[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item16. public ν΄λž˜μŠ€μ—μ„œλŠ” public ν•„λ“œκ°€ μ•„λ‹Œ λ©”μ„œμ¦ˆ μ ‘κ·Όμžλ₯Ό μ‚¬μš©ν•˜λΌ.

2023. 2. 27. 11:36ㆍJAVA/Effective JAVA

728x90

 

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item16. public ν΄λž˜μŠ€μ—μ„œλŠ” public ν•„λ“œκ°€ μ•„λ‹Œ λ©”μ„œλ“œ μ ‘κ·Όμžλ₯Ό μ‚¬μš©ν•˜λΌ. 

 

public class Point
{
   public double x;
   public double y;
   
   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 10;
      point.y = 20;
   }
}

μœ„μ— μ˜ˆμ‹œμ²˜λŸΌ public ν΄λž˜μŠ€μ—μ„œ public ν•„λ“œλ₯Ό 톡해 μ‚¬μš©ν•œλ‹€λ©΄ 데이터 ν•„λ“œμ— 직접 μ ‘κ·Όν•  수 μžˆμ–΄ μΊ‘μŠν™”μ˜ 이점을 μ œκ³΅ν•˜μ§€ λͺ»ν•œλ‹€. 

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item15. ν΄λž˜μŠ€μ™€ λ©€λ²„μ˜ μ ‘κ·Ό κΆŒν•œμ„ μ΅œμ†Œν™”ν•˜λΌ. (tistory.com)

 

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item15. ν΄λž˜μŠ€μ™€ λ©€λ²„μ˜ μ ‘κ·Ό κΆŒν•œμ„ μ΅œμ†Œν™”ν•˜λΌ.

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item15. ν΄λž˜μŠ€λ‚˜ λ©€λ²„μ˜ μ ‘κ·Ό κΆŒν•œμ„ μ΅œμ†Œν™”ν•˜λΌ. https://www.inflearn.com/course/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-2/dashboard μ΄νŽ™ν‹°λΈŒ μžλ°” μ™„λ²½ 곡랡 2λΆ€ - μΈν”„λŸ° | κ°•μ˜ μžλ°”

hyejin.tistory.com

-> μΊ‘μŠν™”μ˜ 이점은 μ—¬κΈ°μ„œ 확인할 수 μžˆλ‹€. 

 

데이터 ν•„λ“œμ— 직접 μ ‘κ·Όν•˜κ²Œ 되면 APIλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λŠ” λ‚΄λΆ€ ν‘œν˜„μ„ λ°”κΏ€ 수 μ—†κ³ , λΆˆλ³€μ‹μ„ 보μž₯ν•  수 μ—†μœΌλ©°, μ™ΈλΆ€μ—μ„œ ν•„λ“œμ— μ ‘κ·Όν•  λ•Œ λΆ€μˆ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  μˆ˜λ„ μ—†λ‹€. 

 

 

public 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 setY(double y)
   {
      this.y = y;
   }
   
   public void setX(double x)
   {
      // λΆ€κ°€ μž‘μ—… κ°€λŠ₯
      this.x = x;
   }
}

λ”°λΌμ„œ ν•„λ“œ 접근을 public ν•„λ“œκ°€ μ•„λ‹Œ λ©”μ„œλ“œ μ ‘κ·Όμžλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. ν•„λ“œλ₯Ό λͺ¨λ‘ private둜 λ³€κ²½ν•˜κ³  public μ ‘κ·Όμž(getter) μΆ”κ°€!! 

 

νŒ¨ν‚€μ§€ λ°”κΉ₯μ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” 클래슀라면 μ ‘κ·Όμžλ₯Ό μ œκ³΅ν•¨μœΌλ‘œμ¨ 클래슀 λ‚΄λΆ€ ν‘œν˜„ 방식을 μ–Έμ œλ“  λ°”κΏ€ 수 μžˆλŠ” μœ μ—°μ„±μ„ 얻을 수 μžˆλ‹€. 

