티스토리 뷰

프로그래밍/java

Java 8 - Default Method

박스여우 2017.06.08 14:54

정말 오랜만의 포스팅입니다. 겨울방학 3개월동안 인턴과정을 진행했고 정직원 확정이 된 뒤로 블로그에 대한 관심이 소홀해진것 같아 죄송합니다 ㅠㅠ. Android에서는 Kotlin을 정식언어로 채용하고 곧있으면 Java 9이 출시된 분위기에서 Java 8버전에대한 소개를하자니 많이 늦은감이 있긴합니다만 그래도! Java8에서 새롭게 추가되었던 default 메소드에 대해서 알아보도록 하겠습니다.



Interface

대부분 아실거라고 생각하지만 달라진점을 소개하기 전에 기존 특징을 먼저 알아보고 넘어가도록 하겠습니다. 인터페이스는 기본적으로 상수와 추상 메소드만을 정의할 수 있었습니다. 이를 클래스에서 구현하거나 익명으로 인터페이스를 구현한 객체를 생성할 수도 있습니다.


1
2
3
4
5
6
7
interface  Parent{
    // 상수 필드
    public static final TEST_VALUE = 100;
 
    // 추상 메소드
    public abstract void decode();
}
cs


하지만 이러한 인터페이스에는 새로운 기능을 추가하기 위해 기존의 구현체들을 깨트려야 한다는 단점이 있었습니다. 이러한 단점을 보완하기 위해 default 메소드라는 개념이 Java 8버전에서 새롭게 추가되었습니다.



Default 메소드

Default메소드는 기존 추상메소드 선언만 가능했던 인터페이스에 구현된 메소드를 선언할 수 있게 만들어줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface  Parent{
    // 상수 필드
    public static final TEST_VALUE = 100;
 
    // 추상 메소드
    public abstract void decode();
 
    // 디폴트 메소드 : 내용까지 구현.
    public default void changeState(boolean state){
        if(state){
            System.out.println("ON");
        }else{
            System.out.println("OFF");
        }
    }
}
cs

단순하게 abstract 대신 default 키워드를 적어주면 default 메소드가 선언됩니다. 만약 changeState 메소드를 일반적으로 추상메소드로 선언했다면 Parent 인터페이스를 구현했던 클래스들은 모두 changeState 메소드를 오버라이드해 주어야 합니다. 하지만 default 메소드를 사용하였으니 필요한 클래스에서만 changeState 메소드를 오버라이드해주면 됩니다.



Default Method Vs Abstract Class

이쯤에서 "이제 인터페이스에서도 메소드의 내용을 구현할 수 있는데 추상클래스와 다른게 뭔가요?"라는 궁금증이 하나 생기셨을수도 있습니다. 저역시도 이러한 궁금증이 생겨서 찾아보았습니다.


Default Method가 추가된 Java 8의 Interface와 추상클래스의 차이점의 몇가지를 꼽아보자면, 우선 생성자와 멤버변수를 들 수 있을것 같습니다. 인터페이스는 상수만 사용할 수 있기 때문에 추상클래스보다 변수사용에 있어서 훨씬 제한적입니다. 또한 private, protected등 다양한 접근제한자를 사용할 수 없습니다. 또한 인터페이스는 생성자가 없어서 생성시에 초기화해주는 작업이 필요한경우 적합하지 않습니다.


무엇보다 interface와 abstract class의 용도가 다르기때문에 모호한 개념을 잘 확립하여 적절한때에 적절한 방법으로 사용하는것이 바람직할것 같습니다.

댓글
댓글쓰기 폼
Total
354,596
Today
15
Yesterday
658
링크
«   2019/11   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함