프로그래머스 백엔드 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
반응형