4 분 소요

객체 리터럴

자바스크립트에서 사용자가 객체를 정의하는 방법 중 하나로 객체 리터럴(object literal) 방식이 있다. 중괄호로 정의하며, 그 안에 키-값 쌍의 프로퍼티들을 선언하는 방식이다.

// 객체 리터럴 문법으로 객체 생성.
let siteUser = {
    nickname: "sunandstar11",
    age: 25,
    job: "IT dev",
    "is VIP": true,  // 프로퍼티 키 이름에 띄어쓰기를 쓰고자 한다면 반드시 따옴표로 감싸야함.
    something: "good", 
    // 객체 내 메서드 정의. 
    getAdd: function(a, b) {
        return a + b;
    },
};

// 객체의 프로퍼티 접근.
console.log(siteUser.nickname);
// 프로퍼티 키의 이름에 띄어쓰기가 되어있다면 접근 시 대괄호와 그 안에 따옴표를 이용하여 접근.
// 이러한 접근법을 "대괄호 표기법(square bracket notation)"이라 한다. 
console.log(siteUser["is VIP"]);

siteUser["age"] = 26; // 대괄호 표기법으로 객체 내 프로퍼티에 접근하여 그 값을 변경시킬 수 있다.
console.log(siteUser["age"]); 

// 객체에 새로운 프로퍼티 추가.
siteUser.moneyPoint = 1000;
console.log(siteUser.moneyPoint);

// 객체 내 프로퍼티 삭제.
delete siteUser.something;
console.log(siteUser.something);

// 객체 내 메서드 호출.
console.log(siteUser.getAdd(1, 2));
sunandstar11
true
26
1000
undefined
3

상수 객체의 프로퍼티 수정

const siteUser = {
    nickname: "sunandstar11",
    age: 25,
    job: "IT dev",
    "is VIP": true,
    something: "good",  
    getAdd: function(a, b) {
        return a + b;
    },
};

siteUser.nickname = "moon";
console.log(siteUser.nickname);

// 에러.
// siteUser = 12;
// console.log(siteUser);
moon

객체를 할당받는 변수를 상수로 선언해도 해당 객체의 프로퍼티의 값을 수정할 수 있다. 상수에 대입된 객체 자체가 다른 값으로 변경되려고 할 때 에러가 발생한다.

계산된 프로퍼티 (Computed property)

let someVarName = "good";
let someObj = {
    [someVarName]: "bad",  // 계산된 프로퍼티.
};

console.log(someObj.good);
bad

계산된 프로퍼티는 객체 리터럴로 생성된 객체 내 프로퍼티 키를 대괄호로 둘러싸는 것을 의미한다.

위 예제에서는 그 전에 정의된 변수 someVarName을 이용하여 계산된 프로퍼티로 사용하였다. 이 때 [someVarName]에는 해당 변수에 대입되어 있는 “good”이 사실상 프로퍼티의 키가 된다. 그래서 최종적으로 good: “bad”가 된다. 이렇게 대괄호 내부의 변수명에서 해당 변수에 할당된 값으로 변경되는 과정이 “계산된다”로 보여서 붙여진 이름으로 추측된다.

in 연산자 : 객체 내 프로퍼티 존재 여부 확인

let siteUser = {
    nickname: "sunandstar11",
    age: 25,
    job: "IT dev",
    "is VIP": true,
    something: "good", 
    getAdd: function(a, b) {
        return a + b;
    },
};

console.log("age" in siteUser);
console.log("a" in siteUser);
let strVar = "job";
console.log(strVar in siteUser);
true
false
true

객체 리터럴 내 프로퍼티 키 존재 여부를 알고자 한다면 위 코드에서 볼 수 있듯 in 키워드를 이용하여 다음의 형태로 사용하면 된다.

"key" in obj

반복문으로 객체 내 프로퍼티 키 순회

for - in 반복문을 이용하여 객체 내 모든 프로퍼티 키들을 순회할 수 있다.

for (let prop in obj) {
    // 코드.
}

위 형태에서 let prop는 let을 이용하여 prop 변수를 선언한 것이다. 해당 변수는 for 반복문을 빠져나가면 사용할 일이 없기에 let으로 선언한 것이다. 해당 변수는 반복문을 통해 obj 객체 내 프로퍼티 키를 하나씩 받고, 블록 부분에서 이를 사용하는 방식이다.

