코딩 기록들
[Java Programming] 8.2 다형성 (메소드 오버라이딩) 본문
다형성(Polymorphism)
객체지향프로그래밍의 4가지 특징 중 하나
다형성을 구현하기 위해서는 :
1. 메소드 재정의 , 2. 타입변환 이 필요함
자동타입변환
- 프로그램 실행 도중 자동으로 타입변환이 일어나는것
[ 자동타입변환의 조건 ]
부모타입변수 = 자식타입;
- ex) Animal 부모클래스, cat 자식클래스(Animal 상속받음)가 있다고 가정 할 때,
Cat cat = new Cat(); //Cat클래스로부터 Cat객체 생성하고
Animal animal = cat; //이걸 Animal변수에 대입하면 자동타입변환이 일어남
( Animal animal = new Cat(); 도 가능)
이때, cat == animal 결과 : true (cat과 animal변수는 타입만 다를뿐, 동일한 Cat객체(동일한 참조번지)를 참조하므로)
- 또한, 바로위의 부모가 아니더라도 상속계층에서 상위타입이라면 자동타입변환 일어남
- 부모타입으로 자동 타입 변환이 된 이후에는 부모클래스에 선언된 필드,메소드만 접근이가능함.
-- 예외)메소드가 자식클래스에서 재정의 되어있는 경우 -> 자식클래스의 메소드가 대신호출됨(다형성과 관련)
강제타입변환
- 부모타입을 자식타입으로 변환하는것
- 자식타입이 부모타입으로 자동타입변환 후 다시 자식타입으로 변환될 때 강제타입변환 사용할 수 있음
자식타입 변수 = (자식타입) 부모타입;
- 단, 강제타입변환은 자식타입이 부모타입으로 변환되어있는 상태에서 ' 만' 가능하기때문에, 처음부터 부모타입으로 생성된 객체는 자식타입으로 변환할 수 없음
[ 부모변수가 참조하는 객체가 부모/자식 객체중 어느것인지 확인하는 방법: instanceof 연산자 ]
boolean result = 좌향(객체) instanceof 우향(타입)
- 좌향의 객체가 우향의 인스턴스라면, true 리턴 (아니라면 false 리턴)
메소드 오버라이딩 (=재정의)
- 부모클래스의 메소드를 자식클래스에서 재정의하는것
(private을 제외한 ) super class의 메소드를 sub class에 다시 정의하는것
- @Override 를 작성하지 않아도 메소드 오버라이딩은 정삭동작함(하지만, 미미한 성능하락 발생 하므로 반드시 작성할것)
- 상속된 일부메소드는 자식클래스에서 다시수정해서 사용
메소드 재정의 방법
1. 부모의 메소드와 동일한 시그니처 가짐(리턴타입, 메소드이름, 매개변수목록)
2. 접근제한을 더 강하게 재정의할 수 없음 ex부모 : public & 자식 : default/private로 수정핤없음. 반대는 가능
3. 새로운 예외를 throws 할 수 없음
- 자식클래스에서 부모클래스 메소드 재정의하게되면, 부모클래스의 메소드는 숨겨지고, 재정의된 자식메소드만 사용함
- 예제에서의 super.PrintContact(); -> contact가 가지고있는 print기능을 무시하지않고, 여기에 override 해서 기능을 추가하겠다
final method
- 오버라이딩 불가능
protected
- 상속에의한 오버라이딩도 할 수 있고, 외부에 공개도 안됨
- 하지만, 클래스와 클래스간 상속에는 리스코프원칙 위배될 수 있기때문에 protected 는 잘 안씀
'Java' 카테고리의 다른 글
[Java Programming] 9.2 익명 클래스 (0) | 2024.01.29 |
---|---|
[Java Programming] 9.1 추상화, 인터페이스 (1) | 2024.01.29 |
[Java Programming] 8.1 상속 (2) | 2024.01.26 |
[Java Programming] 7.1 메소드 오버로딩 (1) | 2024.01.26 |
[Java Programming] 7.4 배열 (0) | 2024.01.26 |