코딩 기록들

[Java Programming] 8.2 다형성 (메소드 오버라이딩) 본문

Java

[Java Programming] 8.2 다형성 (메소드 오버라이딩)

코딩펭귄 2024. 1. 26. 16:50

다형성(Polymorphism)

객체지향프로그래밍의 4가지 특징 중 하나

1. 캡슐화 - 여러 기능을 메소드(캡슐)로 묶어 처리한다.
2. 추상화 - 기능의 정의만 존재하고 구현은 하지 않는다
3. 다형성
- 상속 및 구현 대상(부모클래스) 타입에 포함되는 것을 허가한다. (=IS A 관계가 허용된다)
- , 하나의 타입으로 여러가지 타입을 표현할 수 있다.
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 는 잘 안씀