λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
develop_kr/이둠

πŸ”Œ μ–΄λŒ‘ν„° νŒ¨ν„΄ (Adapter Pattern): ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ—°κ²°ν•˜λŠ” λ§ˆλ²•

by JSsunday 2025. 7. 13.
728x90
λ°˜μ‘ν˜•

πŸ€” μ–΄λŒ‘ν„° νŒ¨ν„΄μ΄λž€?

μ–΄λŒ‘ν„° νŒ¨ν„΄μ€ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§„ ν΄λž˜μŠ€λ“€μ„ ν•¨κ»˜ μž‘λ™ν•  수 μžˆλ„λ‘ ν•˜λŠ” ꡬ쑰적 λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. 마치 μ—¬ν–‰ν•  λ•Œ μ‚¬μš©ν•˜λŠ” 전원 μ–΄λŒ‘ν„°μ²˜λŸΌ, μ„œλ‘œ λ‹€λ₯Έ 규격의 μ‹œμŠ€ν…œλ“€μ„ μ—°κ²°ν•΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.

🎯 μ£Όμš” νŠΉμ§•

  • κΈ°μ‘΄ μ½”λ“œ μˆ˜μ • 없이 μƒˆλ‘œμš΄ μΈν„°νŽ˜μ΄μŠ€μ™€ 톡합
  • λ ˆκ±°μ‹œ μ‹œμŠ€ν…œκ³Ό μƒˆλ‘œμš΄ μ‹œμŠ€ν…œ κ°„μ˜ λΈŒλ¦Ώμ§€ μ—­ν• 
  • μ˜μ‘΄μ„± μ—­μ „ 원칙을 λ”°λ₯΄λŠ” κΉ”λ”ν•œ 섀계

🌊 Java 예제: λ°”λ‹€ 생물 μ–΄λŒ‘ν„°

λ°”λ‹€μ˜ λ‹€μ–‘ν•œ 생물듀이 μ„œλ‘œ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ μ›€μ§μ΄μ§€λ§Œ, κ³΅ν†΅λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 κ΄€λ¦¬ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

// 🐠 κΈ°μ‘΄ λ¬Όκ³ κΈ° μΈν„°νŽ˜μ΄μŠ€
interface Fish {
    void swim();
}

// 🦈 상어 클래슀
class Shark implements Fish {
    @Override
    public void swim() {
        System.out.println("🦈 상어가 λΉ λ₯΄κ²Œ μˆ˜μ˜ν•©λ‹ˆλ‹€!");
    }
}

// πŸ™ λ¬Έμ–΄ 클래슀 (λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€)
class Octopus {
    public void crawl() {
        System.out.println("πŸ™ λ¬Έμ–΄κ°€ λ°”λ‹₯을 κΈ°μ–΄λ‹€λ‹™λ‹ˆλ‹€!");
    }
}

// πŸ”§ λ¬Έμ–΄ μ–΄λŒ‘ν„°
class OctopusAdapter implements Fish {
    private Octopus octopus;
    
    public OctopusAdapter(Octopus octopus) {
        this.octopus = octopus;
    }
    
    @Override
    public void swim() {
        // λ¬Έμ–΄μ˜ crawl을 swim으둜 λ³€ν™˜
        octopus.crawl();
        System.out.println("πŸ’« λ¬Έμ–΄κ°€ μˆ˜μ˜ν•˜λ“― μ΄λ™ν•©λ‹ˆλ‹€!");
    }
}

// 🌊 λ°”λ‹€ μƒνƒœκ³„ κ΄€λ¦¬μž
class OceanManager {
    private List<Fish> marineLife = new ArrayList<>();
    
    public void addFish(Fish fish) {
        marineLife.add(fish);
    }
    
    public void makeAllSwim() {
        System.out.println("🌊 λ°”λ‹€ 생물듀이 μ›€μ§μž…λ‹ˆλ‹€:");
        marineLife.forEach(Fish::swim);
    }
}

