반응형
안좋은 클래스 예시
class Point{
public double x;
public double y;
}
- package-private으로 선언 후에 데이터 접근 제한자는 public 으로 선언한 경우
- 캡슐화의 이점제공 x
- API를 수정하지 않고는 내부 표현을 바꿀 수 없다
- 불변식을 보장하지 않는다
접근자와 변경자(mutator)메서드를 활요해 데이터를 캡슐화 한다.
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = 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; }
}
default 클래스 혹은 private 중첩 클래스의 경우
• public 클래스와 다르게 데이터 필드를 노출해도 크게 문제가 없다
public class TopPoint {
private static class Point {
public double x;
public double y;
}
public Point getPoint() {
Point point = new Point();
point.x = 3.5;
point.y = 4.5;
return point;
}
}
자바 플랫폼 라이브러리에서 public 클래스의 필드를 직접 노출하지 말라는 규칙을 어기는 사례
Dimension.class
- Dimension 클래스의 필드는 가변으로 설계되어 있다.
그렇다면 다음의 결과는?
더보기
width = 10, height= 100
width = 10, height= 100
width = 20, height= 100
반응형
불변필드를 노출한 public 클래스
- public 클래스의 필드가 불변이라면 직접 노출할 때의 단점은 줄어들지만 표현방식을 바꿀 수 없고, 필드를 읽을 때 부수 작업을 수행할 수 없다는 단점이 있다.
- 각 인스턴스가 유효한 시간을 표현함을 보장함
public final class Time {
private static final int HOURS_PER_DAY = 24;
private static final int MINUTES_PER_HOUR = 60;
public final int hour;
public final int minute;
public Time(int hour, int minute) {
if (hour < 0 || hour > HOURS_PER_DAY) {
throw new IllegalArgumentException("시간: " + hour);
}
if (minute < 0 || minute > MINUTES_PER_HOUR) {
throw new IllegalArgumentException("분: " + minute);
}
this.hour = hour;
this.minute = minute;
}
...
}
안좋은 클래스 예시
class Point{
public double x;
public double y;
}
- package-private으로 선언 후에 데이터 접근 제한자는 public 으로 선언한 경우
- 캡슐화의 이점제공 x
- API를 수정하지 않고는 내부 표현을 바꿀 수 없다
- 불변식을 보장하지 않는다
접근자와 변경자(mutator)메서드를 활요해 데이터를 캡슐화 한다.
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = 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; }
}
default 클래스 혹은 private 중첩 클래스의 경우
• public 클래스와 다르게 데이터 필드를 노출해도 크게 문제가 없다
public class TopPoint {
private static class Point {
public double x;
public double y;
}
public Point getPoint() {
Point point = new Point();
point.x = 3.5;
point.y = 4.5;
return point;
}
}
자바 플랫폼 라이브러리에서 public 클래스의 필드를 직접 노출하지 말라는 규칙을 어기는 사례
Dimension.class
- Dimension 클래스의 필드는 가변으로 설계되어 있다.
그렇다면 다음의 결과는?
정답
width = 10, height= 100
width = 10, height= 100
width = 20, height= 100
불변필드를 노출한 public 클래스
- public 클래스의 필드가 불변이라면 직접 노출할 때의 단점은 줄어들지만 표현방식을 바꿀 수 없고, 필드를 읽을 때 부수 작업을 수행할 수 없다는 단점이 있다.
- 각 인스턴스가 유효한 시간을 표현함을 보장함
public final class Time {
private static final int HOURS_PER_DAY = 24;
private static final int MINUTES_PER_HOUR = 60;
public final int hour;
public final int minute;
public Time(int hour, int minute) {
if (hour < 0 || hour > HOURS_PER_DAY) {
throw new IllegalArgumentException("시간: " + hour);
}
if (minute < 0 || minute > MINUTES_PER_HOUR) {
throw new IllegalArgumentException("분: " + minute);
}
this.hour = hour;
this.minute = minute;
}
...
}
안좋은 클래스 예시
class Point{
public double x;
public double y;
}
- package-private으로 선언 후에 데이터 접근 제한자는 public 으로 선언한 경우
- 캡슐화의 이점제공 x
- API를 수정하지 않고는 내부 표현을 바꿀 수 없다
- 불변식을 보장하지 않는다
접근자와 변경자(mutator)메서드를 활요해 데이터를 캡슐화 한다.
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = 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; }
}
default 클래스 혹은 private 중첩 클래스의 경우
• public 클래스와 다르게 데이터 필드를 노출해도 크게 문제가 없다
public class TopPoint {
private static class Point {
public double x;
public double y;
}
public Point getPoint() {
Point point = new Point();
point.x = 3.5;
point.y = 4.5;
return point;
}
}
자바 플랫폼 라이브러리에서 public 클래스의 필드를 직접 노출하지 말라는 규칙을 어기는 사례
Dimension.class
- Dimension 클래스의 필드는 가변으로 설계되어 있다.
그렇다면 다음의 결과는?
width = 10, height= 100
width = 10, height= 100
width = 20, height= 100
불변필드를 노출한 public 클래스
- public 클래스의 필드가 불변이라면 직접 노출할 때의 단점은 줄어들지만 표현방식을 바꿀 수 없고, 필드를 읽을 때 부수 작업을 수행할 수 없다는 단점이 있다.
- 각 인스턴스가 유효한 시간을 표현함을 보장함
public final class Time {
private static final int HOURS_PER_DAY = 24;
private static final int MINUTES_PER_HOUR = 60;
public final int hour;
public final int minute;
public Time(int hour, int minute) {
if (hour < 0 || hour > HOURS_PER_DAY) {
throw new IllegalArgumentException("시간: " + hour);
}
if (minute < 0 || minute > MINUTES_PER_HOUR) {
throw new IllegalArgumentException("분: " + minute);
}
this.hour = hour;
this.minute = minute;
}
...
}
반응형
'JAVA > 이펙티브자바' 카테고리의 다른 글
이펙티브자바 Item17. 변경 가능성을 최소화 하라 (0) | 2024.10.07 |
---|---|
이펙티브자바 Item15. 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2024.10.07 |
이펙티브자바 Item2. 생성자에 매개변수가 많다면 빌더를 고려하라 (1) | 2024.02.18 |