본문 바로가기

카테고리 없음

객체지향프로그래밍(OOP)란?

 

OOP 설명 예시

객체지향 프로그래밍(OOP)이란 소프트웨어 설계 및 개발 방법론 중 하나이다.

이름에서 추론할 수 있듯이 프로그램을 '객체'라는 단위로 나누어 설계하는 것을 의미한다.

그렇다면 객체는 뭐고, 정확히 뭘 어떻게 설계한다는 걸까?

필자는 이를 새로운 데이터(속성)과 이를 조작하는 방법을 정의하며 진행하는 프로그래밍이라고 해석했다. 

 

객체(Object)란?

객체란 새로운 데이터와 그 데이터를 조작하는 함수(메서드)를 가지는 독립적인 단위를 의미한다.

예를 들어, 자바로 예시를 들면 '자동차'라는 클래스를 정의한다고 했을때, '자동차 객체'는 각 자동차의 색상, 모델, 속도 등의 데이터를 가질 수 있고, 엑셀 밝기, 브레이크와 같은 메서도(기능)을 가질 수 있다. 

요약하자면, 클래스를 통해 새로운 데이터 타입의 속성과 기능을 정의하고, 이후에 constructor를 통해 생성된 각 데이터는 객체가 되는 것이다. 

 

왜 객체로 나누어 설계할까?

그렇다면 근본적으로 왜 이런 짓을 해야하는지 의문이 들 수 있다.

일단 이에 대한 공식적인 설명은 코드의 재사용성, 유지보수성 등을 높이기 위함이라고 알고 있다.

이유는 클래스라는 청사진을 통해 생성된 객체는 독립적으로 동작할 수 있어 다른 부분에 영향을 주지 않고 수정이 가능하고, 새로운 객체를 쉽게 생성하고 추가할 수 있기 때문이다.

그리고 필자가 생각하는 또 다른 이유는 사람이 사물을 인식하고 분류하는 방식을 컴퓨터에도 적용하기 위함이라고 생각한다.

예를 들어, 사람은 똑같은 모델의 자동차가 2대있어도, 이 두가지 자동차는 같은 종류이지만 서로 다른 '객체'임을 바로 인식할 수 있다.

하지만, 컴퓨터가 이 두가지 자동차를 구분하기 위해서는 해당 자동차의 속성이 서로 다른지에 대해 비교해보는 방식을 사용할 것이다.

구현관점에서 속성이란 자동차의 일련번호, 소유주 등에 대한 정보를 가리킨다. 

 

OOP의 4대 원칙

- 추상화 (Abstraction): 복잡한 시스템을 단순화하는 것을 의미한다.

예를 들어, '자동차' 객체에 실제 자동차의 모든 정보를 포함하지 않고, 중요한 속성(색상, 모델)과 기능(엑셀, 브레이크 등)만을 포함하는 것이다. 그리고 불필요한 세부 사항은 숨김으로서 사용자가 이 '자동차' 데이터 타입을 이용할때 이에 대해 세부적으로 알지 못해도 지장이 없어지는 것이다.

 

- 캡슐화 (Encapsulation): 객체의 내부 상태를 숨기고 외부에서 접근할 수 있는 방법을 제한합니다.

캡슐화란 객체 내부의 상태를 숨기고, 외부에서 접근할 수 있는 방법을 제한하는 것을 의미한다. 

자바에는 public과 private이라는 access modifier가 있다. public은 외부에서 접근할 수 있다는 것을 의미하고, private은 해당 클래스내에서만 접근이 가능하다는 것을 의미한다.

예를 들어, 자바를 통해 '자동차'객체를 정의한다면, 해당 자동차의 내부 구조나 부품과 같은 정보는 private으로 설정하고, '엑셀', '브레이크'와 같은 기능(매서드)는 public으로 설정할 수 있는 것이다.

 

- 상속 (Inheritance): 기존 클래스의 속성과 메서드를 재사용하여 새로운 클래스를 만듭니다.

상속이란 기존 객체의 속성과 매서도를 재사용하여 새로운 객체를 만드는 방법이다.

마치 부모에게 재산과 외모와 같은 특성을 물려받듯이 부모 클래스의 속성과 매서드를 자식 클래스가 물려받는 것을 의미한다. 

예를 들어, '자동차' 클래스를 새롭게 정의한 '트럭'이라는 클래스가 상속받을 수 있다. 이 경우, 자동차는 트럭의 부모 클래스가 되며, 상속을 통해 자동차와 트럭은 공통적인 속성(데이터, 매서드)를 공유하면서도, 각각의 고유한 특성도 가질 수 있게 되는 것이다. 

 

- 다형성 (Polymorphism): 같은 메서드가 다른 객체에서 다르게 동작할 수 있게 합니다.

다형성은 매서드 오버로딩과 오버라이딩을 통해 구현된다.

예를 들어, 구현 관점에서 '엑셀'이라는 매서드가 콜되어질때마다 자동차 객체에서는 휘발유라는 데이터를 1씩 감소시키는 방식이라면, 자동차 객체를 상속받은 '전기 자동차'라는 객체에서는 휘발유대신 전기라는 데이터를 1씩 감소시키는 방식으로 구현될 수 있다.

이처럼 같은 '엑셀'이라는 매서드이지만 객체의 특성에 따라 다르게 동작할 수 있는 것이다.

 

 

대학에서 객체 지향 프로그래밍에 대해 처음에는 왜 중요한지 잘 몰랐다.

하지만 직접 프로그래밍을 해보며 역시 느끼는 것은 '기본'이 매우 중요하다는 것이다. 

그러한 의미에서 객체지향은 우리도 모르는 사이에도 적용하고 있을 정도로 프로그래밍에 있어 굉장히 통용적인 개념이라고 생각한다. 

예를 들어, React는 컴포넌트 기반 아키텍처를 사용한다. 이 경우, 각 컴포넌트는 독립적인 객체로 생각할 수 있다.

다양한 상태(state)을 관리하는 것 또한 useState와 같은 매서드를 통해 진행하며, 커스텀 훅에 경우 관련된 데이터 로직을 모듈화하여 관리할 수 있듯이 OOP 특성인 캡슐화, 모듈화를 통해 유지 보수성을 높일 수 있는 것이다.