10. 객체 리터럴

해피데빙·2022년 7월 20일
0

객체란

  • 자바스크립트는 객체 기반의 프로그래밍 언어
  • 구성하는 거의 모든 것이 객체 : 원시 값 제외 나머지 값 모두
    ex. 함수, 배열, 정규 표현식 등

원시 타입 vs 객체 타입

  • 원시 타입
    - 단 하나의 값
    • 변경 불가능
  • 객체 타입
    - 다양한 타입의 값(원시 값 또는 다른 객체)를 하나의 단위로 구성한 복합적인 자료구조
    • 변경 가능한 값

객체의 구조

  • 0개 이상의 프로퍼티로 구성된 집합
  • 프로퍼티 : 키 - 값
  • 프로퍼티의 값 : JS에서 사용할 수 있는 모든 값 ex. 함수
    -> 자바스크립트의 함수는 일급 객체이므로 값으로 취급 가능
    -> 메서드 : 프로퍼티 값이 함수일 경우 일반함수와 구분하기 위해 메서드라고 부른다
  • 프로퍼티 : 객체의 상태를 나타내는 값
  • 메서드 : 프로퍼티를 참조하고 조작할 수 있는 동작
  • 객체는 이처럼 프로퍼티와 메서드를 통해 상태와 동작을 하나의 단위로 구조화할 수 있어 유용
var counter ={
	num: 0, //프로퍼티 
    increase: function(){ this.num++; } //메서드 
}

객체 vs 함수

  • 함수 : 객체, 객체를 생성할 수 있다

객체 지향 프로그래밍
: 객체의 집합으로 프로그램ㅇ르 표현하려는 프로그래밍 패러다임

객체 리터럴에 의한 객체 생성

클래스 기반 객체지향 언어
ex. C, 자바 등

  • 클래스를 사전에 정의
  • 필요한 시점에 new 연산자와 함께 생성자 호출을 통해 인스턴스를 생성

인스턴스

  • 클래스에 의해 생성되어 메모리에 저장된 실체
  • 객체 지향 프로그래밍에서 객체 = 클래스 + 인스턴스
  • 객체가 메모리에 저장되어 실제로 존재하는 것에 초점

클래스

  • 인스턴스를 생성하기 위한 템플릿

자바스크립트는 프로토타입 기반 객체 지향 언어로서 클래스 기반 객체지향 언어와는 달리 다양한 객체 생성 방법 지원

  • Object 생성자 함수
  • 생성자 함수
  • Object.create 메서드
  • 클래스
  • 객체 리터럴 [가장 일반적, 간단]
    - 리터럴 : 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용하여 값을 생성하는 표기법
    • 객체 리터럴 : 객체를 생성하기 위한 표기법
      • {} 내에 0개 이상의 프로퍼티를 정의한다
        • 코드 블록이 아닌 값으로 평가되는 표현식이니까 닫는 중괄호 뒤에 세미콜론을 붙인다
        • 중괄호 내에 프로퍼티를 정의하지 않으면 빈 객체가 생성된다
      • 변수에 할당되는 시점에 자바스크립트 엔진은 객체 리터럴을 해석해 객체를 생성한다
        • 생성 후에 동적으로 프로퍼티를 추가할 수도 있다
        • 이외 방법은 모두 함수를 사용해 객체를 생성
var person = {
	name: 'Lee', 
    sayHello: function(){
    	console.log('Hello! My name is ${this.name}.`);
    }
}

typeof person// object 
person // {name: 'Lee', sayHello:f}

프로퍼티

  • 객체는 프로퍼티의 집합
  • 프로퍼티는 키와 값으로 구성
  • 프로퍼티를 나열할 때는 ,로 구분 (마지막에 붙여도/X도 됨)
  • 프로퍼티 키와 값으로 사용할 수 있는 값들
    - 키
    - 빈 문자열 포함 모든 문자열(일반적)
    - 식별자 네이밍 규칙 지킬 때는 "" 불필요 (권장) ex. firstName
    - 안 지킬 때는 필요 ex. 'last-name'
    - 빈 문자열 사용 가능 : 하지만 키로서 의미 X (권장 X)
    - 심벌값
    => 값에 접근할 수 있는 식별자 역할을 한다
    - 이외
    - 암묵적 타입 변환을 통해 문자열이 된다
    - 예약어를 사용해도 에러가 발생하지는 않지만 권장 X
    - 키를 중복 선언하면 나중에 선언한 프로퍼티가 덮어쓴다
    	- 값 : 자바스크립트에서 사용할 수 있는 모든 값
var person = {
name: 'Lee', 
age : 20
}
  • 문자열 또는 문자열로 평가할 수 있는 표현식을 사용해 프로퍼티 키를 동적으로 생성 가능
  • 이 경우 프로퍼티 키로 사용할 표현식을 대괄호로 묶어야 한다
var obj ={}; 
var key = 'hello' 

//프로퍼티 키 동적 생성
obj[key] = 'world' 

var obj={[key] : 'world'}// {hello: "world"} 
var foo = {
 0:1, 
 1:2, 
 2:3
}

//{0:1, 1:2, 2:3} 
//따옴표는 붙지 않지만 내부적으로는 문자열로 변환
var foo = {
	var : '', 
    function : ''
}

메서드

  • 자바스크립트 함수는 객체(일급 객체) : 함수를 값으로 취급할 수 있기 때문에 프로퍼티 값으로 사용 가능
  • 메서드 : 객체에 묶여 있는 함수, 프로퍼티 값이 함수일 때 메서드라고 한다
var circle ={
radius : 5, 
getDiameter : function(){ 
	return 2 * this.radius;//this를 쓰지 않으면 이 객체를 참조하지 못해서 referenceError가 뜬다
}
}

//circle.getDiameter() -> 10 
//이렇게 실행을 해야 return을 통해 결과값을 반환한다 

프로퍼티 접근

프로퍼티 접근 방법

  • 마침표 표기법: 마침표 프로퍼티 접근 연산자 사용 [dot notation]
  • 대괄호 표기법 : 대괄호 프로퍼티 접근 연산자 사용 [bracket notation]
    - 식별자 네이밍 규칙을 준수하지 않으면 반드시 대괄호 표기법 사용
    • 단, 프로퍼티 키가 숫자로 이뤄진 문자열인 경우 따옴표 생략 가능

프로퍼티 키가 식별자 네이밍 규칙을 준수하는 이름이면 둘다 사용 가능

  • 연산자 좌측에는 객체로 평가되는 표현식
  • 마침표 프로퍼티 접근 연산자 : 우측에 프로퍼티 키를 지정
  • 대괄호 프로퍼티 접근 연산자 : 내부에 프로퍼티 키를 지정, 문자열이면 ''를 반드시 사용해야(안 사용하면 식별자로 판단)
var person ={
name : 'Lee'
}

person.name    //Lee
person['name'] //Lee
  • 객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환한다

프로퍼티 값 갱신

이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신된다

var person ={
name : 'Lee'
}

person.name = "Kim" //{name:"Kim"}

프로퍼티 동적 생성

존재하지 않는 프로퍼티에 값을 할당하면 동적으로 생성되어 추가되고 값이 할당된다

var person ={
name : 'Lee'
}

person.age =20
//age라는 프로퍼티가 없다 
//따라서 person 객체에 age 프로퍼티가 동적으로 생성되고 값이 할당된다 

//{name: "Lee", age:20}

프로퍼티 삭제

delete 연산자

  • 객체의 프로퍼티를 삭제한다
  • delete연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식이어야 한다
  • 존재하지 않는 프로퍼티 삭제 시 에러 없이 무시
var person ={
name : 'Lee'
}

person.age =20
delete person.age; //삭제 

//{name: "Lee"}

ES6에서 추가된 객체 리터럴

더욱 간편하고 표현력 있는 객체 리터럴의 확장 기능 제공

프로퍼티 축약 표현

프로퍼티 값은 변수에 할당된 값, 즉 식별자 표현식일 수도 있다

var x=1, y=2;

var obj={
x:x, 
y:y
}

{x:1, y:2}

ES6에서는 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키를 생략할 수 있다
프로퍼티 키는 변수 이름으로 자동 생성된다

let x=1, y=2; 

const obj ={x,y}
obj/// {x:1, y:2}

계산된 프로퍼티 이름

  • 문자열 또는 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성할 수도 있다
  • 단 프로퍼티 키로 사용할 표현식을 대괄호로 묶어야 한다
  • 프로퍼티 키를 동적 생성하려면 객체 리터럴 외부에서 대괄호 표기법을 사용해야 한다
var prefix = 'prop'; 
var i=0; 

var obj={}; 

obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;

obj//{props-1;1, prop-2:2, prop-3: 3}
  • 객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키를 동적 생성할 수 있다
var prefix = 'prop'; 
var i=0; 

var obj={
[`${prefix}-${++i}`] : i, //여기서도 위와 같은 + 사용 가능
[`${prefix}-${++i}`] : i,
[`${prefix}-${++i}`] : i
}; 

obj//{props-1;1, prop-2:2, prop-3: 3}

메서드 축약 표현

  • 메서드를 정의하려면 프로퍼티 값으로 함수를 할당한다
var obj={
name : 'Lee', 
sayHi : function(){
	console.log('Hi!' + this.name); 
}
}

obj.sayHi(); //Hi! Lee

ES6에서는 메서드를 정의할 때 function 키워드를 생략한 축약 표현을 사용할 수 있다
프로퍼티에 할당한 함수와 다르게 동작한다 (26장의 메서드 참고)

const obj = {
	name: 'Lee', 
    sayHi(){ console.log('Hi! '+this.name);} 
}

obj.sayHi(); //Hi! Lee
profile
노션 : https://garrulous-gander-3f2.notion.site/c488d337791c4c4cb6d93cb9fcc26f17

0개의 댓글