[TIL] 객체지향프로그래밍은 무엇일까

김민성·2021년 2월 26일
0

절차지향프로그래밍은 또 무엇일까

자바스크립트를 공부하면서 가장 이해가 안되는 객체지향을 정리해보기 이전에 절차지향 프로그래밍에 대해서 적어보겠습니다. 절차지향프로그래밍은 특정 기능을 가지는 프로그램을 짤 때, 기능을 하나의 함수로 구현하고 순차적으로 코드를 실행하는 방식입니다.
예를 들어서 계산기를 만들어보면 계산기가 가지고 있는 연산 기능을 순차적으로 짜고 해당 조건에 성립하면 기능이 실행되는 방법을 가집니다. 여기서 저는 공학용 계산기를 새로 만들고 싶습니다. 그러면 새로운 함수를 정의해서 기존의 계산기를 복사하여 같은 코드를 중복하고, 공학용계산기의 코드를 추가하여 새로운 코드를 만듭니다. 그런데 제가 만들고 싶은 계산기가 공학용 계산기뿐만 아니라 추가적인 기능들을 가진 10개, 100개의 계산기들을 만들려고 한다면 같은 코드들을 10번, 100번 반복해야 합니다. 이러한 것을 방지하기 위해서 객체지향 프로그래밍이 개발되었습니다.

prototype

자바스크립트는 클래스라는 개념이 ES6에서 새로 나왔다고 한다. 하지만 이전에는 어떻게 클래스를 표현했을까요. 바로 프로토타입방식을 사용했습니다. 프로토타입은 기존의 객체를 복사하여 새로운 객체를 만들어냅니다.

function Person(){
	this.hand = 2;
	this.body = 1;
	this.foot = 2;
}

let kim = new Person();
let lee = new Person();
console.log(kim.hand); // 2
console.log(lee.hand); // 2

여기서 kim과 lee의 변수데이터를 보면 각각 3개씩 해서 6개의 변수를 저장합니다. 여기서 중복된 값을 줄이기 위해 프로토타입을 사용합니다.

function Person(){}

Person.prototype.hand = 2;
Person.prototype.body = 1;
Person.prototype.foot = 2;

let kim = new Person();
let lee = new Person();
console.log(kim.hand); // 2
console.log(lee.hand); // 2

이런식으로 만든다면 kim, lee각자가 변수를 가지고 있는 것이 아니라 프로토타입의 변수를 공유하게 됩니다.

객체지향프로그래밍

Object-Oriented Progamming(OOP)라고 불리는 객체지향프로그래밍은 반복작업을 최소화하기 위해 클래스를 지정합니다. 클래스에는 고유 속성과 공통적인 기능을 가지고 있습니다. 이를 속성과 메소드라고 부릅니다. 계산기를 예로 들면 속성은 계산기의 색상, 배터리용량등이 있고, 메소드는 연산버튼, 값초기화 버튼등이 있습니다. 클래스를 기반으로 인스턴스를 만들어 각 인스턴스마다 기능을 추가할 수 있습니다. 절차지향에서 기본 계산기가 클래스이고, 공학용계산기가 인스턴스입니다. 클래스라는 하나의 틀을 정해놓으면 인스턴스에서는 틀을 이용하여 새로운 기능만 추가해주면 더욱 간단하게 프로그래밍을 할 수 있을 것 같습니다.

객체지향프로그래밍의 특징

특징은 캡슐화, 추상화, 상속, 다형성 이렇게 4가지가 있습니다.

캡슐화

캡슐화는 속성과 메소드를 하나의 인스턴스 안에 같이 정의할 수 있게 하는 것입니다. 또한 은닉화의 특징을 내장하고 있습니다. 은닉화는 내부에서 정의된 데이터나 동작들을 노출되지 않도록 하게 해줍니다. 캡슐화의 장점은 느슨한결합이 있습니다. 느슨한결합은 절차지향에서 들어오는 데이터의 형태가 바뀌면 코드의 흐름에 큰 영향을 미칩니다. 하나하나 바꿔줘야 하지요. 하지만 객체지향은 인스턴스의 메소드에서만 바꿔주면 됩니다. 캡슐화로 인해 코드의 재사용성이 올라갑니다. 하나하나 뭉쳐있으니 그 상태로 틀만가져와서 사용할 수 있게 됩니다.

추상화

추상화는 겉에 보이는 부분은 단순하게 만든다는 개념입니다. 보이는 부분이 단순해진다는 말은 인터페이스를 단순하게 만든다는 말이됩니다. 캡슐화가 코드나 데이터를 보이지 않게 해준다면 추상화는 클래스를 사용하는 사람이 필요로 하지 않는 메소드 등을 가려주고, 다른 기능들의 이름을 단순한 이름으로 정의합니다. 코드를 단순하게 만들어 주고 변화에 따른 영향이 덜 일어나게 만들어줍니다.

상속

상속은 기본클래스의 특징을 파생클래스(인스턴스)가 상속받는 것을 말합니다. 위에서 말한 계산기를 예로 들어보겠습니다. 공학용 계산기는 기본계산기의 특징을 상속받은 다음 다른 기능들을 추가한 것이 되는 겁니다. 상속으로 인해 불필요하게 반복되는 코드를 줄일 수 있습니다.

다형성

다형성은 말 그대로 인스턴스는 다양한 형태를 가질 수 있습니다. 계산기라는 같은 클래스에서 파생되었지만 공학용계산기, 프로그래머용 계산기 등 다양한 형태로 나뉠 수 있습니다.

profile
https://github.com/alstjd8826

0개의 댓글