객체에 대하여

Development Javascript

객체에 대하여

  • 객체는 이름이 붙은 값들의 집합이며, 배열은 순서있는 집합이다. 객체는 복합타입이라고 한다.
  • 객체는 이름과 값으로 구성된 프로퍼티들의 집합이라고 할 수 있다. 객체리터럴은 {}속에 이름과 값을 한쌍으로 하는 프로퍼티들을 콤마로 분리하여 연결한 리스트다.
  • new 연산자를 이용하여 다른 형태의 객체를 생성할 수 있다.
// 객체 example
var empty = {}; // 객체 empty는 아무런 프로퍼티를 가지고 있지않은 빈 객체다.
var point  = { x:0, y:1 };
var circle = { x:point.x, y:point.y+1, radius:2 };
var homer = {
  name: 'homer simpson',
  age: 34,
  married: true,
  occupation: 'plant operator',
  email: 'homer@example.com'
};

// new 연산자를 이용한 객체생성
var a = new Array(); // 빈 배열을 생성한다.
var b = new Date(); // 현재 날짜와 시간을 나타내는 객체를 생성한다.
var c = new RegExp("Javascript", "i"); // 패턴매칭을 위한 객체를 생성한다.

객체 프로퍼티

  • 객체 프로퍼티를 접근하기 위해서는 마침표(.)를 사용하여 프로퍼티를 접근한다. 반드시 식별자를 사용해야하고, 문자열이나 표현식은 사용할 수 없다.
    ex) o.p는 객체 o의 프로퍼티 p를 참조하며, circle.radius는 객체 circle의 프로퍼티인 radius를 참조한다.
  • 변수를 선언할때는 var 키워드를 사용하지만 프로퍼티는 사용하지 않고 바로 정의할 수 있는 유연함을 가지고 있다. 그리고 언제든지 새로운 값을 할당할 수 있다.

프로퍼티 열거하기

var objectEX = {oob1:1, oob2:2, oob3:3};
// 객체를 받아서 프로퍼티를 출력한다.
function DisplayPropertyNames(obj) {
  var names = "";
  for (var name in obj) names += name + ', ';
  document.write(names);
}
DisplayPropertyNames(objectEX);
  • for/in 루프를 사용하여 객체의 프로퍼티를 열거하거나 프로퍼티에 대한 작업을 반복화시킬 수 있다.
  • 이 방법은 디버깅할때 자주 사용되며, 어떤 프로퍼티가 있는지 확인해보고 싶을 때 유용하게 사용할 수 있다.

프로퍼티 존재 확인하기

in 연산자를 이용하여 프로퍼티의 존재여부를 확인할 수 있다.

// 객체 o에 프로퍼티 "x"가 있으면 1을 저장한다.
if ("x" in o) o.x = 1;

객체에 없는 프로퍼티에 접근하려하면 undefined값이 반환되기 때문에 in연산자는 자주 사용되지 않는다. 아래와 같은 코드가 일반적으로 쓰인다고 한다.

// 프로퍼티 x가 존재하고 값이 undefined가 아니라면 1을 저장한다.
if (o.x !== undefined) o.x = 1;

//doSomething 프로퍼티가 존재하고 이 값이 null 혹은 undefined가 아니라면 doSomething를 함수로 간주하여 호출한다.
if (o.doSomething) o.doSomething();

프로퍼티 삭제하기

프로퍼티를 삭제하기 위해서는 delete연산자를 사용한다. 객체에서 프로퍼티를 완전히 제거해준다. in연산자로도 찾을 수 없다.

delete book.chapter2;

연관 배열로서의 객체

  • 객체의 프로퍼티에 접근하기 위해서는 마침표(.)를 사용하지만, []를 사용해서 접근해도 된다.
  • 마침표(.)를 이용하여 식별자로 접근하지만, []를 이용하여 프로퍼티 이름을 문자열로 접근한다는 부분에서 차이를 나타낸다.

다음 코드중 두 연산자는 동일하다.

object.property;
object["property"];
  • 자바스크립트는 C나 C++, 자바같이 엄격한 프로그래밍 언어가 아니라서 객체의 프로퍼티 정의에 대한 제약이 없다.
  • []를 사용하면 자바스크립트가 실행되는 동안에도 프로퍼티가 새롭게 생성되고 조작될 수 있다.

다음 코드는 address0, address1, address2... 와같은 프로퍼티를 읽어서 addr변수에 연결한다.

var addr = "";
for (i=0; 4 > i; i++) {
  addr += customer["address" + i] + '\n';
}

공통적으로 나타나는 객체 프로퍼티와 메서드

자바스크립트 모든 객체는 Object 클래스를 상속한다. 그래서 모든 객체는 공통으로 Object에서 상속받은 프로퍼티와 메서드가 있다.

Constructor 프로퍼티

모든 객체를 초기화하는데 사용된다. 예를들어 Date() 생성자를 사용하여 객체 d를 생성했다면, d.constructor프로퍼티는 Date를 가르킨다.

var d = new Date();
d.constructor == Date; // 이 표현식은 true로 평가된다.

Constructor 프로퍼티는 객체의 타입을 판독하는데 사용할 수 있다. 정체를 알 수 없는 타입을 판단하기 위하여 다음과 같이 코드를 작성할 수 있다.

if ((typeof o == "object") && (o.constructor == Date)) {}
if ((typeof o == "object") && (o instanceof Date)) {}

toString() 메서드

toString() 메서드는 호출한 객체의 값을 어떠한 방식으로든 표현하는 문자열을 만들어 결과로 반환한다.

toLocaleString() 메서드

Object 클래스에 의하여 제공되는 toLocaleString()메서드는 반환하는 값은 toString()와 같다. 지역화된 문자열 표현을 제공할 때 사용한다고 한다.

valueOf() 메서드

valueOf()메서드는 객체를 숫자같은 기본타입으로 변환하려할 때 호출된다.

hanOwnProperty() 메서드

문자열 전달인자를 받아서 객체가 이 프로퍼티를 소유하고 있는것인지 검사한다. 상속받은 프로퍼티가 맞으면 true를 반환하고, 그렇지 않다면 false를 반환한다.

var o = {};
o.hasOwnProperty("undef"); // false: 프로퍼티가 정의되지 않았다.
o.hasOwnProperty("toString"); // false: toString은 상속받은 프로퍼티다.
Math.hasOwnProperty("cos"); // true: Math객체에 cos프로퍼티가 있다.

propertyIsEnumerable() 메서드

이 메서드는 프로퍼티 이름을 담은 문자열 전달인자를 하나 받아서, 객체가 상속받지 않고 직접 지역적으로 정의했는지 검사하는 프로퍼티다.

var o = { x:1 };
o.propertyIsEnumerable("x"); // true: 프로퍼티가 존재하고 열거할 수 있다.
o.propertyIsEnumerable("y"); // false: 프로퍼티가 존재하지 않는다.
o.propertyIsEnumerable("valueOf"); // true: valueOf는 상속받은 프로퍼티다.

isPrototypeOf() 메서드

이 메서드는 전달인자로 주어진 객체의 프로토타입 객체라면 true를 반환하고 그렇지 않으면 false를 반환한다.

var o = {};
Object.prototype.isPrototypeOf(o); // true: o.constructor == Object
Object.isPrototypeOf(o); // false
o.isPrototypeOf(Object.prototype); // false
Function.prototype.isPrototypeOf(Object) // true: Object.constuctor == Function