lessons 10. 객체

2023. 2. 5. 19:42·프로그래밍/js

2023.02.05

자바스크립트 스터디 3회차

공부 사이트: https://poiemaweb.com/

 

10. 객체

1) 객체(Object)

- 원시 타입을 제외한 나머지 값들(함수, 배열, 정규표현식 등..)은 모두 객체

- 키(key)와 값(value)으로 구성된 프로퍼티(property)의 집합

- 객체 = 데이터를 의미하는 프로퍼티 + 데이터를 참조하고 조작할 수 있는 동작을 의미하는 메소드

- 상속을 구현하기 위해 프로토타입이라고 부르는 객체의 프로퍼티와 메소드를 상속받을 수 있다.

 

① 프로퍼티

- 프로퍼티 키와 프로퍼티 값으로 구성

- 프로퍼티 키로 유일하게 식별 가능

- 프로퍼티 키에 문자열/Symbol 값 이외의 값을 지정하면 암시적 형변환되어 문자열이 된다.

- 프로퍼티 키 중복 선언 시 나중에 선언한 프로퍼티가 덮어쓴다.

 

② 메소드

- 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메소드라고 부른다.

 

 

 

2) 객체 생성 방법

- 자바스크립트는 프로토타입 기반 객체 지향 언어로서, 클래스 개념이 없고 별도의 객체 생성 방법이 존재

- ES6부터 클래스 도입.

 

① 객체 리터럴

- 가장 일반적인 자바스크립트 객체 생성 방식

- 중괄호 사용하여 객체 생성

// 빈 객체 생성
var Obj1 = {};

var Obj2 = {
	name: "홍길동",
	age: "12",
	sayHello: function(){
		console.log('hello. my name is ' + this.name);
	}
};

Obj1.sayHello();   //메소드 사용

 

② Object 생성자 함수

- new 연산자와 Object 생성자 함수를 호출하면 빈 객체 생성 가능

- 빈 객체 생성 이후 프로퍼티/메소드를 추가하여 객체 완성

- 생성자 함수: new 키워드와 함께 객체를 생성하고 초기화하는 함수. 이를 통해 생성된 객체를 인스턴스라고 함.

- 객체가 소유하고 있지 않은 프로퍼티 키에 값 할당 시, 해당 객체에 프로퍼티 추가/값 할당 

- 존재하는 프로퍼티 키에 새로운 값 할당 시 변경

//빈 객체 생성
var Obj = new Object();

Obj.name = "홍길동";
Obj.age = "12";
Obj.sayHello = function() {
     console.log('hello. my name is ' + this.name);
};

Obj.sayHello();

 

객체 리터럴 방식으로 생성된 객체는 빌트인 함수인 Object 생성자 함수로 객체를 생성하는 것을 단순화 시킨 축약 표현이다. 개발자가 일부러 Object 생성자 함수를 사용해서 객체 사용할 일은 없다.

 

 

③ 생성자 함수

- 생성자 함수를 사용하면 객체를 생성하기 위한 템플릿(클래스)처럼 사용하여 프로퍼티가 동일한 객체 여러개를 간단하게 만들 수 있다.

function Person(name,age){
    var married = true;     //private
	this.name = name;       //public
	this.age = age;         //public
	this.sayHello = function(){     //public
		console.log('hello. my name is ' + this.name);
	};
}

var person1 = new Person("홍길동", "12");
var person2 = new Person("황진이", "51");

person1.sayHello();  
person2.sayHello();

- 생성자 함수 이름은 보통 대문자로 시작. (생성자 함수임을 인식하도록)

- this: 생성자 함수가 생성할 인스턴스를 의미

- this에 바인딩되어있는 프로퍼티와 메소드는 public(외부에서 참조 가능)

- 생성자함수 내에 선언된 일반 변수는 private(외부에서 참조 불가능)

 

 

 

3) 객체 프로퍼티 접근

① 프로퍼티 키

- 따옴표 사용

- 자바스크립트에서 사용 가능한 유효한 이름일 경우, 따옴표 생략 가능 (연산자, 예약어 등이 아니면)

 

② 프로퍼티 값

- 객체의 프로퍼티 값에 접근하기 위한 방법은 마침표, 대괄호를 이용할 수 있다.

var person = {
	name: "홍길동",
	age: "12",
	sayHello: function(){
		console.log('hello. my name is ' + this.name);
	}
};

console.log(person.name);
console.log(person[name]);     // 참조 에러. not defined
console.log(person['name']);
console.log(person['address']); // 존재하지 않는 프로퍼티 참조 시 undefined

- 대괄호로 접근하는 경우, 대괄호 내 프로퍼티 이름은 반드시 문자열('')이어야 함.

 

③ 프로퍼티 삭제

- delete 연산자: 객체의 프로퍼티 삭제 가능. 이 떄, 피연산자는 프로퍼티 키

var person = {
	name: "홍길동",
	age: "12",
	sayHello: function(){
		console.log('hello. my name is ' + this.name);
	}
};

console.log(person);
delete person.age;
console.log(person)

 

④ for-in문

- 객체에 포함된 모든 프로퍼티 루프 수행 가능

- 객체의 문자열 키를 순회하기 위한 문법.

var person = {
	name: "홍길동",
	age: "12",
    address: "the street"
};

