프로그래밍-학습기록/객체 지향 프로그래밍 8

클래스의 내부와 외부를 구분해야 하는 이유는?!

클래스의 내부와 외부를 구분해야 하는 이유 1. 경계의 명확성이 객체의 자율성을 보장하기 때문이다. 객체가 자율적인 존재로 우뚝 서기 위해서 외부의 간섭을 최소화해야 한다. 일반적으로 객체의 상태는 숨기고 행동만 외부에 공개해야 한다. 외부에서는 객체가 어떤 상태에 놓여 있는지, 어떤 생각을 하고 있는지 알아서는 안 되며, 결정에 직접적으로 개입하려고 해서도 안 된다. 객체에게 원하는 것을 요청하고는 객체가 스스로 최선의 방법을 결정할 수 있을 것이라는 점을 믿고 기다려야 한다. 캡슐화와 접근 제어는 객체를 두 부분으로 나눈다. 하나는 외부에서 접근 가능한 부분으로 이를 퍼블릭 인터페이스라 부른다. 다른 하나는 외부에서 접근 불가능하고 오직 내부에서 접근 가능한 부분으로 이를 구현이라 부른다. 2. 프로..

<오브젝트>에서 말하는 '객체지향, 왜 필요한가?'

책 에서 말하는 객체지향 설계 책 의 34쪽에서 36쪽을 발췌, 요약한 글입니다. 설계가 왜 필요한가 항상 변경되는 요구사항에 잘 대응하기 위해서 좋은 설계가 필요하다. 우리가 짜는 프로그램은 두 가지 요구사항을 만족시켜야 한다. 우리는 오늘 완성해야 하는 기능을 구현하는 코드를 짜야 하는 동시에 내일 쉽게 변경할 수 있는 코드를 짜야 한다. 좋은 설계란 오늘 요구하는 기능을 온전히 수행하면서 내일의 변경을 매끄럽게 수용할 수 있는 설계다. - 35p 요구사항은 항상 변경된다. 코드를 변경해야 한다. 버그가 발생할 가능성이 높아진다. 그러니 변경을 수용할 수 있는 설계가 중요하다. 객체지향 설계 객체지향 프로그래밍은 의존성을 효율적으로 통제할 수 있는 다양한 방법을 제공함으로써 요구사항 변경에 좀 더 수..

주요 디자인 패턴

주요 디자인 패턴 디자인 패턴이란? 반복적으로 사용되는 소프트웨어 설계 패턴 전략(Strategy) 패턴 예시 상황 → 과일 매장에서 상황에 따라 다른 가격 할인 정책을 적용할 때 서로 다른 계산 정책들이 한 코드에 섞여 있어, 정책이 추가될수록 코드 분석이 어려움 가격 정책이 추가될 때마다 calculate 메서드를 수정하는 것이 점점 어려워진다. 예를 들어 마지막 손님 50% 할인과 같은 새로운 가격 정책이 추가될 경우, calculate 메서드에 마지막 손님을 구분하기 위한 lastGuest 파라미터가 추가되고 if 블록이 하나 더 추가되어야 한다. 일반 상황 if - else로 구성된 코드 블록이 비슷한 기능(비슷한 알고리즘)을 수행하는 경우 완전히 동일한 기능을 제공하지만 성능의 장단점에 따라 ..

DI(Dependency Injection)와 서비스 로케이터

DI(Dependency Injection)와 서비스 로케이터 애플리케이션 영역과 메인 영역 (본 책에서는 예제를 통해 애플리케이션과 메인 영역을 설명한다. 예제가 구체적이고 설명도 자세해서 책을 찬찬히 읽으면 이해가 잘 된다.) 메인 영역은 다음 작업을 수행한다. 어플리케이션 영역에서 사용될 객체를 생성한다. 각 객체 간의 의존 관계를 설정한다. 어플리케이션을 실행한다. 메인 영역은 어플리케이션영역의 객체를 생성하고, 설정하고, 실행하는 책임을 갖기 때문에, 어플리케이션 영역에서 사용할 하위 수준의 모듈을 변경하고 싶다면 메인 영역을 수정하게 된다. 모든 의존은 메인 영역에서 어플리케이션 영역으로 향한다. 반대의 경우인 어플리케이션 영역에서 메인 영역으로의 의존은 존재하지 않도록 한다. 이는 메인 영역..

