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
설명
- Parent p1 = new Parent();
- 객체 생성 및 참조 타입: Parent 클래스 타입의 참조 변수 p1을 선언하고, Parent 클래스의 인스턴스를 생성하여 이를 p1에 할당합니다.
- 해설: 여기서 p1은 Parent 타입의 참조 변수이며, 실제로 가리키는 객체는 Parent 클래스의 인스턴스입니다. 이 참조 변수 p1은 Parent 클래스에 정의된 모든 메서드와 속성에 접근할 수 있습니다.
- Parent p2 = new Child();
- 업캐스팅 및 참조 타입: Parent 클래스 타입의 참조 변수 p2를 선언하고, Child 클래스의 인스턴스를 생성하여 이를 p2에 할당합니다.
- 해설: 여기서 p2는 Parent 타입의 참조 변수이지만, 실제로 가리키는 객체는 Child 클래스의 인스턴스입니다. 이를 업캐스팅이라고 하며, p2는 Parent 클래스에 정의된 메서드와 속성에만 접근할 수 있지만, 메서드 호출 시 오버라이딩된 메서드가 있다면 실제 객체의 클래스(Child)에 정의된 메서드가 호출됩니다.
- 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 |