2022.10.19 (수)
Interface
라는 주제로 학습했습니다. 역시나 알고 있는 건 알고 있던 게 아니더군요 ~!~! 새롭게 배우는 느낌이어서 재밌고 좋았어요 :)
외부에서 의존도를 높임으로써 외부에서 의존성을 주입한다.
UserService userService = new UserService(new KakaoLogin());
userService.login();
UserService 라는 객체에 KakaoLogin 이라는 구체적인 객체를 넣어 login() 기능을 호출했다. -> 외부 의존도 높아짐 -> 의존성 주입 (우와)
구상체가 아닌, 추상체에 의존(결합)해서 구상체에 접근한다.
구체화 된 객체를 생성하는 디자인 패턴으로, 기능을 외부로 위임한다.
void run(LoginType loginType) {
Login user = getLogin(loginType);
user.login();
}
// factory 패턴
private static Login getLogin(LoginType loginType) {
if(loginType == LoginType.Kakao) return new KakaoLogin();
return new NaverLogin();
}
getLogin()
클래스에서 구체화 된 객체를 생성하고, 기능을 외부(run()
) 클래스로 위임하였다.
변경 없이 인터페이스를 추가해서 기능을 확장하는 게 무슨 말이야,,,
했는데 default 메소드 강의와 코드를 보면서 이해할 수 있었다 :)
class Duck implements Swimmable, Walkable {}
class Swan implements Flyable, Walkable, Swimmable {}
public class Main {
public static void main(String[] args) {
new Duck().swim();
new Duck().walk();
new Swan().swim();
new Swan().walk();
new Swan().fly();
}
}
Duck 과 Swan 클래스에 인터페이스 상속을 추가하면서 기능을 확장할 수 있었다.
interface Flyable {
default void fly() {
System.out.println("FLY");
}
}
interface Swimmable {
default void swim() {
System.out.println("SWIM");
}
}
interface Walkable {
default void walk() {
System.out.println("WALK");
}
}
default method는 상속받은 클래스 내에서 오버라이드 없이 호출 가능하기 때문이죠.