Skip to content

Latest commit

Β 

History

History
87 lines (67 loc) Β· 3.63 KB

File metadata and controls

87 lines (67 loc) Β· 3.63 KB

μ–΄λŒ‘ν„°λž€?

μ–΄λŒ‘ν„°(Adapter)λŠ” μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œ, μ„œλ‘œ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§„ ν΄λž˜μŠ€λ“€μ΄ ν•¨κ»˜ λ™μž‘ν•  수 μžˆλ„λ‘ λ³€ν™˜ν•΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€. 즉, κΈ°μ‘΄ 클래슀의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.

이 νŒ¨ν„΄μ€ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§„ ν΄λž˜μŠ€λ“€μ΄ ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ€‘κ°„μ—μ„œ λ³€ν™˜ μž‘μ—…μ„ μ²˜λ¦¬ν•΄μ£ΌλŠ” μΌμ’…μ˜ "λ³€ν™˜κΈ°" 역할을 ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μžλ°”μ—μ„œλŠ” 특히 μ»¬λ ‰μ…˜, 슀트림, λ°°μ—΄ 등을 λ³€ν™˜ν•  λ•Œ μ–΄λŒ‘ν„° νŒ¨ν„΄μ„ 자주 μ‚¬μš©ν•©λ‹ˆλ‹€.

μ–΄λŒ‘ν„° νŒ¨ν„΄μ˜ μ‚¬μš© λͺ©μ :

  1. ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ—°κ²°ν•˜μ—¬ κΈ°μ‘΄ μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•  수 있게 ν•©λ‹ˆλ‹€.
  2. μž¬μ‚¬μš©μ„±μ„ 높이기 μœ„ν•΄, κΈ°μ‘΄ 클래슀λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ ν™œμš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

μ˜ˆμ‹œλ‘œ μ„€λͺ…ν•œ μ½”λ“œμ—μ„œ μ–΄λŒ‘ν„°μ˜ μ—­ν• :

static List<Integer> intArrayAsList(int[] a) {
    return new AbstractList<>() {
        @Override
        public Integer get(int i) {
            return a[i]; // int λ°°μ—΄μ˜ 값을 Integer둜 λ³€ν™˜ν•˜μ—¬ 제곡
        }

        @Override
        public Integer set(int i, Integer val) {
            int oldVal = a[i];
            a[i] = val; // Integer 값을 int 배열에 μ €μž₯
            return oldVal;
        }

        @Override
        public int size() {
            return a.length; // λ°°μ—΄μ˜ 크기λ₯Ό 리슀트의 크기둜 λ°˜ν™˜
        }
    };
}

이 μ½”λ“œλŠ” int[] 배열을 λ°›μ•„ List<Integer>둜 λ³€ν™˜ν•΄μ€λ‹ˆλ‹€. 즉, 배열을 리슀트처럼 λ‹€λ£° 수 μžˆλ„λ‘ λ³€ν™˜ν•˜λŠ” μ–΄λŒ‘ν„° 역할을 ν•©λ‹ˆλ‹€.

  • int[] 배열은 κΈ°λ³Έ μžλ£Œν˜•μ„ μ‚¬μš©ν•˜κ³ , 리슀트(List)λŠ” μ œλ„€λ¦­ νƒ€μž…μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • 이 두 κ°€μ§€λŠ” ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μžλ£Œκ΅¬μ‘°μ΄λ―€λ‘œ, μ–΄λŒ‘ν„° νŒ¨ν„΄μ„ 톡해 배열을 리슀트둜 λ³€ν™˜ν•˜μ—¬ μ„œλ‘œ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ²˜λ¦¬ν•  수 있게 λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€.

μ–΄λŒ‘ν„° νŒ¨ν„΄μ˜ 일반적인 ꡬ쑰:

  1. ν΄λΌμ΄μ–ΈνŠΈ(Client): κΈ°μ‘΄ 클래슀의 κΈ°λŠ₯을 μ‚¬μš©ν•˜λ €λŠ” μ½”λ“œμž…λ‹ˆλ‹€.
  2. μ–΄λŒ‘ν‹°(Adaptee): κΈ°μ‘΄ 클래슀, 즉 λ³€ν™˜ν•΄μ•Ό ν•˜λŠ” λŒ€μƒμž…λ‹ˆλ‹€.
  3. μ–΄λŒ‘ν„°(Adapter): μ–΄λŒ‘ν‹°μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ λ³€ν™˜ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.

μ–΄λŒ‘ν„° νŒ¨ν„΄μ˜ κ°„λ‹¨ν•œ 예:

// 기쑴 클래슀
class OldSystem {
    public void oldMethod() {
        System.out.println("Old method is called");
    }
}

// μ–΄λŒ‘ν„° μΈν„°νŽ˜μ΄μŠ€
interface NewSystem {
    void newMethod();
}

// μ–΄λŒ‘ν„° 클래슀
class Adapter implements NewSystem {
    private OldSystem oldSystem;

    public Adapter(OldSystem oldSystem) {
        this.oldSystem = oldSystem;
    }

    @Override
    public void newMethod() {
        oldSystem.oldMethod(); // κΈ°μ‘΄ λ©”μ„œλ“œλ₯Ό μƒˆλ‘œμš΄ λ©”μ„œλ“œλ‘œ λ³€ν™˜
    }
}

// ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ
public class Main {
    public static void main(String[] args) {
        OldSystem oldSystem = new OldSystem();
        NewSystem adapter = new Adapter(oldSystem);
        adapter.newMethod(); // μ–΄λŒ‘ν„°λ₯Ό 톡해 oldMethod()λ₯Ό 호좜
    }
}

μœ„ μ˜ˆμ‹œμ—μ„œ, OldSystem은 κΈ°μ‘΄ μ‹œμŠ€ν…œμ„ ν‘œν˜„ν•˜κ³  AdapterλŠ” 이λ₯Ό NewSystem μΈν„°νŽ˜μ΄μŠ€μ— 맞게 λ³€ν™˜ν•΄μ€λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ OldSystem의 μ½”λ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ λ„ μƒˆλ‘œμš΄ λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.