티스토리 뷰
함수 표현식을 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
- 알람
- Jackson
- Java8
- Clojure
- json
- react
- gitlab
- Java
- 람다
- RAMDA
- 컴퓨터 시간
- 클로저
- 성능개선
- rambda
- 코어
- javascript
- Docker
- 프로세서
- 날짜
- 성능
- 자료구조
- 자바 성능
- 리액트
- 퍼포먼스
- 시간
- Stream
- Swift 2.0
- 메모리
- opensource
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |