본문 바로가기
Computer Science/JAVA

디폴트 메서드, 추상 클래스와 인터페이스

by 꽃요미 2024. 11. 20.

1. 디폴트 메서드 Default Method

 

 - 1.1 개요

  - 자바의 인터페이스는 자바2, 자바5 에서도 일부 변화가 있었지만 가장 큰 변화는 Java8 에서라고 볼 수 있다.

  - 자바8의 주요 변경점은 정적 메서드와, 디폴트 메서드를 선언 할 수 있다.

  - 디폴트 메서드의 출현으로 기존의 배포된 인터페이스에서 수정이 어려운 단점을 극복 할 수 있게 됐다.

  - 자바9에서 private 메서드를 선언해 외부에서 접근 불가능한 메서드 또한 선언 할 수 있게 됐다.

 

 - 1.2 예제

interface Foo {

  String getName(); // 추상 메서드, 구현하는 클래스에서 무조건 구현해줘야 하는 메서드.

  void printName() {
    System.out.println(getName());
  }

}

---

public class Bar implements Foo {
  private String name;

  public Bar(String name) { // 생성자
    this.name = name;
  }

  @Override
  public String getName() { // 추상 메서드 구현
    return this.name;
  }
}

---

public class Main {
  public static void main(String[] args) {
    Foo foo = new Bar("Neo");
    foo.printName();
  }
}

---

Result

>> Neo

 

- 위의 예제에서 인터페이스 Foo에 이름을 콘솔에 출력하는 기능을 추가하고 싶다고 가정해보자.

- 이전의 방식으로는 인터페이스에 새로운 printName() 메서드를 추가하고 인터페이스 Foo를 구현한 모든 클래스에서 새로운 메서드를 구현해주어야했다.

 

* 추상 클래스 vs  인터페이스

 - 추상 클래스와 인터페이스는 근본적으로 쓰임이 달라서 비교하는것이 부적절함.

 - 사용방법이 비슷한 점과 인터페이스도 클래스의 종류라는점을 생각할때 비교.

 

* 공통점

 - 스스로 new 연산자를 통해 객체를 생성할 수 없다.

 - 추상 메서드를 가진다.

 - 자손 클래스를 이용해 정의된 추상 메서드들을 구현함.

 

* 차이점

 - 용도, 태생

  1. 추상 클래스 : 여러 클래스를 추상화해 공통점을 묶은 추상클래스를 상속받아 그 기능을 사용하거나 확장하기 위함.

  2. 인터페이스 : 여러 구현체들의 맥락에 맞는 동일한 동작을 보장하기 위한 명세.

 

 - 다중 상속 가능 여부

  1. 추상 클래스 : 다중 상속 불가능 

  2. 인터페이스 : 다중 상속 가능

 

 - 선언 가능한 메서드

  1. 추상 클래스 : 일반 클래스와 동일 하고, 추상 메서드를 선언 할 수 있다.

  2. 인터페이스 : 추상 메서드만 선언할 수 있었으나 자바8 부터 디폴트 메서드, 자바9 부터 정적 메서드까지 선언 가능하게 됨.

 

 - 변수와 생성자, 메서드

  1. 추상 클래스 : 생성자와 변수, 메서드를 모두 가질 수 있다.

  2. 인터페이스 :

   - 정적 상수만 가능.

   - 위에 언급한것 처럼 자바8 이전까지는 추상 메서드만, 자바9 이전까지는 추상 메서드 + 디폴트 메서드, 그 이후로는 추상메서드 + 디폴트 메서드 + private 메서드만 가질 수 있다.

 

 - 자식 클래스에서의 구현의 강제성

  1. 추상 클래스 : 선택적으로 오버라이딩이 가능하다.

  2. 인터페이스 :

   - 정의된 모든 추상메서드를 구현해야함.

   - 디폴트 메서드의 경우 선택적으로 구현 가능.

 

 - 키워드

  1. 추상 클래스 : extends

  2. 인터페이스 : implements

'Computer Science > JAVA' 카테고리의 다른 글

Java의 Garbage Collection(GC)  (0) 2024.11.22
Error와 Exception 의 개념  (0) 2024.11.20
Java의 실행 엔진  (0) 2024.11.20
Java의 컴파일 과정  (0) 2024.11.20
컬렉션 프레임 워크  (1) 2024.11.20