반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • pnpm
  • item7
  • serverless computing
  • item8
  • 자바
  • try-with-resources
  • 메이븐 페이즈
  • 외래키 제약조건
  • 자바스크립트 면접
  • 자바스크립트 인터뷰
  • 알고리즘
  • 프로그래머의 뇌
  • Next.js
  • 자바스크립트
  • 자바 검증
  • 싱글톤 패턴
  • Pre-rendering
  • next js app
  • 토비의 스프링
  • prerendering
  • 빈 검증
  • rust
  • Java
  • Javadoc 자바독 자바주석 주석 Comment
  • 슬로우 쿼리
  • 이펙티브 자바 item9
  • item9
  • 디자인패턴
  • 추상 팩터리 패턴
  • 플라이웨이트패턴
  • 참조 해제
  • 작업기억공간
  • 도커공식문서
  • bean Validation
  • 자바 디자인패턴
  • 러스트
  • 팩터리 메서드 패턴
  • 메이븐 골
  • 이펙티브 자바
  • 스프링 검증
  • 서버리스 컴퓨팅
  • 느린 쿼리
  • 싱글톤
  • 객체복사
  • 싱글턴
  • MSSQL
  • 자료구조
  • NEXT JS
  • 이펙티브자바
  • 메이븐 라이프사이클

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

Java/자바 잡지식

자바에서 상속이 갖는 단점들

2023. 2. 22. 23:56

상속이 갖는 단점들

  • 상속은 객체지향 프로그래밍의 핵심 기능이지만, 몇가지 단점을 가지고 있다.
  • 그래서 일반적으로는 합성(composition)을 사용하는 것이 권장된다.

강한 결합이 강제된다.

  • 부모 클래스의 소스 코드를 그대로 내려받을 수 있다는 장점이 있지만, 그만큼 자식 클래스가 많아졌을 때 부모 클래스의 소스코드 변경이 힘들다는 말도 된다.
    • 부모 클래스의 변화가 모든 자식 클래스에 영향을 미치게 된다.
    • 변경하려면 자식 클래스의 구현들이 제대로 돌아갈 수 있을지 테스트를 많이 거쳐야 한다.
    • 코드의 유지보수와 수정을 어렵게 만든다.
    • 함부로 변경했다가 자식 클래스에서 쉽게 알아차리기 힘든 미묘한 버그를 만들어낼 수 있는 가능성도 생긴다.

접근자에 대한 제약이 강하게 걸린다.

  • 초기에 public 으로 공개해놨던 필드나 메서드를 이용하는 자식 클래스가 여럿 있다면, private 으로 바꿀 필요를 느껴도 바꿀 수 없다.
  • 접근자를 더 좁은 범위로 바꾸려면 서브 클래스도 다 같이 바꿔야 되는 경우가 생긴다.

정적인 코드가 된다.

  • 합성(Composition)은 의존성 주입과 같이 런타임에 관계를 결정할 수 있는 반면, 상속은 정적인 컴파일 타임에 이미 관계가 결정되어 있다.
  • 변화에 취약하고 더 딱딱한 코드가 된다.

캡슐화와 은닉을 깨뜨릴 수 있다.

  • 상위 클래스의 구현을 전부 알고있거나, 모른다면 살펴봐야 하위 클래스를 구현할 수 있다.
  • 상위 클래스의 구현을 숨기고 싶어도 숨기기 어렵다.

복잡한 구조를 갖게 된다.

  • 상속을 2~3 번 이상 반복하면, 계속 계층 구조를 따라다녀야 한다.
    • 정해진 메서드를 구현하기만 하면 되는 인터페이스 방식이나 클래스 사용 방식과 대비된다.
  • 매 상속마다 자식 클래스는 모든 계층에 존재하는 부모의 필드, 메서드를 이어받기 때문에 상속을 여러번 받다보면 매우 복잡해진다.
    • 서브클래스의 정체성을 알기 위해 모든 부모 클래스를 다 살펴봐야 한다.

하위 클래스에서 동작을 100% 확신할 수는 없다.

  • 부모 클래스는 정확히 부모 클래스의 상황에 맞춰 코드가 구현된 것이라 자식 클래스에서 부모 클래스와 같은 코드를 사용한다고 해서 100% 동작한다는 확신은 없다.

하위 클래스는 선택권이 없다.

  • 하위 클래스는 원하든 원하지 않든 부모 클래스의 모든 필드와 메서드를 이어받아야 한다.
  • 필요한 필드, 필요한 메서드 외에도 필요 없더라도 모든 메서드와 필드를 상속받아야 한다.

상속은 딱 한번만 가능하다.

  • 자바에서 클래스 상속은 딱 하나의 클래스만 상속 가능하기 때문에 신중하게 상속해야 한다.
  • 합성 패턴은 몇개든 원하는 클래스를 이용할 수 있는 점과 대비된다.

상속이 적절한 경우는?

  • 보통 자식 클래스로 부모 클래스를 완전히 대체할 수 있는 경우에만 유효하다.

레퍼런스

https://incheol-jung.gitbook.io/docs/q-and-a/architecture/undefined-2

반응형
저작자표시 비영리 (새창열림)

'Java > 자바 잡지식' 카테고리의 다른 글

자바 함수형 인터페이스 혹은 람다 인터페이스란?  (0) 2023.03.29
Java Stream API 에서 평가 (evaluation) 란?  (0) 2023.03.28
로컬과 운영 환경의 log4j 나누기  (0) 2022.12.28
ObjectMapper (Jackson) 커스텀 직렬화 역직렬화 구현  (0) 2022.05.23
자바 8 이상에서 날짜 올바르게 다루기  (0) 2022.05.19
    'Java/자바 잡지식' 카테고리의 다른 글
    • 자바 함수형 인터페이스 혹은 람다 인터페이스란?
    • Java Stream API 에서 평가 (evaluation) 란?
    • 로컬과 운영 환경의 log4j 나누기
    • ObjectMapper (Jackson) 커스텀 직렬화 역직렬화 구현
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바