// μ‚¬μš© 예제
public class AdapterPatternExample {
    public static void main(String[] args) {
        OceanManager ocean = new OceanManager();
        
        // 일반 λ¬Όκ³ κΈ° μΆ”κ°€
        ocean.addFish(new Shark());
        
        // λ¬Έμ–΄λ₯Ό μ–΄λŒ‘ν„°λ‘œ κ°μ‹Έμ„œ μΆ”κ°€
        Octopus octopus = new Octopus();
        ocean.addFish(new OctopusAdapter(octopus));
        
        ocean.makeAllSwim();
    }
}

☁️ TypeScript 예제: ν•˜λŠ˜μ˜ λ‚ κ°œ μ–΄λŒ‘ν„°

ν•˜λŠ˜μ„ λ‚˜λŠ” λ‹€μ–‘ν•œ μƒλ¬Όλ“€μ˜ λΉ„ν–‰ 방식을 ν†΅ν•©ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

// ✈️ κΈ°μ‘΄ λΉ„ν–‰ μΈν„°νŽ˜μ΄μŠ€
interface Flyer {
    fly(): void;
}

// πŸ¦… λ…μˆ˜λ¦¬ 클래슀
class Eagle implements Flyer {
    fly(): void {
        console.log("πŸ¦… λ…μˆ˜λ¦¬κ°€ λ‚ κ°œλ₯Ό 펼치고 λΉ„ν–‰ν•©λ‹ˆλ‹€!");
    }
}

// 🚁 헬리μ½₯ν„° 클래슀 (λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€)
class Helicopter {
    rotate(): void {
        console.log("🚁 헬리μ½₯ν„°κ°€ λ‘œν„°λ₯Ό νšŒμ „μ‹œν‚΅λ‹ˆλ‹€!");
    }
}

// πŸ”§ 헬리μ½₯ν„° μ–΄λŒ‘ν„°
class HelicopterAdapter implements Flyer {
    private helicopter: Helicopter;
    
    constructor(helicopter: Helicopter) {
        this.helicopter = helicopter;
    }
    
    fly(): void {
        // 헬리μ½₯ν„°μ˜ rotateλ₯Ό fly둜 λ³€ν™˜
        this.helicopter.rotate();
        console.log("πŸ’« 헬리μ½₯ν„°κ°€ ν•˜λŠ˜μ„ λ‚ μ•„κ°‘λ‹ˆλ‹€!");
    }
}

// 🎈 기ꡬ 클래슀 (또 λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€)
class Balloon {
    float(): void {
        console.log("🎈 기ꡬ가 곡쀑에 λ– μ˜€λ¦…λ‹ˆλ‹€!");
    }
}

// πŸ”§ 기ꡬ μ–΄λŒ‘ν„°
class BalloonAdapter implements Flyer {
    private balloon: Balloon;
    
    constructor(balloon: Balloon) {
        this.balloon = balloon;
    }
    
    fly(): void {
        // 기ꡬ의 float을 fly둜 λ³€ν™˜
        this.balloon.float();
        console.log("πŸ’« 기ꡬ가 ν•˜λŠ˜μ„ λ‚ μ•„κ°‘λ‹ˆλ‹€!");
    }
}

// ☁️ ν•˜λŠ˜ κ΄€μ œμ„Όν„°
class SkyController {
    private flyers: Flyer[] = [];
    
    addFlyer(flyer: Flyer): void {
        this.flyers.push(flyer);
    }
    
    makeAllFly(): void {
        console.log("☁️ ν•˜λŠ˜μ˜ λͺ¨λ“  것듀이 λΉ„ν–‰ν•©λ‹ˆλ‹€:");
        this.flyers.forEach(flyer => flyer.fly());
    }
}

// μ‚¬μš© 예제
const skyController = new SkyController();

// 일반 비행체 μΆ”κ°€
skyController.addFlyer(new Eagle());

