인터랙티브 웹 개발 제대로 시작하기-객체(Object)
본문 바로가기

Front End

인터랙티브 웹 개발 제대로 시작하기-객체(Object)

728x90
반응형
Object(객체)에 대해서 공부해보자.

 

자바스크립트에는 기본 데이터 타입(숫자, 문자, 참과 거짓의 boolean, undefined, null)이라고 불리우는 데이터 타입들을 제외한 나머지는 "객체"라고 할 수 있다. 함수나 변수도 자바스크립트에서는 큰 범주안에서 객체이다.

 

객체를 설명할 때는 보통 사람을 예를 들어 설명을 하는데, [한 명의 사람 = 객체]이라고 설정한다.

한 사람은 이름과 성별 등등의 기타 속성들을 가지고 있다.

 

 

객체는 속성들과 동작 또는 기능(액션)으로 이루어진 집합체라고 생각하면 된다. 

 

객체를 만드는 법

첫번째,

객체를 만드는 법은 중괄호{ }로 만들수있다. (배열은 [ ]) 객체를 생성한 후, 'name' 과 'age' 같은 속성들을 추가해보자.

const person = {}; // 객체의 생성
person.name = '일분이';
person.age = 10;​

 

그리고 동작을 추가해보자. 여기서 동작은 함수(function)이다.

person.introduce = function() {
	console.log('안녕하세요!');
};
person.introduce(); // 함수 호출

 

객체에 추가한 name, age 등 값들로 정의되는 것들을 속성(property)라고 불리우는 데, 속성들 중 "함수"로 표현되는 속성을 메소드(method)라고 한다.

정리하자면,

자바스크립트에서는 함수도 하나의 값이며, 객체에 속성들을 점 . 으로 추가할 수 있다.

 

두번째,

두번째 방법이 보편적으로 더 많이 쓰인다.

const person = {
    name: '일분이',
    age: 10,
    introduce: function() {
    	console.log('안녕하세요?');
       	}
    }
    console.log(person.name);
    person.introduce();

값을 이용해서 응용해보자.

선언된 값으로 콘솔로그에 사람을 선언하고 콘솔 로그에서 자기소개를 하도록 이용해볼 수 있다.

const person = {
	name: "일분이",
    age: 10,
    introduce: function() {
        console.log('안녕하세요! 저는' + this.name + '이고, 나이는' + this.age + '살 이에요.');
    }
 };
 
 person.introduce();

※ 여기서 주의할 점은 this. 없이 age를 찍을 경우 age is not defined 에러가 나는데, 이 때 this는 객체가 메소드를 실행했을 때, 메소드를 실행할 주체 객체를 가르킨다. 

(name의 경우 window.name 이라는 전역 객체가 이미 있으므로, 에러가 나지 않지만 "" 빈 값이다.)

 


생성자(constructor) 함수를 만들어보자

객체를 생성해내는 역할을 하는 "생성자"는 함수이다. 그리고 생성자는 관례적으로 첫 글자를 대문자로 써준다.

function Person() {	
}

const person1 = new Person(); // 생성자 호출1
const person2 = new Person(); // 생성자 호출2

※ 여기서 규칙은 함수가 생성자로서 호출을 하고 싶다면, new 키워드(인스턴스)를 붙히면 된다.

 

만들고자 하는 것,

  1. 일분이1와 일분이2 라는 객체를 각각 만들고 싶다.
  2. 이 때 생성자를 이용해 매개변수로 값을 전달해 생성자를 호출한다면 값이 많아졌을 때, 유지 보수하기가 편리해질 것이다.
// 생성자(constructor)
function Person(nickname, age) {
	this.nickname = nickname;
    this.age = age;
	this.introduce = function() {
    	console.log("안녕하세요? 저는" + this.nickname + "이고, 나이는" + this.age + "살이에요.");
    }
}
// 인스턴스(instance)
const person1 = new Person("일분이", 10);
const person2 = new Person("이분이", 8);

person1.introduce();
person2.introduce();

개선해보기

위의 코드에서 보자면 this.introduce는 각 nickname과 age의 인스턴스를 가지고 있기 때문에 일분이와 이분이의 메모리를 점유하고 있다는 뜻이다. 이 코드는 메모리 사용면에서 비효율적이기 때문에 공통으로 쓰는 메소드는 "프로토타입"이라는 객체에 추가를 해준다.

// 생성자(constructor)
function Person(nickname, age) {
	this.nickname = nickname;
    this.age = age;
	}
    
    Person.prototype.introduce = function() {
    	console.log("안녕하세요? 저는" + this.nickname + "이고, 나이는" + this.age + "살이에요.");
    }
    
// 인스턴스(instance)
const person1 = new Person("일분이", 10);
const person2 = new Person("이분이", 8);

person1.introduce();
person2.introduce();

프로토타입 객체는 함수 하나에 쌍으로 단 하나씩있기 때문에, 개별 인스턴스들이 메소드와 속성들을 공유하게 된다. 정리하자면, nickname과 age 처럼 개별 값이 들어와야 하는 속성들은 생성자에서, 공유하는 값을 가지고 있다면 prototype 객체에서 처리를 해줄 수 있다.

 

 

카드게임 예시를 들어보자

두 카드는 공통된 width와 height값을 가지고 있다.(프로토타입)

생성자를 이용해서 실제로 코드로 구현을 해보자.

※ 이때 Card.prototype을 세팅을 해줄때 원래의 constructor를 선언해주어야 한다.

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie-edge">
    <title>Object</title>
<style>
.card {
	display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 100px;
    height: 150px;
    border: 2px solid black;
    border-radius: 10px;
    font-size: 3rem;
    font-weight: 900;
    }
</style>
<body>
<script>
function Card(num, color) {
	this.num = num;
    this.color = color;
    this.init();
}

Card.prototype = {
	constructor: Card,
    init: function() {
    	const mainElem = document.createElement('div');
        mainElem.style.color = this.color;
        mainElem.innerHTML = this.num;
        mainElem.classList.add('card');
        document.body.appendChild(mainElem); // 조립
    }
}

const Card1 = new Card(1, 'green');
const Card2 = new Card(2, 'blue');
</script>
</body>
</html>


마무리

이렇게 자바스크립트의 오브젝트에 관해서 학습을 해보았고, 객체를 생성, 생성자와 프로토타입 객체를 익혀서 만들어낸 UI는 컴포넌트처럼 분리해내 필요한 부분을 유지 보수하기가 훨씬 용이해진다는 것을 알 수 있었다.

반응형