CODE STATES 44

객체 지향 프로그래밍 1-1) 클래스와 인스턴스

꼬드리 2023. 3. 15. 13:57

얼마 전 스터디를 위해 클래스를 잠깐 공부하다 어마어마한 '낯선 단어'들의 등장에 당황한 채 백스텝을 밟은 적이 있다. 그러나 개발자가 되기 위해서는 절대로 회피할 수 없는 그 이름이 바로 클래스였으니...

낯선 것은 두려울 수 있지만 자주 접하면 무뎌진다! 그런 의미에서 어제의 내가 잘 몰랐던 개념들을 예시와 함께 살펴보자.

 

 

그래서 클래스Class가 뭐라고?

맛있는 붕어빵 틀!

 

가장 적절하게 사용되는 예시가 붕어빵이다. 클래스는 붕어빵을 찍어내는 틀에 해당한다. 100개의 붕어빵을 서로 다른 맛으로 구워내고 싶은데, 이걸 일일이 처음부터 붕어 모양으로 빚고 아가미도 찍어가며 조물조물 만드는 건 장인 정신(?)이 아니라면 불가한 일이다. 시간도 엄청나게 걸리고... 손님들도 기다리며 화를 내고... 

이토록 비효율적인 일을 방지하기 위해 혜성처럼 등장한 것이 바로 클래스였다. 

풀어 설명하자면 클래스란, '청사진, 템플릿'이라고도 부르며 이름처럼 여러 객체를 만들기 위한 기본적인 이 된다. 

 

이러한 클래스를 만드는 문법은 ES6에 도입되며 처음 등장했다. 처음이라고는 하지만, 물론 그 전에도 수많은 개발자들은 클래스와 비슷한 기능을 쓰기 위해 function으로 만들어가며 프로젝트를 진행했다. 개발자들도 바보가 아니니까...

다음은 ES5에서 클래스를 만들던 방식이다. 

function Flower(color, name, size) { //여기 인스턴스가 생성될 때 실행되는 코드 }

하지만 ES6에서 Class를 명시해주면서 좀더 편하게 클래스를 만들 수 있게 되었다. 따라서 Syntatical Sugar문법적 설탕에 Class가 속한다고도 종종 말하지만, 몇 가지 분명한 차이점이 존재하기에 그전의 방법과 완벽하게 같다고 볼 수는 없다.

ES6에서 새롭게 클래스를 정의하는 함수는 아래와 같다.

class Flower{
	constructor(color, name, size) { //여기 인스턴스가 생성될 때 실행되는 코드}
}

 

 

그렇다면 마침내! 클래스까지 만들었으니...

이런 클래스(틀)을 기반으로 생성된 특별한 객체는 뭐라고 할까?

바로 '인스턴스 객체 instance object', 줄여서 인스턴스라고 부른다. 인스턴스는 사전에 만들어둔 클래스의 속성과 메소드를 가지면서, 실제 데이터를 넣어 생성된다. 그러니 이쪽이 진짜 결과물이라고 볼 수도 있겠다. 붕어빵! 슈붕, 팥붕... 등등 일단 전체 틀은 주어졌으니 인스턴스의 내부물은 얼마든지 달라질 수 있다.

 

인스턴스는 new 키워드를 앞에 붙여 만든다는 점에서 기존 객체들과 차이를 가진다.

또 클래스는 다른 함수들과 구분지어주기 위해 가지는 규칙들이 존재한다.

1. 일반적인 함수와 달리 주로 일반명사를 쓴다.(일반 함수는 동사를 포함하는 경우가 많다.)

2. 대개 대문자로 시작한다.(일반 함수는 소문자로 시작한다.)

이를 예시로 살펴보자면 아래와 같다.

function Flower{
	constructor(color, name, size){ }
    } //여기가 클래스라면
let Rose = new Flower('red', 'rose', '10cm'); //여기가 인스턴스다.
let Daisy = new Flower('white', 'daisy', '4cm');
// 이와 같이 각각의 인스턴스는 Flower라는 클래스의 고유 속성과 메소드를 갖게 된다.
//위에 만든 인스턴스 Rose와 Daisy처럼, 
//여러 개의 인스턴스는 클래스의 속성을 토대로 하되 서로 다른 속성을 가진다.

객체의 인스턴스가 만들어질 때 실행되는 함수를 객체 지향 프로그래밍에서는 '생성자 함수 constructor function'라고 부른다. 재사용이 가능한 객체를 만들어주는 특수 함수이다. 생성자 함수는 new 연산자를 사용하여 호출된다. ES6에서부터 우리는 생성자 함수를 Class문법으로 쓸 수 있게 되었다.

 

 

이처럼 클래스에서 속성과 메소드(객체에 딸린 함수)를 미리 정의해둔 뒤, 인스턴스에서 이용한다. 이와 같은 방식으로 유사한 틀 안에 속한 여러 객체를 간편하게 만들어낼 수 있다.

그러니 왜 클래스가 사용되어야 편리한 지 감이 온다면, 성공적으로 이해하고 있는 것이다!