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

luneah·2022년 3월 10일
1

Seminar - OOP

목록 보기
4/4
post-thumbnail

GoF 디자인 패턴은 1995년 Gang of Four라 불리는 에리히 감마, 리차드 헬름, 존 블라시디스, 랄프 존슨이 오랜 시간 발전과 진화를 이어온 많은 디자인 패턴을 집대성한 것을 말한다.

GoF 디자인 패턴 종류

총 23가지인 GoF 디자인 패턴을 분류하는 기준은 두 가지가 있다. 첫째는 목적에 따라 분류하면 생성, 구조, 행동 3가지로 나눌 수 있다.

둘째로 범위에 따라 분류할 수 있는데, 패턴을 주로 클래스에 적용하는지, 아니면 객체에 적용하는 지 구분하는 것이다. 클래스 패턴은 클래스와 서브 클래스간의 관련성을 다루며 주로 상속을 통해 관련되고, 이는 컴파일 타임에 정적으로 결정된다. 객체패턴은 객체 간의 관련성을 다루고, 런타임에 변경될 수 있는 동적인 성격을 갖는다.

생성 패턴 (Creational Pattern)

생성 패턴은 객체의 생성과 관련된 패턴으로 객체의 인스턴스 과정을 추상화하는 방법이다. 객체의 생성과 참조 과정을 캡슐화하여 생성되거나 변경되어도 프로그램 구조에 영향을 받지 않도록 하여 프로그램에 유연성을 더해준다.

생성 클래스 패턴은 객체를 생성하는 일부 서브클래스가 담당하도록 하며 생성 객체 패턴은 객체 생성을 다른 객체에게 위임한다.

싱글톤 패턴 (Singleton Pattern)

싱글톤의 장점은 인스턴스들끼리 데이터를 공유하기 쉬워진다는 점인데 여기서 주의해야할 점은 동시성 문제를 고려해야 한다는 것이다.

코드를 보면 자동차라는 객체가 있고, 자신을 멤버로 선언하여 메모리에 올려놓는다. 그리고 외부에서 멤버로 선언된 car를 가져올 수 있는 메서드를 생성하면된다. 이렇게하면 getInstance 메서드 외에는 CarClass 객체를 생성 및 사용할 수 없게 된다.

그 밑으로는 private static CarClass car = new CarClass를 통해 최초 한 번만 객체를 생성하고 이후 해당 객체를 getInstance 메서드를 활용해 return을 받아 사용하는데 해당 차 객체를 누군가 이용하고 있으면 이용 못하게끔 구현하고 있는 코드이다.

구조 패턴 (Structural Pattern)

구조 패턴은 클래스나 객체들을 조합해 더 큰 구조로 만들 수 있게 해주는 패턴이다. 구조 클래스 패턴은 상속을 통해 클래스나 인터페이스를 합성하고, 구조 객체 패턴은 객체를 합성하는 방법을 정의한다.

파사드 패턴 (Facade Pattern)

구조 패턴의 대표적인 예시인 파사드 패턴은 복잡하고 다양한 서브시스템을 인터페이스로 만들어 단순화 하는 것이다. 단순화가 되면 사용자는 통합된 인터페이스를 이용하여 사용함에 있어서 편리함을 느끼게 된다.

간단한 예제를 들면 우리가 영화를 본다고 가정하면 여러가지 일들을 해야 하는데, 그 중 스크린을 내리고, 빔을 켜고, 영화를 재생하고, 팝콘을 튀기고, 맥주를 가져온다고 가정하여 위와 같은 코드로 바꾼다.

이를 구현하기 위해 playmovie라는 클래스 안에 기능들을 몰아넣고 play와 stop이라는 인스턴스를 생성해 간단하게 처리했다. playmovie에 앞서 생성했던 메소드를 담아 새로 생성해서 play와 stop 인스턴스를 이용해서 사용자는 서브시스템을 몰라도 play stop만 이용할 수 있게 된다.

행동 패턴 (Behavior Pattern)

행동 패턴은 클래스나 객체들이 서로 상호작용하는 방법이나 어떤 테스크나 어떤 알고리즘을 어떻게 할당하는 것이 좋을지를 정의하는 패턴이다. 즉, 객체나 클래스의 교류 방법에 대해 정의하는 것이다. 이는 하나의 객체로 수행할 수 없는 작업을 여러 객체로 분배하면서 그들 간의 결합도를 최소화 할 수 있도록 도와준다.

행동 클래스 패턴은 상속을 통해 알고리즘과 제어 흐름을 기술하고, 행동 객체 패턴은 하나의 작업을 수행하기 위해 객체 집합이 어떻게 협력하는지를 기술한다.

옵저버 패턴 (Observer Pattern)

옵저버 패턴은 모듈간 상태변화를 감지하는 관찰자 객체를 생성하는 것이다. 각 모듈은 서로 알아야하는 상태변화가 있을 때마다 상대 모듈에게 필요한 데이터와 함께 관찰자를 통하여 통보하는 방식이다. 이 통보를 받은 관찰자는 통보한 모듈에서 넘겨준 데이터를 인자로 해당 상태변화와 연관된 각 모듈의 핸들러들을 호출하여 각 모듈이 필요한 작업을 수행할 수 있도록 해준다.

Subject라는 클래스는 옵저버들을 가지는 배열과 옵저버를 등록, 제거하는 함수로 이루어져 있다. 옵저버가 하는 일은 서브젝트가 전달받은 데이터를 출력하는 일이다.

즉 옵저버 패턴의 정의를 알 수 있는데, 서브젝트는 옵저버를 가지고, 옵저버에게 정보를 전달한다는 사실과 옵저버는 서브젝트에게 전달받은 데이터를 처리한다는 것이다.

profile
하늘이의 개발 일기

0개의 댓글