OOP란?
필요한 데이터를 추상화하여 속성(Attributes)와 행위(methods)를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 방법이다.
데이터를 중심으로 필요한 기능을 함수로 구현하는 방식의 절차 지향 프로그래밍과 달리, OOP에선 데이터와 함수들을 묶고 이를 객체로 관리한다.
객체라고 하면 뭔가 말이 어렵고 한데, 그냥 우리가 일반적으로 사용하는 언어 구조와 비슷하다고 생각하면 이해하기 쉽다.
위 그림을 예시로 들면 우선 데이터는 '돈', '잔돈', '제품'이다. 앞서 절차 지향에선 데이터(돈, 잔돈, 제품)를 행위와 별도로 생각한다고 했다. 그래서 절차 지향에선 데이터에 대한 모든 행위를 '~돈을 ~', '~잔돈을~', '~제품을~'의 식으로 표현한다.
하지만 우리가 데이터를 통해 어떤 행동을 할 땐, 목적이 되는 대상이나 주체가 정해져 있는 경우가 많다. 실제로 우리는 보통 말할 때도 '고객이 돈을 ~' 또는 "자판기가 돈을~"과 같은 표현을 더 많이 사용하고, 익숙하다. 이 경우 행위와 데이터를 묶어 유기적으로 표현하는 객체 지향과 닮았다.
OOP의 4가지 특징
Encapsulation(캡슐화) → Tell, Don’t Ask.
객체의 속성과 행위를 하나로 묶고, 구현 코드를 외부에 감춰 은닉 하는 것을 뜻한다.
다시 말하면 데이터와 처리 행위를 묶고, 외부에는 그 행위를 보여주지 않는 것이다.
캡슐화는 객체의 응집도와 독립성을 높여 객체의 모듈화를 지향할 수 있게 도와준다.
모듈화는 모듈 단위의 코드 재 사용이 가능하기 때문에, 코드 유지 보수에도 도움을 준다.
Abstraction(추상화)
중요하고 필요한 정보 만을 표현하기 위해서, 객체의 공통적인 속성과 행위를 하나로 묶는 것을 의미한다.
Inheritance(상속)
상위 클래스에서 정의된 기능을 가져와 재 사용하거나, 새로운 기능을 추가해
코드의 중복을 줄이고 재 사용성을 늘릴 수 있는 방법을 의미한다.
Polymorphism(다형성)
객체가 상속을 통해 기능을 확장, 변경하여 여러 형태의 객체로 재구성 되는 것을 의미한다.
Overriding과 Overloading을 통해 다형성을 확보할 수 있다.
- Overriding : 상위 클래스에 동일한 이름을 가진 함수가 있을 때, 하위 클래스에서 기능을 재 정의 하는 것을 의미한다.
- Overloading : 하나의 클래스 안에 같은 이름을 가진 함수를 여러 개 만들 수 있게 해줍니다. 구분을 위해 함수의 인자들은 달라야 한다.
OOP의 장/단점
장점
- 높은 코드 재 사용성 : 다형성이 있고, 캡슐화를 통해 모듈화가 가능하기 때문에
- 생산성 향상 : 캡슐화로 객체의 독립성이 높기 때문에
- 자연적 모델링 가능 : 일상의 언어와 유사하다는 장점이 있기 때문에
- 유지 보수의 우수성 : 캡슐화로 객체의 독립성이 높고, 다형성이 있어 기능 변경이 용이함
단점
- 개발 속도가 느림 : 모델링 과정에서 시간이 오래 걸리기 때문에
- 절차 지향에 비해, 실행 속도가 느림 : 클래스를 확인 후, 실행되기 때문에
- 객체가 많아짐에 따라 용량이 커짐 : Instance의 증가로 인한 문제점