● 절차지향 프로그래밍
객체지향 프로그래밍이 있기 전에, 절차지향 프로그래밍이 있었다. 초기의 C, 포트란 같은 언어들은 객체 지향의 개념이 없는 절차적 언어였다. 논리적 구조가 절차적으로 진행되었다.
사진을 보면 고객의 절차적인 행동을 기준으로 논리구조가 설계되고 있는 것을 볼 수 있다. 그저 행동의 순서만 나열되었고, 그에 따른 시행이 되는 것이다.
● 객체지향 프로그래밍
절차지향 프로그래밍이 지나가고, 객체지향 프로그래밍이라는 패러다임(=방식)이 등장하게 되면서 단순히 별개의 변수, 함수를 순차적으로 작동하는 것을 넘어 데이터 접근과 데이터 처리 과정에 대한 모형을 만들어내는 방식을 고안해냈다. 따라서 데이터와 기능을 별개로 취급하지 않고 한 번에 묶어서 처리할 수 있게 되었다.
객체지향프로그래밍이란 객체의 상태 데이터와 데이터를 조작할 수 있는 동작을 하나의 논리적 단위로 묶어서 생각하는 것
위의 사진 두개를 비교해면서 알 수 있듯이, '고객' 과 '자판기' 를 분리하여 상호작용을 하며 프로그램이 작동하는 것을 알 수 있다. 객체지향은 코드의 분할이 가능하며 분할된 코드를 여러 명이 맡아 개발함으로써 코드에 대한 질도 향상되고 개발시간도 단축된다.
객체지향 프로그래밍에는 크게 네 가지 개념이 있다.
⚬ 캡슐화
- 데이터와 기능을 하나로 묶는 것
- 데이터의 은닉(구현은 숨기고 동작은 노출)
- 느슨한 결합에 유리 - 언제든 구현을 수정할 수 있다.
데이터와 기능을 하나로 묶는 것은 객체 안에, 데이터와 그 데이터를 조작할 수 있는 동작을 묶는 것을 말한다. 즉, 데이터와 동작이 느슨한 결합이 된다는 것이다.
캡슐화라는 개념은 "은닉화"의 특징도 포함하고 있는데, 은닉화는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만드는 것이다. 따라서, 디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 동작(메서드)만 노출시킨다. 은닉화의 특징을 살려서 코드를 작성하면 객체 내 메서드의 구현만 수정하고, 노출된 메서드를 사용하는 코드 흐름은 바뀌지 않도록 만들 수 있다.
예를 들어 파칭코를 생각해보자. 파칭코의 슬롯을 내리면 슬롯들이 돌아가게된다.
(1) 외부에 노출 시킬 동작(메서드) : 슬롯을 내리기
(2) 외부에 노출 시킬 동작(메서드) : 슬롯이 돌아가는 모습
(3) 외부에 노출 시킬 데이터 : 슬롯 진행 +결과 모습
(3) 외부에 노출 시키지 않을 데이터(데이터) : 슬롯이 돌아간 횟수, 돌아가는 시간.. 등
(4) 외부에 노출 시키지 않을 동작(메서드) : 슬롯이 돌아가는 방식, 어떻게 랜덤으로 슬롯이 정해지는 지 등
⚬ 추상화
추상화는 내부 구현은 아주 복잡한데, 실제로 사용자에게 노출되는 부분은 단순하게 만든다는 개념이다. 위의 파칭코 개념과도 같다. 우리는 파칭코를 할 때 그냥 돈을 넣고 슬롯만 내리면 끝이다. 하지만 동전이 얼마가 투입되었는지, 슬롯을 내렸을 때, 시작되는 시스템, 랜덤으로 돌아가게되는 슬롯의 시스템 등 내부적으로 알려고하면 복잡하다. 따라서 동전의 입구, 슬롯을 내리는 방아쇠, 두개만으로 인터페이스를 쉽게 단순화할 수 있다.
캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져있다면, 추상화는 클래스를 사용하는 사람이 필요하지 않은 메서드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있다. 클래스 정의 시, 메서드와 속성만 정의한 것을 인터페이스라고 부릅니다. 이것이 추상화의 본질입니다.
⚬ 상속
상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미한다.
자바스크립트에서 상속은 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용할 수 있는 것이다. 상속의 가장큰 의의는 중복을 제거할 수 있다. 기존 코드를 재사용하므로 중복을 제거할 수 있다. 자바스크립트는 프로토타입을 기반으로 상속을 구현한다.
⚬ 다형성
다형성이란 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미한다.
예를들어 String 타입과 Array 타입은 length라는 메서드가 있다. 이는 Object.prototype에 의해 상속받아 둘다 모두 사용할 수 있는 메서드이다. 그런데 모양이 같은데도 길이라는 똑같은 숫자열을 리턴하게된다. 따라서 어떤 타입 or 객체의 속성이든 다양한 성질을 가질 수 있음을 인정하는 것이다.