다음은 위 문법을 이용하여 한 객체 내 모든 키를 순회하는 예제이다.

let siteUser = {
    nickname: "sunandstar11",
    age: 25,
    job: "IT dev",
    "is VIP": true,
    something: "good", 
    getAdd: function(a, b) {
        return a + b;
    },
};

for (let prop in siteUser) {
    console.log(`${prop} : ${siteUser[prop]}`);
}
nickname : sunandstar11
age : 25
job : IT dev
is VIP : true
something : good
getAdd : function(a, b) {
        return a + b;
    }

객체 리터럴 내 프로퍼티 정렬 방식

앞서 소개한 for 반복문을 이용하여 객체 리터럴 내 프로퍼티들을 모두 순회할 때, 사용자가 프로퍼티들을 정의한 순서대로 순회될까?

정수 프로퍼티(integer property)의 경우에는 오름차순으로 정렬되고, 그 외의 프로퍼티들은 사용자가 객체에 정의, 추가한 순으로 정렬된다.

정수 프로퍼티는 정수형에서 문자열형으로, 또는 그 반대로 형변환을 할 때 내용이 변경되지 않는 문자열을 말한다. 문자열 “11”을 정수형으로 바꿔도 11로 그 내용에는 변함이 없다. 그 역순도 마찬가지이다. 그런데 “+11” 문자열을 정수형으로 바뀌면 11로 바뀌며, “+” 문자가 사라진다. 이 경우 해당 문자열은 정수 프로퍼티가 될 수 없다.

다음은 정수 프로퍼티로만 이루어진 객체와 그 외의 프로퍼티로 이루어진 객체를 각각 순회할 때의 결과를 보기 위한 예제이다.

let rankNum = {
    "3": "duck",
    "5": "lion",
    "1": "tiger",
    "12": "snake",
    "2": "cat",
};

let rankAlp = {
    b: "elephant",
    e: "giraffe",
    d: "dog",
    a: "crocodile",
};

function printAndIterObj(obj) {
    for (let prop in obj) {
        console.log(`${prop} : ${obj[prop]}`);
    }
}

printAndIterObj(rankNum);
console.log("==========");
printAndIterObj(rankAlp);
1 : tiger
2 : cat
3 : duck
5 : lion
12 : snake
==========
b : elephant
e : giraffe
d : dog
a : crocodile

위 예제를 보면, 정수 프로퍼티들로 구성된 객체에서는 프로퍼티 순을 일부로 랜덤으로 정렬하여 선언하였다. 그럼에도 출력결과에서는 오름차순으로 정렬되어 출력됨을 알 수 있다. 반면 그 외의 프로퍼티들은 객체에 정의된 순서대로 출력됨을 알 수 있다.

메서드

자바스크립트에서 객체 리터럴 내 메서드를 다음과 같은 방법으로 정의할 수 있다.

let user = {
    nickname: "bowWow2024",
    pointMoney: 1000,
    // 일반적인 메서드 정의 방법. (함수 표현식)
    getMinus: function(a, b) {
        return a - b;
    },
    // 메서드 단축 구문으로 메서드 정의.
    getAdd(a, b) {
        return a + b;
    },
};

// user 객체 내 메서드 정의 및 printProfile 프로퍼티에 할당.
user.printProfile = function() {
    console.log("===== 사용자 프로필 =====");
    // this는 메서드 호출 시 해당 메서드가 속한 객체를 의미.
    console.log(`닉네임 : ${this.nickname}`);
    console.log(`보유 포인트 : ${this.pointMoney}`);
    console.log("=======================");
};

function getSumOneToN(n) {
    let total = 0;
    for(let i = 1; i <= n; i++) {
        total += i;
    }
    return total;
}

// 이미 선언된 함수를 객체의 메서드로 할당 가능.
user.getSumOneToN = getSumOneToN;

user.printProfile();
console.log(user.getAdd(3, 4));
console.log(user.getMinus(3, 4));
console.log(user.getSumOneToN(user.pointMoney));
===== 사용자 프로필 =====
닉네임 : bowWow2024
보유 포인트 : 1000
=======================
7
-1
500500

References

[1] 객체

[2] 메서드와 this

This content is licensed under CC BY-NC 4.0

댓글남기기