반응형

디폴트 메서드와 static 메서드

  • 인터페이스에 디폴트 메서드, static메서드 추가 가능 (JDK1.8 부터)

 

default 메서드와, static메서드는 JDK1.8부터 추가되었다.

static메서드는 iv가 쓰이지 않아서 독립적이다. 그래서 인터페이스나 어디든지 포함되지 못할 이유가 없었지만,
그동안은, 인터페이스의 원칙을 단순화 하기위해 뺏었다가 추가한 것이다. default메서드도 마찬가지이다.
원래는 인터페이스에서 추상메서드만 가지게 했었는데, 이미 충분히 Java가 널리 퍼졌고, 많은 사람들의 요구에 의해
dafault메서드와 static메서드를 추가할 수 있게 되었다.

 

(default method)가 추가된 이유

  • 기존에는 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려웠음

 

인터페이스에는 문제가 있었다.

그림처럼 상속계층도가 있다고 할 때, 색칠한 여러 부분을 인터페이스로 구현했다고 가정해보자.

만약, 인터페이스 안에 interface Reparable {boolean isFinished()} 처럼 
작업이 끝났는지를 묻는 메서드를 추가하고 싶다면, 어떻게 해야할까?

인터페이스는 추상메서드의 집합이다.
따라서, Repairable인터페이스에 새로운 메서드를 추가하고싶다는 이야기는,
추상메서드를 추가한다는 이야기다. (boolean isFinished()는 추상메서드)

즉, Repariable인터페이스를 사용한 다른 곳에도 isfinished가 추가되므로, 멤버가 새로 추가된 해당 클래스에서 isfinished의 {}몸통을 만들어서 구현해줘야 한다.
Repariable인터페이스를 사용하는 다른곳도 마찬가지일 것이다.

즉, Repairable이라는 인터페이스에 메서드(추상메서드)가 하나 추가되었을 뿐인데, 
기존에 Repairable인터페이스를 구현했던 클래스들에도 Rpairable인터페이스에 새로생긴 추상 메서드를 구현해야 한다. 
만약, 널리 쓰이는 인터페이스일 수록 이러한 변경에 대한 파장은 클 것이다. 

그래서 이 문제를 해결하기 위해 나온 것이 default메서드이다.

 

좌측 코드처럼, 원래 인터페이스에 메서드를 추가하면, 그 메서드는 추상 메서드 일 것이다.

그런데, 이렇게 하면, 방금 전에 발견한 문제처럼, 기존에 해당 인터페이스를 구현했던 클래스들이
새로 추가한 추상 메서드를 구현해야 한다. 그러면 이 메서드를 추가함으로 인해 다른 클래스들도 많은 변경이 일어날 것이다.

그래서 문제를 해결하기 위해 default 메서드를 이용해서
몸통이 있는 메서드를 추가할 수 있게 해준다. 앞에 default 키워드를 붙인다.

인터페이스에 새로운 메서드를 추가했을 때,
이 인터페이스를 구현한 클래스들이 새로운 추상메서드를 구현하는 것의 부담음 없애주기 위해서 
default메서드를 고안한 것이다. (인터페이스 원칙을 위반하는 예외사항이다)

 

기존의 인터페이스가 추상 메서드만 갖게 된 이유는,  메서드의 충돌 때문이었다.
그런데 default메서드에서는 몸통있으므로, 충돌 문제가 다시 발생한다.
편리함이 생긴 대신, 충돌문제가 생겼다.

 

그러면, 이 충돌문제를 어떻게 해결해야 할까?

1. 인터페이스의 디폴트 메서드끼리 충돌하는 것은, 
인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야 한다.

그리고,

2. 조상의 메서드와 조상 클래스의 메서드 간의 충돌되면, 
조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

충돌이 발생했을 때는,  직접 오버라이딩 하면 해결되는 문제이다.

 

여기까지가 객체지향 개념이다. 6~7장을 복습하면서 계속 공부하자.

반응형

'JAVA' 카테고리의 다른 글

내부 클래스의 제어자와 접근성  (0) 2022.04.08
내부 클래스의 종류, 특징, 선언  (0) 2022.04.07
인터페이스의 장점 (2)  (0) 2022.04.07
인터페이스의 장점 (1)  (0) 2022.04.06
인터페이스와 다형성  (0) 2022.04.06