NullNull

Abstract class vs Interface 본문

프로그래밍 언어/JAVA

Abstract class vs Interface

KYBee 2022. 8. 14. 20:11

추상 클래스 (is a)

추상 클래스(abstract class)

  • 미완성된 클래스
  • 다른 클래스를 만들기 위한 보조 클래스
  • 자손 클래스에서 반드시 재정의해서 사용되기 때문에 조상의 구현이 무의미한 메서드
    • 메서드의 선언부만 남기고 구현부는 없음
    • abstract 키워드를 메서드 선언부에 추가
    • 객체를 생성할 수 없는 클래스가 됐기 때문에 클래스 선언부에 abstract 추가
abstract class Person {
    public void hello() {
        return "hi";
    }

    public abstract void walk();
}

 

추상 클래스의 특징

  • 기본 클래스의 특징을 모두 갖고 있음
    • 상태를 가질 수 있음. (멤버 변수)
  • 추상 메소드를 포함할 수 있음. 없어도 상관은 없다.
  • 직접 객체 생성을 할 수 없다. 상속을 위한 클래스
    • 간접적으로 생성 가능
      • 자식 클래스에 의해서
  • 상속이 가능하므로 자식을 참조할 수 있다. 다형성 적용이 가능하다.
  • 단일 상속만 가능하다.
  • 조상 클래스에서 상속받은 abstract 메서드를 재정의 하지 않으면
    • 해당 클래스 내에는 여전히 abstract 메서드가 있는 상황이기 때문에 자식 클래스 역시 abstract 클래스가 된다.
  • 접근제어자 설정 가능
proteced abstract <- 요런거 가능

 

추상 클래스 사용의 이유

  • 구현의 강제를 통해 프로그램의 안정성을 향상한다.

 

 

인터페이스 (has a)

인터페이스

  • 구현자 관점 - 구현 명세
  • 사용자 관점 - 사용 방법

 

인터페이스의 특징

  • 클래스가 아니다.
  • 객체로 생성될 수 없기 때문에 상태를 가질 수 없음
    • 인터페이스에서 멤버 변수 생성 시 public static final이 생략된다. (상수)
    • 메소드엔 public abstract 생략 되어 있음. (모든 메소드 오버라이딩 함)
    • 구현 클래스에선 반드시 인터페이스의 모든 메소드를 구현해야 함
  • 인터페이스는 다중 상속이 가능하다.
  • 상속이 가능하므로 다형성 역시 적용된다.

 

인터페이스의 사용 이유

  • 해당 기능들의 구현을 강제할 수 있음.
    • 구현 입장 → 메서드의 이름을 만들 필요 없음
    • 사용 입장 → 구현 볼 필요 없이 인터페이스만 참고하면 됨
    • 해당 인터페이스를 구현한 클래스들은 같은 기능을 구현하고 있다는 것을 파악할 수 있음
  • 구현과 사용의 분리를 통해 결합도를 낮출 수 있음. 손쉬운 모듈 교체 지원
    • 결합도가 낮다?
      • 특정 코드에 변화가 생겼을 때 다른 부분이 바뀌는 정도가 낮다.
  • 공통된 기능을 통한 관계성 부여
    • 원래는 상속을 통해서만 부모 자식의 관계 부여 가능
    • 이제는 인터페이스 사용도 가능
    • 인터페이스 타입으로 해당 객체를 받을 수 있다. (다형성 적용)
    • 해당 인터페이스 타입의 참조 변수로 인터페이스를 구현한 객체를 참조 가능
  • 모듈 간 독립적 프로그래밍 가능

 

추상클래스와 인터페이스

공통점 차이점
직접 객체 생성이 불가능하다. 추상클래스는 is a 관계의 경우 주로 사용
참조 변수의 타입으로 사용 가능하다. 인터페이스는 has a 관계의 경우 주로 사용. 해당 클래스가 특정 기능들을 구현해야하는 경우
  추상 클래스는 클래스라 단일 상속, 인터페이스는 클래스는 아니라서 다중 상속
공통점 차이점
직접 객체 생성이 불가능하다. 추상클래스는 is a 관계의 경우 주로 사용
참조 변수의 타입으로 사용 가능하다. 인터페이스는 has a 관계의 경우 주로 사용. 해당 클래스가 특정 기능들을 구현해야하는 경우
  추상 클래스는 클래스라 단일 상속, 인터페이스는 클래스는 아니라서 다중 상속

인터페이스 ≥ JDK v8

  • 이전 버전에는 인터페이스는 구현부분이 없어야 했다.
  • 이제는 default, static메서드 구현 가능

default 메소드

  • 아래처럼 이미 사용되던 인터페이스에 새로운 기능을 추가할 경우, 그 인터페이스를 사용하고 있던 모든 클래스에서는 그 기능을 오버라이딩 해야 함 → 기능 하나만 넣으려고 하다가 엄청 많은 오류와 유지보수가 필요함
interface {
        void off();

        //새롭게 추가한 메서드 ------- (x)
        void powerOff();
}
  • 이를 방지하기 위해서 default 으로 선언하여 구현을 일부 작성하고 → 재정의도 가능함
  • 여러개 만들 수도 있음
interface {
        void off();

        //새롭게 추가한 메서드 ------- (o)
        default void powerOff() {
                System.out.println("강제종료");
        }
}

static 메소드

  • 객체를 생성하지 않고도 사용 가능한 메소드
  • 인터페이스명.메소드명 으로만 사용 가능하다.
  • 재정의 불가능 → 객체를 위해 만들어 둔 것이 아니다. <default 메소드와 의 차이점>
  • 해당 인터페이스의 고유기능 같은 것들 정의
  • 또는 유틸리티 메소드 형태로 사용
    • 유틸리티 클래스란?
      • 프로그램 개발에 유용한 클래스
        • java.util 패키지의 클래스

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

간단한 Unit Test 작성하기  (0) 2024.04.04
객체지향 언어의 특징과 설계 원칙  (0) 2022.09.29
예외 처리  (0) 2022.08.14
JAVA 노드 스트림 & 보조 스트림  (0) 2022.07.31
Java Data Type  (0) 2022.07.24
Comments