JavaScript

자바스크립트 객체

9tun 2025. 3. 31. 20:52

객체

 

자바스크립트 객체

내장 객체

자바스크립트에서 자주 사용돼서 미리 정의해 둔 객체

 

문서 객체 모델 (DOM = Document Object Model)

HTML 문서를 자바스크립트로 제어할 수 있도록 만든 구조(트리 구조)

 

웹 브라우저 객체

웹 브라우저 자체를 제어할 수 있도록 만든 객체

 

사용자 정의 객체

미리 정의된 객체 뿐 아니라 사용자가 필요할 때마다 객체를 정의해서 사용 가능

 

사용자 정의 객체

프로퍼티는 '키:값' 형태를 갖고 있음

프로퍼티 값이 함수일 경우 '메서드'라고 부름

 

키:값

객체명{

    키1:값1,

    키2:값2,
    키3:값3,

    ...

}

 

객체 선언하기

 let book = {
	title : "스트렝스 훈련"
	pages : 500
 }

 

객체 프로퍼티 접근

book.title	/* 점 표기법, 큰 따옴표 필요 없음 */
book["title"]	/* 괄호 표기법, 큰 따옴표 필요 */

 

프로퍼티 수정하고 추가

객체명.키 = 값

book.author = "구턴"

 

빈 객체 생성

빈 객체 생성 방법 2가지

let book = {}
let book = new Object()

 

프로퍼티 삭제

delete 객체명.키

delete book.author

 

프로퍼티 키는 그대로 두고, 값만 제거하고 싶을 때는 아래와 같이 

book.author = undefined

 

객체 중첩

객체 안에 객체

let student = {
	name : "구턴",
	score : {
		math : 100,
        science : 98,
		average : function () {
			return (this.math + this.science) / 2
		}
	}
}

student.score.math
student.score.average()

 

 

객체 메서드 정의

메서드명 : function() {

    ...

}

 

book에 buy라는 메서드 정의

let book = {
	title : "스트렝스 훈련",
	pages : 500,
	buy : function(){
		console.log("책 구입");
	}
}

 

에크마스크립트 2015에서는 function이라는 예약어 생략 가능

let book = {
	title : "스트렝스 훈련",
	pages : 500,
	buy(){
		console.log("책 구입");
	}
}

 

this

메서드에서 객체 안에 있는 프로퍼티를 사용해야 할 때 유용

let book = {
	title : "스트렝스 훈련",
    pages : 500,
    done : false,
    finish : function() {
		this.done === false ? console.log("읽는 중") : console.log("완독");
	}
}

 

 

객체 복사

🎯 객체를 복사할 경우에는 값이 아니라 값이 저장된 메모리 주소가 전달됨. 

✅ 따라서 복사된 객체의 값을 변경하면 원본 값도 변경됨


생성자와 클래스

생성자

✅ 생성자

객체의 틀을 만들 때 사용하는 함수

 

✅ 인스턴스

생성자 함수를 사용해서 만든 객체

 

생성자 함수 정의

function 함수명(매개변수) {

    this.키1 = 값1,

    this.키2 = 값2,

    ...

    this.메서드1 = function() {...},

    this.메서드2 = function() {...},

    ...

}

 

혹은 아래와 같이 표현식 사용도 가능함

const 함수명(매개변수) = function() {

    ...

}

 

👨‍🏫 생성자 함수 첫 글자는 대문자로!

function Book(title, pages, done = false) {
  this.title = title;
  this.pages = pages;
  this.done = done;
  this.finish = function () {
    let str = "";
    this.done === false ? (str = "읽는 중") : (str = "완독");
    return str;
  };
}

 

new 예약어를 사용해 인스턴스 만들기

생성자 함수는 객체가 아니라 객체를 만들 수 있는 틀일 뿐입니다.

객체를 만들려면 new라는 예약어를 사용합니다. 

const book1 = new Book("스트렝스 기초", 500, false);
const book2 = new Book("스쿼트의 정석", 180, true);

 

클래스

✅ Syntactic Sugar (신택틱 슈거: 설탕을 살짝 바른 구문)

자바스크립트의 클래스는 생성자 함수를 좀 더 표현하기 쉽게 바꾼 클래스임

 

클래스 선언

class 클래스명 {

    constructor(){

        프로퍼티1,

        프로퍼티2,

        ...

    }

    메서드1() {...}

    메서드2() {...}

}

 

혹은 다음 표현식 사용도 가능

const 클래스명 = class {

    ...

}

class Book {
  constructor(title, pages, done = false) {
    this.title = title;
    this.pages = pages;
    this.done = done;
  }

  finish() {
    let str;
    this.done === false ? (str = "읽는 중") : (str = "완독");
    return str;
  }
}

const book1 = new Book("스트렝스 기초", 500, false);
const book2 = new Book("스쿼트의 정석", 180, true);

 


 

객체의 키와 값

객체에 있는 프로퍼티와 값을 탐색해 봅시다.

 

for...in

for(변수 in 객체) {

    ...

}

 

let bag = {
	type : "backpack",
    color : "blue",
    size : 15
}

for (key in bag){
	console.log(`${key}`);	/* type, color, size 같은 키가 반환됨 */
}

for (key in bag){
	console.log(`${key} : ${bag[key]}`);	/* type : backpack, color : blue, size : 15 */
}

 

 

Object 객체 메서드 - keys(), values(), entries()

Object.keys(객체명)      // 키만 반환

Object.values(객체명)  // 값만 반환

Object.entries(객체명)  // [키, 값] 반환

 

