새소식

Java/제대로 파는 자바

[제대로 파는 자바 (Java)-by 얄코] 다형성

  • -

해당 게시물은 [제대로 파는 자바 (Java) - by 얄코]를 수강한 내용을 바탕으로 작성하였습니다.

 

 

 

 

버튼 클래스들의 상속 관계

  • Button
    • ShutDownButton
    • ToggleButton

⭐️ 부모/자식 관계는 범주의 포함 관계로 이어짐

 

  • 자식 클래스의 인스턴스는 부모 클래스 자료형에 속함
    • 모든 셧다운버튼과 토글버튼은 버튼이다.
//  💡 가능 - 자식 클래스는 부모 클래스에 속함
Button button1 = new Button("Enter");
Button button2 = new ShutDownButton();
Button button3 = new ToggleButton("CapsLock", true);

 

 

 

  • 다른 방향으로는 불가
    • 모든 버튼이 셧다운 버튼이거나 토글버튼인 것은 아니다.
    • 셧다운 버튼은 토글 버튼이 아니다.
        //  ⚠️ 불가
//        ShutDownButton button4 = new Button("Enter");
//        ToggleButton button5 = new ShutDownButton();

 

 

 

 

  • 배열 내에 버튼들을 담아 for문을 통해 배열 내 버튼들을 하나하나 접근하여 func메소드 오버라이딩한 기능들 수행가능

 

//  ⭐️ 편의 : 모두 Button이란 범주로 묶어 배열 등에서 사용 가능
Button[] buttons = {
        new Button("Space"),
        new ToggleButton("NumLock", false),
        new ShutDownButton()
};

for (Button button : buttons) {
    //  ⭐️ 모든 Button들은 func 메소드를 가지므로
    button.func();
}
  • ⭐️ 이처럼 특정 자료형의 자리에 여러 종류가 들어올 수 있는 것 - 다형성 (Polymorphism)
    • 상속, 오버라이딩, 이후 배울 인터페이스 등을 통해 구현 가능

 

 

 

 

  • FiresSlime 은 Slime 이므로
    • attack 의 인자로 사용 가능
    • hp 와 defence 필드를 가짐 전제
	Slime slime = new Slime();
        FireSlime fireSlime = new FireSlime();

        slime.attack(fireSlime); // ⭐ 클래스가 다른데 가능한 이유 : 다음 강에서
        fireSlime.attack(slime);

 

 

 

 

 

 

 

 

instance of 연산자

  • 뒤에 오는 클래스의 자료형에 속하는(족보상 같거나 아래인) 인스턴스인지 확인
    • 이후 배울 인터페이스에 대해서도 사용 가능

 

 

  • 상속관계가 아닌 클래스끼리는 컴파일 오류

 

 

 

 

▶ if (btn instanceof ShutDownButtoncontinue;를 사용하여 ShutDownButton의 실행 제외

//ShutDownButton을 제외하고 나머지만 실행하고 싶을 때
for (Button btn : buttons) {
    if (btn instanceof ShutDownButton) continue; // ⭐️
    btn.func();
}

 

 

 

 

▶ 자식클래스 YalcoChickenDT의 기능 takeDTOrder()를 사용하고 싶다면 아래와 같이 형변환 필요

YalcoChicken ycStores[] = {
        new YalcoChicken(3, "판교"),
        new YalcoChicken(17, "강남"),
        new YalcoChickenDT(108, "철원"),

};

for (YalcoChicken store : ycStores) {
    if (store instanceof YalcoChickenDT) {
        //  ⭐️ 자식 클래스의 기능을 사용하려면 명시적 타입 변환
        ((YalcoChickenDT) store).takeDTOrder();
    } else {
        store.takeHallOrder();
    }
}

 

 

 

 

 

 

 

Object 클래스 - 모든 클래스의 최고 조상

package sec05.chap06.ex03;

import sec05.chap05.ex01.YalcoChicken;
import sec05.chap05.ex02.Button;
import sec05.chap05.ex02.ShutDownButton;
import sec05.chap05.ex03.FireSlime;

public class Main {
    public static void main(String[] args) {
        Object obj1 = new Object();

        
        
        //  ⭐️ IDE의 안내대로 다른 패키지의 클래스 임포트(Ctrl+space)
        //  자료형이 Object인 변수에 넣을 수 있음
        //  💡 해당 클래스의 생성자가 public 이어야 함
        Object obj2 = new YalcoChicken(3, "판교");
        Object obj3 = new ShutDownButton();
        Object obj4 = new FireSlime();


        
        
        //  원시 자료형들도 Object의 인스턴스로... - 이후 자세히 배울 것
        Object obj5 = true;
        Object obj6 = 1;
        Object obj7 = "Hello";



        
        //  ⭐️ 모든 자료형을 포함할 수 있는 배열
        //   아주 특별한 경우가 아니고서는 사용하지 말 것!
        Object[] objs = {
                1, false, 3.45, '가', "안녕하세요", new Button("Space")
        };

        for (Object obj : objs) {
            System.out.println(obj);
        }

    }
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.