개발은 재밌어야 한다
article thumbnail
[디자인패턴] 템플릿 메서드 패턴 (Template Method Pattern)

템플릿 메서드 패턴 볼트라고 하는 이름의 강아징와 키티라는 이름의 고양이를 키운다고 상상해보자. 볼트, 키티와 함께 재미있는 시간을 보내는 세계를 프로그래밍으로 표현한다면 다음과 같은 2개의 클래스가 필요 할 것입니다. Dog클래스와 Cat 클래스 안에 있는 playWithOwner() 메서드를 보면 서로 짖는 부분(멍멍, 야옹야옹)만 빼고는 모두 동일한 것을 볼 수 있다. 코드를 보고 있으면 객체 지향의 4대 특성 가운데 상속을 통해 동일한 부분(중복)은 상위 클래스로, 달라지는 부분만 하위 클래스로 분할하고 싶은 객체 지향 설계에 대한 욕구가 자극될 것입니다. 따라서 이 코드를 개선해보겠습니다. 상위 클래스인 Animal에는 템플릿(견본)을 제공하는 playWithOwner() 메서드와 하위 클래스에..

article thumbnail
[디자인패턴] 싱글턴 패턴(Singleton Pattern)

싱글턴 패턴이란 인스턴스를 하나만 만들어 사용하기 위한 패턴이다. 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등과 같은 경우 인스턴스를 여러 개 만들게 되면 불필요한 자원을 사용하게 되고, 프로그램이 예상치 못한 결과를 낳을 수 있다. 싱글턴 패턴은 오직 인스턴스를 하나만 만들고 그것을 계속해서 재사용한다. 싱글턴 패턴을 적용할 경우 의미상 두 개의 객체가 존재할 수 없다. 이를 구현하려면 객체 생성을 위한 new에 제약을 걸어야 하고, 만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다. 따라서 필요한 요소들이 3가지가 필요하다. new를 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다. 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다. 유일한 단일 객체를 참조할 정적 ..

article thumbnail
[디자인패턴] 프록시패턴 (Proxy Pattern)

프록시(proxy)는 대리자, 대변인이라는 뜻을 가진 단어이다. 대리자/대변인이라고 하면 다른 누군가를 대신해 그 역할을 수행하는 존재를 말한다. 뉴스에는 항상 청와대 대변인, 백악관 대변인 등등 다양한 대변인이 등장한다. 디자인 패턴에서도 이렇게 대리자/대변인이 등장합니다. 우선 대리자를 사용하지 않고 직접 호출하는 코드를 보면 Service라는 클래스를 호출하는 ClientWithNoProxy라는 클래스는 대변인의 존재를 사용하지않은 즉, 프록시 패턴을 적용하지 않은 클래스이다. Service클래스에서 직접적으로 runSomething 메소드를 호출해서 서비스 호출!!! 이라는 결과를 보여준다. 그럼 프록시 패턴이 적용된 경우를 보면, 프록시 패턴의 경우 실제 서비스 객체가 가진 메서드와 같은 이름의..

article thumbnail
[디자인패턴] 어댑터 패턴(AdapterPattern)

