객체 지향 프로그래밍? (캡슐화, 추상화, 상속, 다형성)

김민아·2022년 7월 25일
0

[학습] javascript OOP

목록 보기
3/4
post-thumbnail

코드스테이츠 객체지향 프로그래밍 복습 중 추가로 위시켓 요즘 IT의 테오의 프론트엔드 자바스크립트에서 객체 지향을 하는게 맞나요? 글을 보고 일부를 발췌했습니다. 좀 더 정확하고 자세한 글은 원문을 참고하세요!

객체 지향 프로그래밍

초창기 프로그래밍부터 절차 지향 프로그래밍은?

완전 초창기 프로그래밍은 순차적으로 실행되었다. 특정 위치로 실행 순서를 강제로 변경하는 goto 문법이 특징이다. 이후에 일정 반복되는 코드를 따로 만들어 두고, 해당하는 코드를 호출하고 나서 다시 원래 자리로 돌아오는 방식의 프로시저, 지금의 함수와 같은 개념이 생기며 절차적 프로그래밍 패러다임이 탄생했다. 초기의 C, 포트란 같은 언어들은 객체 지향의 개념이 없는 절차적 언어였다.


객체 지향 프로그래밍(Object Oriented Programming)은?

프로그램 설계 철학이며, 하나의 모델이 되는 청사진(blueprint)를 만들고, 그 청사진을 바탕으로 한 객체(object)를 만드는 패턴이다. 데이터와 기능이 별개로 취급되지 않고, 하나의 모듈로 관리할 수 있다.

현대의 언어들은 대부분 객체 지향의 특징을 갖고 있다. 대표적으로 Java, C++, C# 등. 자바스크립트는 엄밀히 말해 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있다.

객체 지향 프로그래밍에서 프로퍼티와 메서드는 두 그룹으로 분류된다.

내부 인터페이스(internal interface)

동일한 클래스 내의 다른 메서드에선 접근할 수 있지만,
클래스 밖에선 접근할 수 없는 프로퍼티와 메서드 ⇒ private

외부 인터페이스(external interface)

클래스 밖에서도 접근 가능한 프로퍼티와 메서드 ⇒ public

자바스크립트 이외의 다수 언어(Typescript)에서 클래스 자신과 자손 클래스에서만 접근을 허용하는 protected 필드를 지원한다.


객체지향 프로그래밍의 4가지 개념

캡슐화 Encapsulation

캡슐화는 코드가 복잡하지 않게 만들고, 재사용성을 높인다.

데이터(속성)과 기능(메서드)을 따로 정의하는 것이 아닌, 하나의 객체 안에 넣어서 묶는 것이다. 이러한 느슨한 결합(Loose Coupling)은 실행 순서에 따른 절차적이 아닌, 코드가 상징하는 실제 모습과 닮도록 코드를 결합하는 것이다. ‘은닉화’의 특징도 있는데, 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것이다. 객체 외부에서 필요한 동작(메서드)만 노출시켜야 한다.

추상화 Abstraction

추상화는 마찬가지로 코드가 복잡하지 않게 만들고, 단순화된 사용으로 변화에 대한 영향을 최소화한다.

추상화는 복잡한 내부 구현은 감추고, 실제로 노출되는 인터페이스를 단순화하는 것이다. 외부에서 접근이 불필요한 동작을 감추기에 예기치 못한 수정을 줄일 수 있다.

캡슐화와 추상화는 언뜻 비슷하게 보이지만 캡슐화는 코드나 데이터의 은닉하는데 중점을 둔다면, 추상화는 클래스를 사용하는 사람이 필요하지 않은 메서드 등을 노출시키지 않고, 단순한 이름으로 정의하는데 있다.

클래스 정의 시, 메서드와 속성만 정의한 것을 인터페이스라고 한다.

상속 Inheritance

상속 역시 불필요한 코드를 줄여 재사용성을 높인다.

상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것이다. 정확하게는 기본 클래스(base class)의 특징을 파생 클래스(derived class)가 상속받는다라고 한다.

다형성 Polymorphism

다형성으로 인해 동일한 메서드에 대해 객체의 특성에 맞게 달리 작성하는 것이 가능해집니다.

다형성은 말그대로 하나의 부모 클래스를 상속받은 자식 클래스들이 "다양한 형태"를 가질 수 있다는 뜻이다. 부모 클래스로부터 상속받지만, 다형성을 통해서 각자의 방식대로 동작할 수 있다. 예를 들어 DOM에서도 모든 요소들을 HTML에서는 Element라고 부르는데, 각 element들은 객체이며 메서드 역시 다르게 작동한다.


객체 지향과 JavaScript의 차이점

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

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

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

속성과 메서드의 이름만 노출시켜서 사용을 단순화한다는 의미를 갖고 있다. 즉, 인터페이스(interface)의 단순화를 의미한다.

데이터와 메소드를 기반으로 작은 문제를 독립적으로 해결할 수 있는 작은 프로그램을 만들어 코드의 재사용을 높이고, 개발과 유지보수를 편하게 할 수 있다는 간결한 문법의 장점은 취하고, 객체를 연결하는 과정에서 과도하게 객체지향을 통해 만들어진 복잡한 구조를 만들지 않도록 지양하고, 적절한 선 안에서 함수형 프로그래밍이 가지고 있는 장점과 결합하는 것이, 현대 Javascript에서 객체지향 프로그래밍을 잘한다라고 볼 수 있는 것 같습니다. _테오의 프론트엔드

TypeScripts는 보다 객체지향적으로 디자인되었으며, 클래스 내부에서만 속성 및 메서드를 구분하는 private 키워드와 인터페이스를 제공한다. 특히 인터페이스는 일종의 규약처럼 간주되어, 클래스로 구현하는 사람들이 이에 맞게 작성할 수 있다. ‘이 클래스는 메서드 이름이 의도한 바대로 작동할 것이다’라는 것을 명시하는 것이다.


출처

객체 지향 프로그래밍 (Object Oriented Programming) | 코드스테이츠 UR Class
자바스크립트에서 객체 지향을 하는게 맞나요? | 위시켓 요즘 IT의 테오의 프론트엔드
private, protected 프로퍼티와 메서드 | 모던 javascript 튜토리얼

0개의 댓글