SOLID 설계 원칙

설계 원칙: SOLID SOLID 설계 원칙은 다섯 가지 원칙으로 구성된다. 객체 지향 설계 관련 내용들을 체계적으로 정리한 것으로서 이 원칙만으로도 좋은 설계를 하는데 큰 도움이 될 것이다. SRP, Single responsibility principle 단일 책임 원칙 OCP, Open-closed principle 개방-폐쇄 원칙 LSP, Liskov substitution principle 리스코프 치환 원칙 ISP, Interface segregation principle 인터페이스 분리 원칙 DIP, Dependency inversion principle 의존 역전 원칙 SRP, Single responsibility principle 단일 책임 원칙 클래스는 단 한 개의 책임을 가져야 한다..

재사용, 상속보다는 조립으로

재사용: 상속보단 조립 상속을 사용하면 재사용을 쉽게 할 수 있는 것은 분명하다. 하지만 상속을 사용할 경우 몇 가지 문제점이 있다. 이 글에서는 상속을 통한 재사용 과정에서 발생할 수 있는 문제점을 살펴보고, 또 다른 재사용 방법인 객체 조립을 통해 상속을 통한 재사용의 단점을 해소하는 방법을 알아본다. 상속을 통한 재사용의 단점 상위 클래스 변경의 어려움 어떤 클래스를 상속받는다는 것은 그 클래스에 의존한다는 뜻이다. 따라서 의존하는 클래스의 코드가 변경되면 영향을 받을 수 있다. 즉, 상위 클래스에서 변경의 여파가 하위 클래스로 전파된다. 최악의 경우 상위 클래스의 변화가 모든 하위 클래스에 영향을 줄 수 있다. 이는 클래스 계층도에 있는 클래스들을 한 개의 거대한 단일 구조처럼 만들어 주는 결과를..

다형성과 추상 타입

다형성과 추상 타입 객체 지향에서 유연하게 구현을 변경할 수 있도록 하는 방법으로 추상화가 있다. 추상화는 다형성으로 가능해진다. 다형성을 알기 위해서는 상속을 알아야 한다. 상속 개요 상속(Inheritance)은 한 타입을 그대로 사용하면서 구현을 추가할 수 있도록 해주는 방법을 제공한다. 어떤 객체가 갖고 있는 기능을 확장해 새로운 기능을 구현하고 싶을 때 상속을 사용한다. 상속 대상이 되는 클래스를 상위(super) 클래스 또는 부모 클래스라고 부른다. 상속을 받는 클래스를 하위(sub) 클래스 또는 자식 클래스라고 부른다. 자식 클래스는 부모 클래스에 정의된 구현을 물려받는다. 프로그래밍 언어마다 하위 타입에서 물려받을 수 있을 것이 다를 수 있다. 다수의 언어에서 private 범위를 갖는 메..

객체 지향

객체 지향 절차 지향과 객체 지향 절차(프로시저) 지향 프로그램은 데이터를 중심으로 한 프로시저로 구성된다. 프로그램 규모가 커져서 데이터 종류가 증가하고 이를 사용하는 프로시저가 증가하게 되면, 다음과 같은 문제들이 발생하게 된다. 데이터 타입이나 의미를 변경해야 할 때, 함께 수정해야 하는 프로시저가 증가한다. 같은 데이터를 프로시저들이 서로 다른 의미로 사용하는 경우가 발생한다. 이는 결국 코드의 수정을 어렵게 만들며, 새로운 기능을 추가하는데 많은 구현 시간(즉, 개발 비용)을 투입하게 만든다. 이런 절차 지향과 달리 객체 지향 프로그램은 데이터 및 데이터와 관련된 프로시저를 객체(object)라고 불리는 단위로 묶는다. 객체는 프로시저를 실행하는데 필요한 만큼의 데이터를 가지며, 객체들이 모여 ..