JavaScript

데이터 타입

원시 데이터 타입

이제 데이터 타입에 대해서 조금 더 심도 있는 이야기를 할 수 있게 되었다. 데이터 타입이란 데이터의 형태를 의미한다. 데이터 타입은 크게 두가지로 구분할 수 있다. 객체와 객체가 아닌 것. 그럼 객체가 아닌 것은 무엇일까?

  • 숫자
  • 문자열
  • 불리언(true/false)
  • null
  • undefined

객체가 아닌 데이터 타입을 원시 데이터 타입(primitive type)이라고 한다. 그 외의 모든 데이터 타입들은 객체다. 

레퍼 객체

아래 코드를 보자.

var str = 'coding';
console.log(str.length);        // 6
console.log(str.charAt(0));     // "C"

문자열은 분명히 프로퍼티와 메소드가 있다. 그렇다면 객체다. 그런데 왜 문자열이 객체가 아니라고 할까? 그것은 내부적으로 문자열이 원시 데이터 타입이고 문자열과 관련된 어떤 작업을 하려고 할 때 자바스크립트는 임시로 문자열 객체를 만들고 사용이 끝나면 제거하기 때문이다. 이러한 처리는 내부적으로 일어난다. 그렇기 때문에 몰라도 된다. 하지만 원시 데이터 타입과 객체는 좀 다른 동작 방법을 가지고 있기 때문에 이들을 분별하는 것은 결국엔 필요하다.

var str = 'coding';
str.prop = 'everybody';
console.log(str.prop);      // undefined

str.prop를 하는 순간에 자바스크립트 내부적으로 String 객체가 만들어진다. prop 프로퍼티는 이 객체에 저장되고 이 객체는 곧 제거 된다. 그렇기 때문에 prop라는 속성이 저장된 객체는 존재하지 않게된다. 이러한 특징은 일반적인 객체의 동작 방법과는 다르다. 

하지만 문자열과 관련해서 필요한 기능성을 객체지향적으로 제공해야 하는 필요 또한 있기 때문에 원시 데이터 형을 객체처럼 다룰 수 있도록 하기 위한 객체를 자바스크립트는 제공하고 있는데 그것이 레퍼객체(wrapper object)다.

레퍼객체로는 String, Number, Boolean이 있다. null과 undefined는 레퍼 객체가 존재하지 않는다.

댓글

댓글 본문
작성자
비밀번호
  1. 완료!
    완료! 감사합니다~
  2. 취준생1
    자바에서 레퍼클래스와 비슷한 개념이군요 자동으로 만들어준다는게 특이합니다
  3. yihsang
    "문자열은 문자열과 관련된 메소드등을 호출할 때 임시로 객체를 만들어준다"
    감사합니다.
  4. 이주환
    2016.04.26
    잘보고 갑니다.
  5. JustStudy
    고맙습니다
  6. terminater
    언어를 공부하는데는 애로가 있으나 실제 코딩에서의 편리함이 있겠군요?!
    대화보기
    • Soori
      저는 잘은 모르지만.. 자바스크립트 말고 다른 언어를 공부하다 보면 실제 String의 경우 charator('A', 'B' 등의 문자)와 integer(숫자)들과는 다르게 객체로 정의하기도 해요. 그게 정석이구요. 근데 코딩을 하다 보면 엄청 귀찮을 때가 많아요... 그래서 '그냥 다 같이 원시로 정의하면 안 되는 거야?'라고 불평해요. 그래서 저는 자바스크립트에서 var선언과 string과 char를 구분하지 않는게 너무나 편하게 느껴져요. 실제 파이썬 같은 후에 나온 프로그래밍 언어들을 보면 char 선언이 없어지고 죄다 string 취급을 하고 실제 string을 살펴보면 array나 다를 바 없는 걸 알 수 있어요. 그게 편하기도 하구요.. 저는 프로그래밍 언어의 진화된 경향성이라고 생각을 해요. 그게 더 편하니깐... 내부적으로는 처리할게 많지만...
      대화보기
      • 쩡아에요
        좋은 강좌 정말 감사합니다. 자바스크립트를 이해하는데 많은 도움이 됐어요 ㅎ
        강좌를 보다 궁금한점이 생겼는데요. 원시 데이터로 변수를 만들어서 자주 객체 함수를 사용 한다면,
        객체가 만들어졌다 없어졌다를 반복 하게 되서 성능에 문제가 생길수도 있는건가요 ??

        예를 들어
        var name = 'opentutorials';
        name.length; name.charAt(0); ...........
        이런식으로 계속 해서 String 객체의 함수를 사용하게 된다면

        var name = new String('opentutorials');
        이렇게 객체로 아예 생성해서 사용하는게 효율적인건가 궁금해요.
      • 샤핀
        자바 강좌 어딘가에도 object access operator에 대한 언급이나 강의가 있었으면 좋겠네요.
        저같은 경우는 이고잉님이 말씀하시는 개발자 성향 중에 모르는 것이 생기면 쉽게 넘어가지 못하는 타입이었는데, System.out.println(); 여기서( . )<--이 뭘까 라는 의문을 넘기지 못해서 한참 고생했던 기억이 있는지라.

        c언어 책이나 c++을 대부분 하고 왔다고 여겨서인지 c++을 배울 때도 당연하게 그냥 쩜( . ) 연산자를 사용하면서 언급이 없어서 저건 뭔데 어느순간부터 그냥 쓰지란 생각이 들때가 있었거든요 ^^;;
      • 나무마루
        좋은 답변 감사드립니다.
        대화보기
        • egoing
          문자열이 객체는 아니지만 문자열을 객체처럼 사용할 수 있게 하기 위해서 문자열과 관련된 메소드등을 호출할 때 임시로 객체를 만들어준다는 의미입니다. 결론적으로 문자열은 객체라고 이해하시면 됩니다. 내부 구현을 속속들이 알아야 하는 것은 아니죠.
          대화보기
          • 나무마루
            ㅋㅋ 아뇨. 이고잉님이 잘못 하셨을리가... 제가 실수 한거일 것 같은데.... 위에 본문에 보시면

            문자열은 분명히 프로퍼티와 메소드가 있다. 그렇다면 객체다. 그런데 왜 문자열이 객체가 아니라고 할까? 그것은 내부적으로 문자열이 원시 데이터 타입이고 문자열과 관련된 어떤 작업을 하려고 할 때 자바스크립트는 임시로 문자열 객체를 만들고 사용이 끝나면 제거하기 때문이다. 이러한 처리는 내부적으로 일어난다. 그렇기 때문에 몰라도 된다. 하지만 원시 데이터 타입과 객체는 좀 다른 동작 방법을 가지고 있기 때문에 이들을 분별하는 것은 결국엔 필요하다.

            이렇게 쓰셨는데요. 왜 문자열이 객체가 아니라고할까 이렇게 쓰셨잖아요. ㅎㅎ 그래서 묻는 겁니다.
            대화보기
            • egoing
              음. 제가 수업에서 잘못 언급한게 있나요?
              대화보기
              • 나무마루
                위에서는 아니라고 하셨잖아요. 객체가 아니라고 레퍼 객체로 만들 때만 잠시 객체가 되는 거 아닙니까?
                대화보기
                • egoing
                  문자열도 객체거든요.
                  대화보기
                  • 나무마루
                    문자열에 어떻게 프로퍼티와 메소드가 있죠???
                  버전 관리
                  egoing
                  현재 버전
                  선택 버전
                  graphittie 자세히 보기