본문 바로가기
Web/JavaScript

12. 원시값, 객체값

by 사라리24 2024. 4. 18.
SMALL

1. JavaScript에서 데이터를 나타내는 2가지 방법

JavaScript에서 데이터를 나타내는 두 가지 주요 유형이 있습니다.
바로 '기본 타입'과 '객체'입니다.  각각의 특징과 차이를 살펴보겠습니다.

 

  1. 기본 타입(Primitive Types):
    • 문자열(string), 숫자(number), 부울(boolean), 심볼(symbol), undefined, null이 있습니다.
    • 이러한 값들은 메모리 상에 고정된 크기로 저장되며, 불변(immutable)합니다. 즉, 한 번 생성되면 변경할 수 없습니다.
    • 프로퍼티나 메서드를 가질 수 없습니다. 즉, 메서드를 호출하거나 프로퍼티에 접근할 수 없습니다.
  2. 객체(Object):
    • 객체는 여러 속성(property)을 가질 수 있으며, 이러한 속성은 키와 값의 쌍으로 이루어집니다.
    • 객체는 프로퍼티와 메서드를 가질 수 있습니다. 즉, 객체는 동적(dynamic)으로 프로퍼티와 메서드를 추가, 수정, 삭제할 수 있습니다.
    • 객체는 참조(reference)로 저장되며, 이는 변수에 할당될 때 변수는 실제 객체를 가리키는 주소를 저장하게 됩니다.

 

  1. 원시값(Primitive Value):
    • 원시값은 데이터의 가장 기본적인 형태를 나타냅니다.
    • JavaScript에서는 문자열(String), 숫자(Number), 부울(Boolean), 심볼(Symbol), undefined, null이 원시값에 해당합니다.
    • 원시값은 불변(immutable)하며, 한 번 생성되면 변경할 수 없습니다. 즉, 값 자체가 변경되지 않습니다.
    • 값에 의한 복사(pass by value)가 발생합니다. 이는 변수나 함수에 전달될 때 해당 값을 복사하여 전달합니다.
  2. 객체값(Object Value):
    • 객체값은 여러 속성(property)을 포함하는 복합적인 데이터 구조를 나타냅니다.
    • 객체는 키와 값의 쌍으로 이루어진 속성들의 모음이며, 이를 통해 복잡한 데이터를 표현할 수 있습니다.
    • JavaScript에서 객체는 중괄호({})로 정의되며, 객체의 속성은 점(.)이나 대괄호([]) 표기법을 사용하여 접근할 수 있습니다.
    • 참조에 의한 복사(pass by reference)가 발생합니다. 이는 변수나 함수에 전달될 때 객체의 메모리 주소가 전달되어, 해당 객체를 직접 변경할 수 있습니다.
간단히 말해, 원시값은 단순한 값이며 변경되지 않는 반면,
객체값은 복합적인 데이터 구조를 갖고 있고 직접 변경될 수 있습니다.
이러한 차이로 인해 원시값은 값에 의한 복사가 일어나고, 객체값은 참조에 의한 복사가 일어납니다.

 

 

2. 기본 타입( Primitive Type )

 

 

  • 래퍼 객체(Wrapper Objects):
    JavaScript에서 기본 타입에는 해당하는 래퍼 객체가 있습니다.
    이 래퍼 객체들은 해당 기본 타입의 값에 접근하여 프로퍼티나 메서드를 사용할 수 있도록 합니다.
    예를 들어, 문자열의 경우 String 객체가 그 역할을 합니다.
     

          const str1 = 'apple';   // 기본 타입인 문자열
          const str2 = new String('apple');  // 문자열을 감싼 래퍼 객체

           console.log(typeof str1);   // 출력: "string"
           console.log(typeof str2);   // 출력: "object"


           console.log(str1.length); // 출력: 5
           console.log(str2.length); // 출력: 5

하지만 주로 기본 타입을 래퍼 객체로 변환하는 것은 권장되지 않습니다.
왜냐하면 이는 불필요한 오버헤드를 초래하고 코드를 복잡하게 만들 수 있기 때문입니다.
따라서 보통은 기본 타입을 그대로 사용하는 것이 더 효율적입니다.

 

  • 래퍼 객체 예시:
    • string -> String
    • number -> Number
    • bigint -> BigInt
    • boolen -> Boolean
    • symbol -> Symbol

 

 

3. 원시값과 객체값 비교

 

 

  • 원시값

     
      <body>

         <h2> 원시값 </h2>



                <script> 
 
   
                    // 원시값: 값에 의한 복사 발생

                    function display(num){
                        num = 10
                        console.log(num)
                    }

                    const value = 5;
                    display(value);   //10
                    console.log(value);   //5
 
            </script>     

        </body>




 

 

 

  • 객체값
    

                <script>   

                     // 객체값: 참조에 의한 복사 발생(메모리 주소)
                    function displayObj(obj){
                        obj.age = 14
                        console.log(obj)
                    }

                    const Rucy = {name: '루시'age: 10};
                    displayObj(Rucy); //  {name: '루시', age: 14}
                    console.log(Rucy); //  {name: '루시', age: 14}
 
 
            </script>     

     
 
 

 

  • 새로운 객체를 생성하여 값을 변경
    ( 객체의 값을 직접 변경하는 것은 좋지 않은 알고리즘 )

     
                <script>   
  
                     function changAge(obj){
                         return {...objage: 14}
                     }
                    // {...obj}: obj 객체의 모든 속성을 새로운 객체에 복사합니다
                     // age:14  : 새로운 객체에 age 속성을 추가하고 값을 14로 설정합니다. 


                    const Rucy={name:'루시', age:10};
 
                    Ppomi=changeAge(Rucy);
                    console.log(Ppomi);
                    // {name:'루시', age: 14} 

 
            </script>     

 


     return { ..[복사야할 object], [변환값 입력]}
 

 

 

4. 동등 연산자(===)로 비교

- 기본 타입으로 생성된 변수와 new 키워드를 사용하여 명시적으로 생성된 .wrapper 객체는 서로 타입이 다름

 



         'JavaScript' === 'JavaScript' // true

         'JavaScript' === new String('JavaScript') // false

          let num1=10;

          let num2=new Number(10);
          num1===num2 // false


 

 

'Web > JavaScript' 카테고리의 다른 글

11. 이벤트(Event)  (0) 2024.04.18
10. 정규표현식(Regular Expression: Regex)  (0) 2024.04.16
09. 문서객체모델, 노드(Node)  (0) 2024.04.16
08. 내장객체  (0) 2024.04.16
07. 객체(Object)  (0) 2024.04.16