package algorithm;

public class ex2 {

	public static void main(String[] args) {
		
        //"Parent" 클래스 타입의 참조 변수 "p1"을 선언하고 "Parent" 클래스의 인스턴스를 생성하여 이것을 "p1"에 할당한다" 
		Parent p1 = new Parent(); 
        
        //업캐스팅
		Parent p2 = new Child(); 
        
        //"Child" 클래스 타입의 참조 변수 "c1"을 선언하고 "Child" 클래스의 인스턴스를 생성하여 이것을 "c1"에 할당한다" 
		Child c1 = new Child(); 

		p1.print();
		p2.print();
		c1.print();
		
		
		System.out.println(p1.getB(2)); 
		System.out.println(p2.getB(2)); 
		System.out.println(c1.getB(2)); 
		
		//System.out.println(p1.getB()); //자식클래스가 오버로드한 메소드에는 접근하지못함
		//System.out.println(p2.getB()); //업캐스팅의 경우에도 자식클래스가 오버로드한 메소드에 접근하지못함
		System.out.println(c1.getB()); 
	}

}

class Parent {
	int x=3, y=3;

	void print() {
		System.out.println("Parent");
	}

	
	int getB(int n) {
		return n * n;
	}
}

class Child extends Parent {

	int x=1, y=1;

	//오버라이딩
	void print() {
		System.out.println("Child");
	}

	
	//오버로드
	int getB() {
		return x + x;
	}

}
//결과

Parent
Child
Child
4
4
4
2

설명

  1. Parent p1 = new Parent();
    • 객체 생성 및 참조 타입: Parent 클래스 타입의 참조 변수 p1을 선언하고, Parent 클래스의 인스턴스를 생성하여 이를 p1에 할당합니다.
    • 해설: 여기서 p1은 Parent 타입의 참조 변수이며, 실제로 가리키는 객체는 Parent 클래스의 인스턴스입니다. 이 참조 변수 p1은 Parent 클래스에 정의된 모든 메서드와 속성에 접근할 수 있습니다.
  2. Parent p2 = new Child();
    • 업캐스팅 및 참조 타입: Parent 클래스 타입의 참조 변수 p2를 선언하고, Child 클래스의 인스턴스를 생성하여 이를 p2에 할당합니다.
    • 해설: 여기서 p2는 Parent 타입의 참조 변수이지만, 실제로 가리키는 객체는 Child 클래스의 인스턴스입니다. 이를 업캐스팅이라고 하며, p2는 Parent 클래스에 정의된 메서드와 속성에만 접근할 수 있지만, 메서드 호출 시 오버라이딩된 메서드가 있다면 실제 객체의 클래스(Child)에 정의된 메서드가 호출됩니다.
  3. Child c1 = new Child();
    • 객체 생성 및 참조 타입: Child 클래스 타입의 참조 변수 c1을 선언하고, Child 클래스의 인스턴스를 생성하여 이를 c1에 할당합니다.
    • 해설: 여기서 c1은 Child 타입의 참조 변수이며, 실제로 가리키는 객체는 Child 클래스의 인스턴스입니다. 이 참조 변수 c1은 Child 클래스와 그 부모 클래스인 Parent 클래스에 정의된 모든 메서드와 속성에 접근할 수 있습니다. 이 경우, c1은 Child 클래스의 메서드뿐만 아니라, 부모 클래스인 Parent 클래스에서 상속된 메서드도 사용할 수 있습니다.

요약

  • Parent p1 = new Parent();: p1은 Parent 타입의 참조 변수로 Parent 클래스의 인스턴스를 가리킵니다.
  • Parent p2 = new Child();: p2는 Parent 타입의 참조 변수로 Child 클래스의 인스턴스를 가리킵니다. 이는 업캐스팅된 형태입니다.
  • Child c1 = new Child();: c1은 Child 타입의 참조 변수로 Child 클래스의 인스턴스를 가리킵니다.

이와 같이 각 변수는 해당 타입의 참조 변수이며, 가리키는 객체의 타입에 따라 접근할 수 있는 메서드와 속성이 달라집니다.

 

 

아래는 접근가능한 메소드를 나타낸 표이다.

 

  자식이 오버라이딩한 메소드 부모 클래스의 메소드 자식이 오버로딩한 메소드
Parent p1 = new Parent(); x o x(오류)
Parent p2 = new Child();
(업캐스팅)
o o x(오류)
Child c1 = new Child(); o o o