객체지향 프로그래밍 OOP
객체지향 프로그래밍(OOP)란?
우리가 실생활에서 쓰는 모든 것을 객체라 하며, 객체지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고, 상태와 행위를 가진 객체를 만들어 각각의 객체들의 역할이 무엇인지 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 의미한다.
즉, 기능이 아닌 객체가 중심이며 “누가 어떤 일을 할 것인가?”가 핵심이다. 특징으로는 캡슐화, 상속, 다형성, 추상화 등이 있고, 모듈 재사용으로 확장 및 유지보수가 용이하다.
데이터를 중심으로 필요한 기능을 함수로 구현하는 방식의 절차지향 프로그래밍과 달리, 객체지향에서는 데이터와 함수들을 묶고 이를 객체로 관리하는데, 아래 그림을 통해 이해해 보자.
그림을 예시로 보면, 데이터는 돈, 잔돈, 제품이다. 절차지향에서는 데이터(돈, 잔돈, 제품)를 행위와 별도로 생각한다고 했다. 그래서 절차지향에서는 데이터에 대한 모든 행위를 “~돈”, “~잔돈을”, “~제품을” 의 식으로 표현한다.
그러나 우리가 데이터를 통해 어떤 행동을 할 땐, 목적이 되는 대상이나 주체가 정해져 있는 경우가 많은데, 실제로 우리는 보통 말할 때도 고객이 “돈을~” 또는 자판기가 “돈을~” 과 같은 표현을 더 많이 사용하고 익숙하다. 이 경우 행위와 데이터를 묶어 유기적으로 표현하는 객체지향과 비슷하다.
OOP의 장점과 단점
장점
코드의 재사용성
생산성 향상
자연적 모델링 가능
유지보수 용이
단점
개발 속도 느림
절차 지향에 비해, 실행 속도 느림
객체가 많아지면 용량이 커짐
OOP의 4가지 특징
추상화
추상화란 어떤 대상/집단의 공통적이고 본질적인 특징을 추출하여 정의한 것이다.
객체지향에서 추상화란 어떤 대상을 구현할 때, 그 대상의 본질적인 특징을 정의하고, 이것에 기반하여 대상을 객체로 구현하는 것을 의미한다. 대상의 본질적인 특징을 정의하는 데 프로그래밍적으로 활용되는 개념이 abstract class와 interface이다.
캡슐화
한 객체가 특정한 하나의 목적을 위해 필요한 데이터나 메서드를 하나로 묶고, 구현 코드를 외부에 감춰 은닉하는 것을 의미한다.
캡슐화는 객체의 응집도와 독립성을 높여 객체의 모듈화를 지향할 수 있게 도와준다. 모듈화는 모듈 단위의 코드의 재사용이 가능하기 때문에 코드 유지 보수에도 도움을 준다.
여기서 나온 은닉화는 내부 구조에서는 private으로 감추고, 외부에서 조작할 수 있는 정보만 public으로 공개하는 것이다. 이로 인하여 외부에서의 간섭으로 인해 발생하는 오류를 방지할 수 있다.
상속
상위 클래스에서 정의된 기능을 가져와 재사용하거나, 새로운 기능을 추가해 코드의 중복을 줄이고, 재사용성을 늘릴 수 있는 방법이다.
보통 상속에서는 다중 상속은 안되거나 제한이 있는데, 반면에 인터페이스는 자유롭다.
인터페이스를
implements
하는 경우, 반드시 인터페이스에 있는 메서드를 정의해야 한다.인터페이스의 경우
implements
된 모든 클래스 객체를 하나로 묶어서 한번에 명령할 수 있다.
다형성
객체가 상속을 통해 기능을 확장, 변경하여 여러 형태의 객체로 재구성되는 것을 의미한다. Overriding과 Overloading을 통해 다형성을 확보할 수 있다.
참고 자료
Last updated