객체지향 프로그래밍
컴퓨터 관련 학부생이라면 무조건 들어봤을 객체지향 프로그래밍!!
객체지향 설계, 객체지향 프로그래밍 등 이야기는 많이 들어보았지만 무엇인지 깊이 이해하기보단 추상적으로만 이해했었습니다. (추상화는 객체지향의 특징인데... 그래서 어려운건가..)
객체지향 프로그래밍에 대해 한발짝 더 다가가보겠습니다.
그렇다면 객체지향 프로그래밍은 왜 만들어졌을까요?
객체지향 프로그래밍의 등장
초기 프로그래밍 방식은 절차 지향 프로그래밍 방식입니다. 주로 학부 1학년 과정에서 배우는 C언어가 바로 대표적인 절차 지향 프로그래밍 언어입니다. 우리가 C언어를 사용해서 만든 프로그램은 흐름에 따라 그 순서대로 함수들을 실행해가며 결과를 만들었습니다. 초기 프로그래밍도 마찬가지입니다. 프로그램 자체가 가지는 기능에 대해서만 고려하였고, 이 프로그램이 어떤 데이터를 취급하는 지에는 별로 관심이 없었습니다. 하지만, 프로그램의 요구사항과 복잡도, 크기 등이 커지면서 코드가 점점 복잡해졌습니다. 바로 이렇게 난잡해진 코드를 우리는 "스파게티 코드"😱라고 부릅니다. 덩치가 큰 시스템을 설계하는 것은 매우 어려운 일입니다. 따라서, 시스템이 복잡해지면서 발생하는 문제들을 프로젝트 초기 단계부터 작은 단위로 해결하기 위해 객체 지향 프로그래밍이 등장하였습니다.
객체지향 프로그래밍의 사전적 정의
객체지향 프로그래밍의 사전적 정의는 다음과 같습니다.
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립적인 단위, 즉 "객체"들의 모임으로 파악하고 하는 것이다.
덧붙여서, 객체 지향 프로그래밍은 프로그래밍에서 필요한 데이터를 상태와 행위를 가진 객체로 추상화시켜 이런 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체지향 프로그래밍의 특징
객체지향 프로그래밍의 추상화, 캡슐화, 상속, 다형성이라는 특징을 가집니다.
-
추상화
- 추상화는 객체들의 공통된 속성과 행위를 추출하는 것입니다.
- 역할과 구현을 분리하여 설계를 유연하게 변경할 수 있도록 만들어줍니다.
-
캡슐화
- 캡슐화는 높은 응집도와 낮은 결합도를 유지하기 위해 사용합니다.
- 객체의 세부 내용을 감추고 싶거나 외부에서 데이터를 직접 접근하거나 조작하는 것을 방지할 수 있습니다.
-
상속
- 상속은 부모 클래스의 특징과 기능을 자식 클래스가 그대로 물려받는 것입니다.
- 기존에 작성한 코드를 재사용하기 때문에 코드 재사용성을 높여주는 기능입니다.
- 기능의 일부분을 변경해야 할 경우 자식 클래스에서 오버라이딩을 통해 기능 변경이 가능합니다.
-
다형성
- 다형성은 하나의 변수 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것을 말합니다.
- 변화가 생겼다면 해당 모듈 부분만 교체하는 등 상황에 유연하게 대처할 수 있습니다.
- 예시) 인터페이스, 추상클래스, 오버로딩, 오버라이딩 등...
객체지향의 5원칙(SOLID) ✅
- 단일 책임 원칙(SRP, Single Responsibiliy Principle) : 하나의 클래스는 단 하나의 책임만을 가진다. 해당 클래스를 변경해야 하는 이유는 오직 하나 뿐이어야 한다.
- 개방 폐쇄 원칙(OCP, Open-Closed Principle) : 자신의 확장에는 열려있지만 주변의 변화로부터는 닫혀있어야 한다는 원칙이다.
- 리스코드 치환 원칙(LSP, Liskov Substitution Principle) : 상위 타입은 언제나 하위 타입으로 대체할 수 있어야 한다는 원칙이다.
- 인터페이스 분리 원칙(ISP, Interface Segregation Principle) : 하나의 일반적인 인터페이스보다 여러 개의 자세한 인터페이스가 더 낫다는 원칙이다.
- 의존 역전 원칙(DIP, Dependency Inversion Principle) : 자신보다 변하기 쉬운 것에 의존하지 않는 즉, 변할 가능성이 낮은 것(인터페이스, 추상클래스, 상위클래스)과 의존해야 한다는 원칙이다.