[CS] 추상 클래스와 인터페이스

말하는 감자·2025년 1월 31일

CS

목록 보기
21/33
post-thumbnail

추상 클래스(Abstract Class)

하위 클래스의 공통점을 추상화하여 만든 클래스를 의미한다.
다중 상속이 불가능하여 단일 상속만 허용
추상 클래스는 추상 메소드 외의 일반 클래스처럼 일반적인 필드, 메서드, 생성자를 가질 수 있다.
상태정보 저장 가능
생성자 구현 가능

인터페이스(interface)

모든 메서드를 public 으로 정의해야 하고, 모든 필드를 public static final인 상수로 정의해야한다.
메서드의 시그니처만을 포함하고 구현은 포함하지 않는다.
다중구현(여러 개의 인터페이스를 구현)을 지원한다

추상 클래스 vs 인터페이스

인터페이스와 추상클래스는 둘 다 추상 메소드를 통해 상속/구현을 통한 메소드 강제 구현 규칙을 가지는 추상화 클래스이다.
다만 이 둘은 각각의 고유의 특징들을 가지고 있는데, 이러한 특징으로 인해 각각 사용처가 갈리게 된다.

  • 인터페이스: implement, 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현
  • 추상 클래스: extends, 자신의 기능들을 하위 클래스로 확장(공통 기능들의 구체화)

추상 클래스를 사용하는 경우

  • 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많아 중복 멤버를 통합할 때
  • 멤버에 public 이외의 접근자 선언이 필요한 경우
  • non-static/non-final 필드 선언이 필요한 경우(상태 변경을 위한 메소드가 필요한 경우)
  • 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야 할 경우 사용

중복 멤버 통합

통합 전

// 독수리
class Eagle {
    private String wings;
    private String feathers;

    public void fly();
    
}

// 비둘기
class Pigeon {
    private String wings;
    private String feathers;

    public void fly();
}

abstract class Bird {
    protected String wings;
    protected String feathers;
	
    //생성자
    public Bird(String wings, String feathers) {
        this.wings = wings;
        this.feathers = feathers;
    }

    public abstract void fly();
}

// 독수리
class Eagle extends Bird {
    public Eagle();

    @Override
    public void fly();
}

class Pigeon extends Bird {
    public Pigeon();
    
    @Override
    public void fly();
}

중복되는 멤버 wing,feather를 상속을 통해 상위 클래스로 묶어 메서드도 통합하여 추상화 해주면서 나중에 다른 클래스를 추가/확장하는데 있어서 유연한 객체 지향 설계를 만들 수 있다.

또한, 생성자를 정의하여 자식 클래스에서 부모 클래스의 속성을 초기화하여 사용할 수 있다.

인터페이스를 사용하는 경우

  • 어플리케이션의 기능을 정의해야 하지만 그 구현 방식이나 대상에 대해 추상화 할 때
  • 서로 관련성이 없는 클래스들을 묶어주고 싶을 때
  • 다중 상속을 통한 추상화 설계를 해야할 때
  • 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용

인터페이스의 가장 큰 특징은 구애 받지 않은 상속(구현)이 가능하다는 것이다.
상속(extends)는 클래스끼리의 논리적인 타입 묶음이라면, 구현(implements)은 관련없는 클래스간의 공통적 동작의 정의이다.

  • 독수리와 비둘기를 "조류" 라는 추상 클래스로 묶어 놓은 상황에서 만약 "타조"라는 새로운 클래스가 등장하는 경우
    • 타조는 날지 못함


독수리와 비둘기의 공통 기능(날다)과 사람과 타조의 공통 기능(걷다, 뛰다)로 정의

// 인터페이스
interface Flyable {
    void fly();
}

// 
interface Walkable {
    void walk();
    void run();
}

// 조류 추상 클래스
abstract class Bird {
    public String feathers;

    public Bird(String feathers) {}    
}

// 타조 클래스
class Ostrich extends Bird implements Walkable {
    public Ostrich() {}
    
    @Override
    public void walk() {}

    @Override
    public void run() {}
}

// 독수리 클래스
class Eagle extends Bird implements Flyable  {
    public Eagle() {}
    
    @Override
    public void fly() {}
}

// 비둘기 클래스
class Pigeon extends Bird {
    public Pigeon() {}

	@Override
    public void fly() {}
}
profile
주니어개발자(?)

0개의 댓글