그저 내가 되었고
☕️Java:: 다형성(polymorphism) 본문
class A {
public string x() {
return "x";
}
}
class B extends A {
public string y() {
return "y";
}
}
public class whatIsPolymorphism {
public static void main(String[] args) {
A obj = new B();
obj.x();
obj.y();
}
}
B라는 클래스를 인스턴스화할 때(new)
그 인스턴스를 담는 변수의(obj) //결국 인스턴스 이름이 obj임
데이터타입(A)은
그 클래스(B)가 될 수도 있고
그 클래스의 부모클래스(A)가 될 수도 있다.
이러면 obj는 A인양 행세하며 동작함.
그러므로 부모클래스 A의 메소드 x()는 실행 가능하지만(obj.x(); => O)
자식클래스 B의 메소드 y()를 실행시키면 에러가 난다.(obj.y(); => X)
여기까지는 문법 설명이고.
이걸 왜 쓰느냐가 중요함.
위의 소스코드를 좀 수정해보겠음.
class A {
public string x() {
return "A.x";
}
}
class B extends A {
public string x() {
return "B.x";
}
public string y() {
return "y";
}
}
public class whatIsPolymorphism {
public static void main(String[] args) {
A obj = new B();
System.out.println(obj.x());
}
}
이렇게되면 자식클래스B에서 부모클래스A의 메소드인 x()를 오버라이딩 함.
main메소드 안에서 sout한 결과 뭐 나올 것 같음? 답은 B.x임.
..... 왜?
왜냐면.
인스턴스가 어떠한 클래스의 행세를 한다. 이거는
그 클래스에 정의된 메소드만 실행시킬 수 있다는거임.
그래서 obj 인스턴스는 A클래스 행세를 하는데.
클래스A에는 y()메소드가 없고.
그러므로 y()는 실행시키면 에러가 난다.
근데 x()를 실행시키면.
x()는 클래스A에도 정의되어있지만.
결국 이 obj란 인스턴스는 B라는 클래스를 인스턴스화 시킨거기때문에.
클래스B에 overriding된 x()를 실행시킨다.
그러므로 결과는 B.x가 나오는 것.
'개발 > Java' 카테고리의 다른 글
☕️Java:: ArrayList & removeIf & switch case (1) | 2023.11.24 |
---|---|
☕️Java:: 백준 자바 2098번(외판원 순회) (0) | 2023.10.29 |
☕️Java:: 백준 자바 1157번(단어 공부) (0) | 2023.10.24 |
☕️Java:: forEach 람다 출력 & 메소드 참조(::) 출력 (1) | 2023.10.14 |
☕️Java:: 백준 자바 20499번 (0) | 2023.10.06 |