보통 OOP라고 많이 부르는 객체지향 프로그래밍은 프로그램을 명령어 또는 함수의 목록으로 보는 전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 여러 개의 독립적 단위, 즉 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말합니다.
특정한 개념의 함수와 자료형을 함께 묶어서 관리하기 위해 탄생했으며 객체 내부에 자료형(필드)와 함수(메소드)가 같이 존재합니다.
객체지향 프로그래밍은 객체 간의 독립성이 생기고 중복코드의 양이 줄어드는 장점이 있으며 독립성이 확립되면 유지보수에도 도움이 될 수 있습니다.
객체 지향 프로그래밍의 대표적인 특징 4가지
- 추상화 (Abstraction)
- 캡슐화 (Encapsulation)
- 상속 (Inheritance)
- 다형성 (Polymorphism)
추상화란, 객체를 구성할 수 있는 다양한 속성(프로퍼티) 중에서 프로그램에 필요한 속성이나 행동을 간추려 내어 표현하는 것을 말합니다. 세부적인 사물들의 공통적인 특징을 파악한 후 하나의 집합으로 만들어내는 것이 추상화라고 할 수 있습니다.
ex. 아우디, BMW, 벤츠는 모두 '자동차'라는 공통점이 있다.
자동차라는 추상화 집합을 만들어두고, 자동차들이 가진 공통적인 특징들을 만들어 활용한다.
캡슐화는 데이터 구조와 데이터를 다루는 방법들을 목적에 따라 결합시켜 묶는 것으로 한 곳에서 변화가 일어나도 다른 곳에 미치는 영향을 최소화 시키는 것으로 변수와 함수를 하나로 묶는 것을 말합니다. 또한 데이터를 절대로 외부에서 직접 접근을 하지 않고 오로지 함수를 통해서만 접근해야하는데, 이를 가능하게 해주는 것이 캡슐화입니다. (정보 은닉을 활용하여 외부에서 접근할 필요가 없는 것들은 private으로 접근하지 못하도록 제한을 두는 것)
상속은 일반화 관계(Generalization)라고도 하며, 여러 개체들이 지닌 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립하는 과정으로 상위 개념의 특징을 하위 개념이 물려받는 것이라고 할 수 있습니다.
다형성은 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력을 말합니다. 부모 클래스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩 되어 자신의 역할에 맞게 활용하는 것입니다.
객체 지향 설계 과정
- 제공해야 할 기능을 찾고 세분화한다. 그리고 그 기능을 알맞은 객체에 할당한다.
- 기능을 구현하는데 필요한 데이터를 객체에 추가한다.
- 그 데이터를 이용하는 기능을 넣는다.
- 기능은 최대한 캡슐화하여 구현한다.
- 객체 간에 어떻게 메소드 요청을 주고받을 지 결정한다.
자바스크립트는 객체지향 프로그래밍 언어인가요?
- 자바스크립트는 객체지향 프로그래밍 뿐만 아니라 명령형, 함수형 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어입니다. 클래스 기반 객체 지향 프로그래밍 언어와 달리 프로토타입 기반의 객체지향 프로그래밍 입니다.
- 프로토타입이 뭔가요? (유전자)
프로토타입은 상속을 구현하기 위해 사용됩니다. 자바스크립트에서 기본 데이터 타입을 제외한 모든 것은 객체입니다. 객체가 만들어지기 위해서는 자신을 만드는 데 사용된 원형인 프로토타입 객체를 이용하여 객체를 만듭니다. 이때 만들어진 객체 안에__proto__ 속성이 자신을 만들어낸 원형을 의미하는 프로토타입 객체를 참조하는 숨겨진 링크가 있습니다. 이 숨겨진 링크를 프로토타입이라고 합니다.
- 프로토타입이 뭔가요? (유전자)
Prototype Chaining
프로토타입 객체 내에 찾는 값을 찾을 때, 직접 갖고 있다면 그것을 사용하고 존재하지 않는다면 상위 요소, 없다면 상위 요소의 상위 요소의 프로토타입에서 값을 찾아 반환합니다. 이렇게 __proto__ 를 통해 상위 프로토타입들과의 연결성이 Chain 처럼 연결되어있는 형태를 Prototype Chaining이라고 합니다.
Reference
https://gyoogle.dev/blog/computer-science/software-engineering/Object-Oriented%20Programming.html
'기술면접' 카테고리의 다른 글
position 속성과 z-index의 연관성에 대해 설명하세요. (0) | 2021.12.24 |
---|---|
event loop에 대해서 설명하세요. (0) | 2021.12.21 |
리액트 라우터같은 Client Side Routing 에 대해서 설명하세요. (0) | 2021.12.17 |
리액트에 있는 라이프사이클과 각 라이프사이클의 역할을 설명하세요. (0) | 2021.12.15 |
state를 직접 변경하지 않고 setState를 사용하는 이유에 대해서 설명하세요. (0) | 2021.12.13 |