♻️ 개발자로 재활용/🟢 JavaScript

객체 지향 프로그래밍(OOP)과 4가지 특징

BuleRatel 2022. 11. 21. 23:28

 


절차 지향 언어와 객체 지향 언어

 

🎾 절차 지향 프로그래밍

초기 컴퓨터 언어인 C포트란 등은 ‘절차 지향 언어’였다. 절차 지향 언어들은 사용하는 코드들을 순차적으로 처리한다. 자동차 제조를 예로 들면 엔진, 차체, 핸들, 의자, 바퀴 순서대로 만드는 것. 서로 분리되거나 순서가 틀려서도 안 된다. 절차 지향 프로그래밍이 이런 방식이었다.

절차 지향 프로그래밍은 프로그램 전체가 유기적으로 연결되어 있다. 코드의 순서가 바뀌면 결과가 달라지거나(언어의 융통성이 떨어짐), 문제 해결을 위해 시스템 전체를 수리해야 하는(유지보수의 어려움) 단점이 있었다. 이를 보완하기 위해 나온 개념이 **‘객체 지향 언어’**이다.

 

🎾 객체 지향 프로그래밍

객체 지향 프로그래밍은 명령어를 단순히 ‘목록’으로 보는 게 아닌, 여러 개의 독립된 단위인 ‘객체’들의 모임으로 파악한다. 객체 안에는 어떤 개념에 대한 데이터(속성)와 기능(메서드)이 함께 존재한다. 다수의 객체들은 이들끼리 서로 상호작용 할 수 있다.

현대의 언어들은 대부분 객체 지향의 특징을 가지고 있고, 대표적인 객체 지향 언어로는 Java, C++, Python 등이 있다. JavaScript는 엄밀히 말해 ‘객체 지향 언어’는 아니지만, ‘객체 지향 패턴’으로 작성할 수 있다.

 


객체 지향 프로그래밍(OOP, Object Oriented Programming)

객체 지향 프로그래밍은 프로그램의 설계 철학 중 하나이다.

  • OOP의 모든 것은 ‘객체’로 그룹화된다.
  • 만들어진 ‘객체’는 메모리상에서 반환되기 전까지 객체 내의 모든 것이 유지된다.
  • 객체 내에는 ‘데이터(속성)’과 ‘기능(메서드)’가 함께 있다.

 


OOP의 4가지 특징

 

🎾 캡슐화 (Encapsulation)

데이터(속성)과 기능(메서드)을 하나의 객체 안에 넣어서 묶는 것

데이터(속성)과 기능(메서드)를 따로 정의하는 게 아닌, 하나의 객체 안에서 묶어 캡슐처럼 만드는 것. 속성과 메서드들은 느슨하게 결합된다. 이렇듯 내부에서 결합되기 때문에 내부 데이터나 내부 구현이 외부로 노출되지 않는 ‘은닉화’의 특징도 가진다. 묶은 코드들은 재사용성이 쉬워지며, 한 곳에서 변화가 일어나도 다른 곳에 미치는 사이드 이펙트를 최소화한다.

 

🎾 추상화(Abstraction)

내부 구현은 복잡해도, 실제로 노출되는 부분은 단순하게 만드는 것

객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 작업이다. 전화기를 생각해 보자. 내부에는 스피커, 마이크, 서킷 보드 등 복잡한 형태로 구성되어 있지만, 사용자들은 그저 수화기를 들고 버튼을 눌러서 사용한다. 이런 방식이 추상화이다. 사용자에게 필요하지 않는 메서드 등을 노출시키지 않고 단순한 이름으로 정의하는 interface에 포커스가 맞춰져 있다. (’은닉’에 집중하는 캡슐화와 구분할 것) 추상화 역시 코드를 단순하게 만들고, 단순화된 사용으로 변화에 대한 영향을 최소화한다.

 

🎾 캡슐화 (Encapsulation)

부모 클래스의 특징을 자식 클래스가 물려받는 것

부모 클래스(기본 클래스, base class)의 특징을 자식 클래스(파생 클래스, derive class)가 상속받는 것. 자식 클래스는 이미 작성된 부모 클래스의 속성과 메서드를 물려받아 자신의 속성과 메서드를 추가할 수도 있다. 상속을 통해 불필요한 코드 중복을 줄여 재사용성을 높인다.

 

🎾 다형성(Polymorphism)

똑같은 메서드라 하더라도, 특성에 따라 다른 방식으로 구현하는 것

다형성은 말 그대로 많은(poly) 형태(morph)이다. 상속과 연관된 개념으로, 동일한 메서드를 element 등의 특성에 따라 각각 다르게 적용시킬 수 있다. 동일한 매서드에 대해 복잡한 조건문을 사용하는 대신 객체의 특성에 맞게 달리 작성 가능하다.

 


참고 링크