2023. 3. 6. 15:45γJAVA/Effective JAVA
[μ΄νν°λΈ μλ°] Item20. μΆμν΄λμ€λ³΄λ€ μΈν°νμ΄μ€λ₯Ό μ°μ νλΌ.
[μ΄νν°λΈ μλ°] Item20. μΆμν΄λμ€λ³΄λ€ μΈν°νμ΄μ€λ₯Ό μ°μ νλΌ. (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μμ μκΈ°ν 'μμμ κ³ λ €ν΄ μ€κ³νκ³ λ¬ΈμννλΌ. κ·Έλ μ§ μμλλΌλ©΄ μμμ κΈμ§νλΌ' λ₯Ό λ°λΌμΌ νλ€.
μΈν°νμ΄μ€μ μ μν λν΄νΈ λ©μλλ λ³λμ μΆμ ν΄λμ€λ , 골격 ꡬνμ λ°λμ κ·Έ λμ λ°©μμ μ μ λ¦¬ν΄ λ¬Έμλ‘ λ¨κ²¨μΌ νλ€.
π μ 리
μΌλ°μ μΌλ‘ λ€μ€ ꡬνμ© νμ μΌλ‘λ μΈν°νμ΄μ€κ° κ°μ₯ μ ν©νλ€. 볡μ‘ν μΈν°νμ΄μ€λΌλ©΄ ꡬννλ μκ³ λ₯Ό λμ΄μ£Όλ 골격 ꡬνμ ν¨κ» μ 곡νλ λ°©λ²μ μκ°ν΄λ³΄κΈ°!!
골격 ꡬνμ κ°λ₯ν ν μΈν°νμ΄μ€μ λν΄νΈ λ©μλλ₯Ό μ 곡νμ¬ κ·Έ μΈν°νμ΄μ€λ₯Ό ꡬνν λͺ¨λ κ³³μμ νμ©νλλ‘ νλ κ²μ΄ μ’λ€.