Default Method, 추상 클래스와 인터페이스

동동주·2024년 5월 1일

CS스터디_자바

목록 보기
15/19

1. Default Method

  • 인터페이스는 기능에 대한 선언만 가능하기 때문에, 실제 코드를 구현한 로직은 포함될 수 없습니다. 하지만 자바8에서 이러한 룰을 깨트리는 기능이 나오게 되었는 데 그것이 Default Method(디폴트 메소드) 입니다. 메소드 선언 시에 default를 명시하게 되면 인터페이스 내부에서도 로직이 포함된 메소드를 선언할 수 있습니다.

  • 접근제어자에서 사용하는 default와 같은 키워드이지만, 접근제어자는 아무것도 명시하지 않은 접근 제어자를 default라고 하며 인터페이스의 default method는 'default'라는 키워드를 명시해야 합니다.

interface MyInterface { 
    default void printHello() { 
    	System.out.println("Hello World"); 
    } 
}
  • default라는 키워드를 메소드에 명시하게 되면 인터페이스 내부라도 코드를 작성할 수 있습니다.

default method를 사용하는 이유

  • 기존에 존재하던 인터페이스를 이용하여서 구현된 클래스를 만들고 사용하고 있는데 인터페이스를 보완하는 과정에서 추가적으로 구현해야 할 혹은 필수적으로 존재해야 할 메소드가 있다면, 이미 이 인터페이스를 구현한 클래스와의 호환성이 떨어 지게 됩니다. 이러한 경우 default 메소드를 추가하게 된다면 하위 호환성은 유지되고 인터페이스의 보완을 진행 할 수 있습니다.
  • 실제로 스프링 프레임 워크 버전 4에서 WebMvcConfigure라는 인터페이스를 구현한 클래스 WebMvcConfigurerAdapter를 사용하였지만 자바8에서 default 메소드가 등장하고 WebMvcConfigurerAdapter클래스는 더 이상 사용되지 않습니다.
  • ex)
interface MyInterface { 
    default void printHello() {
    	System.out.println("Hello World"); 
        } 
} 

class MyClass implements MyInterface {} 

public class DefaultMethod { 
    public static void main(String[] args) { 
    	MyClass myClass = new MyClass(); 
        myClass.printHello(); //실행결과 Hello World 출력 
    } 
}

추상 클래스

  • 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상메서드)를 포함하고 있다는 의미입니다. 추상 클래스로는 인스턴스를 생성할 수 없으며 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있습니다.
  • 즉 상속을 강제하기 위한 추상메서드를 하나 이상 가진 클래스를 말합니다.

추상 클래스의 특징

  • 공통 구현을 상위 클래스에 뽑아내려고 사용함
  • 자신의 생성자로 객체 생성 불가능
  • 하위 클래스를 참조하여 상위 클래스의 객체를 생성
  • 하위 클래스를 제어하기 위해 사용
  • abstract와 final 키워드를 동시에 표기할 수 없음

-> 사용하는 이유: 분류하는 작업을 통해 중복을 줄이고 규모가 큰 프로젝트에서 유지보수를 용이하게 하기 위해서 추상 클래스를 사용한다.

인터페이스

  • 인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와는 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 어떠한 요소도 허용하지 않는다.
  • 추상클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려져 있는 '기본 설계도라고 할 수 있다. 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러 개의 인터페이스로부터 상속을 받는 것이 가능하다.

인터페이스의 특징

  • 일종의 추상 클래스
  • 모든 메서드가 구현된 부분이 없는 추상 메서드 형태로 이루어진 클래스
  • implements 키워드를 사용
  • 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하며 쓸 수 있도록 함
  • extends는 하나의 클래스만 상속 가능하나 interface는 다중 상속이 가능

-> 인터페이스를 이용하면 결합도가 낮은 코드를 만들어 협업과 유지보수가 용이해진다. 일반적으로 부모 클래스의 내부 구현을 자식 클래스들이 상속받아 공유할 필요가 있으면 추상클래스를 사용하고 공유할 내부 구현이 없다면 더 추상적인 인터펭스를 사용한다. (의존 대상이 구체적이기보단 추상적일수록 더 좋다. 그렇기 때문에 추상클래스보다 더 추상적인 인터페이스는 객체지향적인 코딩을 하기에 꼭 필요한 유용한 방법이다.)

인터페이스추상클래스
구현 객체의 같은 동작을 보장하기 위함추상클래스를 상속받아 기능을 이용, 확장하기 위함
다중 상속 가능다중 상속 불가능
추상메소드만 사용 가능일반메소드와 추상메소드 모두 사용 가능
생성자와 일반변수를 가질 수 없음생성자와 일반변수 모두 가질 수 있음
메소드 선언만 가능메소드의 부분적인 구현 가능
상속받은 클래스는 반드시 인터페이스에 있는 메소드를 모두 다 구현해야함상속받는 클래스는 추상메소드만 구현해도 됨
Implements 사용extends 사용

0개의 댓글