// 헬리μ½₯ν„°λ₯Ό μ–΄λŒ‘ν„°λ‘œ κ°μ‹Έμ„œ μΆ”κ°€
const helicopter = new Helicopter();
skyController.addFlyer(new HelicopterAdapter(helicopter));

// 기ꡬλ₯Ό μ–΄λŒ‘ν„°λ‘œ κ°μ‹Έμ„œ μΆ”κ°€
const balloon = new Balloon();
skyController.addFlyer(new BalloonAdapter(balloon));

skyController.makeAllFly();

🌍 Python 예제: λ•…μ˜ 이동 μ–΄λŒ‘ν„°

λ•… μœ„μ˜ λ‹€μ–‘ν•œ 생물듀과 νƒˆκ²ƒλ“€μ˜ 이동 방식을 ν†΅ν•©ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

from abc import ABC, abstractmethod

# 🚢 κΈ°μ‘΄ 이동 μΈν„°νŽ˜μ΄μŠ€
class Walker(ABC):
    @abstractmethod
    def walk(self):
        pass

# πŸ¦“ 얼룩말 클래슀
class Zebra(Walker):
    def walk(self):
        print("πŸ¦“ 얼룩말이 λ„€ 발둜 κ±Έμ–΄κ°‘λ‹ˆλ‹€!")

# 🐍 λ±€ 클래슀 (λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€)
class Snake:
    def slither(self):
        print("🐍 뱀이 λͺΈμ„ ꡬ뢈거리며 κΈ°μ–΄κ°‘λ‹ˆλ‹€!")

# πŸ”§ λ±€ μ–΄λŒ‘ν„°
class SnakeAdapter(Walker):
    def __init__(self, snake: Snake):
        self.snake = snake
    
    def walk(self):
        # λ±€μ˜ slitherλ₯Ό walk둜 λ³€ν™˜
        self.snake.slither()
        print("πŸ’« 뱀이 κ±Έμ–΄κ°€λ“― μ΄λ™ν•©λ‹ˆλ‹€!")

# πŸš— μžλ™μ°¨ 클래슀 (또 λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€)
class Car:
    def drive(self):
        print("πŸš— μžλ™μ°¨κ°€ 바퀴λ₯Ό κ΅΄λ € λ‹¬λ¦½λ‹ˆλ‹€!")

# πŸ”§ μžλ™μ°¨ μ–΄λŒ‘ν„°
class CarAdapter(Walker):
    def __init__(self, car: Car):
        self.car = car
    
    def walk(self):
        # μžλ™μ°¨μ˜ driveλ₯Ό walk둜 λ³€ν™˜
        self.car.drive()
        print("πŸ’« μžλ™μ°¨κ°€ κ±Έμ–΄κ°€λ“― μ΄λ™ν•©λ‹ˆλ‹€!")

# 🌱 λ‘œλ΄‡ 클래슀 (또 λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€)
class Robot:
    def move_mechanically(self):
        print("πŸ€– λ‘œλ΄‡μ΄ κΈ°κ³„μ μœΌλ‘œ μ›€μ§μž…λ‹ˆλ‹€!")

# πŸ”§ λ‘œλ΄‡ μ–΄λŒ‘ν„°
class RobotAdapter(Walker):
    def __init__(self, robot: Robot):
        self.robot = robot
    
    def walk(self):
        # λ‘œλ΄‡μ˜ move_mechanicallyλ₯Ό walk둜 λ³€ν™˜
        self.robot.move_mechanically()
        print("πŸ’« λ‘œλ΄‡μ΄ κ±Έμ–΄κ°€λ“― μ΄λ™ν•©λ‹ˆλ‹€!")

# 🌍 지상 κ΄€λ¦¬μž
class GroundManager:
    def __init__(self):
        self.walkers = []
    
    def add_walker(self, walker: Walker):
        self.walkers.append(walker)
    
    def make_all_walk(self):
        print("🌍 λ•… μœ„μ˜ λͺ¨λ“  것듀이 μ΄λ™ν•©λ‹ˆλ‹€:")
        for walker in self.walkers:
            walker.walk()

