○ 다형성이란?
- '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것. 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 하였다는 것.
기존 클래스의 개념으로 보았을때 인스턴스는 아래와 같이 생성하고 메소드를 호출하였다.
1
2
3
4
5
6
7
8
9
|
public class Test {
public static void main(String[] args) {
Parents p = new Parents();
Son s = new Son();
p.pMethod();
s.sMethod();
}
}
|
cs |
- 각각 Parents 클래스와 Son 클래스의 인스턴스를 생성하여 각각의 참조변수로 해당 클래스의 메소드를 접근한다.
하지만 이때, Son클래스가 Parents클래스를 상속받았을 경우에는 3번 Line 없이,
4번 Line의 'Son s = new Son();' 으로 자식클래스 기반 객체만 생성하여도 부모클래스의 인스턴스가 같이 메모리에 올라가게 된다.
1
2
3
4
5
6
7
8
9
|
public class Test {
public static void main(String[] args) {
Son s = new Son();
s.pMethod();
s.sMethod();
}
}
|
cs |
- 상속관계가 성립되었을 경우, 참조변수 s는 부모클래스 메소드인 pMethod()와 자식클래스 메소드인 sMethod를 모두 접근할 수 있다.
여기까지가 기본 상속의 개념이고, 아래부터는 다형성에 대해 알아보자.
-------------------------------------------------------------------------------------------------------------------
앞서 다형성이란 부모클래스의 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있다고 하였다.
1
2
3
4
5
6
7
8
9
10
|
public class Test {
public static void main(String[] args) {
Parents p = new Son();
p.pMethod();
//p.sMethod();
}
}
|
cs |
- Parents 타입의 참조변수 p로 Son클래스의 인스턴스를 참조하도록 하였다. (업캐스팅)
- 4번 Line을 풀어서 쓰면 아래와 같다.
Son s = new Son(); // 자식클래스 기반 인스턴스를 생성한다.
Parents p; // 부모클래스를 참조하는 참조변수 p를 선언한다.
p = s; // 참조변수 s가 가리키는 곳을 참조변수 p도 가리키게 한다.
// p = (Parents)s; 와 동일한 의미다. 부모가 자식보다 큰 범위이기 때문에 (Parents)를 생략하여 자동형변환이 가능하다.
- 이 때, 참조변수 p의 타입은 Parents이기 때문에 Son클래스가 가지고있는 고유의 sMethod는 접근 불가하다.
- 이렇게 자식클래스의 참조변수 s를 부모클래스 참조변수 p로 변환하는 것을 업캐스팅(up-casting)이라고 한다.
★★★중요★★★
앞서 Son s = new Son(); 으로 인스턴스를 생성하였을 경우에는 pMethod()와 sMethod()에 모두 접근 가능했지만,
Parents p = new Son(); 으로 참조변수 타입을 부모클래스로 지정할 경우에는 자식클래스의 고유멤버에는 접근할 수 없다는 것에 집중하자.
이는 둘다 new Son();으로 같은 타입의 인스턴스지만, 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다는것을 알수 있다.
그렇다면 참조변수 p로는 sMethod()로 접근을 못하는 것일까?
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Test {
public static void main(String[] args) {
Parents p = new Son();
p.pMethod();
//p.sMethod();
((Son)p).sMethod();
}
}
|
cs |
9번 Line 처럼 부모클래스의 참조변수 p를 자식클래스인 Son타입으로 강제형변환한다면 sMethod()로 접근 가능하다.
이를 다운캐스팅(down-casting)이라고 한다.
큰 범위(부모)에서 작은 범위(자식)로는 형변환 생략이 불가하다.
// 4번 Line은 (Parents) 생략이 가능하다.
'스터디 > 개념정리' 카테고리의 다른 글
상속의 기본 개념/클래스 상속/java (0) | 2020.02.15 |
---|---|
메소드 오버로딩과 오버라이딩/java (0) | 2020.02.15 |
배열과 난수/java (0) | 2020.02.11 |