나는 내 기억력을 믿지 않는다

[기본 지식] 객체지향 정리 (OOP, SOLID원칙)

박도치 2024. 3. 18. 06:57

 

객체지향이란?

 

객체는 세계에 존재하는 사물이나 개념 등을 의미한다. 그리고 객체 지향 프로그래밍은 객체를 프로그래밍에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화를 통해 모델링하는 프로그래밍 방식이다. 

 

객체지향 프로그래밍은 프로그램을 개체 또는 객체의 모음으로 구성한다. 객체들은 데이터와 데이터를 처리하는 메서드(함수)로 구성되어 있다. 

 

객체지향 프로그래밍은 현실 세계의 사물이나 개념을 모델링하기에 적합하며, 코드를 더 이해하기 쉽고 유지보수하기 쉽게 만들어 준다.

 

C#에서의 객체지향 프로그래밍은 클래스와 객체를 기반으로 한다. 클래스는 객체를 만들기 위한 템플릿이며, 객체는 클래스의 인스턴스이다. 여기서 클래스는 데이터와 메서드로 구성된다.

 

예를 들어, 자동차를 객체지향적으로 만든다고 치면 자동차 클래스에서 데이터는 브랜드, 색상 등이 있으며 메서드는 가속 감속등의 기능이 있다. 이 클래스를 기반으로 여러대의 자동차 객체를 생성할 수 있다. 

 

객체지향적 접근은 코드를 재사용하고, 모듈화하여 개발 속도를 높이며, 코드의 가독성과 유지보수성을 향상시킨다. 객체 지향 프로그래밍은 유지보수가 쉽고 확장이 용이한것이 장점이다.

 

 

객체지향의 특징

객체지향의 특징은 4가지로 구성되어있으며, 각각 추상화, 상속, 다형성, 캡슐화이다.

 

1. 추상화

미술에서의 추상은 구체적인 형상이 아니다 라는 뜻이지만, 언어에서의 추상화는 공통적인 속성과 기능을 추출하여 정의한다는 뜻이다.

 

C#에서는 대표적인 추상화가 추상 클래스와 인터페이스를 이용하는 것이다. 인터페이스는 이를 상속받는 다른 클래스들이 수행해야하는 역할을 규정해두는 역할을 한다.

 

2. 상속

상속은 이미 존재하는 클래스의 특성과 동작을 새 클래스가 재사용하는 것을 의미한다. 이를 통해 코드의 재사용성을 높이고 계층 구조를 형성하여 소프트웨어의 구조를 더욱 명확하게 만들어준다.

 

3. 다형성

 

다형성은 객체가 여러 형태를 가질 수 있는 능력을 의미한다. 동일한 이름의 메서드를 다른 방식으로 구현하는 것을 허용함으로써 다형성을 달성할 수 있다. 이는 코드의 유연성을 증가시키고, 다양한 유형의 객체를 동일한 인터페이스로 처리할 수 있게 된다.

 

4.캡슐화

 

캡슐화는 데이터와 해당 데이터를 처리하는 메서드를 하나의 단위로 묶는 것을 의미한다. 이를 통해 객체의 내부 구현된 세부사항을 외부로부터 숨기며, 객체 간의 상호작용을 제어할 수 있다.

 

 

OOP ( Object-Oriented Programming )

 

객체 지향 프로그래밍이란, 컴퓨터 프로그램을 어떤 데이터를 입력 받아 순서대로 처리하고 결과를 도출하는 명령어들의 목록으로 보는 시각에서 벗어나 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미한다.객체 지향적으로 프로그램을 설계하면 보다 유연하고 변경이 용이하게 만들 수 있다..

 

객체 지향적 원리를 잘 적용해 둔 프로그램은 각각의 부품들이 각자의 독립적인 역할을 가지기 때문에 코드의 변경을 최소화하고 유지보수를 하는 데 유리하다. 또한 코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현할 수 있다.

 

 

SOLID원칙

 

SOLID원칙은 OOP를 효과적으로 구현하기 위한 5가지 원칙을 의미한다.

 

1. 단일 책임의 원칙 : 하나의 클래스는 하나의 책임만 가져야 한다는 뜻이다. 즉, 클래스는 변경의 이유가 하나여야 한다. 이를 통해 클래스의 응집도를 높이고, 변경에 대한 영향을 최소화한다.

 

2. 개방 폐쇄의 원칙: 소프트웨어 요소(클래스, 함수 등)은 확장에 대해서는 열려 있어ㅑ 하고, 수정에 대해서는 닫혀있어야 한다. 이는 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있도록 설계해야 함을 의미한다.

 

3. 리스코프 치환 원칙: 상위 타입의 객체는 하위 타입의 객체로 치환 가능해야 한다. 즉, 어떤 클래스가 상속 관계에 있을 때, 하위 클래스는 상위 클래스의 기능을 모두 수행할 수 있어야 한다.

 

4. 인터페이스 분리 원칙: 클라이언트는 자신이 사용하지 않는 메서드에 의존하지 않아야 한다. 즉, 클라이언트는 오직 필요한 기능에만 의존해야 한다. 이를 통해 인터페이스를 더 작고 구체적으로 분리함으로써 클라이언트가 필요한 부분만을 사용할 수 있도록 한다.

 

5. 의존 역전 원칙: 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되며, 둘 다 추상화에 의존해야 한다. 즉, 구체화에 의존하면 안되고 추상화에 의존해야 한다.