// 객체 리터럴 예제
const person = {
    name: "홍길동",
    age: 25,
    isStudent: false,
    greet: function() {
        console.log(`안녕하세요, 저는 ${this.name}입니다.`);
    }
}

// person 변수의 데이터 타입 확인
console.log(typeof person); // "object"

// person 객체의 속성(property) 접근
console.log(person.name); // "홍길동"
console.log(person.age);  // 25
person.greet();           // "안녕하세요, 저는 홍길동입니다."
typeof [1, 2, 3];  // "object" — 배열도 객체
typeof null;       // "object" — null도 객체
typeof /regex/;    // "object" — 정규식도 객체
const 객체명 = {
    속성이름1: 값1,
    속성이름2: 값2,
    // ...
}; // ← 변수 선언 끝나는 부분에는 세미콜론(;)이 올 수 있지만, 중괄호 자체에는 세미콜론을 붙이지 않아도 됩니다.
const person = {
    name: "홍길동",
    age: 25
}
const person = {
    name: "홍길동",
    age: 25,
    isStudent: false,
    $score: 95
}
const user = {
    'full name': "홍길동", // 작은따옴표
    "birth-date": "2004-01-25" // 큰따옴표
}
const userA = {
    [`job title`]: "프론트엔드 개발자" // []로 감싸서 템플릿 리터럴 사용 가능
}

const field = "name";
const userB = {
    [`full ${field}`]: "홍길동"  // 동적인 속성 이름 생성
}
const user = {
    2004: "2004년생"
}

// 다음과 동일하게 처리됩니다.
const user = {
    "2004": "2004년생"
}
const a = 1;
const b = 2;

const obj = { a, b }

console.log(obj);  // { a: 1, b: 2 }
const obj = {
    // 익명 함수 표현식
    greet: function() {
        console.log("안녕하세요");
    },

    // 화살표 함수 표현식
    greetArrow: () => {
        console.log("안녕하세요");
    }
}

obj.greet();      // "안녕하세요"
obj.greetArrow(); // "안녕하세요"
const obj = {
    greet() {
        console.log("안녕하세요");
    }
}

obj.greet(); // "안녕하세요"
// 익명 함수 표현식
const obj1 = {
    add: function(a, b) {
        return a + b;
    }
}

console.log(obj1.add(3, 4)); // 7

// 축약형 메서드 표현법
const obj2 = {
    add(a, b) {
        return a + b;
    }
}

console.log(obj2.add(3, 4)); // 7
const emptyObj = {}
console.log(typeof emptyObj); // "object"
console.log(Object.keys(emptyObj)); // [] — 속성 없음
const obj = {
    "": "빈 문자열 속성 이름의 값"
}

console.log(obj[""]); // "빈 문자열 속성 이름의 값"
const person = {
    name: "홍길동",
    age: 25
}

// person 변수를 통해 객체 전체에 접근할 수 있습니다.
console.log(person); // { name: "홍길동", age: 25 }
const person = {
    name: "홍길동",
    age: 25
}

console.log(person.name); // "홍길동"
console.log(person.age);  // 25
const obj = {
    "first name": "홍길동",
    "1stPlace": true
}

console.log(obj.first name); // 문법 오류
console.log(obj.1stPlace);   // 문법 오류
const obj = {
    "first name": "Alice",
    "1stPlace": true,
    "": "빈 문자열 속성 이름",
}

console.log(obj["first name"]);  // "Alice"
console.log(obj["1stPlace"]);    // true
console.log(obj[""]);            // "빈 문자열 속성 이름"

// 변수에 저장된 속성 이름으로 접근하기
const propName = "first name";
console.log(obj[propName]);      // "Alice"
const obj = {
    name: "홍길동"
}

// 점 표기법
console.log(obj.name);    // "홍길동"

// 대괄호 표기법
console.log(obj["name"]); // "홍길동"
const person = {
    name: "홍길동"
}

// 점 표기법을 이용한 속성 추가
person.age = 30;

// 대괄호 표기법을 이용한 속성 추가
person["job"] = "개발자";

console.log(person);
/* 출력 결과
{
    name: "홍길동",
    age: 30,
    job: "개발자"
}
*/
person.age = 31;
person["job"] = "프론트엔드 개발자";

console.log(person.age);  // 31
console.log(person.job);  // "프론트엔드 개발자"
const person = {
    name: "홍길동",
    age: 31,
    job: "프론트엔드 개발자"
}

delete person.job;  // job 속성 삭제

console.log(person.job);  // undefined
console.log(person);      
/* 출력 결과
{
    name: "홍길동",
    age: 31
}
*/
const person = {
    name: "홍길동",
    age: 31,
    job: "개발자"
}

for (const key in person) {
    console.log(`${key}: ${person[key]}`);
}
/* 출력:
    name: 홍길동
    age: 31
    job: 개발자
*/
for (const key in person) {
    if (person.hasOwnProperty(key)) {
        console.log(`${key}: ${person[key]}`);
    }
}