# 관련 포스팅
- 상속 : https://young0105.tistory.com/42
다형성 (Polymorphism)
- 하나의 코드 형태가 다양한 자료형으로 구현되어 실행될 수 있음
(자료형을 다양한 형태로 바라볼 수 있음)
→ 같은 코드에서 여러 실행 결과가 나타남
- 하나의 타입에 여러 객체를 대입할 수 있게 하여, 다양한 형태로 동작하게 함
→ 부모 타입으로 자식 객체를 참조할 수 있게 함
or 같은 인터페이스를 구현하는 여러 객체를 같은 타입으로 참조할 수 있게 함
- 객체지향 프로그래밍의 큰 특징 중 하나
- [장점]
i. 유연성
ii. 확장성
: 새로운 하위 클래스를 추가하더라도, 기존의 코드를 변경하지 않고 사용할 수 있음
iii. 재사용성 및 유지보수성
: 한 가지 타입의 변수/메서드를 사용하여 다양한 객체와 상호 작용할 수 있음
iv. 추상화
: 어떤 클래스가 어떻게 구현되었는지보다, 무엇을 하는지에 더 집중할 수 있게 함
→ 코드의 가독성 및 이해도 향상
# 상속 관계에서의 다형성
- 자식 클래스는 부모 클래스를 확장한 형태임
→ '자식 클래스'는 '부모 클래스'라고 할 수 있음 ex) '호랑이'는 '동물'이다
(반대로 '부모 클래스'는 '자식 클래스'라고 할 수 없음)
→ 자식 클래스는 자신의 클래스로도 볼 수 있고, 부모 클래스로도 볼 수 있음
- 메서드 선언 시 매개변수로 부모 클래스를 기입한 경우, 자식 클래스도 매개변수로 입력될 수 있음
// 인스턴스화 : 메모리에 로드하는 것
부모클래스 참조변수 = new 자식클래스();
// 메서드 선언 시 매개변수에 부모 클래스를 입력
public void 메서드명(부모클래스 매개변수) {
// 매개변수 자리에 자식 클래스 객체가 들어가도 정상 작동
코드;
// this를 사용하면 매개변수에 들어온 자식 클래스 객체를 가리킴
}
- 다형성을 사용하더라도 실제 기능은 초기화된 객체(자식 클래스)의 메서드를 우선적으로 따름
(존재하지 않는다면 부모 클래스의 메서드로)
- 부모 클래스에서는 공통적인 부분을 제공하고, 자식 클래스에서는 각 클래스에 맞는 기능 구현
- 여러 클래스를 하나의 상위 클래스로 다룰 수 있음
배열에서의 다형성 활용
- 같은 부모 클래스를 가진, 연관된 자료형들을 배열에 모아서 관리할 수 있음
// 예시 //
Animal animalH = new Human();
Animal animalT = new Tiger();
// Animal을 부모 클래스로 갖는 자식 클래스 객체들을 배열에 할당 가능
Animal[] arrayAnimal = new Animal[10];
arrayAnimal[0] = animalH;
arrayAnimal[1] = animalT;
참조형 형 변환 (Reference Type Casting)
- 상속 관계에서, 부모 클래스와 자식 클래스 간의 형 변환
# 업 캐스팅
부모클래스 참조변수 = new 자식클래스();
// ex) Fruit fruit1 = new Banana();
- 부모 클래스 타입으로 변수를 선언하고, 자식 클래스의 생성자로 인스턴스를 생성함
- 해당 참조변수는 자식 클래스의 멤버변수에 접근할 수 없음
: 컴파일 시점에는 컴파일러가 앞에 선언된 타입(부모 클래스)만 확인하기 때문임
→ 다운 캐스팅 필요
# 다운 캐스팅
((자식클래스) 참조변수).멤버변수 // ex) ((Banana) fruit1).origin
- 부모 클래스의 참조를 자식 클래스의 참조로 변환하는 과정
- 업 캐스팅된 참조변수에 대해, 지금은 '자식 클래스'로 사용하겠다고 컴파일러에게 명시함
- 자식 클래스에 정의된 메서드나 멤버변수를 사용하기 위해 수행됨
- 강제 형 변환과 유사함 : https://young0105.tistory.com/9
'Java > Base' 카테고리의 다른 글
[Java] final 키워드 (0) | 2023.02.11 |
---|---|
[Java] 문자열 자료형 (String) (0) | 2023.02.10 |
[Java] 상속 관계와 메서드 오버라이드 (0) | 2023.02.09 |
[Java] 배열 (0) | 2023.02.09 |
[Java] static 키워드 (0) | 2023.02.09 |