개발/Java

☕️Java:: 다형성(polymorphism)

hyuunii 2024. 2. 11. 12:23
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가 나오는 것.