반응형
타진
개발 그라운드
타진
전체 방문자
오늘
어제
  • 분류 전체보기 (136)
    • 프로그래밍 (65)
      • Java (28)
      • Android (1)
      • Web (19)
      • Web-Spring (12)
      • R (5)
      • Angular (0)
    • 운영체제 (17)
      • Linux (14)
      • Docker(vmware) (3)
    • 클라우드 (4)
      • aws (0)
      • aws_handson (4)
    • 개발문제해결 (25)
      • Exception (12)
      • 알고리즘 문제풀이 (13)
    • 그 외 개발관련 (23)
    • 일상 (1)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • vmmem
  • stackset
  • transit gateway peering
  • docker ps
  • jdk14
  • GIT
  • 키보드매핑
  • wsl_update_x64
  • docker
  • handson
  • github actions
  • 4700u
  • alt tab
  • wsl2
  • Github CLI
  • AWS
  • 빠른 시작 켜기
  • angular cli
  • transit_gateway
  • 빠른 시작 끄기
  • ubuntu terminal
  • cfn
  • 라이젠
  • 문법 체크
  • 정올알고리즘 정올 알고리즘
  • 일어키보드
  • github
  • chromium edge
  • 크로미움 엣지
  • docker desktop

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
타진
프로그래밍/Java

이펙티브 자바 규칙 15 - 변경 가능성을 최소화하라

프로그래밍/Java

이펙티브 자바 규칙 15 - 변경 가능성을 최소화하라

2018. 2. 12. 22:00
반응형



자바의 클래스는 변경가능한 클래스와 변경 불가능한 클래스로 나눌 수 있습니다.


final 선언자가 큰 역할을 하죠.


EFJ15에서는 이 변경 불가능한(immutable) 클래스의 이점에 대해 설명하면서, 


특별한 이유가 없을 때에는 되도록 변경이 불가능 하도록 설정하라고 권하고 있습니다.


먼저 변경 불가능한 클래스를 만들 때 지켜야할 5규칙입니다.



1. 객체 상태를 변경하는 메소드(Setter 등)를 제공하지 않는다.


2. 계승할 수 없도록 한다.(상속 불가)

하위 클래스로 인해 변경될 가능성을 차단합니다.


3. 모든 필드를 final로 선언한다.

시스템상으로 강제해 의도를 분명히 합니다.


4. 모든 필드를 private로 선언한다.

클라이언트가 객체를 직접 수정하는 일을 막습니다.


5. 변경 컴포넌트에 대한 독점적 접근권을 보장한다.

클라이언트는 클래스에 포함된 변경 가능 객체에 대한 참조를 획득할 수 없어야합니다.






다음으로 변경 불가능한 클래스의 장점입니다.


1. 변경 불가능 객체는 단순합니다.

    생성될 때에 한가지 값만 가지기 때문입니다. 반면 변경 가능한 객체의 상태는 

   세세한 명세나 기술이 없으면 안정적으로 사용되기 힘듭니다.


2. 변경 불가능한 객체는 어떠한 동기화도 필요없고, 스레드에 안전합니다.

    스레드 처리중인 객체의 내부값이 돌발적으로 변화하거나, 의도하지 않았더라도 수정되는 시도가 생기면

   스레드 자체가 붕괴할 위험이 있습니다. 변경 불가능이라는 특성이 이러한 점을 예방해줍니다.


3. 변경 불가능한 객체는 자유롭게 공유가 가능합니다.

    private로 설정해 숨기려는 이유는 변경을 불가능하게 함입니다. 안정성을 위해 개방으로 인한 활용성을 희생하는 것이죠.

   하지만 변경이 불가능하다는 확인이 있다면 public static final 처럼 선언하여 자유롭게 공유하여, 활용할 수 있습니다.


4. 방어적 복사본을 만들 필요가 없습니다.


5. 변경 불가능한 객체는 그 내부도 공유할 수 있습니다.


6. 변경 불가능한 객체는 다른 객체의 구성요소로도 좋습니다.

    대표적으로 map과 set이 있습니다. key값을 매번 변화하는 값으로 지정할 수는 없겠지요.



유일한 단점은 값마다 별도의 객체를 생성해야 해서

자원소모가 있다는 점입니다.


작은 객체라면 상관없지만, BigInteger 처럼 큰 값을 다루는 객체라면


한비트의 변화많으로도 객체를 새로 생성해야해서 많은 자원이 소모됩니다.






왠지 이번 주제는 알 것 같으면서도, 모르는 내용이 많아서 설명을 못한 부분이 많네요..






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

'프로그래밍 > Java' 카테고리의 다른 글

이펙티브 자바 규칙 16 - 계승하는 대신 구성하라  (0) 2018.02.14
디자인 패턴 - 프록시 패턴(Proxy pattern)  (0) 2018.02.12
디자인 패턴 - 데코레이터 패턴(Decorator Pattern)  (0) 2018.02.12
    '프로그래밍/Java' 카테고리의 다른 글
    • 이펙티브 자바 규칙 17 - 계승을 위한 문서를 갖추거나, 그럴 수 없다면 금지하자
    • 이펙티브 자바 규칙 16 - 계승하는 대신 구성하라
    • 디자인 패턴 - 프록시 패턴(Proxy pattern)
    • 디자인 패턴 - 데코레이터 패턴(Decorator Pattern)
    타진
    타진
    vulnerable1324@gmail.com

    티스토리툴바

    개인정보

    • 티스토리 홈
    • 포럼
    • 로그인

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.