[CS] 디자인 패턴

2024. 3. 14. 21:42

키워드 : 라이브러리, 프레임워크, 디자인패턴

 

 

 


Q1. 라이브러리와 프레임 워크의 차이점은 뭔가요?

프레임워크와 라이브러리의 차이

1. 라이브러리 (Library)
  • 정의 : 공통으로 사용될 수 있는 특정한 기능들을 모듈화 한것을 의미한다.
    • 라이브러리는 개발에 필요한 것들은 미리 구현해놓은 도구라고 할 수 있겠다.
    • 재사용이 가능한 기능들을 미리 구현해놓고, 필요한 곳에서 호출하여 사용이 가능하도록 만들어진 집합이다.
  • 특징
    • 폴더명, 파일명 등에 대한 규칙이 없고, 프레임 워크에 비해 자유롭다.
    • 라이브러리는 제어의 역전 (Inversion of Control) 개념을 따르지 않는다.
    • 개발자가 라이브러리를 호출하여 사용하는 것이지, 라이브러리가 개발자의 코드를 호출하는 것은 아니다. 
  • 비유 : 무언가를 자를때 '도구' 인 '가위'를 사용해서 '내가' 직접 컨트롤 하여 자른다.
  • 예시
    • C++ 의 STL
    • Python 의 Pip 로 설치한 패키지/ 모듈 (Pandas, Tenseorflow 등)
    • JSON 파싱을 위한 JSON 라이브러리
    • HTTP 요청을 위한 HTTP 라이브러리 

 

2. 프레임 워크 (Framework)
  • 정의 : 공통으로 사용될 수 있는 특정한 기능들을 모듈화 한것을 의미한다.
  • 특징
    • 폴더명, 파일명 등에 대한 규칙이 있고, 라이브러리에 비해 좀 더 엄격하다.
    • 개발자는 프레임워크가 제공하는 규칙과 패턴을 따라 코드를 작성해야 한다.
    • 제어의 역전 (Inversion of Control) 개념을 따르고 있어, 프레임워크가 개발자의 코드를 호출하여 필요한 기능을 수행한다.
  • 비유 : 다른곳으로 이동할때 '도구' 인 '비행기'를 타고 이동하지만, '비행기'가 컨트롤 하고 나는 가만히 있어야 한다.
  • 예시 
    • Spring 프레임워크
    • Django 프레임워크

 

3. 답변

 

💡 라이브러리와 프레임워크는 공통으로 사용될 수 있는 기능들을 모듈화한다는 점에서는 동일합니다.
    차이점은 '관리의 주체' 입니다.프레임워크는 IoC 개념이 적용이 되어있어, 프레임워크에게 제어의 흐름을 넘겨 개발        자가 작성하는 코드에서신경써야 할 부분을 줄이고, 라이브러리개발자가 전체적인 흐름을 만들며, 라이브러리를 가      져다 쓰게 됩니다.

 

 


Q2. 제어의 역전 (IoC) 에 대해서 설명해주세요.

 

1. 제어 (Control)
  • 정의 :직접 객체를 생성하여 코드를 '제어' 하는 것이다.
  • 객체 생명주기나 메서드의 호출을 직접 제어한다 == 객체 생명주기나 메서드의 호출을 직접 관리 한다.

 

2. 역전 (Inversion)
  • 정의 : 프로그램의 제어 흐름을 직접 제어하는 것이 아니라, 외부에서 관리하는 것.

 

2. 제어의 역전 (Inversion of Control)
  • 개발자가 작성한 객체나 메서드의 제어를 개발자가 아니라 외부에 위임하는 설계 원칙을 제어의 역전이라고 한다
  • 제어의 역전에서는 오브젝트 스스로가 사용할 오브젝트를 결정하지도, 생성하지 않는다.
  • 원칙의 이름 그대로 제어에 대한 권한이 개발자에서 외부 환경으로 역전되는 것 이다.

 

3. IoC가 필요한 이유
  • 객체지향 원칙을 잘 지키기 위해
    • 역할과 관심을 분리해서 응집도를 높이고 결합도를 낮추게 된다.
    • 이에 따라 변경에 유연한 코드를 작성 할 수 있는 구조가 될 수 있기 때문이다.
  • 할리우드 법칙 (Hollywood Principle)
    • Don't call us, we'll call you
답변

 

