[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item20. μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ. (μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 골격 skeletal 클래슀)

2023. 3. 6. 15:45ㆍJAVA/Effective JAVA

728x90

 

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item20. μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ. 

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item20. μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ. (tistory.com)

 

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item20. μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ.

[μ΄νŽ™ν‹°λΈŒ μžλ°”] Item20. μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜λΌ. μžλ°”κ°€ μ œκ³΅ν•˜λŠ” 닀쀑 κ΅¬ν˜„ λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œλŠ” μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€ μ΄λ ‡κ²Œ 두가지가 μžˆλ‹€. μžλ°” 8λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€λ„ λ””ν΄νŠΈ

hyejin.tistory.com

λ¨Όμ € 좔상 ν΄λž˜μŠ€λ³΄λ‹€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ ν•˜κΈ° μœ„ν•΄ μΈν„°νŽ˜μ΄μŠ€μ˜ μž₯점에 λŒ€ν•΄μ„œ κ³΅λΆ€ν–ˆλ‹€. 

 

 

그런데 이제 μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 골격(skeltal implementation) 클래슀λ₯Ό ν•¨κ»˜ μ œκ³΅ν•˜λŠ” μ‹μœΌλ‘œ μΈν„°νŽ˜μ΄μŠ€μ™€ 좔상 클래슀의 μž₯점을 λͺ¨λ‘ μ·¨ν•˜λŠ” 방법도 μžˆλ‹€. 

-> μΈν„°νŽ˜μ΄μŠ€λ‘œλŠ” νƒ€μž…μ„ μ •μ˜ν•˜κ³ , ν•„μš”ν•˜λ©΄ λ””ν΄νŠΈ λ©”μ„œλ“œ λͺ‡κ°œλ„ ν•¨κ»˜ μ œκ³΅ν•œλ‹€. 그리고 골격 κ΅¬ν˜„ ν΄λž˜μŠ€λŠ” λ‚˜λ¨Έμ§€ λ©”μ„œλ“œλ“€κΉŒμ§€ κ΅¬ν˜„ν•œλ‹€. 

-> μ΄λ ‡κ²Œ 해두면 λ‹¨μˆœνžˆ 골격 κ΅¬ν˜„μ„ ν™•μž₯ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° ν•„μš”ν•œ 일이 λŒ€λΆ€λΆ„ μ™„λ£Œν•œλ‹€. 

-> 이게 λ°”λ‘œ ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄μ΄λ‹€..! 

 

 

public class IntArrays
{
   static List<Integer> initArrayList(int[] a)
   {
      Objects.requireNonNull(a);
      
      return new AbstractList<>()
      {
         @Override
         public Integer get(int index)
         {
            return a[index];
         }
         
         @Override
         public Integer set(int index, Integer element)
         {
            int oldVal = a[index];
            a[index] = element;
            return oldVal;
         }
         
         @Override
         public int size()
         {
            return a.length;
         }
      };
   }
   
   public static void main(String[] args)
   {
      int[] a = new int[10];
      for (int i = 0; i< a.length; i++)
      {
         a[i] = i;
      }
      
      List<Integer> list = new ArrayList<>();
      Collections.shuffle(list);
      System.out.println("list = " + list);
   }
}

이 ν΄λž˜μŠ€λŠ” 골격 κ΅¬ν˜„μ„ μ‚¬μš©ν•΄μ„œ μ™„μ„±ν•œ κ΅¬μ²΄ν΄λž˜μŠ€μ΄λ‹€. 

골격 κ΅¬ν˜„ 크래슀의 μž₯점은 좔상 클래슀처럼 κ΅¬ν˜„μ„ λ„μ™€μ£ΌλŠ” λ™μ‹œμ— 좔상 클래슀둜 νƒ€μž…μ„ μ •μ˜ν•  λ•Œ λ”°λΌμ˜€λŠ” μ‹¬κ°ν•œ μ œμ•½μ—μ„œλŠ” μžμœ λ‘­λ‹€λŠ” 점이닀. 

 

 

ꡬ쑰상 골격 κ΅¬ν˜„μ„ ν™•μž₯ν•˜μ§€ λͺ»ν•˜λŠ” 상황이라면 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 직접 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. 

그리고 골격 κ΅¬ν˜„ 클래슀λ₯Ό 우회적으둜 μ΄μš©ν•  μˆ˜λ„ μžˆλ‹€. 

public abstract class AbstractCat
{
   protected abstract String sound();
   
   protected abstract String name();
}
public class MyCat extends AbstractCat implements Flyable
{
   private MyFlyable myFlyable = new MyFlyable();
   
   @Override
   protected String sound()
   {
      return "My cat sound is noise";
   }
   
   @Override
   protected String name()
   {
      return "My cat name is λ‚­λ§Œκ³ μ–‘μ΄";
   }
   
   public static void main(String[] args)
   {
      MyCat myCat = new MyCat();
      System.out.println("myCat.sound() = " + myCat.sound());
      System.out.println("myCat.name() = " + myCat.name());
      myCat.fly();
   }
   
   @Override
   public void fly()
   {
      this.myFlyable.fly();
   }
   
   private class MyFlyable extends AbstractFlyable
   {
      @Override
      public void fly()
      {
         System.out.println("MyFlyable~~~~~~~!!!!!!!!!!");
      }
   }
   
}
public interface Flyable
{
   void fly();
}
public class AbstractFlyable implements Flyable
{
   @Override
   public void fly()
   {
      System.out.println("fly~~~~~~!!!");
   }
}

μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν¬λž˜μŠ€μ—μ„œ ν•΄λ‹Ή 골격 κ΅¬ν˜„μ„ ν™•μž₯ν•œ private λ‚΄λΆ€ 클래슀λ₯Ό μ •μ˜ν•˜κ³ , 각 λ©”μ„œλ“œ ν˜ΈμΆœμ„ λ‚΄λΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€μ— μ „λ‹¬ν•˜λŠ” 것이닀. 

 

 

- 골격 κ΅¬ν˜„ μž‘μ„± 방법

λ¨Όμ € μΈν„°νŽ˜μ΄μŠ€λ₯Ό 잘 μ‚΄νŽ΄ λ‹€λ₯Έ λ©”μ„œλ“œλ“€μ˜ κ΅¬ν˜„μ— μ‚¬μš©λ˜λŠ” 기반 λ©”μ„œλ“œλ“€μ„ μ„ μ •ν•œλ‹€. 

-> 이 기반 λ©”μ„œλ“œλ“€μ€ 이제 골격 κ΅¬ν˜„μ—μ„œλŠ” 좔상 λ©”μ„œλ“œκ°€ 될 것이닀. 

-> 기반 λ©”μ„œλ“œλ“€μ„ μ‚¬μš©ν•΄ 직접 κ΅¬ν˜„ν•  수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό λͺ¨λ‘ λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ μ œκ³΅ν•œλ‹€. 

 

λ§Œμ•½ μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ„œλ“œ λͺ¨λ‘κ°€ 기반 λ©”μ„œλ“œμ™€ λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ λœλ‹€λ©΄ 골격 κ΅¬ν˜„ 클래슀λ₯Ό λ³„λ„λ‘œ λ§Œλ“€ μ΄μœ λŠ” μ—†λ‹€. 

기반 λ©”μ„œλ“œλ‚˜ λ””ν΄νŠΈ λ©”μ„œλ“œλ‘œ λ§Œλ“€μ§€ λͺ»ν•œ λ©”μ„œλ“œκ°€ λ‚¨μ•„μžˆλ‹€λ©΄ 이 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 골격 κ΅¬ν˜„ 클래슀λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄ 남은 λ©”μ„œλ“œλ“€μ„ μž‘μ„±ν•΄ λ„£λŠ”λ‹€. 

 

 

πŸ’‘ 

골격 κ΅¬ν˜„μ€ 기본적으둜 μƒμ†ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 것을 κ°€μ •ν•˜κ³  있기 λ•Œλ¬Έμ— item19μ—μ„œ μ–˜κΈ°ν•œ '상속을 κ³ λ €ν•΄ μ„€κ³„ν•˜κ³  λ¬Έμ„œν™”ν•˜λΌ. 그렇지 μ•Šμ•˜λ”λΌλ©΄ 상속을 κΈˆμ§€ν•˜λΌ' λ₯Ό 따라야 ν•œλ‹€. 

μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜ν•œ λ””ν΄νŠΈ λ©”μ„œλ“œλ“  λ³„λ„μ˜ 좔상 ν΄λž˜μŠ€λ“ , 골격 κ΅¬ν˜„μ€ λ°˜λ“œμ‹œ κ·Έ λ™μž‘ 방식을 잘 정리해 λ¬Έμ„œλ‘œ 남겨야 ν•œλ‹€. 

 

 

 

πŸ“š 정리

일반적으둜 닀쀑 κ΅¬ν˜„μš© νƒ€μž…μœΌλ‘œλŠ” μΈν„°νŽ˜μ΄μŠ€κ°€ κ°€μž₯ μ ν•©ν•˜λ‹€. λ³΅μž‘ν•œ μΈν„°νŽ˜μ΄μŠ€λΌλ©΄ κ΅¬ν˜„ν•˜λŠ” 수고λ₯Ό λœμ–΄μ£ΌλŠ” 골격 κ΅¬ν˜„μ„ ν•¨κ»˜ μ œκ³΅ν•˜λŠ” 방법을 생각해보기!! 

골격 κ΅¬ν˜„μ€ κ°€λŠ₯ν•œ ν•œ μΈν„°νŽ˜μ΄μŠ€μ˜ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜μ—¬ κ·Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ λͺ¨λ“  κ³³μ—μ„œ ν™œμš©ν•˜λ„λ‘ ν•˜λŠ” 것이 μ’‹λ‹€. 

 

 

 

 

https://velog.io/@alkwen0996/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-%EC%95%84%EC%9D%B4%ED%85%9C20-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4%EB%B3%B4%EB%8B%A4%EB%8A%94-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%A5%BC-%EC%9A%B0%EC%84%A0%EC%8B%9C%ED%95%98%EB%9D%BC

 

[μ΄νŽ™ν‹°λΈŒ μžλ°”] μ•„μ΄ν…œ20 | μΆ”μƒν΄λž˜μŠ€λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μš°μ„ μ‹œν•˜λΌ

μžλ°” 제곡 닀쀑 κ΅¬ν˜„ λ©”μ»€λ‹ˆμ¦˜ μžλ°”κ°€ μ œκ³΅ν•˜λŠ” λ‹€μ€‘κ΅¬ν˜„ λ©”μ»€λ‹ˆμ¦˜μ€ μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€ 두가지닀. μžλ°”8λΆ€ν„° μΈν„°νŽ˜μ΄μŠ€λ„ λ””ν΄νŠΈ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•  수 μžˆκ²Œλ˜μ–΄, 이제 두 λ©”μ»€λ‹ˆμ¦˜ λͺ¨λ‘

velog.io

 

 

 

 

 

 

 

 

 

 

 

 

728x90