프로그래머스 백엔드 1기/Java

Java Interface (1) - 기능

|테드| 2021. 8. 7. 09:39

1. Interface의 기능

  • 구현부가 없어서 인터페이스를 구현한 클래스에서 구현을 강제한다.
    • Interface에 정의되어 있는 메소드들을 구현하지 않으면 에러가 난다.

 

  • 다형성을 제공한다.
// Login.java
public interface Login {
	void login();
}
// KakaoLogin.java
public class KakaoLogin implements Login {
    @Override
    public void login() {
    	System.out.println("카카오로 로그인 합니다.");
    }
}
// NaverLogin.java
public class NaverLogin implements Login {
    @Override
    public void login() {
    	System.out.println("네이버로 로그인합니다.");
    }
}
// Main.java
public class Main {
	public static void main(String[] args) {
    	//로그인
        Login user = new KakaoLogin();
        user.login();
        Login user2 = new NaverLogin();
        user2.login();
    }
}

 

  • 의존성을 역전하여 결합도를 낮춘다.
// LoginType.java
public enum LoginType {
	Kakao, Naver
}
// Main.java
public class Main {
	public static void main(String[] args) {
    	//로그인을 한다.
        Login user = getLogin(LoginType.Naver);
        user.login();
    }
    
    private static Login getLogin(LoginType type) {
    	if (type == LoginType.Kakao) return new KakaoLogin();
        return new NaverLogin();
    }
}
// Main.java 리팩터링
public class Main {
	public static void main(String[] args) {
    	// 보통 이 부분은 설정파일(config) 등에서 가져온다.
        new Main().run(LoginType.Naver);
    }
    
    void run(LoginType loginType) {
    	//로그인을 한다.
        Login user = getLogin(loginType);
        user.login();
    }
    
    // 디자인 패턴 중 생성패턴인 factory 패턴 이용
    private Login getLogin(LoginType type) {
    	if (type == LoginType.Kakao) return new KakaoLogin();
        return new NaverLogin();
    }
}

위의 기능들을 더 확장해본다.

//UserService.java
public class UserService implements Login {
    Login login;
    
    //외부로부터 login을 주입받는다
    public UserService(Login login) {
        this.login = login;
    }
    
    @Override
    public void login() {
    	login.login();
    }
}
//Main.java
public class Main {
    public static void main(String[] args) {
        UserService s = new UserService(new NaverLogin());
        s.login();
    }
}

실제로 해당 기능을 사용하는 부분에서 Login을 주입한다. 따라서 UserService는 의존성을 외부에 맡긴다. 즉 의존성이 낮아진다. 이것을 DI(Dependency Injection), '의존성을 주입받았다' 라고 한다. 그리고 '의존성이 역전되었다'라고 한다.

728x90
반응형