본문 바로가기

전체 글

(291)
[디자인패턴] Mediator 패턴 설명 다양한 기능을 객체 단위로 분산하면 해당 객체들 사이에 다양한 연관 관계가 발생한다. 시스템을 객체 단위로 분할하면 재사용성이 높아질 수 있지만, 분할 수준이 높아지다보면 객체들이 상호작용에 따른 연관관계가 많아지고, 서로에 의존하게 되는 문제가 발생한다. 이 경우 객체를 분할했음에도 객체들 사이의 결합도가 높아 크게 보면 사실상 하나의 큰 덩어리로 구현하는 것과 유사한 상황이 나타난다. 아래 가상의 기기를 보면서 구체적으로 생각해보자. 위 기기는 다음과 같이 동작한다. A ~ F 버튼을 누르면 클릭한 버튼의 문자가 디스플레이에 추가된다. SAVE 버튼을 누르면 현재까지 누른 버튼 리스트를 외부로 전달한다. RESET 버튼을 누르면 누른 버튼 리스트를 초기화한다. 디스플레이도 초기화된다. LED는 ..
[디자인패턴] Facade 패턴 설명 복잡한 시스템 구성을 쉽게 사용할 수 있도록 획일화 된 하나의 상위 레벨의 인터페이스를 제공한다. 하나의 시스템에는 다양한 구성요소가 존재한다. 이때 시스템이 확장되고 보다 구체적으로 설계됨에 따라 이를 구성하는 각 요소들의 복잡도가 높아진다. 현재 시스템을 잘 알고 있다면 이러한 복잡한 아키텍처를 이해하면서 구성요소를 조합하여 새로운 프로그램을 만들 수 있겠지만, 단순히 현재 라이브러리를 사용하고 싶은 개발자 입장에서는 점점 복잡해지는 아키텍처를 전부 이해하며 개발하기가 어렵다. 또한 각 모듈이 제공하는 기능 전부를 사용하는 경우도 드물다. 따라서 사용자가 시스템의 구성요소 각각을 직접 접근하는 대신, 구성요소를 이용하여 사용자가 원하는 기능을 수행하는 Facade 클래스를 두고, 해당 클래스가 ..
[디자인패턴] SOLID 원칙 SOLID 객체 지향 디자인에 대하여 이해, 변경, 확장 및 유지관리하기 쉽도록 하는 설계 원칙으로, 설계 평가에 사용될 수 있다. SOLID를 구성하는 원칙은 다음과 같다. Single Responsibility Principle: 클래스의 책임을 하나만 둬서 변경해야 할 이유를 제한하자. Open Close Principle: 확장에는 열린 상태로, 변경에는 닫힌 상태로 두자. Liskov Substitution Principle: 서브 타입은 베이스 타입으로 손실 없이 바뀔 수 있어야 한다. Interface Segregation Principle: 하나의 범용 인터페이스보다는 여러 개의 개별 인터페이스를 만들자. Dependency Inversion Principle: 추상적인 것이 구체적인 것에..
[프로그래머스] 뒤에 있는 큰 수 찾기 https://school.programmers.co.kr/learn/courses/30/lessons/154539 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 배열의 각 원소에 대해 자기보다 1) 뒤에 있고 2) 크면서 3) 가장 가까운 숫자를 "뒷 큰 수"라고 정의한다. 현재 문제는 배열이 주어졌을 때 뒷 큰 수를 구하는 문제다. 단순히 생각해서 특정 인덱스에서 자기보다 인덱스가 높은 모든 배열 원소와 값을 비교한다면 결과를 구할 수 있다. 예를 들어 인덱스가 1이라면, 인덱스 2 ~ n-1의 원소를 모두 비교하다 보면 언젠가 답이 나오는 것이다. ..
[디자인패턴] Bridge 패턴 설명 구현과 추상을 분리하여 독립적으로 존재하게 만든다. 확장성과 유연성이 좋다. 추상적 개념을 구체화하는 경우 상속을 이용할 수 있다. 이때 상속의 경우 하면 할수록 클래스가 구체적인 구현 사항에 종속되기 때문에 수정 및 확장이 어려워진다. 위 그림의 Paint를 생각해 보자. Paint는 도형들에 대한 가장 추상적인 인터페이스로, 도형을 화면에 그리는 draw 메서드를 정의한다. 구체적인 도형을 의미하는 Circle, Rectangle은 Paint 인터페이스를 구현함으로써 화면에 표현될 수 있으며, 이를 통해 모든 도형을 draw( )라는 일관된 메서드를 통해 그릴 수 있게 된다. 여기서 문제점이 되는 부분은 각 도형을 구체적으로 그리는 구현과 밀접하게 관계되는 OpenGL__, DirectX__ 클..
[nginx] Location Priority https://docs.nginx.com/nginx/admin-guide/web-server/web-server/#nginx-location-priority https://serverfault.com/questions/674425/what-does-location-mean-in-an-nginx-location-block Configuring NGINX and NGINX Plus as a Web Server | NGINX Plus Configuring NGINX and NGINX Plus as a Web Server Configure NGINX and NGINX Plus as a web server, with support for virtual server multi-tenancy, URI and resp..
[디자인패턴] Singleton 패턴 설명 어떤 클래스는 프로그램 상에서 정확히 하나의 인스턴스만 존재하여, 해당 인스턴스가 자신과 관련된 모든 작업을 감독해야 하는 경우가 있다. 이 상황에서 단순히 static 전역변수를 하나 둬서 처리할 수도 있지만 싱글톤 패턴을 이용하여 클래스 자신이 static 변수를 관리하면서 단일 인스턴스를 보장할 수 있다. 일반적인 사용 방식은 다음과 같다. 생성자를 private ( 특이한 경우에는 protected ) 로 설정하여 클래스 외부에서 호출할 수 없게 만든다. 클래스 내부에 static private 인스턴스인 instance을 선언한다. public getInstance 함수를 통해 instance에 대한 접근 권한을 부여한다. 초기에 instance가 없다면 null 체크 후 instance을..
[typescript] 오버로딩 요점 타입스크립트에는 C++, Java 등 정적 타입 언어에 대응되는 함수 본문에 대한 오버로딩은 존재하지 않는다. 대신 함수에 대한 오버로드 시그니처(콜 시그니처)를 기반으로 오버로딩인 것 "처럼" 만들 수는 있다. 메서드 오버로딩 오버로딩은 이름은 같지만 입력 파라미터 타입 + 출력 형식이 다른 여러 개의 메서드를 중복 정의하는 것을 의미한다. 오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다. 메서드의 이름이 같아야 한다. 애초에 이름이 같지 않으면 오버로딩이 아니다. 메서드의 입력 파라미터의 타입 또는 형식이 반드시 달라야 한다. 출력 형식은 같든 다르든 입력 파라미터 형식만 다르다면 상관없다. 예를 들어, 아래 코드는 오버로딩에 해당한다. int add(int a, int b) { ..