메소드
자식클래스에 메소드를 정의할 때 가능한 시나리오 3가지는?
1. 부모 클래스의 메소드를 상속 받음
메소드를 재정의하지 않는 이상 접근 권한이 있는 모든 메소드(생성자 제외)는 자동으로 상속됨
(+부모의 private 메소드 같은경우 상속 안, 상속된다해도 사용할 수 없기 때문에 안된다고 생각해도 무방함)
2. 부모 클래스의 메소드를 재정의(override) 함
부모 메소드의 의미와 재정의된 메소드의 의미가 확연하게 다르면 상속으로 모델링하는 것이 적절하지 않음
(*우리는 항상 "부모 클래스의 리모컨으로 처리할 수 있다"를 생각해야돼
3. 부모 클래스에 없는 새 메소드를 정의함
부모가 공통 기능을 제공하지 않거나, 선언도 안 해놓은 메소드를 새로 정의하는 것은 매우 바람직하지 않은 경우 특히 이게 public인 경우 문제가 매우 심각
(=>이런 경우를 가급적 삼가하고 이런 경우가 생길시 부모 클래스를 다시 고민해봐야된다.
가장 이상적인 부모, 자식, 형제의 메소드 관계는?
부모 클래스와 자식 클래스의 공개 메소드 수, 형제 클래스의 공개 메소드 수는 모두 같은 경우가 가장 이상적인 형태임
(=> Subtyping에 문제가 없어야 된다!)
- 예를 들어 자식쪽에서 메소드가 1개 더 많이 가지고 있다하면 부모 클래스의 리모컨으로는 더 가진 메소드를 호출할 수 없다. Subtyping(대체 가능성)에 문제가 생김
@Override : annotation
- 보통의 //, /* */ 같은 주석과는 다르다.
- 용도. 문법 검사를 더 엄격하게 할 수 있도록 컴파일러에 추가 정보를 주는 역할을 함
- 컴파일러가 재정의하는 함수임을 인식하고 문법 검사를 할 수 있음
재정의 규칙 4가지는?
재정의 규칙은 부모 타입의 리모컨으로 자식 객체를 처리할 때 문제가 없어야 된다는 측면을 고려해서 보면 좋다.
규칙 1. 매개변수 목록의 타입은 정확하게 일치해야 함
- 부모 클래스의 메소드와 매개변수 일치하지 않아서 에러
규칙 2. 반환 타입은 더 특수한 타입을 사용할 수 있음
- 부모 메소드에서는 A로 반환 했지만 자식 메소드에서는 B로 반환
규칙 1과 규칙 2는 논리적 측면도 고려해야 된다.
규칙 3. 메소드의 접근 권한은 완화할 수 있어도 더 강화할 수는 없음
- 부모 메소드는 public이라서 사용할 수 있는데 자식 메소드에서 protected 같이 걸면 안되니깐
규칙 4. 부모보다 더 많은 checked 예외를 공표할 수 없음
부모 메소드는 a,b라는 예외를 발생시키는데 자식 메소드에서 a,b,c 예외를 발생시킨다면 부모 리모컨을 사용했을때 기대하지 않는 예외가 있게된다.
멤버 변수
자식클래스에 멤버변수를 정의할 때 가능한 시나리오 2가지는?
1. 부모 클래스의 멤버 변수를 상속 받음
2. 새 멤버 변수를 정의함
새 멤버 변수의 도입이 새 공개 메소드의 도입이 필요하면 바람직하지 않음
메소드와 달리 부모 클래스에 있는 멤버 변수와 같은 이름의 멤버 변수를 정의하면 같은 이름의 멤버 변수가 두개 존재하게 됨 - 문법 검사가 안되더라도 심각한 부작용을 초래하니 조심
- 자바에서는 메소드와 멤버변수의 이름 같아도 괜찮다
예제
열고 닫을 수만 있는 문 클래스가 있을때 잠금장치가 달린 문 클래스를 만들고 싶을때 할 수 있는 방법 3가지는?
- 문 클래스를 수정함
- 문 클래스를 상속받아 잠금 장치가 있는 문을 정의함
Door 라는 클래스의 자식으로 DoorWithoutLock과 DoorWithLock을 정의해서 해결
- 문 객체를 포함관계로 사용하여 잠금장치가 있는 문을 정의함
상속 사용 시 고려 사항 6가지는?
1. is-a 관계가 성립하고 구현하고자 하는 프로그램 내에서 상속을 통해 얻을 수 있는 이점이 충분할 경우에만 상속으로 모델링함
2. 상속은 클래스 간 정적 관계가 맺어지는 것이며, 후손들은 자신이 물려받는 것을 취사선택할 수 없음
- 하위 클래스를 정의할 때 상속받는 모든 메소드에 대한 필요한 조치를 해야 함
3. 형제 클래스 간 차이는 메소드 수의 차이가 아니라 메소드의 내부 내용의 차이만 있는 것이 가장 이상적임
- 객체를 처리할 때에는 상위 추상 타입을 이용하여 처리하는 것이 바람직함
4. 상속 계층도에서 단말 클래스만 객체를 생성하는 것이 바림직함
- 상위 클래스는 하위 타입 객체들을 범용적으로 처리하기 위한 리모컨으로만 사용하는 것이 바림직함
5. 상속에 대해 미리 준비하고 설계한 클래스가 아닐 경우 이를 상속받는 자식 클래스를 정의하기가 어려울 수 있음
6. 클래스 상속의 깊이가 너무 깊으면 불필요한 복잡성이 생길 수 있기 때문에 적당한 수준의 상속 깊이을 사용하여야 함
7. 상속과 포함 관계 중 포함 관계가 더 효과적일 수 있음