본문 바로가기

Java/Methodology

(9)
[SOLID] 객체지향 설계 5원칙 - DIP DIP (Dependency Inversion Principle) 위키에 다음과 같이 정의되어있다. 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고 있다. 첫째, 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다. 둘째, 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다. 상당히 어렵게 설명이 되어 있는데 한 마디로 구현체가 아닌 Interface를 의존해야한다는 의미다. 이번에는 구현체를 숨기고 외부에서 의존성을 주입받는 방식에 대해서 알아보도록 한다. Spring을 사용한다면 쉽게 자..
[SOLID] 객체지향 설계 5원칙 - ISP ISP (Interface Segregation Principle) 인터페이스 분리 원칙은 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다. 한마디로 구현 객체는 무의미한 메소드의 구현을 방지하고 반드시 필요한 메소드만을 구현해야한다는 원칙이다. 만약 구현해야하는 Interface가 너무 크다면 해당 Interface를 세분화해야한다. 예를들어 2000년식 아반떼가 있고 2020년식 아반떼가 있다. 2020년식 아반떼에는 앞으로 간다, 뒤로 간다, 멈춘다라는 기본적인 기능 이외에 크루즈컨트롤, 무선충전, 네비게이션등 일반적인 차량 기능외에 많은 새로운 기능이 들어가있다. 이러한 점을 가지고 Car라는 Interface를 구현하면 아래와 같을 것이다. public interfac..
[SOLID] 객체지향 설계 5원칙 - LSP LSP (Liskov substitution principle) 자료형 S가 자료형 T의 하위형이라면, 프로그램에서 자료형 T의 객체는 프로그램의 속성을 변경하지 않고 자료형 S의 객체로 교체할 수 있다. 한마디로 객체는 프로그램의 정확성을 지키면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다 라는 말이다. 다형성의 관점에서 보았을 때 하위 클래스는 인터페이스 규약을 전부 지켜야지만 다형성을 지원할 수 있다. 자바에서 자식객체는 부모객체의 모든 속성을 가지고 있으며 부모객체의 확장 버전이기 때문에 가능한 속성이다. 이러한 점 때문에 필자는 상속(inheritance)라는 표현보다 확장(extend)라는 표현을 선호한다. 코드로 예를 들어보자. public abstract class Car { String..
[SOLID] 객체지향 설계 5원칙 - OCP OCP (Open Closed Principle) 개방 폐쇄 원칙 자신의 확장에는 개방되어 있고, 주변의 변화에 대해서는 폐쇄되어 있어야한다. 소프트웨어는 확장에 대해서는 개방되어야 하지만, 변경에 대해서는 폐쇄되어야 한다. - 로버트 C. 마틴 글로는 이해하기 힘들다. 개방 폐쇄의 원칙을 지키지 않고 있는 코드를 살펴보자. public class 아반떼 { public void 앞으로간다() {} public void 뒤로간다() {} } public class 쏘나타 { public void 앞으로간다() {} public void 뒤로간다() {} } public class 사람 { private 아반떼 차량 = new 아반떼(); } 만약 클라이언트인 사람이 차량을 바꾸게 된다면 코드가 어떻게 변..
[SOLID] 객체지향 설계 5원칙 - SRP SRP (Single Responsibility Principle) 단일 책임 원칙 클래스와 메소드는 하나의 역할만 해야한다. 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다. - 로버트 C. 마틴 아래의 코드는 단일 책임 원칙을 지키지 않고 있는 코드이다. public class PublicTransport { public void 탑승문을연다() {} public void 하차문을연다() {} public void 하차벨을누른다() {} public void 목적지로이동한다() {} public void 트렁크에짐을싣는다() {} } PublicTransport라는 대중교통이라는 클래스다. 버스와 택시의 행위를 모두 모으다 보니 버스의 역할도 해야하고 택시의 역할도 해야한다. 단일 책임 원..
[OOP] 객체 지향 프로그래밍이란? - 다형성 다형성(Polymorphism) 하나의 객체가 여러가지 타입을 가질 수 있다. 하위클래스는 상위클래스로 참조될 수 있다. 역시 글로만 정리하니 이해가 되질 않는다. 아래의 코드를 보자. public class Vehicle { private String manufacturer; private String modelName; } public class Motorcycle extends Vehicle { private String engineName; private String fuelType; } public class Bicycle extends Vehicle {} Vehicle 클래스와 이를 상속하고 있는 Motorcycle이 있다. 그러면 사용하는 쪽의 코드를 확인해보자. Vehicle vehicle..
[OOP] 객체 지향 프로그래밍이란? - 추상화 추상화(Abstraction) 각자 다른 클래스들의 공통적인 부분들을 모아서 하나로 추출한다. 전혀 추상화가 되어있지 않은 아래의 코드를 살펴보자. public class Motorcycle { private String manufacturer; private String modelName; private String engineName; private String fuelType; public void run() { log.info("느리게 달린다."); } public void engineOn() { log.info("시동을 켠다."); } } public class Bicycle { private String manufacturer; private String modelName; public voi..
[OOP] 객체 지향 프로그래밍이란? - 상속 상속(Inheritance) 상위클래스를 확장한 하위클래스가 상위클래스의 기능을 그대로 사용 할 수도 있고 재정의 하여 사용할 수도 있다. 아래는 전혀 상속을 사용하지 않은 코드이다. public class Avante { private String manufacturer; private String modelName; private String modelSubName; public void run() { log.info("달린다."); } public void reverse() { log.info("후진한다."); } } public class Sonata { private String manufacturer; private String modelName; private String modelSubNa..