OOP : Object-Oriented Programming
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위인
객체들의 상호작용으로 프로그램 로직을 구성하는 프로그래밍 패러다임.
객체 지향 프로그래밍 이전의 프로그래밍 패러다임에서는 중심이 컴퓨터에 있다. 즉, 이전에는 컴퓨터가 사고하는 방식으로 프로그래밍을 했다면 객체 지향에서는 인간 중심의 사고를 하고 있다고 볼 수 있다. 그래서 현실 세계의 사물들을 객체로 보고 그 객체로부터 특징을 찾아 프로그래밍 하는(추상화) 것이다.
객체 지향 프로그래밍을 하면 코드의 재사용성이 높다. 자주 사용되는 로직을 라이브러리로 만들어 계속 사용할 수 있으며 각종 예외 상황에 맞게 만들어 에러를 컴파일 단계에서 잡아내도록 할 수도 있다. 이를 통해 신뢰성을 확보하고 버그 발생이 줄어든다. 이런 라이브러리들이 많이 제공되고 있고 사용 가능하기 때문에 생산성이 높아진다.
객체 단위로 나눈 코드를 작성하기 때문에 디버깅이 쉽고 유지보수에 용이하고 데이터 모델링에서 객체와의 매핑이 수월하기 때문에 요구사항 파악에 효과적이다.
객체 간의 정보 교환이 모두 메시지를 통해 일어나기 때문에 실행 시스템에 많은 오버헤드가 발생하게 된다는 문제가 있었지만 하드웨어의 지속적인 발전으로 상당 부분 보완되었다. 오히려 문제되는 객체가 상태를 갖게 되는 것이다. 변수가 존재하고 그 변수를 통해 객체가 예측할 수 없는 상태를 갖게 되어 애플리케이션 내부에서 버그를 발생시키는 것이다.
위와 같은 이유로 함수형 패러다임이 주목받고 있다.
OOP 특징
- 캡슐화 Encapsulation
한 객체가 특정한 하나의 목적을 위해 필요한 데이터나 메소드(기능)를 하나로 묶는 것으로 객체가 독립적인 역할을 할 수 있도록 한다. 실제로 구현되는 부분을 외부로 드러내지 않도록 해 정보를 은닉할 수 있다.
- 은닉화 Information hiding
캡슐화의 목표로, 내부 구조는 private하게 감춰두고 외부에서 조작할 수 있는 정보만 public으로 공개
- 바깥 간섭으로 인해 발생하는 오류 방지
- 응집도를 높이며, 결합도를 떨어뜨려 유연함과 유지 보수성을 높인다.
- 상속성 Inheritance
기존 메소드와 변수를 물려받으면서 필요한 기능을 더 추가하거나 재정의하는 것
- 추상화 Abstraction
공통의 속성이나 기능을 묶어 이름을 붙이는 것으로 구체적으로 정의하는 것이 아니라 필요한 정보만을 중심으로 간소화 하는 것을 말한다.
- 다형성 Polymorphism
하나의 변수명이 상황에 따라 다른 의미로 해석될 수 있다는 것으로, 결국 하나의 클래스나 메서드가 다양한 방식으로 동작이 가능한 것을 말한다.
- 오버라이딩, 오버로딩을 뜻함
- 동적 바인딩
runtime 값에 따라 변수 데이터 타입과 호출될 함수가 결정되는 것
- 대부분의 객체 지향 언어가 지원하지만, 예외의 경우도 있다.
SOLID 원칙
- 단일 책임 원칙 Single responsibility principle
한 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화 해야한다.
- 개방-폐쇄 원칙 Open/closed principle
소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 변경에 대해서는 닫혀 있어야 한다.
- 리스코프 치환 원칙 Liskov substitution principle
프로그램의 객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 인터페이스 분리 원칙 Interface segregation principle
큰 덩어리의 인터페이스를 구체적이고 작은 단위로 분리함으로써 클라이어트가 필요없는 메서드에 의존하지 않고 반드시 필요한 메서드만 이용할 수 있어야 한다.
- 의존관계 역전 원칙 Dependency inversion principle
상위 모듈은 하위 모듈에 의존해서는 안된다. 상위/하위 모듈 모두 추상화에 의존해야한다.
추상화는 세부 사항에 의존해서는 안된다. 세부 사항이 추상화에 의존해야 한다.
* https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/main/Development_common_sense
'CS' 카테고리의 다른 글
[CS] TCP/UDP (0) | 2024.02.05 |
---|---|
[CS] OSI 7계층 (0) | 2024.02.05 |
[CS] 절차지향, 객체지향 (0) | 2024.01.29 |
[CS] 동기와 비동기 (0) | 2024.01.22 |
[CS] 쿠키와 세션 (0) | 2024.01.22 |