티스토리 뷰

JAVA

7. default 메소드

박중수 2015. 3. 30. 20:14

함수 표현식을 Collection 라이브러리(HashMap, ArrayList 등)와 통합하면 루프를 이용한 코드보다 짧고 이해하기 쉽게 코드를 짤 수 있다.




예를 들면

for(int i=0; i<list.size(); i++)

System.out.println(list.get(i));


와 같은 코드를


list.forEach(System.out::println);


와 같이 간결하게 짤 수 있다.





하지만 이 경우 List 인터페이스에 forEach라는 메소드가 추가된 것이므로


forEach라는 메소드를 구현하지 않은 List를 상속받는 클래스들은 


규칙상 전부 동작하지 않게 될 수 있다.




이에 대한 대책으로 인터페이스 안에서도 구체적인 동작을 담은 메소드를 구현할 수 있게 되었다.

이는 추상클래스와 같은데 이로 인해 추상클래스가 잘 쓰이지 않게 될 것 같다.

이제는 인터페이스에서 바로 메소드의 구현이 가능해졌기 때문이다.



그리고 클래스와 인터페이스, 인터페이스와 인터페이스 처럼 다중 상속을 받을 경우

같은 내용의 메소드가 충돌할 수 있다. 이 경우에는 두 가지의 해결법이 있다.


1. 클래스와 인터페이스를 함께 상속받은 경우 슈퍼클래스의 메소드를 우선한다.


2. 인터페이스와 인터페이스의 메소드가 충돌하는 경우에는 사용자가 충돌하는 메소드를

   오버라이드 해서 재정의 해야한다.


예를 들어


interface Test1 {

default void print(){ System.out.println("Hello"); }

}


interface Test2 {

void print(){ System.out.println("Hi"); }

}


Class Test implements Test1, Test2 {

.....

}


위의 경우에는 Test1의 print()는 default 메소드이고, Test2의 print()는 일반 메소드이다.

이와 같은 경우에도 충돌이 일어나면 void print() 메소드를 재정의 해줘야한다.


만약 여러 슈퍼인터페이스 중 하나를 고르고 싶다면 아래와 같이 하면 된다.


Class Test implements Test1, Test2 {

@override

void print(){

Test1.super.print();

}

}


여러개의 슈퍼 인터페이스의 충돌하는 메소드들 중 한개라도 디폴트 메소드라면 

재정의를 해줘야하지만 슈퍼인터페이스의 모든 충돌하는 메소드가 일반 메소드라면

이전 버전의 규칙에 따른다. 정의하면 일반클래스, 정의하지 않으면 추상클래스가 되는 것이다.



★ Object 클래스에 있는 메소드들은 interface에서 default 메소드로 재정의가 불가능하다.

   혹여 재정의를 하더라도 모든 클래스들은 Object 클래스를 상속받으므로 슈퍼클래스 

   우선 규칙에 의해 Object 클래스의 메소드가 호출된다.


'JAVA' 카테고리의 다른 글

생성자 레퍼런스에서 Stream.toArray()  (0) 2015.03.31
8. 정적 메소드  (0) 2015.03.30
6. 변수 유효범위  (0) 2015.03.29
5. 생성자 레퍼런스  (0) 2015.03.29
4. 메소드 레퍼런스  (0) 2015.03.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
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
글 보관함