티스토리 뷰
다형성(Polomorphism)이란 자바의 객체지향 프로그래밍의 네 가지 기둥 중 하나이자,
객체지향 프로그래밍에서 가장 중요하다고 할 수 있는 부분이다.
자바에서 다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미한다.
자바 프로그래밍에서 다형성이란 한 타입의 참조변수를 통해 여러 타입의 객체를 참조할 수 있도록 만든 것이며,
더 직관적으로 보자면 상위 클래스 타입의 참조변수를 통해 하위 클래스의 객체를 참조할 수 있도록 허용된 것이라 할 수 있다.
도대체 무슨 말인지 잘 감이 오지 않는데, 다음의 쉬운 예를 보자.
//참조변수의 다형성 예시
class Friend {
public void friendInfo() {
System.out.println("나는 당신의 친구입니다.");
}
}
class BoyFriend extends Friend {
public void friendInfo() {
System.out.println("나는 당신의 남자친구입니다.");
}
}
class GirlFriend extends Friend {
public void friendInfo() {
System.out.println("나는 당신의 여자친구입니다.");
}
}
public class FriendTest {
public static void main(String[] args) {
Friend friend = new Friend(); // 객체 타입과 참조변수 타입의 일치
BoyFriend boyfriend = new BoyFriend();
Friend girlfriend = new GirlFriend(); // 객체 타입과 참조변수 타입의 불일치
friend.friendInfo();
boyfriend.friendInfo();
girlfriend.friendInfo();
}
}
// 출력 결과
나는 당신의 친구입니다.
나는 당신의 남자친구입니다.
나는 당신의 여자친구입니다.
이전까지의 글에서 객체를 생성할 때 객체의 타입과 참조변수 타입을 일치시켜 왔다.
위의 예에서 friend 객체와 boyfriend 객체가 그 예라고 할 수 있다.
그런데 그 다음 라인에선 GirlFriend 클래스의 객체를 생성하고 Friend 타입의 참조변수 girlfriend에 할당하고 있다.
원래대로라면 타입을 일치시키기 위해 GirlFriend를 참조변수의 타입으로 지정해주어야 하지만
그러지 않고 상위 클래스 Friend를 참조변수의 타입으로 지정해준 것이다.
이 경우, 상위 클래스를 참조변수의 타입으로 지정했기 때문에 참조변수가 사용할 수 있는 멤버의 개수는 상위 클래스의 멤버의 수가 된다.
이것이 앞서 정의했던 상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조하는 것이자 다형성의 핵심이다.
다음으로 기억해두어야 할 사실은 상위 클래스의 타입으로 하위 클래스 타입의 객체를 참조하는 것은 가능하지만,
그 반대는 불가능하다는 점이 있다.
다음의 예를 보자.
public class FriendTest {
public static void main(String[] args) {
Friend friend = new Friend(); // 객체 타입과 참조변수 타입의 일치 -> 가능
BoyFriend boyfriend = new BoyFriend();
Friend girlfriend = new GirlFriend(); // 객체 타입과 참조변수 타입의 불일치 -> 가능
// GirlFriend friend1 = new Friend(); -> 하위클래스 타입으로 상위클래스 객체 참조 -> 불가능
friend.friendInfo();
boyfriend.friendInfo();
girlfriend.friendInfo();
}
}
Friend 타입으로 하위 클래스 GirlFriend를 참조하는 것은 가능하지만,
하위 클래스 GirlFriend로 상위 클래스 Friend 타입을 참조하는 것은 불가능함을 볼 수 있다.
이는 Friend 타입의 참조변수보다 GirlFriend타입의 참조변수의 멤버가 더 많기 때문인데,
멤버를 줄이는 것은 가능해도 늘리는 것은 구현되어있지 않기 때문이라고 한다.
또한, 앞에서 살펴봤던 오버로딩과 오버라이딩도 다형성의 한 예시라 할 수 있는데
둘 다 같은 이름의 메서드를 재사용/덮어쓰기로 사용하기 때문에 글 처음에 언급했던
하나의 객체가 여러가지 타입을 가질 수 있는 것이라는 다형성의 정의에 부합하기 때문이다.
'Java+Spring > Java' 카테고리의 다른 글
[Java]추상화, abstract 제어자, 추상 클래스 (0) | 2022.07.15 |
---|---|
[Java]다형성의 활용 예제 (0) | 2022.07.15 |
[Java]참조 변수의 타입 변환 / instanceof 연산자 (0) | 2022.07.15 |
[Java]Getter/Setter 메서드 (0) | 2022.07.15 |
[Java]접근 제어자(Access Modifier) (0) | 2022.07.15 |
[Java]캡슐화(Encapsulation), 패키지(Package) (0) | 2022.07.15 |
- Total
- Today
- Yesterday
- 세계일주
- 면접 준비
- RX100M5
- Algorithm
- 세계여행
- java
- 여행
- 지지
- 리스트
- 동적계획법
- 칼이사
- spring
- 스트림
- 기술면접
- 세모
- Python
- BOJ
- 알고리즘
- 파이썬
- 중남미
- 유럽
- 백준
- 맛집
- Backjoon
- 자바
- 남미
- 유럽여행
- 야경
- a6000
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |