** πŸ“Œ 객체 생성 방식 μ™„μ „ ν•΄λΆ€**

생성 방법 문법 νŠΉμ§• μ£Όμ˜μ‚¬ν•­
객체 λ¦¬ν„°λŸ΄ { key: value } κ°€μž₯ 간단, μ¦‰μ„μ—μ„œ 객체 생성 λ©”μ„œλ“œ 곡유 λΆˆκ°€ (λ©”λͺ¨λ¦¬ λΉ„νš¨μœ¨)
μƒμ„±μž ν•¨μˆ˜ function Person() {} λ™μΌν•œ ꡬ쑰 객체 생성 κ°€λŠ₯, ν”„λ‘œν† νƒ€μž… μ‚¬μš© new μ•ˆ μ“°λ©΄ undefined λ°˜ν™˜
Object.create() Object.create(proto) μ›ν•˜λŠ” ν”„λ‘œν† νƒ€μž… 직접 μ§€μ • ν”„λ‘œνΌν‹° μΆ”κ°€ 별도 ν•„μš”
ES6 클래슀 class Person {} 문법적 섀탕, λ‚΄λΆ€λŠ” μ—¬μ „νžˆ ν”„λ‘œν† νƒ€μž… μ‹€μ œ λ™μž‘μ€ ES5 방식과 동일

πŸ“š 예제 비ꡐ

// 1. 객체 λ¦¬ν„°λŸ΄
const obj = { name: 'JS' };

// 2. μƒμ„±μž ν•¨μˆ˜
function Person(name) {
  this.name = name;
}
const p1 = new Person('Tom');

// 3. Object.create()
const proto = { greet() { console.log('Hello'); } };
const obj2 = Object.create(proto);
obj2.greet();

// 4. 클래슀
class Animal {
  constructor(type) {
    this.type = type;
  }
  speak() {
    console.log(`${this.type} sound`);
  }
}
const dog = new Animal('Dog');
dog.speak();

🧠 μ™œ μƒμ„±μž ν•¨μˆ˜ & ν΄λž˜μŠ€κ°€ ν”„λ‘œν† νƒ€μž…μ„ μ“°λ‚˜?


πŸ”₯ 2️⃣ ν”„λ‘œν† νƒ€μž… & ν”„λ‘œν† νƒ€μž… 체인 심화


πŸ“Œ 핡심 μš©μ–΄ λͺ…ν™•νžˆ ꡬ뢄

μš©μ–΄ μœ„μΉ˜ μ„€λͺ…
prototype ν•¨μˆ˜(μƒμ„±μž ν•¨μˆ˜ or 클래슀) ν•΄λ‹Ή ν•¨μˆ˜λ‘œ μƒμ„±λœ 객체가 μ°Έμ‘°ν•˜λŠ” ν”„λ‘œν† νƒ€μž… 객체
__proto__ λͺ¨λ“  객체 μ‹€μ œ λΆ€λͺ¨ 객체의 prototype을 μ°Έμ‘°

🎯 ν”„λ‘œν† νƒ€μž… 체인 μ‹œκ°ν™”

객체 β†’ __proto__ β†’ μƒμ„±μž ν•¨μˆ˜μ˜ prototype β†’ Object.prototype β†’ null

πŸ“š 예제: 확인

javascript
λ³΅μ‚¬νŽΈμ§‘
function Person(name) { this.name = name; }
Person.prototype.sayHi = function() { console.log(`Hi ${this.name}`); };

const p1 = new Person('Tom');

console.log(p1.__proto__ === Person.prototype); // true
console.log(Person.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__); // null


πŸš€ 3️⃣ ν”„λ‘œν† νƒ€μž… 체인 탐색 흐름

  1. 객체 μžμ‹ μ—μ„œ ν”„λ‘œνΌν‹°/λ©”μ„œλ“œ μ°ΎκΈ°
  2. μ—†μœΌλ©΄ β†’ __proto__ β†’ λΆ€λͺ¨ ν”„λ‘œν† νƒ€μž…μœΌλ‘œ 이동
  3. Object.prototypeκΉŒμ§€ μ˜¬λΌκ°€λ„ μ—†μœΌλ©΄ β†’ undefined


πŸ—οΈ 4️⃣ ES5 vs ES6 상속 μ™„λ²½ 비ꡐ


πŸ“œ ES5: ν”„λ‘œν† νƒ€μž… 기반 상속

function Animal(type) {
  this.type = type;
}
Animal.prototype.speak = function() {
  console.log(`${this.type} sound`);
};

function Dog(name) {
  Animal.call(this, 'Dog'); // super
  this.name = name;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

const d1 = new Dog('Max');
d1.speak(); // Dog sound

πŸ¦„ ES6: class 기반 상속

class Animal {
  constructor(type) {
    this.type = type;
  }
  speak() {
    console.log(`${this.type} sound`);
  }
}

class Dog extends Animal {
  constructor(name) {
    super('Dog');
    this.name = name;
  }
}

const d2 = new Dog('Buddy');
d2.speak(); // Dog sound

βœ… λ‚΄λΆ€μ μœΌλ‘œ μ—¬μ „νžˆ ν”„λ‘œν† νƒ€μž… 기반


🧠 5️⃣ 기술 λ©΄μ ‘ 포인트 정리

질문 λ‹΅λ³€ 포인트
__proto__와 prototype 차이? __proto__: 객체의 λ‚΄λΆ€ μ°Έμ‘°, prototype: ν•¨μˆ˜μ—λ§Œ 쑴재
ν”„λ‘œν† νƒ€μž… 체인 λ™μž‘? 객체 β†’ λΆ€λͺ¨ ν”„λ‘œν† νƒ€μž… β†’ μ΅œμ’… Object.prototype
ES5 vs ES6 상속 차이? ES5: μˆ˜μž‘μ—… ν”„λ‘œν† νƒ€μž… μ—°κ²°, ES6: 문법적 섀탕
ν΄λž˜μŠ€κ°€ ν”„λ‘œν† νƒ€μž… 기반인 이유? λ©”μ„œλ“œ 곡유 μ΅œμ ν™”, κΈ°μ‘΄ JS μ—”μ§„ ν˜Έν™˜μ„±
λ©”μ„œλ“œ λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±? ν”„λ‘œν† νƒ€μž…μ— μ €μž₯ β†’ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ 곡유


πŸ“‘ 6️⃣ λ…Έμ…˜μš© μš”μ•½ 정리


πŸ“‹ 객체 생성 방법 정리

방식 문법 νŠΉμ§• 주의
객체 λ¦¬ν„°λŸ΄ {} 직관적 λ©”μ„œλ“œ 곡유 λΆˆκ°€
μƒμ„±μž ν•¨μˆ˜ function(){} μž¬μ‚¬μš©μ„±, ν”„λ‘œν† νƒ€μž… λͺ…μ‹œ new μ•ˆ μ“°λ©΄ undefined
Object.create() Object.create(proto) μ›ν•˜λŠ” ν”„λ‘œν† νƒ€μž… μ„€μ • ν”„λ‘œνΌν‹° μΆ”κ°€ ν•„μš”
클래슀 class 가독성, 상속 깔끔 λ‚΄λΆ€λŠ” ν”„λ‘œν† νƒ€μž…

πŸ“‹ ν”„λ‘œν† νƒ€μž… 핡심

μš©μ–΄ μ„€λͺ…
prototype ν•¨μˆ˜μ— 쑴재, 객체 생성 μ‹œ μ°Έμ‘°
__proto__ 객체에 쑴재, λΆ€λͺ¨ ν”„λ‘œν† νƒ€μž… μ—°κ²°
ν”„λ‘œν† νƒ€μž… 체인 객체 β†’ λΆ€λͺ¨ β†’ Object.prototype


πŸ”₯ 7️⃣ 싀무 & λ©΄μ ‘ 심화 ν™•μž₯ κ°€λŠ₯:

  1. ν”„λ‘œν† νƒ€μž… 체인 도식화 자료
  2. Prototype Pollution λ³΄μ•ˆ 이슈
  3. μ»€μŠ€ν…€ Object.create νŒ¨ν„΄ & λͺ¨λ“ˆν™” νŒ¨ν„΄
  4. 클래슀 private ν•„λ“œ & Symbol ν™œμš©
  5. λ©΄μ ‘ λŒ€λΉ„ - ν”„λ‘œν† νƒ€μž…κ³Ό 클래슀 심측 질문 μ„ΈνŠΈ

ν•„μš”ν•˜μ‹œλ©΄ λ°”λ‘œ μ‹œκ° 자료, μ‹€μ „ 문제 μ„ΈνŠΈ, λ§ˆν¬λ‹€μš΄μœΌλ‘œ 제곡 κ°€λŠ₯ν•΄μš”! μΆ”κ°€λ‘œ 심화 μš”μ²­ μ£Όμ‹œλ©΄ λ°”λ‘œ μ€€λΉ„ν• κ²Œμš”! πŸš€πŸ”₯

πŸ¦„ 객체 1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JavaScript 객체 심화 예제</title>

    <style>
        .area {
            background: lightgray;
            border: 1px solid black;
            width: 500px;
            margin-bottom: 10px;
            padding: 10px;
            white-space: pre-wrap; /* μ€„λ°”κΏˆ μœ μ§€ */
        }
        .big { height: 500px; overflow-y: scroll; }
    </style>
</head>
<body>

    <h2>🟒 JavaScript 객체(Object) 심화 예제</h2>

    <div class="area big" id="outputArea"> <!-- κ²°κ³Ό 좜λ ₯ μ˜μ—­ --></div>

    <script>
        function objectExamples() {
            const output = document.getElementById("outputArea");

            /* ---------------------------------------------------
            βœ… 1. 객체 μ„ μ–Έ κΈ°λ³Έ - 기초
            --------------------------------------------------- */
            const product = {
                name: "망고 피클",      // πŸ₯­ μƒν’ˆ 이름
                price: 4000,          // πŸ’° 가격
                ingredients: ["망고", "섀탕", "μ‹μ΄ˆ"], // πŸ§‚ 재료 (λ°°μ—΄)
                isAvailable: true     // βœ… 판맀 μ—¬λΆ€
            };

            output.innerHTML += "πŸ“¦ κΈ°λ³Έ 객체 μ„ μ–Έ:\n";
            output.innerHTML += JSON.stringify(product) + "\n\n";

            /* ---------------------------------------------------
            βœ… 2. 객체 속성 μ ‘κ·Ό - 점 ν‘œκΈ°λ²• & λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•
            --------------------------------------------------- */
            output.innerHTML += "πŸ”‘ 점 ν‘œκΈ°λ²•μœΌλ‘œ μ ‘κ·Ό: " + product.name + "\n";
            output.innerHTML += "πŸ”‘ λŒ€κ΄„ν˜Έ ν‘œκΈ°λ²•μœΌλ‘œ μ ‘κ·Ό: " + product['price'] + "원\n\n";

            /* ---------------------------------------------------
            βœ… 3. 속성 μΆ”κ°€, μˆ˜μ •, μ‚­μ œ
            --------------------------------------------------- */
            product.origin = "필리핀"; // βž• 속성 μΆ”κ°€
            product.price = 4500;      // ✏️ 속성 μˆ˜μ •
            delete product.isAvailable; // ❌ 속성 μ‚­μ œ
            output.innerHTML += "πŸ› οΈ 속성 μΆ”κ°€/μˆ˜μ •/μ‚­μ œ ν›„:\n" + JSON.stringify(product) + "\n\n";

            /* ---------------------------------------------------
            βœ… 4. κ³„μ‚°λœ 속성λͺ… (동적 key)
            --------------------------------------------------- */
            const keyName = "special-offer";
            const dynamicProduct = {
                [keyName]: "세일 쀑",  // πŸŒ€ λŒ€κ΄„ν˜Έ μ•ˆμ— λ³€μˆ˜ μ‚¬μš©
                price: 3000
            };
            output.innerHTML += "βš™οΈ κ³„μ‚°λœ 속성λͺ… μ‚¬μš©:\n" + JSON.stringify(dynamicProduct) + "\n\n";

            /* ---------------------------------------------------
            βœ… 5. 객체 λ©”μ„œλ“œ μ„ μ–Έκ³Ό this μ‚¬μš©
            --------------------------------------------------- */
            const person = {
                firstName: "홍",
                lastName: "길동",
                fullName: function() { 
                    return `${this.firstName} ${this.lastName}`; // this둜 자기 μžμ‹  μ°Έμ‘°
                }
            };
            output.innerHTML += "πŸ‘€ λ©”μ„œλ“œ μ‚¬μš©: " + person.fullName() + "\n\n";

            /* ---------------------------------------------------
            βœ… 6. for...in 문으둜 객체 반볡
            --------------------------------------------------- */
            output.innerHTML += "πŸ” for...in 반볡:\n";
            for (let key in product) {
                output.innerHTML += `➑️ ${key}: ${product[key]}\n`;
            }
            output.innerHTML += "\n";

            /* ---------------------------------------------------
            βœ… 7. Object.keys, values, entries
            --------------------------------------------------- */
            output.innerHTML += "πŸ—οΈ Object.keys: " + JSON.stringify(Object.keys(product)) + "\n";
            output.innerHTML += "πŸ”’ Object.values: " + JSON.stringify(Object.values(product)) + "\n";
            output.innerHTML += "πŸ“„ Object.entries:\n";
            Object.entries(product).forEach(([key, value]) => {
                output.innerHTML += `➑️ ${key}: ${value}\n`;
            });
            output.innerHTML += "\n";

            /* ---------------------------------------------------
            βœ… 8. 객체 볡사 - 얕은 볡사
            --------------------------------------------------- */
            const copy1 = Object.assign({}, product);
            const copy2 = { ...product }; // μŠ€ν”„λ ˆλ“œ μ—°μ‚°μž
            output.innerHTML += "πŸ“‹ 얕은 볡사(Object.assign): " + JSON.stringify(copy1) + "\n";
            output.innerHTML += "πŸ“‹ 얕은 볡사(μŠ€ν”„λ ˆλ“œ): " + JSON.stringify(copy2) + "\n\n";

            /* ---------------------------------------------------
            βœ… 9. 쀑첩 객체와 λ©”μ„œλ“œμ—μ„œμ˜ this
            --------------------------------------------------- */
            const order = {
                orderId: 101,
                customer: {
                    name: "홍길동",
                    address: "μ„œμšΈ"
                },
                total: 5000,
                summary() {
                    return `주문번호: ${this.orderId}, 고객: ${this.customer.name}, 총앑: ${this.total}원`;
                }
            };
            output.innerHTML += "πŸ“„ 쀑첩 객체 + λ©”μ„œλ“œ μ‚¬μš©:\n" + order.summary() + "\n\n";

            /* ---------------------------------------------------
            βœ… 10. 객체 비ꡬ쑰화 ν• λ‹Ή (Destructuring)
            --------------------------------------------------- */
            const { name, price } = product;
            output.innerHTML += `πŸ“¦ 비ꡬ쑰화 ν• λ‹Ή: μƒν’ˆλͺ… = ${name}, 가격 = ${price}원\n\n`;

            /* ---------------------------------------------------
            βœ… 11. 객체 κΉŠμ€ 볡사 (deep copy)
            --------------------------------------------------- */
            const deepCopy = JSON.parse(JSON.stringify(order));
            deepCopy.customer.name = "μž„κΊ½μ •"; // 원본 영ν–₯ X
            output.innerHTML += "πŸ“Œ κΉŠμ€ 볡사 ν›„ μˆ˜μ •:\n";
            output.innerHTML += `원본 고객λͺ…: ${order.customer.name}, 볡사 고객λͺ…: ${deepCopy.customer.name}\n\n`;

            /* ---------------------------------------------------
            βœ… 12. 객체 비ꡐ νŠΉμ§•
            --------------------------------------------------- */
            const objA = { a: 1 };
            const objB = { a: 1 };
            output.innerHTML += `⚠️ 객체 비ꡐ: objA === objB β†’ ${objA === objB}\n`; // false (μ£Όμ†Œ 닀름)
            const objC = objA;
            output.innerHTML += `βœ… 동일 μ°Έμ‘° 비ꡐ: objA === objC β†’ ${objA === objC}\n`; // true
        }

        // ν•¨μˆ˜ μ‹€ν–‰
        objectExamples();
    </script>

</body>
</html>

πŸ¦„ 객체 2

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>JavaScript Object Deep Dive</title>
</head>
<body>

<script>
/************************************************
 * 🟒 [1] 객체 λ¦¬ν„°λŸ΄ 방식 (κ°€μž₯ κΈ°λ³Έ)
 ************************************************/
const product1 = {
  code: 'A1000',
  name: '음료수',
  price: 1000,
  showInfo: function() {
    console.log(`πŸ“¦ [λ¦¬ν„°λŸ΄] μƒν’ˆλͺ…: ${this.name}, πŸ’° 가격: ${this.price}원`);
  }
};
product1.showInfo();

/************************************************
 * 🟒 [2] μƒμ„±μž ν•¨μˆ˜ 방식 (기초)
 ************************************************/
function Product(code, name, price) {
  this.code = code;
  this.name = name;
  this.price = price;
  // λΉ„νš¨μœ¨μ  λ©”μ„œλ“œ (각 κ°μ²΄λ§ˆλ‹€ 볡사됨)
  this.showInfo = function() {
    console.log(`πŸ“¦ [μƒμ„±μž ν•¨μˆ˜] μƒν’ˆλͺ…: ${this.name}, πŸ’° 가격: ${this.price}원`);
  };
}
let p1 = new Product('A1001', 'μΉ˜ν† μŠ€', 2000);
let p2 = new Product('A1002', '초콜릿', 1500);
p1.showInfo();
p2.showInfo();

/************************************************
 * 🟒 [3] ν”„λ‘œν† νƒ€μž…μœΌλ‘œ λ©”μ„œλ“œ 곡유 (μΆ”μ²œ!)
 ************************************************/
function ProductProto(code, name, price) {
  this.code = code;
  this.name = name;
  this.price = price;
}
// βœ… λ©”μ„œλ“œλ₯Ό ν”„λ‘œν† νƒ€μž…μ— μΆ”κ°€ β†’ λͺ¨λ“  객체가 곡유!
ProductProto.prototype.showInfo = function() {
  console.log(`πŸ“¦ [ν”„λ‘œν† νƒ€μž…] μƒν’ˆλͺ…: ${this.name}, πŸ’° 가격: ${this.price}원`);
};
let p3 = new ProductProto('A1003', 'μΏ ν‚€', 1800);
let p4 = new ProductProto('A1004', '사탕', 1000);
p3.showInfo();
p4.showInfo();

/************************************************
 * 🟒 [4] ES6 클래슀 문법 (가독성 μ’‹μŒ, μΆ”μ²œ!)
 ************************************************/
class ProductClass {
  constructor(code, name, price) {
    this.code = code;
    this.name = name;
    this.price = price;
  }
  showInfo() {
    console.log(`πŸ“¦ [클래슀] μƒν’ˆλͺ…: ${this.name}, πŸ’° 가격: ${this.price}원`);
  }
}
let p5 = new ProductClass('A1005', '라면', 1200);
p5.showInfo();

/************************************************
 * 🟒 [5] 클래슀 상속 (λΆ€λͺ¨ β†’ μžμ‹)
 ************************************************/
class DiscountProduct extends ProductClass {
  constructor(code, name, price, discountRate) {
    super(code, name, price); // λΆ€λͺ¨ 호좜
    this.discountRate = discountRate; // μΆ”κ°€ 속성
  }
  getDiscountedPrice() {
    const discounted = this.price * (1 - this.discountRate / 100);
    console.log(`πŸ’Έ 할인 μ μš©κ°€: ${discounted}원`);
    return discounted;
  }
}
let dp1 = new DiscountProduct('A2001', 'ν”Όμž', 10000, 20);
dp1.showInfo();
dp1.getDiscountedPrice();

/************************************************
 * 🟒 [6] 정적 λ©”μ„œλ“œ (클래슀 μžμ²΄μ—μ„œ 호좜)
 ************************************************/
class Utility {
  static sayHello() {
    console.log('πŸ‘‹ μ•ˆλ…•ν•˜μ„Έμš”! (정적 λ©”μ„œλ“œ)');
  }
}
Utility.sayHello(); // 객체 생성 없이 호좜 κ°€λŠ₯

/************************************************
 * 🟒 [7] 객체 비ꡐ (μ°Έμ‘°ν˜• 비ꡐ 주의)
 ************************************************/
let obj1 = new ProductClass('A1006', '과자', 2200);
let obj2 = new ProductClass('A1006', '과자', 2200);
console.log('πŸ”Έobj1 === obj2 ?', obj1 === obj2); // false (λ‹€λ₯Έ λ©”λͺ¨λ¦¬)

let obj3 = obj1; // μ°Έμ‘° 볡사
console.log('πŸ”Έobj1 === obj3 ?', obj1 === obj3); // true (같은 μ°Έμ‘°)

/************************************************
 * 🟒 [8] 동적 속성 μΆ”κ°€ & μ‚­μ œ
 ************************************************/
obj1.category = 'μ‹ν’ˆ'; // μΆ”κ°€
console.log('πŸ”Έobj1에 category μΆ”κ°€:', obj1);
delete obj1.category; // μ‚­μ œ
console.log('πŸ”Έobj1μ—μ„œ category μ‚­μ œ:', obj1);

/************************************************
 * 🟒 [9] κ³ κΈ‰: 객체 속성 μ—΄κ±° & ν‚€/κ°’ μ ‘κ·Ό
 ************************************************/
console.log('πŸ” 객체의 속성 μ—΄κ±° (for...in):');
for (let key in obj2) {
  console.log(`πŸ”‘ ${key} : ${obj2[key]}`);
}

// ν‚€/κ°’ λ°°μ—΄λ‘œ
console.log('πŸ“‹ Object.keys:', Object.keys(obj2));
console.log('πŸ“‹ Object.values:', Object.values(obj2));
console.log('πŸ“‹ Object.entries:', Object.entries(obj2));

/************************************************
 * 🟒 [10] κ³ κΈ‰: 객체 볡사 (얕은 볡사 vs κΉŠμ€ 볡사)
 ************************************************/
const original = { code: 'X1', name: 'μŠ€λ‚΅', price: 1500, details: { origin: 'Korea' } };

// 얕은 볡사 (μ°Έμ‘° 곡유)
const shallowCopy = { ...original };
shallowCopy.details.origin = 'USA';
console.log('πŸ”Έμ›λ³Έ 객체:', original); // origin도 λ°”λ€œ (μ°Έμ‘° 곡유)

// κΉŠμ€ 볡사 (JSON μ‚¬μš©)
const deepCopy = JSON.parse(JSON.stringify(original));
deepCopy.details.origin = 'Japan';
console.log('πŸ”Έμ›λ³Έ 객체 (κΉŠμ€ 볡사 ν›„):', original);
console.log('πŸ”ΈκΉŠμ€ 볡사 객체:', deepCopy);

</script>

</body>
</html>