해당 게시물은 [제대로 파는 자바 (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 ShutDownButton) continue;를 사용하여 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);
}
}
}