for(var prop in person){
    console.log(prop + ': ' + person[prop]);
}

console.log('---------------------');

var arr = ['1','2','3','4','5'];
arr.name = 'my array';

for(var idx in arr){
	console.log(idx + ': ' + arr[idx]);
}

객체 대상/배열 대상

그러나 for-in문을 배열 대상으로 사용하는 것은 추천하지 않는다

- 객체의 경우 프로퍼티 순서가 존재하지 않지만, 배열은 순서를 보장하는 데이터 구조이기 때문이다.

- 배열의 요소만 순회하는 것이 아니다.

 

배열 대상으로 사용 시 for-in문 대신 ES6에서 등장한 for-of문을 사용할 것.

var arr = ['1','2','3','4','5'];
arr.name = 'my array';

for(const value of arr){
	console.log(value);
}
console.log('---------');

// entries: 배열의 각 인덱스에 대한 키/값 쌍을 가지는 새로운 배열을 반환
for (const [index, value] of arr.entries()) {
  console.log(index, value);
}

 

 

 

4) 참조에 의한 전달(Pass-by-reference)

- 객체의 모든 연산이 실제 값이 아닌 참조 값으로 처리된다는 의미.

- 원시 타입은 값이 한번 정해지면 변경 불가능하나, 객체 타입은 프로퍼티를 변경/추가/삭제가 가능하므로 변경 가능한 값이다.

- 즉, 프로퍼티는 동적으로 변화할 수 있으므로, 메모리 공간을 얼마나 확보해야할지 예측할 수 없다.

- 런타임 시 메모리 공간을 확보하고, 메모리의 힙 영역에 저장된다.

#런타임: 변수 할당 시점

#힙 영역: 동적 메모리 할당 영역

var person = {
    name : "홍길동",
    age : "12",
    address : "Seoul"
};     //person 변수는 객체 자체를 저장하고 있는 것이 아니라, 객체의 참조값(주소)을 저장

var tmp = person;     //tmp에도 객체의 참조값을 저장하는 것

위 코드에서 tmp와 person 변수는 동일한 참조값을 저장하고 있다. 동일한 객체를 가리키고 있는 것이다.

tmp.name 통해 값 변경 시 당연히 person의 name 값도 변경된다.

 

 

5) 값에 의한 전달(Pass-by-value)

- 값으로 전달. 즉, 값이 복사되어 전달된다.

- 런타임 시 메모리의 스택 영역에 고정된 메모리 영역을 점유하고 저장된다.

#스택 영역: 정적 메모리 할당 영역

var num1 = 1;
var num2 = num1;

위 코드에서 num1의 값이 num2에 복사되어 저장된다. 참조 타입으로 저장되는 것이 아니라 값 자체가 복사되어 저장되는 것이다.

 

 

6) 객체의 분류

내장 객체
(Built-in Object)
- 웹페이지 등을 표현하기 위한 공통 기능 제공. 
- 웹페이지 로드 시 별다른 행위 없이 바로 사용 가능

① Standard Built-in Object
- 표준 내장 객체

② Naive Object
- BOM(Browser Object Model)
- DOM(Document Object Model)
호스트 객체
(Host Object)

- 실행 환경에서 제공하는 객체. 
- 내장 객체(Bulit-in Object)와 Native Object가 구성된 이후에 구성.

 

저작자표시 (새창열림)

'프로그래밍 > js' 카테고리의 다른 글

lessons 12. 함수  (0) 2023.02.07
lessons 11. 객체와 변경불가성(Immutability)  (0) 2023.02.07
lessons 9. 타입 변환과 단축 평가  (1) 2023.02.05
lessons 8. 제어문  (0) 2023.02.03
lessons 7. 연산자  (0) 2023.01.31
'프로그래밍/js' 카테고리의 다른 글
  • lessons 12. 함수
  • lessons 11. 객체와 변경불가성(Immutability)
  • lessons 9. 타입 변환과 단축 평가
  • lessons 8. 제어문
병뚜
병뚜
열정!
  • 병뚜
    열려라 뚜껑
    병뚜
  • 전체
    오늘
    어제
    • all (372)
      • 일상X사랑X돈 (0)
        • 보안이슈 (114)
        • 뜨거운감자 (9)
        • 맛집 (2)
        • 혼잣말 (16)
      • 보안 (87)
        • 웹·모바일 (46)
        • 인프라 (19)
        • 리버싱 (8)
        • Security-Gym (10)
        • 리뷰 (4)
      • 프로그래밍 (66)
        • python (14)
        • java (12)
        • js (40)
      • System (47)
        • OS (14)
        • 침투 (33)
      • Play (20)
        • wargame (20)
      • 기타 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬초보
    혼공파
    리버싱
    파이썬
    보안이슈
    랜섬웨어
    공급망공격
    kisa
    IT뉴스
    혼공단
    프로세스
    윈도우인터널스
    jwt
    it이슈
    windows internals
    혼공학습단
    보안뉴스
    정보보안
    정보보안교육
    혼공
    뉴스요약
    혼자공부하는파이썬
    드림핵리버싱
    자바스크립트 상속
    파이썬입문
    파이썬공부
    정보보호
    악성코드
    커널디버깅
    리버싱초보
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
병뚜
lessons 10. 객체
상단으로

티스토리툴바