[자바스크립트]객체 지향 프로그래밍

따봉도치 개발자·2023년 3월 15일
0

객체 지향 프로그래밍

객체 지향 프로그래밍(Object-Oriented Programming, OOP)이란 컴퓨터 프로그램을 어떤 데이터를 입력받아 순서대로 처리하고 결과를 확인하는 것이 아니라, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

특징 - 클래스와 인스턴스(객체), 추상화, 상속, 다형성, 캡슐화

장점

1. 코드 재사용이 용이하다. 동료가 만든 클래스를 사용할 수 있고 상속을 통해 확장해서 사용이 가능하다. 
2. 유지보수가 비교적 쉽다. 절차 지향 프로그래밍에서는 코드를 수정하기 위해 하나씩 찾아서 수정해야 하지만, 객체 지향 프로그래밍은 클래스 내부에 변수 혹은 메서드로 존재하기 때문에 그 부분만 수정하면 된다.

단점

1. 처리 속도가 절차 지향 프로그래밍에 비해서 느리다.
2. 설계시 많은 시간과 노력이 필요하다.

클래스와 인스턴스(객체)

클래스 - 데이터를 만들기 위해 추상화를 거쳐 변수와 메서드로 정의한 것이다.
인스턴스 - 클래스에 선언한 메서드를 토대로 실제 메모리에 할당 된 것이다.

캡슐화

- 캡슐화는 객체 외부에서 함부로 접근하면 안되는 프로퍼티나 메소드에 직접 접근할 수 없도록 한다
- 객체의 특정 프로퍼티에 직접 접근하지 못하도록 막는 것. 이를 통해 프로그래밍의 안전성을 높일 수 있다.
- 특정 프로퍼티에 대한 접근을 미리 정해진 메소드들을 통해서만 가능하게 하는 것. (setter, getter 메소드)
- 하나의 객체 안에 넣어서 묶는 것입니다. 데이터(속성)와 기능(메서드)들이 느슨하게 결합 여기서 말하는 느슨한 결합은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다.
setter 메서드를 사용해서 프로퍼티를 값을 선언하면 해당 객체를 사용하는 동료가 적절하지 않은 값으로 설정하는 것을 보호할 수 있다. 또한, 숨기고자 하는 프로퍼티 이름 앞에 언더바를 사용할 수 있다.
getter 메서드 프로퍼티의 값을 읽는 용도로 사용한다. 그렇기 때문에 파라미터를 따로 써줄 필요 없다.

추상화

- 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만든다는 개념이다. 예를 들어 전화라는 객체가 있다면, 그 안에는 스피커와 마이크가 존재하고, 서킷 보드 등이 존재하는 등 내부 구현이 되어 있을 것이다. 그러나 실제로 우리가 사용할 때에는, 단순히 수화기를 들고 버튼을 눌러서 해결하는 것으로 인터페이스(interface)를 단순화할 수 있다. 단순화를 하게 되면 많은 기능들이 노출되지 않아 예상하지 못한 변화가 일어나지 않도록 만들 수 있다.

추상화와 캡슐화 구별..

캡슐화 - 코드나 데이터를 외부에서 접근하지 못하도록 한다.
추상화 - 클래스를 사용하는 사람이 필요하지 않은 메서드를 노출 시키지 않고 단순히 이름으로 정의하는 것이다.

상속

부모 클래스의 프로퍼티와 메소드를 자식 클래스가 그대로 물려받는 것이다.

사람이라는 클래스가 있다고 가정해보자. 기본적으로 이름 성별 나이 같은 속성이 있다. 그리고 먹다 자다 같은 메서드가 있다. 이제 추가로 학생이라는 클래스가 있다고 가정해보자. 이때 앞서 구현했던 사람클래스속성과 메서드를 다시 구현한다면 비효율적일 것이다. 상속을 이용하여 학생 클래스는 사람 클래스를 상속받을 수 있다.

다형성

하나의 변수가 여러 종류 클래스의 객체에 접근할 수 있는 것을 말한다.

예를들면 멀티탭을 다형성 개념으로 접근한다면 선언부분은 구멍이 두 개 뚫린 부분이라고 할 수 있다. 구현 부분은 멀티탭에 연결하는 전원 케이블이다.
이 멀티탭에 연결하려면 전원케이블은 반드시 연결 부분이 두 개 튀어 나와 있어야 하며, 튀어 나와 있는 부분이 한 개거나 세 개여서는 절대 안되고 튀어 나온 부분이 사각형이어도 안되고 반드시 둥그런 원형이어야 한다.

자바스크립트에서 다형성

다형성 선언 - 인터페이스, 추상클래스
다형성 구현 - 클래스

자바스크립트 한계

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

TypeScript의 예제로, name이라는 속성이 존재한다. 그러나 private 키워드가 붙어 있어서, 클래스 내부에서만 사용 가능하다.

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

java나 TypeScript 언어는 언어의 주요 기능으로 interface가
있다. 그러나 이러한 부분은 JavaScript에는 존재하지 않는 기능이다.

아래 코드는 인터페이스와 클래스를 따로 정의한 예시이다

클래스를 이용하는 입장에서 노출된 인터페이스를 통해 "이 클래스는 메서드 이름이 의도한 바대로 작동할 것이다"라는 것을 명백히 드러나게 해준다. 또한 실질적인 구현 방법을 공개하지 않고, 사용법을 노출시키기에도 유리하다.
profile
Explain Like I'm 5

0개의 댓글