Java

추상화....인터페이스...

99duuk 2024. 12. 24. 17:31

https://multifrontgarden.tistory.com/315

 

올바른 추상화와 인터페이스 설계

이번엔 특별히 무언가 주제가 있다기보다 실무에서도 쉽게 접하는 상황에서 어떻게 인터페이스를 설계하는게 올바른지 예제를 통해 알아가보려 한다. 지난 포스팅의 후속작정도 될 것 같다. #

multifrontgarden.tistory.com

 

인터페이스

interface SocialLogin {
    void login(String clientKey); // 공통된 기능만 정의
}

 

구현클래스

class NaverLogin implements SocialLogin {
    private String userId;
    private boolean isAgreed;

    public NaverLogin(String userId, boolean isAgreed) {
        this.userId = userId;
        this.isAgreed = isAgreed;
    }

    @Override
    public void login(String clientKey) {
        System.out.println("Naver 로그인: userId=" + userId + ", isAgreed=" + isAgreed + ", clientKey=" + clientKey);
    }
}

class KakaoLogin implements SocialLogin {
    private String userId;

    public KakaoLogin(String userId) {
        this.userId = userId;
    }

    @Override
    public void login(String clientKey) {
        System.out.println("Kakao 로그인: userId=" + userId + ", clientKey=" + clientKey);
    }
}

class GoogleLogin implements SocialLogin {
    private String userToken;

    public GoogleLogin(String userToken) {
        this.userToken = userToken;
    }

    @Override
    public void login(String clientKey) {
        System.out.println("Google 로그인: userToken=" + userToken + ", clientKey=" + clientKey);
    }
}

 

클라이언트

class SocialLoginClient {
    private SocialLogin login;

    // 생성자 주입
    public SocialLoginClient(SocialLogin login) {
        this.login = login;
    }

    public void performLogin(String clientKey) {
        login.login(clientKey);
    }
}

 

 

public class Main {
    public static void main(String[] args) {
        // 네이버 로그인 사용
        SocialLogin naverLogin = new NaverLogin("naverUser123", true);
        SocialLoginClient client1 = new SocialLoginClient(naverLogin);
        client1.performLogin("naver-client-key");

        // 카카오 로그인 사용
        SocialLogin kakaoLogin = new KakaoLogin("kakaoUser456");
        SocialLoginClient client2 = new SocialLoginClient(kakaoLogin);
        client2.performLogin("kakao-client-key");

        // 구글 로그인 사용
        SocialLogin googleLogin = new GoogleLogin("googleToken789");
        SocialLoginClient client3 = new SocialLoginClient(googleLogin);
        client3.performLogin("google-client-key");
    }
}

작동 원리 및 구조

  1. SocialLogin 인터페이스 정의:
    • SocialLogin은 소셜 로그인에서 공통적으로 사용할 기능(여기서는 login(String clientKey))을 정의.
    • NaverLogin, KakaoLogin, GoogleLogin 클래스는 이 인터페이스를 구현
  2. 구현 클래스(NaverLogin):
    • NaverLogin 클래스는 네이버 소셜 로그인을 담당하며, 인터페이스에서 정의된 메서드(login)를 구현
    • 이 클래스는 네이버 로그인에 필요한 고유한 정보(userId, isAgreed)를 관리
  3. 클라이언트(SocialLoginClient):
    • SocialLoginClient는 SocialLogin 인터페이스에 의존하며, 이를 통해 구체적인 구현체(NaverLogin, KakaoLogin 등)를 알 필요가 없음
    • 생성자를 통해 SocialLogin 인터페이스를 구현한 객체(naverLogin)를 주입
  4. 객체 생성 및 실행:

구현체 객체 생성

SocialLogin naverLogin = new NaverLogin("naverUser123", true);

 

클라이언트 객체 생성

 

SocialLoginClient client1 = new SocialLoginClient(naverLogin);

 

로그인 실행

client1.performLogin("naver-client-key");

'Java' 카테고리의 다른 글

LSP  (0) 2024.12.29
리스트처리(for -> forEach), switch (enum), Null(Optional)  (1) 2024.12.25
클라이언트 ip 가져오기  (0) 2024.12.24
추상 클래스 / 인터페이스  (0) 2024.12.20
캡슐화  (0) 2024.12.17