본문 바로가기
Effective JAVA 2판

Effective Java Item14 public 클래스 안에는 public 필드를 두지말고 접근자(accessor) 메소드를 사용한라

by BroBroBro 2015. 5. 5.

------------------------------------------------

본글은 Effective JAVA 2판의 책의 내용을 토대로 작성하였으며
지극히 주관적인 사항들이 많이 있으므로 가려서 읽으시기바랍니다.
잘못된 내용이 있거나 의견이 있으시다면 언제든 댓글로^^~!

------------------------------------------------

CHAPTER 4 클래스와 인터페이스

4장에서는 클래스와 인터페이스를 설계할때 이용할 수 있는 강력한 요소들을 많이 갖추고 있다고 한다. 

[Item 13] 클래스와 그 멤버의 접근 권한을 최소화하자 부터 보도록 하자 

Item14 public 클래스 안에는 public 필드를 두지말고 접근자(accessor) 메소드를 사용한라
Item15 변경 기능성을 최소화 하라 
Item16 계승하는 대신 구성하라
Item17 계승을 위한 설계와 문서를 갖추거나, 그럴 수 없다면 계승을 금지하라
Item18 추상 클래스 대신 인터페이스를 사용하라
Item19 인터페이스는 자료형을 정의할 때만 사용하라
Item20 태그 달린 클래스 대신 클래스 계층을 활용하라
Item21 전략을 표현하고 싶을 때는 함수 객체를 사용하라
Item22 멤버 클래스는 가능하면 static으로 선언하라.

--pageX GuideLine가 될것입니다.

길게 설명할것이 없는 14장이다.  아래와 같은 쓰래기 코드를 만들지 말자고한다....
(우리는 예제를 작성할때 곧잘 만들었지 않는가? )

1
2
3
4
class Point {
  public double x;
  public double y;
}
cs

이것은 우리가 13장에서 봤듯이 캡슐화의 이점을 누릴수가 없다.

그래서 private필드와 public접근자 메서드(getter)로 바꿔야 마땅하다. 변경이 가능한 클래스라면 수정자(mutator) 메서드(setter)도 제공해야 하겠죠?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Point {
  private double x;
  private double y;
 
  public Point(double x, double y) {
    this.x = x;
    this.y = y;
  }
 
  public double getX() {    return x;  }
  public double getY() {    return y;  }
  public void setX(double x) {    this.x = x;  }
  public void setY(double y) {    this.y = y;  }
}
cs

흠...책에는 내용이 조금더 있지만 아직은 몰라도 될것 같다...
(package-private클래스나 private중첩 클래스(nested class)는 데이터 필드를 공개하더라도 잘못이라 말할 수 없다.)

이클립스를 사용한다면 상단메뉴의 Source - Generate Getters and Setters... 를 누르면 자동생성이 되겠죠?