4장 클래스와 인터페이스
이펙티브 자바를 TDD, Clean Code 과정을 수강하면서 들으니 이해가 잘되면서 잘 읽힌다❗
클래스와 멤버의 접근 권한을 최소화
ㅋㅋㅋㅋㅋㅋㅋㅋ 어제 Clean Code 과정에서 뼈저리게 겪었다...
랜덤값 부터 시작해서 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 차이는 클래스 내부 데이터를 각각 다른 외부 컴포넌트로부터 얼마나 추상화 하였는가가 결정 짓는다.
잘 설계되었다면 구현부, API를 깔끔하게 분리할 수 있다.
MVC 패턴만 사용했어 분리하는게 조금 어려웠다. 그런데 진도 나가면서 점점 발전하는것 같다. 😁
이 챕터에서는 정보 은닉(캡슐화) 의 장점에 대해 설명하고 있다.
- 시스템 개발 속도를 높인다.
- 여러 컴포넌트를 병렬로 개발 가능하기 때문
- 시스템 관리 비용을 낮춘다.
- 다른 컴포넌트로 교체하는 부담이 적어진다.
- 성능을 높여주진 않지만, 성능 최적화에는 도움을 준다.
- 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화할 수 있음.
- 소프트웨어 재사용성을 높인다.
- 큰 시스템을 제작하는 난이도를 갖춰준다.
접근 제어자(private, public, protected)
접근 제어자를 잘 써야한다.
사실 이제껏 private
, public
두개만 사용했지 protected
는 활용 빈도가 지극히 낮았던게 나의 코드였다.
여기서 말하는 원칙을 준수하려면 모든 클래스와 멤버의 접근성을 가능한 좁혀야 한다.
접근 범위가 좁은 순서
private
: 멤버를 선언한 가장 바깥의 클래스에서만 접근 가능package-private
: 멤버가 소속된 패키지 안의 모든 클래스에서 접근할 수 있다.- 접근 제한자를 명시하지 않았을 때 적용되는 접근 수준(
interface
는 public)
- 접근 제한자를 명시하지 않았을 때 적용되는 접근 수준(
protected
:package-private
의 접근 범위를 포함하며 상속받는 하위 클래스에서도 접근할 수 있다.public
: 그냥 다 접근 가능
근데 나는 여기중에서 package-private
를 쓰지않고 도메인을 더 분리하여 일급 컬렉션을 사용하면서 호출하는식으로 관리하는 것이 더 좋을 것 같다는 생각.
결국 public
을 많이 사용하면 할수록 점점 코드가 뚱뚱해진다.
🤷♂️ 그렇다는건 또 분리를 해야한다는 것 ❗❗❗
접근 제어자 범위를 늘릴 때,
테스트를 하기 위해서 접근 제어자의 범위를 늘려주는 것은 하나의 방법이 될 수 있겠지만
인터페이스를 사용해서 값을 할당하는 strategy
패턴을 고려하는게 좋다고 생각한다.
이것도 뼈저리게 느낀 이번챕터..
public
클래스의 인스턴스 필드는 되도록 public
이 아니어야 한다.
public 가변 필드를 갖는 클래스라면 스레드 안전하지 않다. 그 클래스는 이 필드를 통제할 통솔력이 없다. 밖에서도 참조가 가능하기 때문에 불변을 보장할 수도 없다.
상당히 좋지 않은 방식... 그래서 DTO를 사용할 때 다 private로 기본 가져가는것이 이유중 하나일 수 있다.
이 책에서는 상수용public static final
외에는 public 필드를 가져서 안된다고 하는데 내가 생각할때는 이 마저도 남용할 수 있는 우려가 있기 때문에 private
로 바꿔서 해당 클래스에서만 사용하게 해야 좋은 것 같다. 사용 빈도가 많다면 Enum
을 만들어서 상수를 관리하자.
public 클래스에서는 public 필드 말고 접근제어자 메소드를 사용
이것이 dto에서 쓰는 기본 원칙이다.
class Class {
public int x;
public int y;
}
이러면
class Main {
public static void main(String[] args) {
Class class = new Class();
class.x = 1;
}
}
데이터에 직접 위의 코드처럼 할당이 가능해서 캡슐화의 이점을 사용할 수 없다.
그래서 필드를 private
변경하고 get, set 메서드를 사용한다.
class Class {
private int x;
private int y;
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
}
이렇게 말이다.
불변 필드를 노출하게 되면 원하는 데이터가 정형화되어 나올 수 있는 환경이 파괴되기 때문에 접근제어자를 고민하면서 구현하자❗
'Java' 카테고리의 다른 글
[Java] 데이터타입, 변수, 배열 (0) | 2022.08.06 |
---|---|
JVM (0) | 2022.08.06 |
TDD Clean Code with Java 12기 3주차 (0) | 2022.08.06 |
TDD Clean Code with Java 12기 2주차 피드백 (0) | 2022.08.06 |