Polymorphism, 다형성
아래는 생활코딩에서 보면서 한 예제.
좀 더 자세한 설명은 코드 아래에 적었다!
class A(){
String x(){"x"};
}
class B1 extends A(){
String x(){"B1.x"}; //class A의 x() method를 오버라이딩함.
String y(){"B1.y"};
}
class B2 extends A(){
String x(){"B2.y"}; //class A의 x() method를 오버라이딩함.
String y(){"B2.y"};
String z(){"B2.z"};
}
public class Exam01{
public static void main(String[] args){
A obj1 = new B1();
A obj2 = new B2();
System.out.println(obj1.x()); //B1.x 가 출력됨.
System.out.println(obj2.x()); //B2.x 가 출력됨.
}
}
A obj1 = new B1(); <- 이 부분은, B1 이라는 클래스의 인스턴스 이름을 obj1 으로 하되, 이 obj1 은 클래스 A의 형세를 갖고 있다는 뜻.
즉, B1 에 있는 method 들이, A의 구조를 따라간다는 뜻으로, A가 갖고 있는, B1 과 A 사이에 겹치는 method 위에만 B1의 내용이 덮어씌워진 것이라고 볼 수 있겠다.
그래서, 클래스 A에는 y() 및 z() method 가 없기 때문에,
obj1 과 obj2 에선 y() z() method 를 쓸 수가 없다!
참고로, class 뿐만 아니라, interface 도 다형성 가능!
아래는 interface 인 I 를 구현한 class C 를 작성한 코드.
class C() 의 인스턴스를 obj 로 만들고, 이 obj 는 I 의 형세를 띔.
I에 설정되어 있는 method 만 구현할 수 있기에, class C 에 있는 dummy() method 는 obj 인스턴스로 사용 불가.
Interface I {
String str(){}
Int int(){}
}
class C implements I {
String str(){return "C.str";}
Int int(){return 100;}
void dummy(){System.out.println("hi");
}
public class Exam02 {
public static void main(String[] args){
I obj = new C();
obj.str(); //C.str 이 출력됨.
obj.int(); //100이 출력됨.
}
}
다형성 관련 예제 3가지
1번째
package com.test.oop;
class Family{
void hello(){
System.out.println("가족들과 인사하고 지냅시다");
}
}
class KimFamily extends Family {
void hello(){
System.out.println("김선생님 안녕하세요?");
}
void dinner(){
System.out.println("같이 식사나 한 번 하시죠");
}
void drink(){
System.out.println("술 한잔 하시죠");
}
}
class ParkFamily extends Family {
void hello(){
System.out.println("박선생님 안녕하세요?");
}
void fishing(){
System.out.println("낚시 한 번 하시죠");
}
}
class ChoiFamily extends Family {
void hello(){
System.out.println("최선생님 안녕하세요?");
}
void meeting(){
System.out.println("가족 모임 한 번 하시죠");
}
}
public class PolymorphismExam {
public static void main(String[] args){
//Upcasting 의 경우는 생성된 인스턴스(Child)의 메소드를 실행 --> 가상메소드
Family f;
f = new KimFamily(); //인스턴스 생성.
f.hello(); //Parent 꺼가 실행이 안되고, Child 꺼만 실행됨.
f = new ParkFamily();
f.hello();
f = new ChoiFamily();
f.hello();
}
}
2번째
package com.test.oop;
class Animal{
public void move(){
System.out.println("동물이 움직입니다.");
}
}
class Human extends Animal{
public void move(){
System.out.println("인간이 움직입니다.");
}
}
class Tiger extends Animal{
public void move(){
System.out.println("호랑이가 움직입니다.");
}
}
class Eagle extends Animal{
public void move(){
System.out.println("독수리가 움직입니다.");
}
}
public class PolymorphismExam02 {
public static void main(String[] args){
PolymorphismExam02 animalTest = new PolymorphismExam02();
animalTest.moveAnimal(new Human()); //인스턴스를 주입. Injection. (생성이 아님)
animalTest.moveAnimal(new Tiger());
animalTest.moveAnimal(new Eagle());
animalTest.moveAnimal(new Animal());
}
public void moveAnimal(Animal animal){ //class 인자 (animal 이라는 인스턴스)를 가지는 method
animal.move();
}
}
3번째
package com.test.oop;
class Animal1{
public void move(){
System.out.println("동물이 움직입니다.");
}
}
class Human1 extends Animal1{
public void move(){
System.out.println("인간이 움직입니다.");
}
}
class Tiger1 extends Animal1{
public void move(){
System.out.println("호랑이가 움직입니다.");
}
}
class Eagle1 extends Animal1{
public void move(){
System.out.println("독수리가 움직입니다.");
}
}
class AnimalMove{
Animal1 animal;
public AnimalMove(Animal1 animal){ //생성자를 통한 인스턴스 주입
this.animal = animal;
animal.move();
}
}
public class PolymorphismExam03 {
public static void main(String[] args){
new AnimalMove(new Human1());
new AnimalMove(new Eagle1());
new AnimalMove(new Tiger1());
new AnimalMove(new Animal1());
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA] 스트림 API 관련! 코드로 알아보기 (0) | 2024.09.02 |
---|---|
[JAVA] Lambda 람다표기법 코드로 알아보기! (0) | 2024.09.02 |
[JAVA] generic class 코드로 이해하기! (1) | 2024.08.30 |
[JAVA] class 와 static, private, 인스턴스 관련 등등. 코드로 이해하기! (0) | 2024.08.30 |
[JAVA] 인스턴스 변수와 클래스 변수 -> 코드 상으로 확인해보자! (0) | 2024.08.29 |