🌈 객체(object)
🔥 객체 기본
🔥 객체 복사
🔥 매서드와 this
1.객체 기본
1) 객체란?
- 객체는 원시형 데이터 타입과과 달리 다양한 데이터를 뿐 아니라, 메서드(함수) 또한 담을 수도 있음
- 이때 객체에 담는 원시형 데이터들은 attribuute(속성)이라하고, 함수를 methods(메서드)라 함
- 객체는 몇가지 특수한 기능을 가진 연관 배열(associative array)임
- 객체 형태 : 🔍 {key1 : "value1", key2 : "value2", key3 : "value3", ... keyN : "valueN"}
- {} 안에는 키(key)와 값(value)쌍으로 구성된 프로퍼티를 여러개 넣을 수 있음
- 키(key)는 문자형, 값(value)에는 모든 자료형을 담을 수 있음
- 키(key)를 다룰 때, 점 표기법 대신 []를 사용할 때가 있는데, 이는 복수의 단어로 이뤄진 키값은 점 표기법으로 다룰 수 없기 때문임
- 키(key) 이름으로 예약어를 사용 가능
- JavaScript 객체 생성 방법
🔍
🔍 객체 리터럴 방식 : JSON, Python에 Dict와 유사
🔍 생성자 함수로 생성하는 방식
const user = new Object();
const user = {};
function User(age, name){
this.age = age;
this.name = name;
}
const info = new User(10, 'Jaewon');
console.log(typeof info);
console.log(info.age, info.name);
User.prototype.message = function(){
return 'Hello';
};
User.prototype.hobby = 'coding'
const info2 = new User(20, 'Jaewon');
console.log(info2.age, info2.name);
console.log(info2.message());
console.log(info2.hobby)
const user = {
name: "John",
age: 30
};
console.log(user)
console.log(user.name)
console.log(user.age)
user.isAdmin = "true";
console.log(user.isAdmin)
delete user.age;
const calcurate = {
name : 'jaewon',
plus : function(a,b){
return a + b;
},
minus : function(a,b){
return a - b;
},
hello : function(){
return 'Hello ' + this.name + '!'
},
bye : function(name){
return 'Bye ' + name + '!'
}
};
console.log(calcurate.name)
console.log(calcurate.plus(2,8))
console.log(calcurate.minus(10,5))
console.log(calcurate.hello())
console.log(calcurate.bye('haezin'))
const userInfo = {
name: "Jaewon",
age: 20,
"favorite fodd": "kimche",
};
console.log(userInfo)
userInfo["soul food"] = pizza
console.log(userInfo["soul food"])
2) getter & setter
- 메서드를 포함해서 전체를 프로퍼티라고 할 때, 일반적인 프로퍼티를 데이터 프로퍼티라 하고 getter와 setter를 접근자 프로퍼티라고 함
- getter는 프로퍼티 값을 접근할 때(읽을 때) 호출되는 메서드
- setter는 프로퍼티 값을 수정할 때(설정 때) 호출되는 메서드
const user = {
age : 10,
name : 'JJ',
get get_age(){
return this.age;
},
set set_age(value){
this.age = value
}
};
console.log(user.get_age);
user.set_age = 33;
console.log(user.get_age);
3) 단축 프로퍼티
- 프로퍼티 값을 기존 변수에서 받아와 사용하는 경우 단축 프로퍼티 사용
function userInfo(name, age, sex){
return {
name : name,
age : age,
sex : sex,
};
}
let user = userInfo("jaewon", 20, "male");
console.log(user.name)
console.log(user.age)
function userInfo(name, age, sex){
return {
name,
age,
sex,
};
}
4) 프로퍼티 존재 여부 확인 방법
- 프로퍼티가 너무 많을 경우, 간단한 방법으로 존재하는지 확인할 수 있음
- 프로퍼티 존재 여부 확인 방법 : 🔍 "key이름" in 객체명
- 존재할 경우 -> true, 존재하지 않을 경우 -> false 반환함
const user = {
name : "jaewon",
age : 20,
location : "seoul"
}
console.log("location" in user)
console.log("sex" in user)
4) 'for ... in' 반복문
- 'for...in' 반복문을 사용하면 객체의 모든 키를 순회할 수 있음.
for(key in object){
}
let user = {
name: "Jaewon",
age: 30,
isAdmin: true,
location : "seoul"
};
for (let key in user) {
console.log( key );
console.log( user[key] );
}
3.객체 복사
1) 객체 복사의 개념
- 객체 복사의 개념 : 메모리가 할당된 위치를 가르키는 참조값(주소)를 복사
- 원시 데이터는 값 그대로 저장,할당,복사되는 반면 오브젝트는 참조값이 복사됨
- 즉, 객체는 값 자체를 복사하는게 아니라 값을 가르키는 메모리 주소(참조값)을 복사함
- 이를 참조 복사 또는 얕은 복사라 함
- 이에 복사된 다른 객체에서 조작(수정 등)을 가하면, 참조에 의해 원본도 함께 변경됨
- 또한 원본과 복사(얕은 복사)된 객체 비교 시, 동등 연산자(==)와 일치 연산자(===)는 동일하게 동작됨
- 다만, 객체는 참조값(메모리가 저장된 주소)을 담고 있기 때문에 똑같은 데이터를 담은 다른 두 객체를 비교하면 일치하지 않음
👉🏻 객체의 데이터들을 비교하는 것이 아니라, 참조값(주소)을 비교하기 때문!
let info = {name : "jaewon", age : 20}
let admin = info
console.log(info)
console.log(admin)
admin.location = "seoul"
console.log(info)
console.log(admin)
let a = {};
let b = a;
console.log(a == b);
console.log(a === b);
let c = {name:"jaewon", age:10}
let d = {name:"jaewon", age:10}
let e = c
console.log(c == d)
console.log(c == e)
2) 깊은 복사
- 깊은 복사 : 객체를 복사하고 싶은데 참조값이 다른 독립된 객체로 복사하고 싶을 때는 사용
- 객체 내에 데이터를 통채로 다른 오브젝트의 값으로 넣는 것이 깊은 복사임
- 즉, 객체 내에 포함된 데이터(key & value)는 동일하지만, 다른 참조값을 가진 복사본을 생성
let originObject = {
name : "jaewon",
age : 20,
location : "seoul",
sex : "male",
ishappy : true
};
let copyObject = {};
for(let key in originObject){
copyObject[key] = originObject[key]
};
console.log(originObject);
console.log(copyObject);
3) 객체 할당(Object.assign)
let user = { name: "John" };
let permissions1 = { canView: true };
let permissions2 = { canEdit: true };
Object.assign(user, permissions1, permissions2);
console.log(user)
Object.assign(user, { name: "Pete" });
let user1 = {
name: "John",
age: 30
};
let user2 = Object.assign({}, user1);
console.log(user2)
4) 중첩 객체 복사
let user = {
name: "John",
sizes: {
height: 182,
width: 50
}
};
let clone = Object.assign({}, user);
alert( user.sizes === clone.sizes );
user.sizes.width++;
alert(clone.sizes.width);
4. 매서드와 this
1) 매서드 만들기
- 객체 안에는 데이터도 들어가지만, 메서드(어떤 기능을 수행하는 함수)도 추가할 수 있음
let user = {
name: "John",
age: 30
};
user.sayHi = function() {
console.log("안녕하세요!");
};
user.sayHi();
console.log(user)
let color = {
value1: "red",
value1: "blue",
value1: "yellow",
};
function colorSay(){
console.log("Hello color")
}
color.colorSay = colorSay;
color.ColorSay();
console.log(color);
user = {
sayHi: function() {
consol.elog("Hello");
}
};
console.log(user.sayHi())
user = {
sayHi() {
console.log("Hello");
}
};
console.log(user.sayHi())
2) 매서드와 'this'
- JavaScript에서 this는 다른 프로그래밍언어의 this와 동작 방식이 다름
- 자바스크립트에서는 모든 함수에 this를 사용 가능
- this는 현재 객체(자신이 속한 객체)를 나타냄.
let user = {
name: "John",
age: 30,
sayHi() {
console.log("Hello, " + this.name);
}
};
console.log(user.sayHi())
let user = { name: "John" };
let admin = { name: "Admin" };
function sayHi() {
console.log( this.name );
}
user.f = sayHi;
admin.f = sayHi;
console.log(user)
console.log(admin)
user.f();
admin.f();
admin['f']();