본문 바로가기
객체 지향 프로그래밍 입문

[객체 지향 프로그래밍 입문] 다형성 과 추상화

by 코딩하는경준 2022. 4. 20.

다형성

  • 여러 모습을 갖는 것을 말합니다.
  • 객체지향에서는 한 객체가 여러 타입을 갖는 것을 의미합니다.
  • 이 의미로는 한 객체가 여러 타입의 기능을 제공할 수 있습니다.
  • 타입 상속으로 다형성을 구현합니다.

추상화

  • 데이터나 프로세스 등을 의미가 비슷한 개념이나 의미 있는 표현으로 정의하는 과정
  • 추상 타입을 이용한 프로그래밍 
Notifier notifer = getNotifier(...);
notifier.notify(someNoti);

      ( 어떤 notifer 에 따라 다른 notify가 적용된다 )

  • 추상 타입은 구현을 감춤 ( 기능의 구현이 아닌 의도를 더 잘 드러냄 ) 

 

추상화, 다형성 예제

 

KakaoSender 와 SmsSender 의 공통점을 모아둔 abstract(추상) 클래스 인 ContentSender 클래스

package content;

public abstract class ContentSender {
    String title;
    String nm;

    public ContentSender(String title, String nm) {
        super();
        this.title = title;
        this.nm = nm;
    }

    //추상메서드 --> 상속을 통해서 반드시 재정이 되어야지만 비로소 인스턴스를 생성할 수 있다.
    public abstract void sendMsg(String recipient);
}

 

ContentSender을 상속(extends) 받은 KaKaoSender 클래스

package content;

public class KakaoSender extends ContentSender {
    String content;

    public KakaoSender(String title, String nm, String content) {
        super(title, nm);
        this.content = content;
    }

    @Override
    public void sendMsg(String recipient) {
        System.out.println("전송매체 = " + "kakao");
        System.out.println("제목=" + this.title);
        System.out.println("이름=" + this.nm);
        System.out.println("내용=" + this.content);
        System.out.println("받는 사람=" + recipient);
    }
}

 

ContentSender을 상속(extends) 받은 SmsSender 클래스

package content;

public class SmsSender extends ContentSender{
    String content;

    public SmsSender(String title, String nm, String content) {
        super(title, nm);
        this.content = content;
    }

    @Override
    public void sendMsg(String recipient) {
        System.out.println("전송매체 = " + "SMS");
        System.out.println("제목=" + this.title);
        System.out.println("이름=" + this.nm);
        System.out.println("내용=" + this.content);
        System.out.println("받는 사람=" + recipient);
    }
}

 

코드를 테스트하는 ContentTest 클래스

package content;

public class ContentTest {

    public static void main(String[] args) {

        ContentSender cs1 = new SmsSender("약속 공지","노경준","4월 20일 저녁 7시까지 공원으로 오세요"); // ContentSender 객체에 LetterSender 객체를 넣음 (다형성)
        cs1.sendMsg("임창규");

        System.out.println();
        SmsSender ls = new SmsSender("문자 받았습니다.","임창규","알겠습니다.");
        ls.sendMsg("노경준");

        System.out.println();
        ContentSender cs2 = new KakaoSender("안녕","송시현","ㅎㅇ"); // ContentSender 객체에 KakaoSender 객체를 넣음 (다형성)
        cs2.sendMsg("송유현");
    }
}

 

코드 실행 결과

 

어떤 Sender 에 따라서 전송매체가 달라지는 예제 였습니다.

Reference

댓글