public ν΄λž˜μŠ€κ°€ ν•„λ“œλ₯Ό κ³΅κ°œν–ˆλ”λΌλ©΄ 이λ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μƒκ²¨μ„œ λ‚΄λΆ€ ν‘œν˜„ 방식을 λ§ˆμŒλŒ€λ‘œ λ°”κΏ€ 수 μ—†κ²Œ 되기 λ•Œλ¬Έμ΄λ‹€. 

 

 

❗ μ±…μ—μ„œλŠ” package-private 클래슀 ν˜Ήμ€ private 쀑첩 클래슀라면 데이터 ν•„λ“œλ₯Ό λ…ΈμΆœν•œλ‹€ 해도 ν•˜λ“±μ˜ λ¬Έμ œκ°€ μ—†λ‹€κ³ λŠ” ν•œλ‹€. 

ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œκ°€ 이 클래슀 λ‚΄λΆ€ ν‘œν˜„μ— λ¬Άμ΄κΈ°λŠ” ν•˜κ² μ§€λ§Œ, ν΄λΌμ΄μ–ΈνŠΈλ„ μ–΄μ°¨ν”Ό 이 클래슀λ₯Ό ν¬ν•¨ν•˜λŠ” νŒ¨ν‚€μ§€ μ•ˆμ—μ„œλ§Œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. ν•˜μ§€λ§Œ κ°•μ˜λ₯Ό 듀을 λ•Œ κ°•μ‚¬λ‹˜μ€ package-private 클래슀라고 ν•˜λ”λΌλ„ private 둜 ν•„λ“œλ₯Ό μ ‘κ·ΌκΆŒν•œμ„ μ£Όκ³ , λ©”μ„œλ“œ μ ‘κ·Όμžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 쒋을 것이라고 ν–ˆκ³ , λ‚΄ 생각에도 λ©”μ„œλ“œ μ ‘κ·Όμžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 μ’‹κ² λ‹€κ³  μƒκ°ν–ˆλ‹€. 그리고 κ·Έλ ‡κ²Œ μ‚¬μš©ν•˜κ³  μžˆμ—ˆκΈ°λ„ ν•˜κ³ .. ! 

 

 

 

πŸ’‘ μžλ°” ν”Œλž«νΌ λΌμ΄λΈŒλŸ¬λ¦¬μ—λ„ public 클래슀의 ν•„λ“œλ₯Ό 직접 λ…ΈμΆœν•˜μ§€ λ§λΌλŠ” κ·œμΉ™μ„ μ–΄κΈ°λŠ” 사둀가 μžˆλ‹€. 

λŒ€ν‘œμ μΈ μ˜ˆλ‘œλŠ” java.awt.package νŒ¨ν‚€μ§€μ˜ Dimension ν΄λž˜μŠ€κ°€ μžˆλ‹€. 

Dimension 클래슀λ₯Ό 보면 width, heightλ₯Ό 직접 λ…ΈμΆœν•˜κ³  있고, 이둜 μΈν•œ μ‹¬κ°ν•œ μ„±λŠ₯ λ¬Έμ œλŠ” μ˜€λŠ˜λ‚ κΉŒμ§€λ„ ν•΄κ²°λ˜μ§€ λͺ»ν–ˆλ‹€κ³  ν•œλ‹€.... 

 

public static void main(String[] args)
{
   Button button = new Button("Hello Button");
   button.setBounds(0, 0, 20, 10);
   
   Dimension size = button.getSize();
   System.out.println("size.height = " + size.height);
   System.out.println("size.height = " + size.height);
   
   doSomething(size);
}

μ΄λ ‡κ²Œ size.height, size.width에 직접 μ ‘κ·Όν•  수 μžˆλŠ”λ°.. 예λ₯Ό λ“€μ–΄ doSomethng()μ΄λΌλŠ” λ©”μ„œλ“œλ₯Ό μˆ˜ν–‰ν•˜κ³  λ‚œ ν›„ κ·Έ λ‹€μŒ width와 height의 크기가 μ–Έμ œ μ–΄λ””μ„œ λ³€κ²½λ˜μ—ˆμ„μ§€ μ˜ˆμΈ‘ν•˜κΈ° νž˜λ“€μ–΄μ§€λ©° μ½”λ“œκ°€ λΆˆμ•ˆν•΄μ§€κ³ ,