💡 제어의 역전(IoC)은 프로그램의 흐름을 개발자가 직접 제어하는 대신 외부 컨트롤러나 프레임워크에 위임하는 방식을 말합니다. 예를 들어, 전통적인 자바 어플리케이션에서는 개발자가 객체의 생성과 의존성을 직접 관리합니다. 하지만 Spring 같은 프레임워크를 사용할 때, 객체 생성과 의존성 주입은 프레임워크가 담당하게 됩니다. 제가 담당했던 프로젝트에서는 final 을 사용하여 생성자를 통한 의존성 주입을 사용하였습니다. 이는 불변성과 명확성, 그리고 테스트 용이성을 증가 시켜줍니다.

 

 


Q3. 디자인패턴에 대해서 설명해주세요

 

1. 디자인 패턴
  • 정의 :소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 또 발생했을때, 재사용할 수 있는 훌륭한 해결책

 

2. GoF 디자인 패턴의 분류
  • 정의 : GoF (Gang of Fout) 사람들이 23가지의 디자인 패턴을 정리하고
  • 각각의 디자인 패턴을 생성(Creational), 구조(Structural), 행위(Behavioral) 3가지로 분류했다.

GoF 디자인 패턴의 종류

 

Q4. 전략패턴에 대해서 설명해주세요

#1. 전략 패턴 ( == 정책 패턴)
  • 정의 : 객체의 행위를 바꾸고 싶은 경우, '직접' 수정하지 않고, 전략이라고 부르는 '캡슐화한 알고리즘' 을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴.
    • 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화 되어 있고, 이들이 필요할 때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴
    • 행위 패턴의 하나
  • 특징: 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴이다.
    • 전략 : 어떠한 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등
    • 게임 프로그래밍에서 게임 캐릭터가 자신이 처한 상황에 따라 공격이나 행동하는 방식을 바꾸고 싶을때 트래티지 패턴은 매우 유용하다.

 

  • 역할이 수행하는 작업
    • Strategy
      • 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시
    • ConcreteStrategy
      • 스트래티지 패턴에서 명시한 알고리즘을 실제로 구현한 클래스
    • Context
      • 스트래티지 패턴을 이용하는 역할을 수행한다.
      • 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter 메서드(‘집약 관계’)를 제공한다.

 


Q4. 싱글톤 패턴에 대해서 설명해주세요

#싱글턴 패턴
  • 정의 : 전역변수를 사용하지 않고, 객체를 하나만 생성 하도록 하며, 생성된 개체를 어디에서든지 참조할 수 있도록 하는 패턴
    • 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다.
    • 보통 데이터베이스 연결 모듈에 많이 사용된다. 
    • 생성 패턴 중 하나.

 

  • 단점
    • 1. TDD를 할 때 걸림돌이 된다. -> 단위테스트를 할때 서로 독립적이어야 하는데, 각 테스트 마다 독립적인 인스턴스를 만들기 어렵다
    • 2. 모듈간의 결합을 강하게 만들 수 있다.
      • 이때 의존성 주입을 통해서 모듈간의 결합을 조금 느슨하게 만들어 해결할 수 있다.
    • 하나의 인스턴스만을 생성하는 책임이 있으며 getInstance 메서드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행한다.
#3. 커맨드 패턴
  • 정의 : 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴
    • 즉, 이벤트가 발생했을때 실행될 기능이 다양하면서도 변경이 필요한 경우에 이벤트를 발생시키는 클래스를 변경하지 않고 재사용 
    • 행위 패턴 중 하나.

 

  • 실행될 기능을 캡슐화함으로써 기능의 실행을 요구하는 호출자(Invoker) 클래스와 실제 기능을 실행하는 수신자(Receiver) 클래스 사이의 의존성을 제거한다.
  • 따라서 실행될 기능의 변경에도 호출자 클래스를 수정 없이 그대로 사용 할 수 있도록 해준다.
  • 역할이 수행하는 작업
    • Command
      • 실행될 기능에 대한 인터페이스
      • 실행될 기능을 execute 메서드로 선언함
    • ConcreteCommand
      • 실제로 실행되는 기능을 구현
      • 즉, Command라는 인터페이스를 구현함
    • Invoker
      • 기능의 실행을 요청하는 호출자 클래스
    • Receiver
      • ConcreteCommand에서 execute 메서드를 구현할 때 필요한 클래스
      • 즉, ConcreteCommand의 기능을 실행하기 위해 사용하는 수신자 클래스

 

 

 

 

 

※ 이 내용은 책 [면접을 위한 CS 전공지식 노트] 를 보고 정리한 내용입니다.

※ 인용한 포스트

https://code-lab1.tistory.com/284

https://hudi.blog/inversion-of-control/

'STUDY > Computer Science' 카테고리의 다른 글

[Coding Test] 구현  (0) 2024.03.14

BELATED ARTICLES

more