Java와 같은 언어는 객체 지향 패러다임을 지향한다고 알려져있다. 패러다임이란 무엇일까? 더 나아가 소프트웨어에서 흔히 말하는 패러다임에 대해 알아보자.패러다임한 시대의 사회 전체가 공유하는 이론이나 방법, 문제 의식 체계패러다임의 공존은 가능하다. C++의 경우 절
객체지향 프로그래밍을 하는 가장 큰 이유는 추후 유지보수 + 확장에 대비하기 위함이다. 단순히, 객체지향 언어를 사용한다고 이게 가능한 것은 아니며 여러 규칙들을 준수하여 설계를 하였을 때 원하는 목표를 이룰 수 있다. 초기 설계 단계에서 어떤 걸 고려해야 되는지 살
객체지향의 본질은 협력하는 객체들의 공동체를 창조하는 것이다. 클래스, 상속, 동적 바인딩은 객체의 책임과 협력이 정해진 후 사용 가능한 구현 매커니즘이다. 초반 설계시 구현에 초점을 두어선 안된다. 어떤 협력이 필요하지? 여기에 어떤 역할과 책임이 필요하지? 를 고민
설계는 변경을 위해 존재하여 변경은 어떻게든 비용이 발생한다. 훌륭한 설계란 합리적인 비용으로 변경을 수용할 수 있는 구조를 만드는 것이다.적절한 비용안에서 변경 가능한 구조가 되기 위해선 객체끼리 느슨히 연결되있어야 하며 응집도가 높은, 흔히 말하는 유연한 코드가 되
데이터를 중심으로 하여 설계를 하면 캡슐화가 지켜지지 않아 응집도가 낮아지고 결합도가 높아진다. 이러한 코드는 변경에 유연하게 대처하기 힘들다. 데이터가 아닌 책임에 초점을 둬야 한다. 이를 통해 앞서 언급한 단점들을 모두 해결하여 유연한 코드를 작성할 수 있다.
객체지향 프로그래밍은 클래스가 아닌 객체에 초점을 둬야한다. 더 정확히 말하면 협력 안에서 객체가 수행하는 책임에 초점을 두자.클래스는 개발자가 직접 다룰 수 있는 실제적이면서 구체적인 도구일 뿐이다. 이에 너무 집착하면 유연하지 못한 설계가 된다.책임은 곧 객체가 수
프로그래밍에서 문제를 해결하기 위해 사용하는 저장소는 단기 기억 방식이다. 단기 기억의 경우 용량이 상대적으로 작고 이를 초과하는 순간 해결 능력이 급격히 떨어진다. 이러한 현상을 인지 과부화라고 하며 이를 해결하기 위해 정보마다 불필요한 부분을 제거하고 현재 문제 해
객체 지향 5가지 원칙 등 우리는 이름을 가진 설계 원칙을 많이 들어봤다. 이들은 확장 가능하고 변화에 유연한 설계 기법이다. 대표적인 원칙들을 살펴보고, 이들은 궁극적으로 어떤 것을 목표로 하는지 알아보자.소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 열려있어야
객체지향 프로그래밍의 장점은 코드를 재사용하기 용이하다는 것이다. 전통적인 패러다임과 다르게 코드를 수정하는게 아닌 새로운 코드를 추가함으로써 재사용이 가능하다.대표적으로 상속을 통해 코드를 재사용한다. 그러나, 이는 많은 문제들을 동반한다. 우선 코드를 재사용하는게
합성 또한 상속과 마찬가지로 객체지향에서 가장 널리 사용되는 코드 재사용 기법이다. 합성은 재사용 객체를 인스턴스로 포함하여 해당 객체의 코드를 사용한다.상속은 구현에 의존하며 컴파일 시점에 의존성이 해결된다. 대부분의 경우 구현보단 인터페이스에 의존하는게 좋다. 확장
다형성이 구현되는 기술적 매커니즘을 살펴보자. 다형성 다형성은 런타임 시점(메시지를 처리할 수 있는 시점)에 적절한 메서드를 탐색하는 과정을 통해 구현된다. 상속은 이러한 메서드를 찾기 위한 일종의 탐색 경로를 클래스 계층의 형태로 구현하는 방법이다. 종류 매개
상속의 용도는 크게 2가지라 볼 수 있다.타입 계층 구현코드 재사용코드 재사용은 부모-자식 간 높은 결합도로 인해 변경하지 어려운 코드가 된다. 상속은 코드 재사용이 아닌 타입 계층을 구현하는데 사용하자.동일한 메시지에 대해 서로 다르게 행동할 수 있는 다형적 객체를
객체는 협력을 위해 존재한다. 협력은 객체가 존재하는 이유를 설명하고 문맥을 제공한다.유사한 요구사항을 계속 추가하는 상황에서 협력이 서로 다른 패턴을 따른다면 설계의 일관성이 무너지게 된다.가능하면 유사한 기능을 구현하기 위해 유사한 협력 패턴을 사용하자. 약간의 부