(2)

[JavaScript] 객체(Object)

객체(Object) 생성자를 통해 객체를 만들 수 있으며, 객체를 직관적으로 선언하여 사용할 수 있다. Key, Value로 구성된 속성(프로퍼티)들의 집합이다. 자바스크립트의 함수를 프로퍼티에 사용할 수 있으며, 객체 내부에 선언된 함수를 메서드라 한다. 자바스크립트의 객체는 프로퍼티와 그 객체에 관련된 동작(메서드)를 모두 포함할 수 있다. 프로토타입 객체의 프로퍼티와 메서드를 상속받는 것이 가능하다. var obj2 = { prop1: "this", // 프로퍼티 prop2: "is", // 프로퍼티 prop3: "property", // 프로퍼티 hello: function () { // 행동을 정의하는 메서드 console.log("메서드"); } } obj2.hello(); >> 메서드 객체 ..

Object

Object - java.lang 패키지 중 가장 많이 사용되는 클래스(모든 자바 클래스들의 최고 조상 클래스) - 필드를 가지지 않으며 11개의 메서드로 구성 메서드 설명 protected Object clone() 해당 객체의 복사본을 생성 boolean equals(Object obj) 두 객체가 같은지 protected void finalize() 가비지 컬렉터가 객체의 리소스를 정리하기 위해 호출 ClassgetClass() 클래스 타입 반환 int hashCode() 해시 코드 반환 void notify() 대기하고 있는 하나의 스레드를 다시 실행할 때 void notifyAll() 대기하고 있는 하나의 모든 스레드를 다시 실행할 때 String toString() 객체의 정보를 문자열로 반환..

[JavaScript] 객체(Object)

Tech/JS & TS 2023. 1. 12. 23:06
728x90
728x90

객체(Object)


생성자를 통해 객체를 만들 수 있으며, 객체를 직관적으로 선언하여 사용할 수 있다.

Key, Value로 구성된 속성(프로퍼티)들의 집합이다.

자바스크립트의 함수를 프로퍼티에 사용할 수 있으며, 객체 내부에 선언된 함수를 메서드라 한다.

자바스크립트의 객체는 프로퍼티와 그 객체에 관련된 동작(메서드)를 모두 포함할 수 있다.

프로토타입 객체의 프로퍼티와 메서드를 상속받는 것이 가능하다.

var obj2 = {
	prop1: "this",        // 프로퍼티
	prop2: "is",          // 프로퍼티
	prop3: "property",    // 프로퍼티
	hello: function () {  // 행동을 정의하는 메서드
    	console.log("메서드");
	}
}
obj2.hello();
>> 메서드

 

 

 

 

객체 생성


리터럴 표기

var obj2 = {
    prop1: "this"
    prop2: "is",
    prop3: "property",
    hello: function () {
      console.log("메서드");
    }
}

 

 

Object를 이용

 

해당 객체에 프로퍼티가 존재하지 않아도 바로 추가할 수 있다.

let cat = new Object();
    cat.hungryYn = 'Y';
    cat.howl = function(){
        console.log("배고파");
    }
    console.log(cat.hungryYn); // Y
    beomsu.howl();             // 배고파
}

 

 

생성자 이용

function 키워드를 이용해 선언하는 객체 타입이며 일반 생성자 함수의 경우 파라미터(프로퍼티)를 미리 지정

생성자 함수 내 선언된 일반 변수들은 외부참조 불가능 ( = 자바 메서드 내에 선언된 변수)

function cat(name, type) {
        this.name = name;
        this.type = type;
        this.act = function(){
            console.log(name+"가 열심히 밥을 먹고있음");
        }
    }
    let dog = new cat("구찌", "포메");
    let kitty = new cat("키티", "러시안블루");
    
    console.log(dog.name);    // 구찌
    console.log(kitty.type);  // 러시안블루
    dog.act();                // 구찌가 열심히 밥을 먹고있음
}

 

 

 

 

프로토타입


자바스크립트는 프로토타입 기반(prototype-based)의 객체 지향 언어이다.

