728x90
반응형
Interface vs Abstract
개념 | 설명 |
인터페이스 | 클래스가 꼭 구현해야 하는 메서드를 명시해 놓은 설계서 라고 할 수 있으며 기능 구현은 없고 형식만 정의 |
추상클래스 | 공통된 기능을 미리 정의하거나, 자식 클래스가 반드시 구현해야 할 부분은 추상 메서드로 남겨둔 미완성 클래스 |
인터페이스란?
"이 기능을 반드시 구현해라" 라는 기능 명세서 : 형태만 있는 순수 추상 구조라고 할 수 있습니다.
인터페이스 특징
- 모든 메서드는 기본적으로 public이고 구현이 없음
- 변수는 선언할 수 없고, 상수만 가능(public static final)
- 다중 상속이 가능
- 상수만 가질 수 있고 일반 변수는 없음
- 의존성 낮고, 유연한 코드 구조 가능
인터페이스 예제 1
interface Vehicle {
void move();
}
class Car implements Vehicle {
public void move() {
System.out.println("자동차가 이동합니다.");
}
}
인터페이스 예제 2
interface Shape {
void draw();
void move(int y);
}
class Triangle implements Shape {
public void draw() { System.out.println("삼각형을 그린다"); }
public void move(int y) { System.out.println("삼각형 이동"); }
}
추상 클래스란?
"공통적인 속성과 기능을 공유하되, 구현되지 않은 메서드는 자식 클래스가 직접 구현해라" : 완성되지 않은 클래스, 공통 기능 제공 + 확장성 고려
추상 클래스 특징
- 일반 메서드 + 추상 메서드 모두 가능
- 단일 상속만 가능
- 변수 선언 가능
- 공통 기능을 물려주고, 자식 클래스에서 세부 내용을 구현
추상클래스 예제1
abstract class Animal {
String name;
void eat() {
System.out.println("먹습니다.");
}
abstract void sound();
}
class Dog extends Animal {
void sound() {
System.out.println("멍멍!");
}
}
추상클래스 예제2
abstract class Shape {
abstract void draw();
void hit() { System.out.println("눌렀습니다"); }
}
class Triangle extends Shape {
void draw() { System.out.println("삼각형을 그린다"); }
}
왜 클래스 대신 인터페이스 사용하나?
1. 이유 다중 상속 가능
인터페이스는 다중 구현 가능하므로, 다양한 기능을 자유롭게 조합할 수 있습니다.
class A {}
class B {}
class C extends A, B {} // Error 자바는 다중 상속 불가능
2. 공통된 기능이 없어도 "동작만 같게" 만들 수 있음
서로 연관 없는 클래스들이 pay()라는 기능만 같게 해야 할 때
interface Payment {
void pay(int amount);
}
class CardPayment implements Payment {
public void pay(int amount) { /* 카드 결제 */ }
}
class PhonePayment implements Payment {
public void pay(int amount) { /* 휴대폰 결제 */ }
}
여기선 공통 속성이나 기능이 없기 때문에 상속은 부적적하며 인터페이스로 동작만 통일하는 게 적절합니다.
3. 결합도 낮은 설계로 유지보수성과 확장성 증가
인터페이스를 쓰면 코드의 유지보수 성과 확장성이 좋아집니다.
// 인터페이스 기반 설계
class PaymentService {
void process(Payment payment) {
payment.pay(1000);
}
}
이렇게 설계하면, CardPayment, KakaoPay, Toss 어떤 클래스는 Payment 인터페이스만 구현하면 사용 가능합니다.
새로운 기능이 추가돼도 기존 코드는 변경할 필요 없습니다.
728x90
반응형
'JAVA' 카테고리의 다른 글
HashMap vs ConcurrentHashMap (0) | 2025.04.10 |
---|---|
팩토리 메서드 패턴 (0) | 2025.02.17 |
데코레이터(Decorator) 패턴 (1) | 2025.01.26 |