객체지향 프로그래밍이란
알고 있지만 막상 설명할 수 없는 기본 개념을 정리하기 위해 포스팅을 하게 되었다.
📌 객체지향 프로그래밍 :: OOP
객체지향 프로그래밍(Object-Oriented Programming)은
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고, 그 객체들 간 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
* 객체 : 현실에 무언가를 추상적으로 표현한 것
📌 OOP의 특징
1. 추상화
클래스들의 공통적인 특성(변수, 메서드)들을 묶어서 표현하는 것
2. 캡슐화
데이터 구조와 데이터를 다루는 방법들을 하나의 캡슐 형태로 결합시켜 데이터와 코드의 형태를 외부로부터 알 수 없게 하는 것
3. 상속
상위 요소의 특징을 하위 요소가 물려받는 것
4. 다형성
하나의 변수명, 함수명 등이 상황에 따라 다양한 형태로 표현이 가능한 구조
📌 SOLID 원칙 :: 객체지향설계 5대 원칙
1. SRP : 단일 책임 원칙
클래스를 변경하는 이유는 단 하나로, 클래스는 단 한 개의 책임을 가져야 한다.
2. OCP : 개방-폐쇄 원칙
확장에는 열려있고 변경에는 닫혀있어야 한다. 즉, 기존 코드를 변경하지 않고 기능을 추가 및 수정할 수 있어야 한다.
3. LSP : 리스코프 치환 원칙
하위타입 객체는 상위타입 객체에서 가능한 행위를 수행할 수 있어야 한다. 즉, 상위타입 객체를 하위타입 객체로 치환해도 정상적으로 동작해야 한다.
4. ISP : 인터페이스 분리원칙
사용에 맞게 인터페이스를 분리하여 사용해야한다.
5. DIP : 의존성 역전 원칙
의존성이 추상에 의존하며 구현체에 의존하지 않는다.
📌 OOP의 특징을 현실세계에 비유한 예시
OOP의 특징을 잘 이해하기 위해 현실세계에 빗대어 생각해 보았다.
예를 들어 아이폰이라는 물체를 추상화한다면 [아이폰 → 휴대폰 → 통신기기 → 전자제품]으로 추상화할 수 있다.
하지만 추상화를 할수록 객체의 디테일함이 사라지고 공통된 특징만 남게 되기 때문에 추상화를 너무 심하게 하면 본래의 형태가 떠오르지 않을 수 있다.
그럼 추상화는 왜 하는 것일까?
첫 번째, 개발을 빠르게 하기 위해서
개발하려는 시스템에서 필요한 객체들을 개념적으로 추상화한 뒤 상위 요소부터 만들어준다.
상위 요소가 가진 내용을 가질 수 있도록 하위 요소를 만들고 상속관계를 설정한다.
전자제품(전원기능) ▼ 통신기기(통화기능) ▼ 휴대폰(카메라, 게임기능) ▼ 아이폰(apple제품 연동기능) |
<아이폰 객체> (상속받은 기능) 전원기능 통화기능 카메라, 게임기능 (고유기능) apple제품 연동기능 |
상속 구조를 이용하면 아이폰을 만들 때 아이폰만의 고유기능 위주로 개발할 수 있다.
공통된 기능들은 상위 요소를 만들 때 미리 구현하기 때문이다.
이러한 방식은 아이폰 하나를 만들 때는 비효율적이지만 제품이 늘어날수록 효율적으로 변한다.
공통 기능을 미리 개발해 두고 상속을 통해 빠르게 구조를 확장할 수 있다. 이러한 구조를 상속 구조라고 한다.
전자제품 | 냉장고 |
세탁기 | |
통신기기 | FAX |
무전기 | |
휴대폰 | 갤럭시 |
아이폰 |
기본적으로 하나의 상위요소만 가질 수 있으며 특정 조건을 만족하면 여러 개를 가질 수 있다.
두 번째, 유연한 프로그래밍 구조를 만들기 위해서
예를 들어 한 치킨매장에서 후라이드와 양념 치킨을 판매한다. 후라이드와 양념 치킨은 같은 박스에 포장한다.
후라이드와 양념 치킨을 모두 추상화하면 치킨이므로 하나의 상자에 보관할 수 있는 것이다.
프로그래밍적으로는 후라이드와 양념치킨이 상속 관계일 때만 가능하다.
상위 요소인 치킨 상자를 이용하여 후라이드 치킨과 양념 치킨 등 다양한 하위 요소 객체를 보관할 수 있는 성질을 다형성이라고 한다.
주차장에 승용차, 벤, 트럭, 버스는 주차할 수 있지만 기차, 비행기는 주차할 수 없는 이유도 다형성에서 찾을 수 있다.
교통수단 | |||||
자동차 | 비행기 |
기차 |
|||
승용차 | 벤 | 트럭 | 버스 |
승용차, 벤, 트럭, 버스는 자동차라는 형태로 표현할 수 있는 다양한 형태 중 하나이므로 주차장을 이용할 수 있다.
하지만 비행기, 기차는 자동차로 추상화할 수 없기 때문에 주차장을 이용할 수 없다.