[자바스크립트] 객체, 프로퍼티, 메소드
글 작성자: 망고좋아
반응형
객체
- 객체는 관련된 데이터와 함수(프로퍼티와 메소드)의 집합니다.
- 즉, 객체는 케이스이고, 데이터를 의미하는
프로퍼티
와 데이터를 참조하고 조작할 수 있는 동작(behavior)을 의미하는메소드
가 객체를 이루고 있다. - 자바스크립트에는 8가지 자료형이 있고 그중 7개는 오직 하나의 데이터만 담을 수 있어서 원시형(primitive type)이라고 부른다.
- 그러나 객체형은 원시형과 달리 다양한 데이터를 담을 수 있다. 키로 구분된 데이터 집합이나 복잡한 개체(entity)를 저장할 수 있다.
- 객체는 중괄호
{…}
를 이용해 생성한다.- 중괄호 안에는 ‘키(key): 값(value)’ 쌍으로 구성된 프로퍼티(property)를 여러 개 넣을 수 있다.
- key엔 문자형, value엔 모든 자료형이 허용된다. 프로퍼티 키를 '프로퍼티 이름'이라고도 부른다.
프로퍼티(property)
- ‘키(key): 값(value)’ 쌍으로 구성되어 있다.
- key는 프로퍼티를 식별하기 위한 식별자(identifier)이다.
메소드(method)
- 메소드를 수행하기 위해서는 객체를 통해서 해당 메소드를 수행되어야 한다.
- 동작을 수행하는 주체가 객체이니, 객체에게 동작을 수행하라고 지시해야 한다.
- 반면, 함수는 자체가 객체라서 자기 자신을 수행하는 것이 가능하다. 이 점이 메소드와 가장 큰 차이이다.
- 즉, 함수는 객체로부터 독립적이고, 메소는 객체에 종속적이다.
var foo={};
foo.a=1;
foo.b=2;
foo.sum=function() {console.log(foo.a+foo.b);};
foo.sum();
// 3
쉽게 생각하기!!
- 서랍장 안 파일을 프로퍼티
- 파일 각각에 붙어있는 이름표 -> 객체의 key
빈 객체 생성 방법
let user = new Objext(); // '객체 생성자' 문법
let user = {}; // '객체 리터럴' 문법 -> 주로 이 문법을 사용
- 중괄호를 이용해 객체를 선언하는 것은 '객체 리터럴' -> 주로 이 방법을 사용한다!
리터럴과 프로퍼티
- 중괄호 안에는 ‘키: 값’ 쌍으로 구성된 프로퍼티가 들어간다.
let user = { // 객체
name: "Jhon", // 키: name, 값: Jhon
age: 30 // 키: age, 값: 30
};
'콜론(:)'
을 기준으로 왼쪽엔 key, 오른쪽엔 value가 위치- 현재 user라는 객체에는 2개의 프로퍼티가 있는 것이다.
프로퍼티 읽기/추가/삭제
// 프로퍼티 값 얻기
alert( user.name ); // John
alert( user.age ); // 30
// 프로퍼티 추가
user.isAdmin = true; // 프로퍼티 값엔 모든 자료형이 올 수 있다.
// 프로퍼티 삭제
delete user.age; // delete 연산자를 사용하여 삭제
여러 단어를 조합해 프로퍼티 이름을 만든 경우에는 프로퍼티 이름을 따옴표로 묶어줘야 한다.
let user = {
name: "John",
age: 30,
"likes birds": true // 복수의 단어는 따옴표로 묶어야 합니다.
};
마지막 프로퍼티 끝은 쉼표로 끝날 수 있다.
let user = {
name: "John",
age: 30,
}
- 이런 쉼표를 ‘trailing(길게 늘어지는)’ 혹은 ‘hanging(매달리는)’ 쉼표라고 부른다.
- 이렇게 하면 추가, 삭제, 이동하는 게 쉬워진다.
⚠️ 주의 :: 상수 객체는 수정될 수 있다.
const
로 선언된 객체는 수정될 수 있다.
const user = {
name: "John"
};
user.name = "Pete"; // (*)
alert(user.name); // Pete
대괄호 표기법
- '점'은 키가 '유효한 변수 식별자'인 경우에만 사용할 수 있다.
- 즉, 유효한 변수 식별자엔 공백이 없어야 한다.
- 숫자로 시작하지 않아야 하며
$
와_
를 제외한 특수 문자가 없어야 한다. - 키가 유효한 변수 식별자가 아닌 경우엔 점 표기법 대신 '대괄호 표기법(square bracket notation)'을 사용할 수 있다. 이는 키에 어떤 문자열이 있던지 상관없이 동작한다.
let user = {};
// set
user["likes birds"] = true;
// get
alert(user["likes birds"]); // true
// delete
delete user["likes birds"];
- 대괄호 표기법을 사용하면 변수를 키로 사용한 것과 같이 문자열뿐만 아니라 모든 표현식의 평가 결과를 프로퍼티 키로 사용할 수 있다.
let key = "likes birds";// user["likes birds"] = true; 와 같습니다.user[key] = true;
let user = { name: "John", age: 30};let key = prompt("사용자의 어떤 정보를 얻고 싶으신가요?", "name");// 변수로 접근alert( user[key] ); // John (프롬프트 창에 "name"을 입력한 경우)
리터럴이란?
- 리터럴이란, 소스 코드의 고정된 값을 대표하는 용어이다.(위키백과)
- 변수 및 상수에 저장되는 ''값 자체''를 말한다.
- 즉, 변수 선언과 동시에 값을 지정해주는 것을 리터럴 표기법이라고 한다.
계산된 프로퍼티
- 객체를 만들 때 리터럴 안의 프로퍼티 키가 대괄호로 둘러싸여 있는 경우를 말한다.
let fruit = prompt("어떤 과일을 구매하시겠습니까?", "apple");let bag = { [fruit]: 5, // 변수 fruit에서 프로퍼티 이름을 동적으로 받아 옵니다.};alert( bag.apple ); // fruit에 "apple"이 할당되었다면, 5가 출력됩니다.
[fruit]
는 프로퍼티 이름을 변수fruit
에서 가져오겠다는 것을 의미- 사용자가 apple를 입력하면 bag에는 {apple: 5}가 할당
개선된 코드
let fruit = prompt("어떤 과일을 구매하시겠습니까?", "apple");let bag = {};// 변수 fruit을 사용해 프로퍼티 이름을 생성해준 것!!bag[fruit] = 5;
정리
- 대괄호 표기법은 프로퍼티 이름과 값의 제약을 없애주기 때문에 점 표기법보다 강력하다
- 그러나 작성하기 번거롭기 때문에 단순한 이름이면 점 표기법을 사용, 복잡한 상황이면 대괄호 표기법으로 사용
단축 프로퍼티
- 실무에선 프로퍼티 값을 기존 변수에서 받아와 사용하는 경우가 종종 있다.
function makeUser(name, age) { return { name: name, age: age, // ...등등 };}let user = makeUser("John", 30);alert(user.name); // John
- 위의 프로퍼티들은 이름과 값이 변수의 이름과 동일하다. 프로퍼티 값 단축 구문(property value shorthand)을 사용하면 코드를 짧게 줄일 수 있다.
function makeUser(name, age) { return { name, // name: name 과 같음 age, // age: age 와 같음 // ... };}//------------------// 한 객체에서 일반 프로퍼티와 단축 프로퍼티를 함께 사용하는 것도 가능하다.let user = { name, // name: name age: 30};
프로퍼티 이름의 제약사항
- 변수와 달리 객체 프로퍼티에는 예약어 사용 등에 제한 제약이 없다.
- 문자형이나 심볼형에 속하지 않은 값은 문자열로 자동 형 변환된다.
- 만약 키에
0
을 넣으면 문자열"0"
으로 자동 변환된다.
let obj = { 0: "test" // "0": "test"와 동일합니다.};// 숫자 0은 문자열 "0"으로 변환되기 때문에 두 얼럿 창은 같은 프로퍼티에 접근합니다,alert( obj["0"] ); // testalert( obj[0] ); // test (동일한 프로퍼티)
특별대우 받는 __proto__
let obh = {};obj.__proto__ = 5 // 숫자 할당alert(obj.__proto__); // [object Object] - 숫자를 할당했지만 값은 객체가 되었습니다. 의도한대로 동작하지 않네요. 무시됨
‘in’ 연산자로 프로퍼티 존재 여부 확인하기
- 자바스크립트 객체의 중요한 특징 중 하나는 존재하지 않는 프로퍼티에 접근하려 해도 에러가 발생되지 않고
undefined
를 반환한다는 것이다.
let uset = {};alert( user.noSuchProperty === undefined ); // true는 '프로퍼티가 존재하지 않음'을 의미합니다.
in
을 사용하여 프로퍼티 존재 여부를 확인할 수 있다.in
왼쪽엔 반드시 프로퍼티 이름!, 이름은 따옴표로 감싸기
let user = { name: "John", age: 30 };alert( "age" in user ); // user.age가 존재하므로 true가 출력됩니다.alert( "blabla" in user ); // user.blabla는 존재하지 않기 때문에 false가 출력됩니다
‘for…in’ 반복문
for...in
반복문을 사용하면 객체의 모든 키를 순회할 수 있다.- for(;;) 반복문과는 다르다.
기본 문법
for(key in object) { // 각 프로퍼티 키(key)를 이용하여 본문(body)을 실행합니다.}
let user = { name: "John", age: 30, isAdmin: true};for (let key in user) { // 키 alert( key ); // name, age, isAdmin // 키에 해당하는 값 alert( user[key] ); // John, 30, true}// 결과 순서 : name - John - age - 30 - isAdmintrue - true
객체 정렬 방식
- 객체는 '특별한 방식'으로 정렬된다.
정수 프로퍼티
로 자동 정렬되고 그 외의 프로퍼티는 객체에 추가한 순서 그대로 정렬된다.- 정수 프로퍼티’라는 용어는 변형 없이 정수에서 왔다 갔다 할 수 있는 문자열을 의미한다.
let codes = { "+49": "독일", "+41": "스위스", "+44": "영국", // .., "+1": "미국"};for (let code in codes) { alert( +code ); // 49, 41, 44, 1}// 나라 번호가 정수로 취급되지 않도록 속임수를 쓰면 입력된 순서대로 정렬된다.
📌 참고
반응형
'프로그래밍 > JavaScript' 카테고리의 다른 글
[자바스크립트] 메서드와 this (0) | 2021.07.04 |
---|---|
[자바스크립트] 참조에 의한 객체 복사, 객체 복사 Object.assign (0) | 2021.07.04 |
[자바스크립트] 화살표 함수 기본 (0) | 2021.06.29 |
[자바스크립트] 함수 표현식 (0) | 2021.06.29 |
[자바스크립트] 함수 (0) | 2021.06.29 |
댓글
이 글 공유하기
다른 글
-
[자바스크립트] 메서드와 this
[자바스크립트] 메서드와 this
2021.07.04 -
[자바스크립트] 참조에 의한 객체 복사, 객체 복사 Object.assign
[자바스크립트] 참조에 의한 객체 복사, 객체 복사 Object.assign
2021.07.04 -
[자바스크립트] 화살표 함수 기본
[자바스크립트] 화살표 함수 기본
2021.06.29 -
[자바스크립트] 함수 표현식
[자바스크립트] 함수 표현식
2021.06.29