객체지향

객체

객체는 실세계의 개체를 의미합니다. 객체는 상태(field)와 동작(method)을 가지고 있습니다.
객체는 클래스의 인스턴스로 field에 상태를 저장하고 method로 동작을 표현합니다.

클래스

클래스는 탬플릿, 청사진과 같이 레시피와 비슷합니다.
객체를 만드는 과정을 ‘인스턴스화한다’고 말할 수 있으며, 원하는 만큼 객체를 만들 수 있고 클래스 자체는 메모리의 힙 영역에 할당되지 않습니다.
클래스를 인스턴스화하여 생성된 객체가 메모리 힙 영역에 할당됩니다.
일반적으로 단일 책임 원칙을 준수하여 단 하나의 일을 할 수 있도록 설계 및 작성합니다.

단일 책임 원칙이란 클래스나 모듈은 하나의 책임을 가지고 있고, 해당 클래스나 모듈이 변경되어야 할 이유는 하나여야 한다는 원칙입니다.
저는 해당 원칙을 ‘클래스와 모듈의 코드를 분리할 때 각 코드의 역할에 맞게 코드를 잘 분리해야한다.‘로 이해하였고 많은 장점이 있습니다.

예를 들어, 페이지에 적용된 css를 파일로 분리해놨고, 해당 페이지에 적용된 스타일을 수정하려면 css 파일을 찾아 수정하면 되고, 이는 js에는 영향이 가지 않습니다.
또한 수정해야 할 파일을 찾기도 쉽고 수정사항에 영향이 가는 부분이 모여있기 때문에 영향도를 알기 쉽고 중복되는 코드도 줄일 수 있습니다. 이로인해 유지보수성과 코드 재사용성도 높아집니다.

추상화

추상화는 사용자에게 작업의 내부 구현 내용을 숨기는 겁니다.
추상화를 통해 사용자는 애플리케이션이 일을 수행하는 방법이 아닌 수행하는 일 자체에 집중할 수 있습니다.
저희가 마우스를 통해 커서를 움직일 수 있지만, 어떻게 수행하는지는 알 필요가 없는 것과 각각의 마우스마다 만드는 방법, 재료 등은 다를 수 있지만, 마우스라는 하나의 카테고리에 담겨 같은 역할을 한다는 것이 중요합니다.

캡슐화

캡슐화는 접근제어자를 통해 객체의 field를 외부로부터 숨기고 이 field에 간접적으로 접근할 수 있는 일련의 public method를 노출하는 것입니다. 이를 통해 코드 간 느슨한 결합이 가능하고 재사용할 수 있으며 테스트하기 쉽습니다.
내부 field에 직접 접근하고 있다면 내부 field에 변경사항이 있을 경우 관련 코드들에 다 영향이 가지만, 예를 들어 getScore()과 같은 method를 통해 score field에 접근하고 있었다면 해당 field가 math, english, science와 같이 3개로 나뉘어도 getScore() 내부 로직을 변경하면 외부엔 영향이 없습니다.

상속

상속은 다른 객체를 기반으로 객체를 만들 수 있는 것으로 객체가 다른 객체의 코드를 재사용할 수 있도록 허용하여 코드의 재사용성을 유지하고 각 객체만의 로직도 추가할 수 있도록 한 것입니다.
자바에선 extends를 통해 상속을 할 수 있고, IS-A 혹은 부모-자식 관계라고도 합니다.

다형성

다형성은 객체가 때에 따라 다르게 동작할 수 있다는 것으로 컴파일 다형성인 오버로딩, 런타임 다형성인 오버라이딩을 통해 구현하고 있습니다.

연관

연관은 서로 독립적인 두 클래스 간의 관계를 의미하며, 연관에서는 소유자가 없습니다.
연관에는 단방향, 역방향, 일대일, 일대다, 다대일, 다대다 관계가 있습니다.

집약

집약은 단방향 연관 관계의 특별한 경우로 HAS-A 관계를 의미합니다.
집약 관계의 두 객체는 자체 수명 주기를 가지며 객체 중 하나는 HAS-A 관계의 소유자입니다.

구성

구성은 좀 더 제한적인 집약 관계입니다.
구성은 단독으로 존재할 수 없는 객체를 포함하는 HAS-A 관계를 의미합니다. 이 관계일 경우 강조를 위해 PART-OF 관계라 부르기도 합니다.
구성은 객체의 가시성을 제어하고 코드를 재사용합니다.