-
객체에 대해서(생성과 중첩 객체)Front/js 2024. 7. 5. 15:11
▤ 목차
✔프로토 타입 객체
⌨ 프로토 타입
java는 클래스 기반 객체지향 프로그래밍 언어이다.
객체 생성 이전에 클래스를 정의하고 객체를 생성한다.
하지만 javascript는 프로토타입 기반 객체지향 프로그래밍 언어이다.
자바스크립트의 동작 원리를 잘 이해하기 위해서는 프로토타입의 개념을 잘 이해하고 있어야한다.
프로토타입 기반 객체지향 프로그래밍 언어는 클래스 없이 객체를 생성할 수 있다.
자바스크립트의 모든 객체는 자신의 부모 역할을 담당하는 객체와 연결되어 있다.
객체지향의 상속 개념과 같이 부모 객체의 프로퍼티 또는 메서드를 상속받아 사용할 수 있다.
👏 객체 생성 방법
자바스크립드의 객체 생성 방법에는
1. Object 생성자
2. 객체 리터럴
3. 생성자 함수
4. 클래스
이렇게 4개로 나뉜다.
✔ 객체 생성하기
⌨ new 연산자 사용
let obj1 = new Object();
객체를 만들어서 생성해보겠다.
obj1.irum = '신기해'; obj1.nai=23; obj1.juso="강남구 역삼동"; obj1.getJuso= ()=> obj1.juso; //약간의 getter
출력해보자.
console.log(typeof obj1); //object console.log(obj1.toString()); //[object Object] console.log(obj1); //{irum: '신기해', nai: 23, juso: '강남구 역삼동', getJuso: ƒ}
객체가 json 형식으로 저장된다.
💻 literal(data) 사용
let myObj = { irum:'홍길동', nai:33, showNai: function(msg){ return this.nai + msg }, }
literal로 객체를 생성했을때 어떻게 나오는지 확인해보자.
console.log(typeof myObj); //object console.log(myObj.toString());//[object Object] console.log(myObj);//[object Object]
위와 동일하게 들어간다. new를 생성하는 것과 비교해보면, 직접 json처럼 값 : 키를 작성한다.
👏 this
메서드 내부에서 객체 멤버에 접근한다.
this는 바인딩이 객체가 생성되는 시점에 결정된다.
일반 함수 호출시 this가 최상위 객체(global 이나 window)를 가리킨다.
메소드를 호출 시 호출된 객체를 가리킨다.
new 키워드를 사용해서 객체를 생성했을 때는 해당 객체를 가리킨다.
[바인딩]더보기메모리에 값을 할당하는 것
프로그램의 어떤 기본 단위가 가질 수 있는 구성 요소의 구체적인 값, 성격을 확정하는 것을 말한다.
즉, 프로그램의 각종 변수들을 실제 값으로 묶어 확정하는
✏️ 함수 별도 작성 후 객체에 할당 가능
let users={ name :'tom', age:25, }; users.sayHi = ()=>{ console.log('안녕'); } console.log(users); //{name: 'tom', age: 25, sayHi: ƒ} users.sayHi();
위의 코드와 같이 함수를 따로 작성한 다음 함수로 바꿀 수 있다.
🪄생성자 함수를 사용
java에서 생성자와 같이 함수를 선언할 수 있다.
생성자 함수를 선언할 때는 관례가 있는데 함수 이름은 대문자로 표시한다.function Person(name){ this.name = name; this.setName = function(newName){ this.name = newName; }; };
위와 같이 생성자 함수를 사용하면 해당 객체를 호출하면서 값을 계속 받을 수 있다.
이래와 같이 활용할 수 있다.let pp = new Person('사오정'); document.querySelector('#disp5').innerHTML = pp.name; //사오정
아래 코드는 html 파일에 해당값을 뿌려주는 역할을 한다.
Person 객체는 파라미터를 원한다.
let pp2 = new Person(); //let pp2 = new Person; 같은 의미 document.querySelector('#disp6').innerHTML = pp2.name;//undefined
만약 파라미터를 전달하지 않는다면?
당연하지만 undefined 값이 나온다.
[property 단축 구문 shorthand properties ]더보기프로퍼티의 키와 값이 동일할 때 키명만 적어도 된다.
같은 이름의 변수값을 자신의 값으로 사용한다.
function MakeUser(name,age){ return{ //name:name, name, // property 단축 구문 (명이 같은 경우) age, } } let user1 = MakeUser('길동', 22); document.querySelector('#disp9').innerHTML = user1.name + ' '+ user1['age']; user1 = null; //GarbageCollector에 의해 메모리 해제
✔ 중첩 함수
객체 또한 중첩으로 사용할 수 있다.
- 최상위 레벨에만 사용할 수 있다.
- if 또는 while문 등 문장에서 작성할 수 없다.
- 단위 로직을 함수로 만드는 행위는 응집도를 높일 수 있다.
⌨ 형식
let 객체명 = { 키: 값 ... 객체명 { 키 : 값, ... } }
내부에 존재하는 지역적인 변수들이 존재한다면 그 변수들은 함수가 실행될 때만 존재한다.
💻 코드로 보기
let myFriend = { name:'손오공', age:23, otherFriend : { name:'박치기', job:'프로그래머', }, };
let str4 = `${myFriend.name}님의 나이는 ${myFriend.age} 다른 친구는 ${myFriend.otherFriend.name}입니다`; document.querySelector('#disp4').innerHTML = str4;
✔ 클래스
클래스는 Object와 관련이 있다.
객체를 생성하기 위한 템플릿이라고 생각하면된다.
클래스는 OOP에서 특정 객체를 생성하기 위해 멤버를 저으이하는 일종의 설계도(틀)이다.
기존 프로토타입을 기반으로 객체를 생성하는 것보다 조금더 명료하게 작성이 가능하다.
⌨ 형식
class 클래스명{ a = '서울'; //멤버 변수 constructor(){} //생성자 메서드명(){} //메서드 }
- 멤버 변수는 let이나 const 사용이 불가하다.
- 생성자로 멤버 변수를 만든다면 (java와 비교해보면) 상단에 정의하지 않아도 된다.(생략 가능)
- 즉, 생성자에서 각 인스턴스의 멤버 변수로 만들어진다.
💻 코드로 보기
class Class1{ addr = '서울'; //멤버변수(prototype 속성), let, const X name; //생성자로 값을 받을 때는 생략 가능, 가독성을 위해 적어도된다. constructor(name){ //생성자 this.name = name; //각 인스턴스의 멤버 변수로 만들어짐 } sayHi(){ //멤버 메소드 document.write("<br>",this.name); document.write("<br>",this.addr); let msg = "프로그래머"; //지역변수 return "<br> 이름은 " +this.name + " "+ msg; } }
👏 중요
클래스는 자바와 약간 비슷하다.
이런 부분은 js가 java와 닮아간다는 생각을 했다.
https://hi-hahahoho.tistory.com/67
클래스에 대해 더 자세히 정리해둔 글이다.
'Front > js' 카테고리의 다른 글
Ajax( Asynchronous JavaScript and XML / XMLHttpRequest ) (2) 2024.07.09 JavaScript) 모듈이란? (0) 2024.07.08 javaScript 클래스(+ 프로퍼티 getter와 setter / 상속) (0) 2024.07.04 promise 처리 흐름 (콜백지옥, Promise, Async/Await) (2) 2024.07.03 js) 배열 정리 (+ 관련 함수) (0) 2024.07.02