private static void doSomething(Dimension size)
{
   // 값을 copy ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. -> 근데 ν•œλ²ˆμœΌλ‘œ μ„±λŠ₯ μ €ν•˜κ°€ μΌμ–΄λ‚˜μ§€λŠ” μ•Šκ² μ§€λ§Œ..μ΄λ ‡κ²Œ copyν•˜λŠ” μžμ²΄κ°€ λΆˆνŽΈν•˜λ‹€!!
   Dimension dimension = new Dimension();
   dimension.width = size.width;
   dimension.height = size.height;
}

λ”°λΌμ„œ μœ„μ™€ 같이 값을 copyν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”λ° 이게 λΆˆν•„μš”ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” μž‘μ—…μ΄κΈ° λ•Œλ¬Έμ— ν•œλ²ˆ 정도 copyν•΄μ„œ μ‚¬μš©ν•˜λŠ”κ±΄ μ„±λŠ₯ 문제둜 μ–΄μ΄μ§€μ§€λŠ” μ•Šκ² μ§€λ§Œ.. 수백만번? μ΄λ ‡κ²Œ ν˜ΈμΆœν•˜κ²Œ λœλ‹€λ©΄... μ„±λŠ₯μƒμ˜ μ‹¬κ°ν•œ 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλ‹€. 

근데 μ„±λŠ₯ 문제 뿐만 μ•„λ‹ˆλΌ μ΄λ ‡κ²Œ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³ .. λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•˜λŠ”κ²ƒ μžμ²΄κ°€ λΆˆνŽΈν•˜λ‹€!! 

 

 

 

public class Time
{
   private static final int HOURS_PER_DAY = 24;
   private static final int MINUTES_PER_HOUR = 60;
   
   // public 클래슀의 ν•„λ“œκ°€ λΆˆλ³€μ΄λΌλ©΄ 직접 λ…ΈμΆœν•  λ•Œ 단점이 쑰금 μ€„μ–΄λ“€μ§€λ§Œ 이게 쒋은 생각은 μ•„λ‹ˆλ‹€.
   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: " + hour);
      }
      
      if (minute < 0 || minute >= MINUTES_PER_HOUR) {
         throw new IllegalArgumentException("Min : " + minute);
      }
      this.hour = hour;
      this.minute = minute;
   }
}

hour, minute처럼 public 클래슀의 ν•„λ“œκ°€ λΆˆλ³€μ΄λΌλ©΄ 직접 λ…ΈμΆœν•  λ•Œμ˜ 단점이 쑰금 μ€„μ–΄λ“€μ§€λ§Œ μ΄λ ‡κ²Œ μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ μ—¬μ „νžˆ 쒋은 생각은 μ•„λ‹ˆλ‹€. 

μ™œλƒν•˜λ©΄ APIλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ λŠ” ν‘œν˜„λ°©μ‹μ„ λ°”κΏ€ 수 μ—†κ³ , ν•„λ“œλ₯Ό 읽을 λ•Œ λΆ€μˆ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μ—†λ‹€λŠ” 단점은 μ—¬μ „ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 

 

 

 

 

πŸ“š 정리 

 

Public ν΄λž˜μŠ€λŠ” μ ˆλŒ€ κ°€λ³€ ν•„λ“œλ₯Ό 직접 λ…ΈμΆœν•΄μ„œλŠ” μ•ˆλœλ‹€.

λΆˆλ³€ ν•„λ“œλΌλ©΄ λ…ΈμΆœν•΄λ„ 덜 μœ„ν—˜ν•˜μ§€λ§Œ μ™„μ „νžˆ μ•ˆμ‹¬ν•  μˆ˜λŠ” μ—†λ‹€. 

 

 

 

 

 

 

 

 

 

728x90