객체지향 프로그래밍 part2. 객체 지향 프로그래밍

holang-i·2023년 3월 15일
0
post-thumbnail

절차 지향 프로그래밍 vs 객체 지향 프로그래밍

  객체 지향 프로그래밍이 등장하기전에는 절차 지향 프로그래밍밖에 없었다. 모든 것을 절차적으로 생각하고 순차적인 명령의 조합으로 이루어졌었다.

  객체 지향 프로그래밍은 단순히 별개의 변수와 함수로 순차적으로 작동하는 것을 넘어서 데이터의 접근, 데이터의 처리 과정에 대한 모형을 만들어 내는 방식이다.
따라서 데이터와 기능이 별개가 아니라 하나의 묶음으로 처리할 수 있다.


Object Oriented Programming

  OOP는 프로그램 설계 철학으로, OOP의 모든 것은 "객체"로 그룹화된다. 이 객체는 한번 만들고 나면, 메모리상에서 반환되기 전까지 객체 내의 모든것이 유지된다.

  객체 내에는 "데이터와 기능이 함께 있다."라는 원칙에 따라 메서드와 속성이 존재한다.

class는 세부 사항(속성)이 들어가지 않은 청사진으로, 세부 사항을 넣는다면 객체가 된다.
JS에서 사용하는 용어와 별개로 클래스를 통해 만들어진 객체를 인스턴스 객체 줄이면 인스턴스라고 부를 수 있다.

생성자를 통해 세부 사항(속성)을 넣어주는데 이는 함수에 인자를 넣듯, 속성을 넣을 수 있다.


클래스와 인스턴스

  • 속성
  • 메서드

OOP Concepts

OOP Basic Concepts에는 크게 네 가지가 있다.

  • Encapsulation (캡슐화)
  • Abstraction (추상화)
  • Inheritance (상속)
  • Polymorphism (다형성)

Encapsulation

  • 데이터(속성)와 기능(메서드)을 하나의 객체 단위로 묶는 것
  • 은닉(hiding): 구현은 숨기되 동작은 노출시킨다.
  • 데이터(속성)와 기능(메서드)들이 느슨하게 결합(Loose Coupling)된다.

느슨한 결합

  코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다.

  속성(property)과 메서드(method)를 통해 코드만 보고도 인스턴스 객체의 기능을 상상할 수 있게 작성하는 것이 느슨한 결합을 추구하는 코드 작성법이다.

은닉화

  은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것이다.

  상세한 구현, 데이터는 숨기되 객체 외부에서 필요한 동작(method)만 노출시키는 것으로 은닉화의 특징을 살려 코드를 작성하면 객체 내 메서드의 구현만 수정하고, 노출된 메서드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있다.

  절차적 코드의 경우 데이터의 형태가 바뀔 때 코드의 흐름에 영향이 가기 때문에 유지보수가 어려운 반면, 엄격한 클래스는 속성의 직접적인 접근을 막고, 설정하는 함수(setter), 가져오는 함수(getter)를 철저하게 나누기도 한다.



Abstraction

  추상화는 내부 구현은 복잡하지만 실제로 노출되는 부분은 단순하게 만드는 개념이다.

  내부 구현이 어떻게 되었는 지 신경쓸 필요 없이 실제로 사용할 때는 인터페이스(interface)를 단순화 할 수 있다.

  캡슐화가 코드 or 데이터의 은닉에 초점이 맞춰져있다면 추상화는 클래스를 사용하는 사람이 필요하지 않은 메서드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 초점이 맞춰져 있다.

  클래스 정의 시, 메서드와 속성만 정의한 것을 인터페이스라고 부르고 이것이 추상화의 본질이다.