let book = {
	title : "스트렝스 기초",
    pages : 500,
    buy : function(){
    	console.log("구매 완료");
    }
}

let keys = Object.keys(book);
console.log(keys);

let values = Object.values(book);
console.log(values);

let entries = Object.entries(book);
console.log(entries);

 

 


 

프로토타입과 클래스 상속

✅ 자바스크립트에서는 객체간 상속을 위해 프로토타입을 사용

 

프로토타입

JavaScript에서 상속을 구현하는 방식

객체가 다른 객체의 속성과 메서드에 접근할 수 있도록 연결해주는 링크

arr 배열은 Array 객체를 상속 받았다.

✅ 배열의 프로토타입 = Array 객체

✅ 숫자의 프로토타입 = Number 객체

✅ 문자열의 프로토타입 = String 객체

 

생성자 함수와 프로토타입 객체

 

사용자가 정의한 class로 strengthBook이라는 객체를 만들었습니다.

객체의 프로토타입을 확인해 보니까 Object라고 되어 있고, 생성자가 class Book입니다.

즉, Book 프로토타입 객체라는 뜻입니다.

 

🎯 상속 (Inheritance)

어떤 객체가 다른 객체의 속성(프로퍼티)이나 기능(메서드)을 물려받아 사용할 수 있는 것
JavaScript에서는 프로토타입을 통해 상속이 이루어짐
예: strengthBook은 Book 클래스에서 만들어졌기 때문에 Book의 기능을 사용할 수 있음

 

__proto__와 prototype 프로퍼티

__proto__

객체의 프로토타입을 가리킴

모든 객체가 가지고 있는 숨겨진 프로퍼티

해당 객체가 상속받는 부모 프로토타입 객체를 참조

 

prototype

생성자 함수나 클래스가 갖고 있는 프로퍼티

생성자 함수나 클래스에 정의된 프로퍼티나 메서드가 인스턴스에 상속됨

Object 객체는 모든 객체의 조상

 

프로토타입 메서드

프로토타입을 사용해서 메서드 정의하기

function newBook (title, pages, done) {
  this.title = title;
  this.pages = pages;
  this.done = done;
}

newBook.prototype.finish = function() {
  this.done === false ? str = "읽는 중" : str = "완독";
  return str;
}

const nBook1 = new newBook("스트렝스 기초", 500, false);
const nBook2 = new newBook("스쿼트의 정석", 180, true);

 

이처럼 프로토타입 메서드를 사용해서 함수를 정의하면, 처음에 객체를 처음 설계할 때 모든 함수를 다 알고 있을 필요가 없다.

🎯 프로토타입 메서드를 사용하면 객체가 생성된 이후에도 공통 메서드를 동적으로 추가할 수 있습니다.

 

 


✅ 생성자 상속

기존 객체명.call(this, 프로퍼티 or 메서드)

프로퍼티만 상속, 메서드는 따로 prototype  연결 필요

 

프로퍼티 연결

Object.setPrototypeOf(하위 객체, 상위 객체)

/* 프로토타입을 이용해서 메서드 정의해 보겠습니다. */
function Book (title, price) {
  this.title = title;
  this.price = price;
}

Book.prototype.buy = function() {
  console.log(`${this.title}을(를) ${this.price}에 구매했습니다.`);
}

const book1 = new Book("세이노의 가르침", 6480);
book1.buy();

/* 앞서 정의한 Book을 상속 받아서 TextBook 객체를 작성해 보겠습니다. */
function TextBook (title, price, section){
  Book.call(this, title, price);  /* Book의 프로퍼티 재사용 */
  this.section = section;             /* 새 프로퍼티 */
}

TextBook.prototype.buyTextBook = function() {
  console.log(`${this.section} 분야, ${this.title}을 ${this.price}에 구매했습니다.`);
}

/* TextBook의 프로토타입을 Book 프로토타입에 연결합니다. */
Object.setPrototypeOf(TextBook.prototype, Book.prototype);

/* TextBook의 객체를 생성해 보겠습니다. */
const book2 = new TextBook("데일 카네기 인간관계론", 10350, "인문학");
book2.buyTextBook();    /* 새로 선언한 메서드 */
book2.buy();            /* 상속 받은 메서드 */

 

 

✅ 클래스 상속

class 새 클래스명 extends 기존 클래스명

프로퍼티 + 메서드 모두 상속

 

✅ 생성자 상속

super(프로퍼티)

부모 생성자 호출

/* 클래스 선언 */
class Book {
  constructor(title, price){
    this.title = title;
    this.price = price;
  }
  buy(){
    console.log(`${this.title}을(를) ${this.price}에 구매했습니다.`);
  }
}

const book1 = new Book("세이노의 가르침", 6480);
book1.buy();

/* extends를 사용한 상속 */
class TextBook extends Book{
  constructor(title, price, section){
    super(title, price);	/* 부모 클래스 생성자 호출 */
    this.section = section;
  }

  buyTextBook(){
    console.log(`${this.section} 분야, ${this.title}을 ${this.price}에 구매했습니다.`);
  }
}

const book2 = new TextBook("데일 카네기 인간관계론", 10350, "인문학");
book2.buyTextBook();    
book2.buy();

 

'JavaScript' 카테고리의 다른 글

HTTP 통신과 JSON  (0) 2025.04.22
배열과 객체  (0) 2025.04.10
Javascript의 내장 객체  (0) 2025.03.27
DOM 활용  (0) 2025.03.26
이벤트  (0) 2025.03.23