인터페이스와 추상클래스

SeungJoo
|2025. 4. 10. 19:19
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