📝느낀 점
상속에 대해 '스프링 입문을 위한 자바 객체 지향의 원리와 이해' 라는 책을 읽고 나의 잘못된 생각들을 바로 잡았던 계기가 되었다. 객체 지향의 상속은 일반인들의 생각하는 상속과는 개념이 다르다는 것이다. 솔직히 말하면 이부분에 대해서도 나는 지금까지 상속이니깐 일반인들의 상속을 연상시켜 생각하면 되겠지하며, 일반인들의 상속과 같게 생각하고 있엇던 것 같다. 그렇게 나또한 지금까지 상속 관계를 설명하면 "부모 - 자식 관계"라고 설명하고 다녔다. 하지만 이젠 이렇게 말하고 다니지 않는다. 제대로 된 표현은 "상위 클래스 - 하위 클래스" ,"슈퍼 클래스 - 서브 클래스" 등등 이렇게 말해야 되는 것이다. 부모 - 자식 관계를 생각해보자면 맨위 클래스에 "할아버지" 그 밑에 "아버지" 그밑에 자식이 있다고 생각해보자. 그렇다면 "아버지는 할아버지다?", "아들은 아버지다?", "딸은 아버지다?" 말이 이상하다! 이렇기에 이번 기회에 상속에 대해 자세히 알게 되었다. 자세한 설명은 밑에서 설명 하겠다.
프로그래밍에서의 잘못된 상속 관계!
상속 관계에서 반드시 만족해야 되는 문장
상속이란 이 문장을 만족해야 된다. -> "하위 클래스는 상위 클래스다"
예시들을 보자.
- 아버지는 할아버지다?
- 아들은 아버지다?
- 딸은 아버지다?
이상하고 괴이하다.
자연스럽게 작성해보자면,
- 포유류는 동물이다
- 고래는 포유류이다
- 고래는 동물이다.
“하위 클래스는 상위 클래스이다” 라는 문장은 LSP(리스코프 치환 원칙)을 나타내는 말이다.
코드로 예시
아버지 영희아빠 = new 딸(); // 딸을 낳으니 아버지 역할을 하는 영희아빠라 이름 지었다? -> 이상하다.
동물 뽀로로 = new 펭귄(); // 펭귄을 낳으니 동물 역할을 하는 뽀로로라 이름 지었다. -> 말은 된다.`
상속의 정의
상위클래스의 모든 것이 하위클래스에게 전달되는 것을 뜻한다.
그러나 상위클래스의 멤버변수와 멤버함수 중,
"private" 으로 접근제한이 된 경우에는 하위클래스로 전달이 되지 않는다.
왜 상속을 사용하는 건가요?
상속의 가장 큰 목적은 코드의 재사용이다.
공통적인 부분을 가지고 있는 상위 클래스를 활용해 하위 클래스는 본인의 고유의 상태와 행동을 정의할 수 있다.
코드의 확장성, 재사용성이 용이하고 중복된 코드를 상위 클래스로 빼기 때문에 코드가 간결해진다
결과적으로 유지보수가 쉬워진다.
상속의 장점
- 적은 양의 코드로 새로운 클래스를 작성 가능하다
- 코드를 공통적으로 관리하기 때문에 여러 코드의 추가 및 변경이 용이하다
- 중복을 제거해서 생산성과 쉬운 유지보수성에 크게 기여
상속이 될 땐 메서드만 되는 줄 알았지만, 맴버 변수까지 상속이 되는 것이다.
밑에 코드 처럼 title변수를 불러와 사용 가능하다.
class aaa {
String title;
public void aMethod() {
System.out.println("고고");
}
}
class bbb extends aaa {
String str;
@Override
public void aMethod() {
super.aMethod(); // super란? 부모인 aaa() 메서드를 부른다는 것이다.
// super( )는 자식 클래스의 생성자에서 부모 클래스의 생성자를
// 호출하기 위해서 사용됩니다
}
}
public class JavaTest {
public static void main(String[] args) {
bbb bClass = new bbb();
bClass.title = "상속되었나요";
bClass.str = "자식꺼요";
System.out.println(bClass.title); // title변수 사용 가능.
System.out.println(bClass.str);
bClass.aMethod();
}
}
출력:
상속되었나요
자식꺼요
고고
상속이 갖는 단점들
강한 결합이 강제된다.
- 부모 클래스의 변화가 모든 자식 클래스에 영향을 미치게 된다.
- 코드의 유지보수와 수정을 어렵게 만든다.
- 함부로 변경했다가 자식 클래스에서 쉽게 알아차리기 힘든
- 버그를 만들어낼 수 있는 가능성도 생긴다.
하위 클래스는 선택권이 없다.
- 하위 클래스는 원하든 원하지 않든 부모 클래스의 모든 필드와 메서드를 이어받아야 한다.
- 필요한 필드, 필요한 메서드 외에도 필요 없더라도 모든 메서드와 필드를 상속받아야 한다.
접근자에 대한 제약이 강하게 걸린다.
- 초기에 public 으로 공개해 놨던 필드나 메서드를 이용하는 자식 클래스가
- 여럿 있다면, private 으로 바꿀 필요를 느껴도 바꿀 수 없다.
- 접근자를 더 좁은 범위로 바꾸려면 서브 클래스도 다 같이 바꿔야 되는 경우가 생긴다.
Reference
'Java' 카테고리의 다른 글
생성자를 왜 만들어야 하나요? / 컴파일러는 왜 기본 생성자를 자동으로 생성해 주나요? (0) | 2023.11.06 |
---|---|
DTO를 만들어 두면 무슨 장점이 있나요? (0) | 2023.11.06 |
인터페이스는 상수 필드만 선언이 가능한 이유는? (0) | 2023.11.06 |
왜 모든 클래스는 Object 클래스의 상속을 받을까? (0) | 2023.11.06 |
실행을 위해서 왜 main 메서드가 필요한 것인가요? (0) | 2023.11.06 |