주의

  • 본 게시글은 Claude로 작성되었습니다. 잘못된 정보가 있을 수 있습니다.

개요

디자인 패턴과 객체지향 프로그래밍(OOP)은 소프트웨어 개발에서 코드의 재사용성, 유지보수성, 확장성을 높이기 위한 핵심 개념입니다. 디자인 패턴은 반복적으로 발생하는 문제에 대한 검증된 해결책을 제공하며, OOP는 데이터와 해당 데이터를 조작하는 메서드를 하나의 단위(객체)로 캡슐화하는 프로그래밍 패러다임입니다.

상세

디자인 패턴

디자인 패턴은 소프트웨어 설계에서 자주 발생하는 문제들에 대한 전형적인 해결책입니다. 주요 카테고리는 다음과 같습니다:

  1. 생성 패턴: 객체 생성 메커니즘을 다룹니다. (예: Singleton, Factory Method, Abstract Factory)
  2. 구조 패턴: 클래스와 객체를 더 큰 구조로 조합합니다. (예: Adapter, Composite, Proxy)
  3. 행동 패턴: 객체 간의 책임 분배와 알고리즘을 다룹니다. (예: Observer, Strategy, Command)

객체지향 프로그래밍(OOP)

OOP는 다음 주요 원칙을 기반으로 합니다:

  1. 캡슐화: 데이터와 해당 데이터를 조작하는 메서드를 하나의 단위로 묶습니다.
  2. 상속: 기존 클래스의 속성과 메서드를 새 클래스가 재사용할 수 있게 합니다.
  3. 다형성: 동일한 인터페이스를 통해 다양한 객체 타입을 처리할 수 있게 합니다.
  4. 추상화: 복잡한 시스템을 단순화하여 핵심 개념만을 표현합니다.

예상 면접 질문/답변

디자인 패턴을 사용하는 이유는 무엇인가요?

디자인 패턴은 검증된 해결책을 제공하여 개발 시간을 단축하고, 코드의 재사용성과 유지보수성을 높이며, 개발자 간 의사소통을 개선합니다.

Singleton 패턴의 장단점을 설명해주세요.

Singleton은 클래스의 인스턴스가 하나만 생성되도록 보장합니다. 장점은 리소스 절약과 전역 접근점 제공이며, 단점은 단위 테스트의 어려움과 의존성 증가입니다.

OOP의 다형성을 Java 예제와 함께 설명해주세요.

다형성은 같은 메서드 호출이 객체의 타입에 따라 다르게 동작하는 것을 말합니다. 예를 들어:

public interface Shape {
    void draw();
}
 
public class Circle implements Shape {
    public void draw() {
        System.out.println("Drawing a circle");
    }
}
 
public class Square implements Shape {
    public void draw() {
        System.out.println("Drawing a square");
    }
}
 
Shape shape1 = new Circle();
Shape shape2 = new Square();
shape1.draw(); // 출력: Drawing a circle
shape2.draw(); // 출력: Drawing a square

추상 클래스와 인터페이스의 차이점은 무엇인가요?

추상 클래스는 일부 구현된 메서드를 가질 수 있고 상태(필드)를 가질 수 있지만, 인터페이스는 모든 메서드가 추상적이며 (Java 8 이후 default 메서드 제외) 상태를 가질 수 없습니다. 또한 클래스는 하나의 추상 클래스만 상속할 수 있지만, 여러 인터페이스를 구현할 수 있습니다.

SOLID 원칙에 대해 설명해주세요.

SOLID는 객체지향 설계의 5가지 원칙을 나타냅니다:

  • Single Responsibility Principle: 클래스는 하나의 책임만 가져야 합니다.
  • Open-Closed Principle: 확장에는 열려있고, 수정에는 닫혀있어야 합니다.
  • Liskov Substitution Principle: 하위 클래스는 상위 클래스를 대체할 수 있어야 합니다.
  • Interface Segregation Principle: 클라이언트는 사용하지 않는 인터페이스에 의존하지 않아야 합니다.
  • Dependency Inversion Principle: 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 합니다.

스스로 찾아보면 좋은 연관 주제

  1. GoF(Gang of Four) 디자인 패턴
  2. SOLID 원칙의 실제 적용 사례
  3. 함수형 프로그래밍과 OOP의 비교
  4. Java의 default 메서드와 인터페이스 진화
  5. 의존성 주입(Dependency Injection)과 IoC(Inversion of Control) 컨테이너