자바스크립트의 거의 모든 문법에 녹아 있는 개념⭐
중괄호 안에는 여러가지 다양한 값들을 쉼표로 구분해서 저장. 각 값들을 좀 더 명확하게 하기 위해 콜론(:)과 함께 이름을 붙여줘야 한다.
❗Property Name은 문자열 타입(String)을 가지고 있다. (따옴표를 써줘야 하지만 자바스크립트가 암묵적으로 문자열로 형변환을 해서 따옴표 생략)
❗❗Property Name 주의사항❗❗
1. 첫 번째 글자는 반드시 문자,밑줄(_),달러 기호($) 중 하나로 시작
2. 띄어쓰기 금지
3. 하이픈(-) 금지
이외의 경우에는 무조건 따옴표("",'') 붙여줘야 함
반면에 Property value는 모든 자료형 값을 사용할 수 있다.
문자열,숫자,불린,null도 property 값이 될 수 있고 심지어 객체안에 객체를 넣을 수도 있다.
📢typeof 연산자를 통해 이 객체를 출력해보자.
(typeof : 피연산자의 자료형을 문자열로 리턴해주는 연산자)
console.log(typeof{ brandName: '코드잇', bornYear:2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }); //실행해보면 이 값의 자료형이 Object, 객체라는 걸 확인할 수 있다.
📢1. 점 표기법(objectName.propertyName)
let codeit = { brandName: '코드잇', bornYear:2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit.bornYear); //2017 출력
그러나 점 표기법을 사용하면 따옴표를 생략할 수 없는 프로퍼티 네임으로는 접근이 불가함.
예를들어서 bornYear도 born year로 표기하면 따옴표로 감싸줘야하는데 이 상태에서 점 표기법으로 접근하려고 하면 서로 다른 문장으로 해석하기 때문에 접근할 수 없음. 이럴때엔 대괄호 표기법을 사용한다.(codeit.born year -> 해석불가❌)
📢2.대괄호 표기법(objectName['propertyName'])
객체 이름 다음에 대괄호 열고 그 안에 프로퍼티 네임을 문자열로 작성해 주는 방식.
띄어쓰기나 숫자로 시작하는 프로퍼티에 접근이 가능, 프로퍼티 네임을 문자열로 만들 수 있는 어떤 방법이든 사용할 수 있다
let codeit = { brandName: '코드잇', 'born Year':2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit['born' +' Year'])-->띄어쓰기 있어도 가능 //2017
📢변수를 추가해서 출력해보기
let codeit = { brandName: '코드잇', 'born Year':2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; let propertyName = 'brandName'; //이렇게 변수에 담긴 값도 활용가능. console.log(codeit[propertyName]) //'코드잇' 출력
Q. 객체안의 객체는 어떻게 접근해야 할까?
A. 프로퍼티네임을 계속 연결해서 접근한다.
let codeit = { brandName: '코드잇', 'born Year':2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit.bestCourse['title']); //"자바스크립트 프로그래밍기초" 출력 만약에 프로퍼티 네임이 점표기법으로 접근이 불가하면 대괄호표기법으로 접근하면 된다.
Q. 만약 존재하지 않는 프로퍼티에 접근하려고 하면 어떻게 될까?
let codeit = { brandName: '코드잇', 'born Year':2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit.bestCourse['teacher']);-->존재하지 않음 //undefined 출력
📢객체(Object)의 프로퍼티를 수정하거나 삭제하기
let codeit = { name: '코드잇', bornYear: 2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit.name); codeit.name = 'Codeit'; //프로퍼티 수정 console.log(codeit.name); //"코드잇" "Codeit"
📢존재하지않는 프로퍼티에 새로운 값 할당하고 프로퍼티 추가해보기
let codeit = { name: '코드잇', bornYear: 2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit.ceo); codeit.ceo = '강영훈'; console.log(codeit.ceo); //undefined //강영훈(개발자도구에서 추가된거 확인 가능)
📢객체의 프로퍼티 삭제하기(delete)
let codeit = { name: '코드잇', bornYear: 2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit.worstCourse); delete codeit.worstCourse; //-->프로퍼티 삭제 console.log(codeit.worstCourse); //null //undefined (개발자도구에서 없어진거 확인 가능)
프로퍼티값과 undefined를 불일치 비교를 해서 객체의 프로퍼티 존재 여부를 확인할 수 있다.
undefined는 존재하지 않는 연산자.
프로퍼티네임을 문자열로 작성한 다음 in이라는 키워드 써주고 그 다음 확인할 객체를 작성.
그리고 객체안에 이런 이름을 가진 프로퍼티가 있는지 확인해서 불린값으로 리턴
let codeit = { name: '코드잇', bornYear:2017, isVeryNice: true, worstCourse: null, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit.name !== undefined); //일치하지 않음. true console.log('name' in codeit); //프로퍼티 있음.true
✍️in연산자 쓰는 이유? 일단은 짧아서 이해하기 쉽고 프로퍼티를 확인할때 안전하게 하기 위함.
실수로 worstCourse에 undefined 값을 할당했다고 가정해보자. 이렇게되면 사실 worstCourse가 프로퍼티로 존재하고 있지만 undefined와 비교했을때는 false가 출력된다.
let codeit = { name: '코드잇', bornYear:2017, isVeryNice: true, worstCourse: undefined, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; console.log(codeit.worstCourse !== undefined); //'propertyName' in Object console.log('worstCourse' in codeit) //false //true
✍️in연산자는 불린값으로 리턴하니까 if문에서 조건부분에 활용하기도 좋다. if문 추가한 예시를 보자.
let codeit = { name: '코드잇', bornYear:2017, isVeryNice: true, worstCourse: undefined, bestCourse: { title: '자바스크립트 프로그래밍기초', language: 'JavaScript' } }; if ('name' in codeit) { console.log(`name 값은 ${codeit.name}입니다.`); } else { console.log(`name 프로퍼티는 존재하지 않습니다.`); } //name 값은 코드잇입니다.
✍️메소드(Method)
객체의 프로퍼티는 어떤 자료형이든 저장할 수가 있기 때문에 프로퍼티 값으로 함수를 넣어주면 됨.
이런 함수를 객체의 메소드라고 부른다.
let greetings = { //그리팅스라는 객체에 세가지 함수가 정의된 것. sayHello: function () { //-->함수이름 없는데 함수이름은 프로퍼티 네임이 대신해줌 console.log('Hello!'); }, sayHi: function() { console.log('Hi!'); }, sayBye: function() { console.log('Bye!'); } }; greetings.sayHello(); //Hello 출력
✍️파라미터 필요한 경우
let greetings = { sayHello: function(name) { //(1)소괄호 안에 파라미터(name) 작성 console.log(`Hello ${name}!`); }, sayHi: function() { console.log('Hi!'); }, sayBye: function() { console.log('Bye!'); } }; greetings.sayHello('Codeit'); //(2)메소드를 호출할 때 파라미터로 값을 전달 //Hello Codeit! 출력
메소드는 console.log와 모양이 똑같음. 함수라고 부르면서 사용했던 console.log도
콘솔이라는 객체의 log 메소드인것.
메소드를 사용할땐 일반적으로 점표기법을 많이 사용하지만 대괄호 표기법을 사용해도
문제없이 동작은 한다.
let greetings = { sayHello: function(name) { console.log(`Hello ${name}!`); }, sayHi: function() { console.log('Hi!'); }, sayBye: function() { console.log('Bye!'); } }; greetings['sayHello']('Codeit'); //-->대괄호 표기법 //Hello Codeit 출력
😲😲😲
//사각형과 삼각형의 넓이(getArea) 구하는 함수 너비와 높이 가지지만 넓이를 구하는 방법이 다름. 똑같은 넓이를 구하는 getArea 함수지만 어떤 객체의 메소드인지에 따라서 그 객체에 맞는 동작을 할 때 메소드를 사용함. 만약 일반적인 함수를 정의해야 했다면 함수 이름이 중복되지 않도록(getArea 두개 못씀) 신경써서 두 함수를 정의하기도 하고 아니면 하나의 함수를 만든다고 하더라도 상황에 따라 다르게끔 함수 내부를 복잡하게 고민해야함. 메소드를 사용하면 다른 함수의 이름 중복을 피할 수도 있고 좀 더 이 객체에 집중해서 함수의 동작부분을 작성할 수 있음.
let rectAngle = { width: 30, height: 50, getArea: function () { return rectAngle.width * rectAngle.height; //-->객체에 맞는 메소드를 사용 } } let triAngle = { width: 15, height: 40, getArea: function () { return triAngle.width * triAngle.height / 2;//-->객체에 맞는 메소드를 사용 } }