Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Archives
Today
Total
관리 메뉴

우주코딩

메서드 명칭, 인터페이스와 추상클래스의 콜라보, default 메서드의 필요성, 인터페이스의 static 메서드, 인터페이스와 추상클래스의 상속 본문

자바 본 강의

메서드 명칭, 인터페이스와 추상클래스의 콜라보, default 메서드의 필요성, 인터페이스의 static 메서드, 인터페이스와 추상클래스의 상속

우주코딩 2021. 8. 13. 21:00

메서드의 명칭

public static int m1(String a){};

public static = modifier
int = return type
m1(String a) = method signature(파라미터 명은 상관없다.)
{} = method body

인터페이스와 추상클래스의 콜라보

인터페이스를 받는다는 것은 인터페이스의 메서드를 모두 구현한다는 뜻이다.
인터페이스를 구현한다는 것은 메서드 바디를 만든다는 것이다.
하지만 일부 메서드만 구현하고 싶은 경우 추상클래스의 도움을 받을 수 있다.

A 인터페이스에 rule 1 ~ 4 까지의 추상 메서드가 있는데 모두 구현하고 싶지 않은 경우 추상 클래스에서 메서드 바디를 빈채로 (최소 상태로) 모든 메서드를 미리 구현한다.

해당 추상클래스를 상속하는 concrete 클래스를 만들면 인터페이스를 직접 구현하는 것이 아니라 관심있는 메서드만 오버라이딩할 수 있어 코딩이 편하다.

인터페이스와 추상클래스의 콜라보2

CarSpec 이라는 인터페이스
void run()
void on()
void off()

AbstractCar 라는 추상클래스
public void on()
public void off()
model
cc

Tico 라는 CarSpec 인터페이스를 직접 구현한 클래스
public void run()
public void on()
public void off()

AbstractCar를 상속받은 Sonata 클래스
run() 만 구현

AbstractCar를 상속받은 Truck 클래스
run() 만 구현

인터페이스 : default 메서드의 필요성

인터페이스에서 다른 기능을 추가하는 순간 기존의 그 인터페이스에 따라 구현한 모든 클래스들에 오류가 발생한다.
규칙을 변경하면 그 규칙에 따라 만든 모든 클래스를 변경해야 한다.
=> 내가 만든 규칙에 따라 내가 클래스를 만들었다면 내가 변경하면 되지만, 내가 만든 규칙을 다른 많은 개발자들이 가져가서 클래스를 만들어 사용하고 있다면, 내가 쉽게 규칙을 변경할 상황이 아닌 것이다. 규칙 즉 인터페이스의 메서드를 변경하거나 제거, 추가하는 순간, 이 인터페이스를 구현한 모든 클래스들에서 컴파일 오류가 발생하게 된다.

해결책

  1. 기존 규칙을 상속받은 인터페이스를 만들어 새 규칙을 추가한다.
  2. 기존 인터페이스에 default 메서드를 사용하여 기존 클래스에 영향을 주지 않도록 한다.

default 메서드를 사용하면 기존 규칙을 구현하면서 새 규칙을 추가로 구현할 수 있다.
새로 추가한 기능을 구현하지 않아도 컴파일 오류가 발생하지 않는다. 이미 구현했기 때문이다.
이것이 default 메서드의 문제점이다.
따라서 default 문법은 기존 인터페이스에 새 기능을 추가할 때만 가능한 사용하라.
즉 기존에 그 인터페이스에 따라 이미 구현한 클래스들에 영향을 끼치지 않기 위한 용도로만 사용해야한다. 새 인터페이스를 만들 때는 가능한 default 문법을 사용하지 말라!

default 메서드는 구현을 강제할수 없다 는 단점이 있다.

인터페이스의 static 메서드

인터페이스에서 스태틱 메서드는 보통 그 인터페이스를 구현한 객체를 다루는 일을 한다.
거의 쓰지 않는다.

인터페이스와 추상클래스의 상속

<> CarCheckInfo
<> Car 를 구현하는 AbstractCar는 Car 인터페이스의 run()메서드 이외의 모든 메서드를 구현한다. AbstractCar 를 상속받는 Tico는 run() 메서드만 구현하면 된다.
==> 수퍼클래스가 인터페이스를 구현하면 서브클래스도 구현한 것으로 간주한다. 구현한 메서드를 상속받았기 때문이다.

Comments