Inheritance

  상속은 기본 클래스(base class, 부모)의 특징을 파생 클래스(derived class, 자식)가 상속받는 것이다

  예를 들어서 커피 머신(Coffee Machine)이라는 클래스가 있다고 가정하고, 기본적으로 커피 머신은 브랜드 이름, 샷과 같은 속성, 원두를 갈다, 샷을 추출하다 등과 같은 메서드가 있다.

  추가적으로 카페라떼 머신(CafeLatte Machine)이라는 클래스를 작성할 때 이미 구현 된 커피 머신 클래스의 속성과 메서드를 다시 구현한다면 비효율적이기 때문에 카페라떼 머신은 커피 머신 클래스를 상속받을 수 있다. 카페라떼 머신은 추가적으로 시럽(속성), 스팀을 내다(메서드)를 추가할 수 있다.



Polymorphism

poly(많은) morph(형태) -> 다양한 형태를 가질 수 있다.

예를 들어서 자동차는 경적을 울리다라는 동작이 있는데 차 종류마다 그 소리가 각기 다른 것처럼, 객체 역시 똑같은 메서드여도 다른 방식으로 구현될 수 있다.



종류주요 개념에 대한 장점
Encapsulation
캡슐화
코드가 복잡하지 않게 만들 수 있다.
재사용성을 높인다.
Abstraction
추상화
코드가 복잡하지 않게 만들 수 있다.
단순화 된 사용으로 변화에 대한 영향을 최소화 한다.
Inheritance
상속
불필요한 코드를 줄여 재사용성을 높인다.
Polymorphism
다형성
다형성으로 인해 동일한 메서드에 대해 if/else if와 같은 조건문 대신
객체의 특성에 맞게 달리 작성하는 것이 가능하다.




객체지향 차이점

JavaScript에 더 많은 기능을 붙인 TypeScript는 보다 객체 지향적으로 디잔인되었고, 아래에 언급된 기능을 알아보면 좋을 것 같다.

은닉화(private 키워드)의 한계

  Java, TypeScript와 같은 프로그래밍 언어는 클래스 내부에서만 쓰이는 속성 및 메서드를 구분시키기 위해 private이라는 키워드를 제공해준다. 이러한 은닉화를 도와주는 기능을 JavaScript에서는 지원하는 브라우저가 적어서 널리 쓰이지 않는다고한다.

아래 코드에서는 name이라는 속성이 존재하는데 private 키워드가 붙어 있어서 클래스 내부에서만 사용 가능하다.

'name' 속성은 private이며, 'Animal' 클래스 내부에서만 접근이 가능하다는 에러가 발생한다.


JavaScript에서는 은닉화를 돕기 위해 일반적으로 클로저 모듈 패턴을 사용하고, 클래스/인스턴스 형태로 만들 때에는 ES2019부터 #이라는 키워드가 도입되었다.



추상화(interface 키워드) 기능의 부재

  객체 지향 프로그래밍의 주요 키워드 중 하나인 추상화는 속성과 메서드의 이름만 노출시켜 사용을 단순화 한다는 의미를 가지고 있다.
즉, 인터페이스(interface)의 단순화를 의미하는데 Java, TypeScript 언어는 언어의 주요 기능으로 interface를 구현해 놓았지만, JavaScript에는 존재하지 않는 기능이다.


interface와 구현이 따로 정의된 코드


인터페이스의 이점

  • 인터페이스가 일종의 규약처럼 간주되어 인터페이스를 클래스로 구현하는 사람들이 이에 맞게 작성할 수 있게 도와준다.
  • 이는 클래스를 이용하는 입장에서 노출된 인터페이스를 통해 "이 클래스는 메서드 이름이 의도한 대로 작동할 것"이라는 것을 명백하게 드러내 준다.
  • 실질적인 구현 방법을 공개하지 않고, 사용법을 노출시키기에 유리하다.
  • 어떤 클래스가 외부 공개용으로 모듈처럼 작동할 때에 인터페이스는 빛을 발하는데 이러한 인터페이스 사용의 대표적인 예가 API(Application Programming Interface)이다.
profile
🌿 주니어 프론트엔드 개발자입니다! 부족하거나 잘못된 정보가 있다면 알려주세요:)

0개의 댓글