반응형
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)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

Java/이펙티브 자바

이펙티브 자바, 쉽게 정리하기 - item 15. 클래스와 멤버의 접근 권한을 최소화하라

2022. 1. 1. 18:35

이펙티브 자바, 쉽게 정리하기 - item 15. 클래스와 멤버의 접근 권한을 최소화하라

잘 설계된 컴포넌트의 기준

  • 내부 데이터와 내부 구현 정보를 외부로부터 얼마나 잘 숨겼느냐가 중요하다.
    • 정보은닉, 캡슐화라고 한다.
    • 시스템을 구성하는 컴포넌트를 독립시켜 개발, 테스트, 최적화, 적용, 분석, 수정이 개별적으로 가능해야 한다.

정보 은닉의 장점

  • 컴포넌트간 의존성이 없어서 독립적으로 병렬로 개발 가능하기 때문에, 시스템 개발 속도가 높아진다.
  • 컴포넌트별 디버깅이 가능하기 때문에, 시스템 관리 비용이 낮아진다.
  • 컴포넌트별 최적화가 가능하기 때문에, 성능 최적화 하기가 쉽다.
  • 컴포넌트간 의존성이 없기 때문에, 어디든 넣어 재사용 가능하다.
  • 컴포넌트별 테스트가 가능하기 때문에, 큰 시스템의 제작 난이도를 낮춰준다.

컴포넌트간 의존성을 없애는 것의 핵심은 접근 제한자이다.

정보 은닉의 기본 원칙

  • 모든 클래스와 멤버의 접근 제한자를 가능한 가장 낮은 접근 수준으로 유지해야 한다.

멤버에 적용 가능한 접근 수준

  • private: 멤버를 선언한 톱레벨 클래스에서만 접근 가능
  • package-private: 멤버가 소속된 패키지 안의 모든 클래스에서 접근 가능
  • protected: package-private이 가지는 접근 범위 + 상속받은 하위 클래스에서도 접근 가능
  • public: 모든 곳에서 접근 가능

접근 제어자 관리 방법

  • 공개할 API를 세심히 설계한 후 그 외의 모든 멤버는 private으로 설정한다.
  • 다른 클래스가 접근해야 하는 멤버에 한해 package-private으로 풀어줄 수 있다.
  • 권한을 풀어줘야 하는 일이 잦다면, 다른 클래스가 하나 더 만들어져야 하는 것은 아닌지 생각해보자.
  • private과 package-private 멤버는 모두 해당 클래스 내부 구현에 해당하므로 공개 API에 영향을 주지 않는다.
  • 만일 private, package-private 외에 protected로 풀어준다면, 그 멤버는 API로서 계속 제공되어야 하기 때문에 신중해야 한다.
    • 이러한 이유로 protected, public의 수는 정말 최소화해야 한다.

Serialize 인터페이스를 구현하게 되면, 필드들이 의도치 않게 공개 API가 될 수 있으므로 주의해야 한다.

테스트를 위해 접근 범위를 넓히지 않도록 주의하라

  • 테스트를 위해 필드를 public으로 만들지 마라
    • 테스트 코드를 테스트 대상과 같은 패키지에 두면 package-private 요소에 접근 가능하다.

정보은닉을 위한 클래스 설계 시 몇가지 주의점

  • public 클래스의 인스턴스 필드는 되도록 public이 아니어야 한다.
    • public 가변 필드를 갖는 클래스는 일반적으로 thread-safe하지 않다.
  • public 접근자인데 필드가 final이며, 불변 객체를 참조한다고 해서 안심하면 안된다.
    • 리팩토링할 때 이미 이 클래스를 다른 클래스가 사용중이라면 public 필드는 함부로 없애지 못한다는 사실을 인지하자.
  • 배열은 public final로 제공하더라도, 배열 내용을 변경할 수 있음에 유의하자.
    • public static final Thing[] VALUES = { ... };
      • 사용자는 이 배열의 내용을 변경할 수 있다.
    • 배열을 public으로 공개하고 싶다면, 아래 코드처럼 작성하면 된다.
private static final Thing[] VALUES = { ... };
public static final List<Thing> VALUES = // 사용자는 값 확인이 가능하다.
  Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
public static final Thing[] values() { // 사용자는 값의 복사본 객체를 받을 수 있다.
  return PRIVATE_VALUES.clone(); // 배열을 복사할 때는 `clone()`이 유용하다.
}

값의 확인을 원하는지 복사를 원하는지에 따라 위의 코드처럼 구현하면 될 것이다.

자바의 모듈 개념

  • 자바 내부에 module-info.java 파일을 보면 자신이 속하는 패키지 중 공개할 것을 정하는 부분을 볼 수 있다.
module com.jenkov.mymodule {
    exports com.jenkov.mymodule;
    exports com.jenkov.mymodule.util;
}
  • 위와 같이 공개할 패키지를 정하면, 공개하지 않은 패키지는 아무리 public 접근 제어자를 갖는 멤버가 있더라도 접근 불가능하다.
  • 모듈에 적용하는 접근 수준은 상당히 주의해서 사용해야 한다.
    • 모듈의 JAR 파일을 자신의 모듈 경로가 아닌 애플리케이션의 클래스패스(class-path)에 두면 그 모듈 안의 모든 패키지는 마치 모듈이 없는 것처럼 행동한다.
    • 즉, 모듈이 공개했는지 여부와 상관없이 public, protected 멤버를 모듈 밖에서도 접근 가능하게 된다.
    • 모듈은 아직 널리 받아들여질지 확실하지 않은 개념이다. 꼭 필요한 경우가 아니라면 사용하지 말자.

핵심

  • 접근제한자는 가능한 최소로 주자.
  • 꼭 필요한 것만 골라 최소한의 public API를 설계하는 편이 좋다.
  • 멤버가 의도치 않게 API로 공개되는 일이 없도록 하자.
  • public 클래스는 상수용 public static final 필드 외에 어떠한 public 필드도 가져선 안된다.
  • public static final 필드가 참조하는 객체가 불변인지 확인하라.
반응형
저작자표시 (새창열림)

'Java > 이펙티브 자바' 카테고리의 다른 글

이펙티브 자바, 쉽게 정리하기 - item 17. 변경 가능성을 최소화하라  (0) 2022.01.03
이펙티브 자바, 쉽게 정리하기 - item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라  (0) 2022.01.01
이펙티브 자바, 쉽게 정리하기 - item 14. Comparable을 구현할지 고려하라  (0) 2022.01.01
이펙티브 자바, 쉽게 정리하기 - item 13. clone 재정의는 주의해서 진행하라  (0) 2021.12.30
이펙티브 자바, 쉽게 정리하기 - item 12. toString을 항상 재정의하라  (0) 2021.12.30
    'Java/이펙티브 자바' 카테고리의 다른 글
    • 이펙티브 자바, 쉽게 정리하기 - item 17. 변경 가능성을 최소화하라
    • 이펙티브 자바, 쉽게 정리하기 - item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
    • 이펙티브 자바, 쉽게 정리하기 - item 14. Comparable을 구현할지 고려하라
    • 이펙티브 자바, 쉽게 정리하기 - item 13. clone 재정의는 주의해서 진행하라
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바