
* 개념 복습과 학습 정도를 파악하고자 포스팅합니다!
* Claude, ChatGPT를 활용하여 이미지를 생성하고 활용합니다.
추상클래스와 인터페이스
1. 추상 클래스란?
직접 객체를 만들 수 없고, 상속을 통해서만 사용할 수 있는 클래스.
공통된 기능은 구현해두고, 자식마다 다르게 구현해야 하는 메서드는 추상 메서드로 선언만 해둡니다.
현실 비유를 하자면, '동물'이라는 개념은 실제로 존재하지 않죠. 개, 고양이, 새처럼 구체적인 동물만 존재하는데 추상 클래스는 이런 개념을 코드로 표현하는 방법입니다.

2. 추상 클래스 문법
// 추상 클래스 선언
public abstract class Animal {
String name;
// 일반 메서드 — 공통 기능 구현
public void eat() {
System.out.println(name + "이(가) 먹어요.");
}
// 추상 메서드 — 선언만, 구현 없음
public abstract void sound(); // {} 바디 없음!
public abstract void move();
}
// 자식 클래스 — 추상 메서드 반드시 구현
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
@Override
public void move() {
System.out.println("네 발로 달려요.");
}
}
추상 메서드가 하나라도 있으면 클래스에 abstract를 붙여야 합니다. 반대로 abstract 클래스라도 추상 메서드가 하나도 없어도 돼요.
자식 클래스가 추상 메서드를 하나라도 구현하지 않으면 자식도 추상 클래스가 되어야 합니다!
3. 인터페이스(Interface) 란?
모든 메서드가 추상 메서드인 완전한 설계도.
클래스가 반드시 구현해야 할 기능의 목록을 정리합니다.
추상 클래스가 "불완전한 부모 클래스" 라면, 인터페이스는 "기능 계약서"입니다.
인터페이스를 구현한다 = 이 기능들을 반드시 제공한다. 와 같은 약속이죠!

4. 인터페이스 문법
// 인터페이스 선언
public interface Flyable {
// 상수 — 자동으로 public static final
int MAX_HEIGHT = 10000;
// 추상 메서드 — 자동으로 public abstract
void fly();
void land();
// default 메서드 — Java 8+ 구현 포함 가능
default void checkWeather() {
System.out.println("날씨 확인 중...");
}
// static 메서드 — Java 8+
static void printInfo() {
System.out.println("Flyable 인터페이스");
}
}
// 인터페이스 구현
public class Bird implements Flyable {
@Override
public void fly() {
System.out.println("날개로 날아요.");
}
@Override
public void land() {
System.out.println("나뭇가지에 앉아요.");
}
}
5. 인터페이스 핵심! - 다중 구현
클래스는 하나만 상속받을 수 있지만, 인터페이스는 여러 개를 동시에 구현할 수 있습니다!

public class Duck implements Flyable, Swimmable, Runnable {
@Override
public void fly() { System.out.println("날개로 날아요."); }
@Override
public void swim() { System.out.println("물갈퀴로 수영해요."); }
@Override
public void run() { System.out.println("뒤뚱뒤뚱 달려요."); }
}
6. 언제 뭘 써야 할까요?

7. 예제
추상 클래스와 인터페이스 함께 쓰기(계좌 업무)
// 인터페이스 — 기능 명세
interface Payable {
void pay(int amount);
int getBalance();
}
interface Printable {
void printReceipt();
}
// 추상 클래스 — 공통 기능 구현
abstract class Account implements Payable {
protected String owner;
protected int balance;
public Account(String owner, int balance) {
this.owner = owner;
this.balance = balance;
}
@Override
public int getBalance() {
return balance;
}
// 추상 메서드 — 계좌 종류마다 다름
public abstract String getAccountType();
}
// 구체 클래스 — 추상 클래스 상속 + 인터페이스 추가 구현
class SavingsAccount extends Account implements Printable {
public SavingsAccount(String owner, int balance) {
super(owner, balance);
}
@Override
public void pay(int amount) {
if (balance >= amount) {
balance -= amount;
System.out.println(amount + "원 결제 완료");
} else {
System.out.println("잔액 부족");
}
}
@Override
public String getAccountType() {
return "저축 계좌";
}
@Override
public void printReceipt() {
System.out.println("[영수증] " + owner + " / 잔액: " + balance);
}
}
SavingsAccount acc = new SavingsAccount("홍길동", 50000);
acc.pay(10000); // 10000원 결제 완료
acc.printReceipt(); // [영수증] 홍길동 / 잔액: 40000
System.out.println(acc.getAccountType()); // 저축 계좌
핵심 정리

추상 클래스와 인터페이스를 정리를 마무리로 OOP 관련 개념을 잘 복습한 것 같네요!!
한 눈에 볼 수 있도록 객체지향 개념 자체를 한 번 정리를 해봐야겠습니다!
감사합니다 :)
'Language > Java' 카테고리의 다른 글
| [Java]내부 클래스 정리 (0) | 2026.04.22 |
|---|---|
| [Java] 배열에 대해서 (0) | 2026.04.22 |
| [Java] 상속 완전히 정리해버리기 (0) | 2026.04.22 |
| [Java] 생성자 & 캡슐화 완전히 정리해버리기 (0) | 2026.04.22 |
| [Java] 메서드 (0) | 2026.04.20 |