개발은 재밌어야 한다
article thumbnail
반응형


안좋은 클래스 예시

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;
	}

	...
}
반응형
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!