AdapterPattern 어댑터를 생각해보면 흔히 사용하는 휴대폰 충전기의 어댑터를 생각해 볼 수 있다. 어댑터는 220V라는 콘센트에 서로 다른 종류의 충전기가 휴대폰과 전원 콘센트 사이에서 둘을 연결해주는 변환기의 역할을 수행해 준다. 데이터 베이스에서 다양한 데이터베이스 시스템을 공통의 인터페이스인 ODBC 또는 JDBC를 이용해서 조작할 수 있는데, ODBC/JDBC 가 어댑터 패턴을 사용해서 다양한 데이터베이스 시스템을 단일한 인터페이스로 조작할 수 있게 해주기 때문이다. 어댑터 패턴이 적용되지 않은 코드 ClientWithNoAdapter 클래스에서 main() 메서드를 보면 sa1 참조 변수와 sb1 참조 변수를 통해 호출하는 각 메서드가 비슷한 일을 하지만 메서드명이 다르다.(sa1은 r..

article thumbnail
SOLID 원칙 5 - DIP: 의존성 역전 원칙 (Dependency Inversion)

DIP 객체 지향 프로그래밍 및 설계에서 5가지 기본원칙(SRP, OCP, LSP, ISP, DIP)의 마지막 다섯번째 원칙인 DIP(Dependency Inversion Principle)에 대해 알아보겠습니다. 의존관계 역전 원칙 (Dependency inversion principle) 객체 지향 프로그래밍에서 의존관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고 있다. 첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야..

article thumbnail
SOLID 원칙 4 - ISP: 인터페이스 분리 원칙 (Interface Segregation Principle)

객체 지향 프로그래밍 및 설계에서 5가지 기본원칙(SRP, OCP, LSP, ISP, DIP)의 네번째 원칙인 ISP(Interface Segregation Principle)에 대해 알아보겠습니다. ISP(인터페이스 분리 원칙)은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다. - 위키백과- 우선 여기서 말하는 인터페이스의 개념에 대해 잠깐 알아보자 인터페이스란? 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 인터페이스의 역할이자 개념이다. 어떤 클래스가 있고 그 클래스가 특정한 인터페이스를 사용하여 구현된다면 그 클래스는 반드시 그 인터페이스에 포함되어 있는 메소드를 구현하도록 강제하는 것이다. 즉, 자바의 다형성을 극대화하여 개발 코드 수정을 줄이고 프로그램 ..

article thumbnail
SOLID 원칙 3 - LSP: 리스코프 치환 원칙 (Liskov Substitution Principle)

객체 지향 프로그래밍 및 설계에서 5가지 기본원칙(SRP, OCP, LSP, ISP, DIP)의 세번째 원칙인 LSP(Liskov Substitution Principle)에 대해 알아보겠습니다. 치환성(영어: substitutability)은 객체 지향 프로그래밍 원칙이다. 컴퓨터 프로그램에서 자료형 {\displaystyle S}S가 자료형 {\displaystyle T}T의 하위형이라면 필요한 프로그램의 속성(정확성, 수행하는 업무 등)의 변경 없이 자료형 {\displaystyle T}T의 객체를 자료형 {\displaystyle S}S의 객체로 교체(치환)할 수 있어야 한다는 원칙이다. 리스코프 치환 원칙(영어: Liskov substitution principle, LSP)은 바바라 리스코프가..

article thumbnail
SOLID 원칙 2 - OCP: 개방-폐쇄 원칙 (Open-Closed Principle)

SOLID 객체 지향 프로그래밍 및 설계에서 5가지 기본원칙(SRP, OCP, LSP, ISP, DIP)의 두번째 원칙인 ORP(Open-Closed Principle)에 대해 알아보겠습니다. Open-Closed Principle라는 뜻을 한국말 그대로 받아들이면 열려있으면서 닫힌 원칙이라는 말이 됩니다. 열려있으면서도 닫혀있다는게 무슨 소리인거지.. 어렵게 생각할 수도 있지만 간단하게 생각하면 OCP는 매우 명확한 의미를 가집니다. OCP에서의 Open은 확장에 대해서, Closed는 변경에 대해서 의미합니다. 즉, "확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다."라는 뜻입니다. 개발적인 의미로는 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다는 뜻을 가지는 원..

article thumbnail
[디자인 패턴] 빌더 패턴(Builder Pattern)

스프링 인 액션 5판 스터디를 진행하던 중에 스프링 시큐리티에서 빌더 패턴이 사용되는 부분을 보고 빌더 패턴에 대한 포스팅을 해보겠습니다. 빌더 패턴은 소프트 웨어 디자인 패턴 중에 하나로 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. 2 단어 요약 생성자 오버로딩 (위키백과- 빌더 패턴) 일단 무슨 소린지 잘 와닿지 않는다. 객체를 생성하는 방법이 여러 가지 있는데, 일반적으로 사용되는 방법은 1.생성자에 인자를 넣어 인스턴스를 생성하는 방법이나 2.setter를 이용하는 자바빈 패턴을 많이 사용합니다. 3. 빌더 패턴은 이런 패턴들에서의 단점을 좀 더 개선한 방법으로 사용되는 방법입니다. 예시로 피자라는 객체가 있다고 가정해보..

article thumbnail
SOLID 원칙 1 - SRP: 단일 책임 원칙 (Single Responsibility Principle)

객체 지향 프로그래밍 및 설계에서 5가지 기본원칙(SRP, OCP, LSP, ISP, DIP)의 앞글자를 따서 SOLID 원칙이라고 합니다. '원칙이란 무엇일까?' 원칙을 이렇게 정의합니다 "많은 경우에 적용되는 기본적인 규칙이나 법칙." SOLID 원칙은 객체 지향 프로그래밍 및 설계에서 많은 경우에 적용되는 규칙이나 법칙입니다. '그럼 SOLID를 적용하는 이유는 뭘까?' 시스템에 예상하지 못한 변경사항이 발생하더라도, 유연하게 대처하고 이후에 확장성이 있는 시스템 구조를 설계하기 위해서입니다. 간단하게 말해서 '유지보수성과 확장성'을 위해서이다. SOILD는 객체 지향 프로그래밍에서 변경사항이 있을때 자기 클래스안에 응집도는 높이고, 다른 클래스 사이의 결합도는 낮추는 High Cohesion - ..