프로토타입 기반의 객체 지향 언어이기 때문에 상속의 개념이 클래스 기반의 객체 지향 언어와는 다른점이 있다.

자바스크립트에서는 현재 존재하고 있는 객체를 프로토타입으로 사용하여, 해당 객체를 복제하여 재사용하는 것을 상속이라고 한다.

 

자바스크립트의 모든 객체는 프로토타입(prototype)이라는 객체를 가지고 있다.

모든 객체는 그들의 프로토타입으로부터 프로퍼티와 메소드를 상속받는다.

자바스크립트의 모든 객체는 최소한 하나 이상의 다른 객체로부터 상속을 받으며, 이때 상속되는 정보를 제공하는 객체를 프로토타입(prototype)이라고 한다.

var obj = new Object(); // Object.prototype
var arr = new Array();  // Array.prototype
var date = new Date();  // Date.prototype

 

Object.prototype 객체는 어떠한 프로토타입도 가지지 않으며, 아무런 프로퍼티도 상속받지 않는다.

자바스크립트에 내장된 모든 생성자나 사용자 정의 생성자는 Object.prototype을 가진다.

var date = new Date(); // Date.prototype과 Object.prototype을 가진다

 

 

프로토타입 생성

function Dog(color, name, age) {
    this.color = color;       
    this.name = name;           
    this.age = age;            
}
var myDog = new Dog("흰색", "구찌", 5); // 이 객체는 Dog라는 프로토타입을 가짐.

 

MyDog 객체에 프로퍼티 및 메서드 추가

새롭게 추가된 family프로퍼티와 breed() 메소드는 오직 myDog 인스턴스에만 추가됐다.

이미 생성된 다른 Dog 객체나 차후에 생성되는 어떠한 다른 Dog 객체에도 추가되지 않는다.

(...생략...)
myDog.family = "포메라니안";       // 품종에 관한 프로퍼티 추가
myDog.breed = function() {        // 털색을 포함한 품종을 반환해 주는 메서드 추가
    return this.color + " " + this.family;
}
document.write("우리 집 강아지는 " + myDog.breed() + "입니다.");

 

프로토타입에 프로퍼티 및 메소드 추가

생성자 함수에 직접 추가해야만 이후에 생성되는 모든 다른 객체에도 적용할 수 있다.

// 현재 존재하고 있는 Dog 프로토타입에 family 프로퍼티를 추가함.
Dog.prototype.family = "시베리안 허스키";
// 현재 존재하고 있는 Dog 프로토타입에 breed 메소드를 추가함.
Dog.prototype.breed = function() {
    return this.color + " " + this.family;
};

var myDog = new Dog("흰색", "구찌", 5);
var hisDog = new Dog("갈색", "콩이", 3);
 