# μ‚¬μš© 예제
if __name__ == "__main__":
    ground_manager = GroundManager()
    
    # 일반 λ³΄ν–‰μž μΆ”κ°€
    ground_manager.add_walker(Zebra())
    
    # 뱀을 μ–΄λŒ‘ν„°λ‘œ κ°μ‹Έμ„œ μΆ”κ°€
    snake = Snake()
    ground_manager.add_walker(SnakeAdapter(snake))
    
    # μžλ™μ°¨λ₯Ό μ–΄λŒ‘ν„°λ‘œ κ°μ‹Έμ„œ μΆ”κ°€
    car = Car()
    ground_manager.add_walker(CarAdapter(car))
    
    # λ‘œλ΄‡μ„ μ–΄λŒ‘ν„°λ‘œ κ°μ‹Έμ„œ μΆ”κ°€
    robot = Robot()
    ground_manager.add_walker(RobotAdapter(robot))
    
    ground_manager.make_all_walk()

πŸ’‘ μ–΄λŒ‘ν„° νŒ¨ν„΄μ˜ μž₯점

βœ… μž₯점

  • κΈ°μ‘΄ μ½”λ“œ μˆ˜μ • 없이 μƒˆλ‘œμš΄ κΈ°λŠ₯ 톡합
  • 단일 μ±…μž„ 원칙 μ€€μˆ˜
  • λ ˆκ±°μ‹œ μ‹œμŠ€ν…œκ³Όμ˜ ν˜Έν™˜μ„± μœ μ§€
  • μ½”λ“œ μž¬μ‚¬μš©μ„± 증가

⚠️ μ£Όμ˜μ‚¬ν•­

  • μ½”λ“œ λ³΅μž‘λ„ 증가 κ°€λŠ₯
  • λ„ˆλ¬΄ λ§Žμ€ μ–΄λŒ‘ν„° μ‚¬μš© μ‹œ μ„±λŠ₯ μ €ν•˜
  • μΈν„°νŽ˜μ΄μŠ€ λ³€κ²½ μ‹œ μ–΄λŒ‘ν„°λ„ μˆ˜μ • ν•„μš”

🎯 μ–Έμ œ μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

  • λ ˆκ±°μ‹œ μ‹œμŠ€ν…œμ„ μƒˆλ‘œμš΄ μ‹œμŠ€ν…œκ³Ό 톡합할 λ•Œ
  • μ™ΈλΆ€ 라이브러리의 μΈν„°νŽ˜μ΄μŠ€κ°€ λ§žμ§€ μ•Šμ„ λ•Œ
  • μ„œλ‘œ λ‹€λ₯Έ 데이터 ν˜•μ‹μ„ λ³€ν™˜ν•΄μ•Ό ν•  λ•Œ
  • λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κ°„μ˜ 톡신 μΈν„°νŽ˜μ΄μŠ€ 톡합

πŸ“š 마무리

μ–΄λŒ‘ν„° νŒ¨ν„΄μ€ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ 맀우 μ‹€μš©μ μΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. 마치 μ‹€μƒν™œμ˜ μ–΄λŒ‘ν„°μ²˜λŸΌ, μ„œλ‘œ λ‹€λ₯Έ μ‹œμŠ€ν…œλ“€μ„ μ—°κ²°ν•˜μ—¬ 더 큰 κ°€μΉ˜λ₯Ό μ°½μΆœν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€ λ•Œλ¬Έμ— 고민이 μžˆλ‹€λ©΄, μ–΄λŒ‘ν„° νŒ¨ν„΄μ„ μ μš©ν•΄λ³΄μ„Έμš”! πŸš€


 

728x90
λ°˜μ‘ν˜•

λŒ“κΈ€