document.write("우리집 강아지의 품종은 " + myDog.breed() + "이다.");
document.write("친구집 강아지의 품종은 " + hisDog.breed() +  이다.");
document.write("우리집 강아지는 " + myDog.family + "이고, 친구집 강아지도 " + hisDog.family + "이다.");

 

프로퍼티 삭제

// delete 객체이름.프로퍼티이름
delete myDog.age // age 프로퍼티 삭제
직접 생성한 프로토타입은 위와 같이 새로운 프로퍼티나 메소드를 마음껏 추가하거나 삭제할 수 있다.
물론 자바스크립트 표준 객체의 프로토타입도 임의로 수정할 수 있으나, 심각한 오류가 발생할 가능성이 있다.
따라서 자바스크립트 표준 객체의 프로토타입은 수정해서는 안된다.

 

 

 

 

 

객체 프로퍼티 루프(순회)


프로퍼티 루프 수행방법

  • for-in :객체의 모든 열거할 수 있는 프로퍼티 루핑
  • Object.keys() : 해당 객체가 가진 고유 프로퍼티 중에서 열거할 수 있는 프로퍼티 이름을 배열에 담아 반환
  • Object.getOwnPropertNames() : 해당 객체가 가진 고유 프로퍼티 이름을 배열에 담아 반환
 var obj2 = {
    prop1: "this",
    prop2: "is",
    prop3: "property",
    hello: function () {
        console.log("메서드");
    }

    for(var i in obj2){
   	 console.log(i + ":" + obj2[i]);
    }
}

>> prop1:this
>> prop2:is
>> prop3:property
>> hello:function() {
	 console.log("메서드");
   }
function Dog(color, name, age) {
    this.color = color;
    this.name = name;
    this.age = age;
}

// color 프로퍼티의 enumerable 속성을 false로 설정함.
Object.defineProperty(myDog, 'color', {enumerable : false} );
 
// 객체가 가진 고유 프로퍼티 중에서 열거할 수 있는 프로퍼티 이름을 배열에 담아 반환함.
document.write(Object.keys(myDog) + "<br>");       // [name, age]
 
// 객체가 가진 모든 고유 프로퍼티의 이름을 배열에 담아 반환함.
document.write(Object.getOwnPropertyNames(myDog)); // [color, name, age]

 

 

 

참조

http://www.tcpschool.com/javascript/js_object_concept

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

Object

Tech/Java & Spring 2022. 12. 10. 12:03
728x90
728x90

Object


- java.lang 패키지 중 가장 많이 사용되는 클래스(모든 자바 클래스들의 최고 조상 클래스)

- 필드를 가지지 않으며 11개의 메서드로 구성

메서드 설명
protected Object clone() 해당 객체의 복사본을 생성
boolean equals(Object obj) 두 객체가 같은지
protected void finalize() 가비지 컬렉터가 객체의 리소스를 정리하기 위해 호출
Class<T>getClass() 클래스 타입 반환
int hashCode() 해시 코드 반환
void notify() 대기하고 있는 하나의 스레드를 다시 실행할 때
void notifyAll() 대기하고 있는 하나의 모든 스레드를 다시 실행할 때
String toString() 객체의 정보를 문자열로 반환
void wait() 스레드가 notify()나 notifyAll()를 실행할 때까지 현재 스레드를 일시적으로 대기시킬 때
void wait(long timeout) 스레드가 notify()나 notifyAll()를 실행하거나 전달받은 시간이 지날 때까지 일시적으로 대기시킬 때 호출함.
void wait(long timeout, int nanos) 스레드가 notify()나 notifyAll()를 실행하거나 전달받은 시간이 지나거나 다른 스레드가 현재 스레드를 인터럽트(interrupt) 할 때까지 일시적으로 대기시킬 때

Clone

- 데이터의 보호를 이유로 Cloneable 인터페이스를 구현한 클래스의 인스턴스가 사용 가능

- 필드값만을 복사하기 때문에 필드값이 배열이나 인스턴스면 제대로 복제할 수 없다

   → 해당 클래스에서 오버라이딩하여 재정의

class cloneExam implements Cloneable{
	
	@Override
	protected cloneExam clone(){
		Object ob = null;
		try {
			ob = super.clone();
		}catch(CloneNotSupportedException e) {			
		}
		return (cloneExam)ob;
	}
}

equals

- 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교

- 서로 다른 두 객체는 언제나 false

ExamMain car01 = new ExamMain();
ExamMain car02 = new ExamMain();		 

System.out.println(car01.equals(car02));

car01 = car02;
System.out.println(car01.equals(car02));

// Console
false
true

finalize

- 자바 9부터 사용불가능

- 배열이나 객체를 Garbage Collector를 사용해 힙 영역에서 제거

- 사용자가 해당 메서드를 직접 사용하려면 오버라이딩

Garbage Collection(GC)
- 메모리 관리법 중 하나
- 시스템에서 더이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 자동으로 다시 사용 가능한 자원으로 회수
Garbage Collector(JVM에 있음) : 가비지 컬렉션을 수행하는 부분

toString

- 인스턴스에 대한 정보를 문자열로 반환 → (클래스 이름/구분자 '@'/8자리 16진수)의 해시값

728x90
300x250
mag1c

mag1c

2년차 주니어 개발자.

방명록