본문 바로가기
03. 웹 표준 기술/JavaScript

[자바스크립트] 08. 객체

by moca7 2024. 8. 13.

 

 

ㅁ 객체

- 자바스크립트의 데이터 유형 중 하나.

- 중괄호{ }로 생성.

- 각 데이터는 "속성(property): 값(value)"의 형태로 정의한다.     (key-value 세트를 Entry라고 한다)

 

- 후행 쉼표(trailing comma)를 사용할 수 있다.

 

 

 

변수 = {

    속성 : 값,

    속성 : 값,

    속성 : 값,

};

 

 

 

자바의 저것들과 비슷하다



 

 

 

객체 내에 정의되어있는 속성에 접근하는 방법

 

 

(1) 점( . ) 표기법

 

객체.속성

 

 

(2) 대괄호( [ ] ) 표기법

- 그냥 속성 쓰면 안 되고 문자열로 써야 한다.

 

객체['속성']  

 

 

 

 

 

ㅁ 

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
   
    <script>
 

        const person = {
 
            name : '꽃감이',
 
            age : 30,
 
            hobbies : ['춤', '노래'],
 
            home : {    //   person이라는 객체에 home이라는 객체가 또 있다.
                address : 'seoul',
                phone : '02-123-4567'
            },
 
            friends : [   //   각 친구들을 객체로 표현한다.
                {
                    name : '루잼',
                    age : 30
                },
                {
                    name : '망개',
                    age : 30
                }
            ]

        }
        // person 객체는 5개의 속성을 가지고 있다.



        // person 객체 출력
        function fnObjectDefine() {
            console.log(person);
        }



    </script>


    <button onclick="fnObjectDefine();">객체확인</button>




</body>
</html>
 

 

 

 

- 콘솔에 표시되는 중괄호 블럭을 보면 객체라는 걸 알 수 있다.

중괄호 블럭 안에 또 중괄호가 있다. home도 객체라는 걸 알 수 있다.

- person은 5개의 속성이 정의되어 있는 객체 형식이다.

 

 

 

 

 

 

- 콘솔에 출력되는 속성 순서가 내가 작성한 속성 순서와 다를 수 있다.

- home은 객체라 한번 펼치면 나오는데, friends는 배열이라 한번 더 열어야 나온다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

속성명에 따옴표가 있어도 되고 없어도 된다. 그런데 속성명에 공백이나 특수문자를 쓰려면 꼭 따옴표를 써야한다. 

 

 

 

 

 

 

객체를 가지고 반복문 가능은 가능하지만, 인덱스가 없기 때문에 일반적인 for 문은 안 됨.

- for in 문으로 가지고 있는 속성(property)명을 문자열로 임의의 순서로 순차적으로 반환.

- 반환되는 속성명은 string타입이므로 속성값을 확인하기 위해서 대괄호 표기법을 사용해야 된다. (점 표기법 x)

- 조회 목적으로만 사용하는게 좋고, 추가/수정/제거는 하지 않는게 좋음.

 

 

for( 속성받을변수 in 객체 ) {

 

}

 

 


- 객체는 for문, for of 문 불가능하다. for in 문만 가능하다.

(배열은 for, for in, for of 다 가능)

 

 

 

 

 

 

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
   
    <script>

        const person = {
            name : '꽃감이',
            age : 30,
            hobbies : ['춤', '노래'],
            home : {    //   person이라는 객체에 home이라는 객체가 또 있다.
                address : 'seoul',
                phone : '02-123-4567'
            },
            friends : [   //   각 친구들을 객체로 표현한다.
                {
                    name : '루잼',
                    age : 30
                },
                {
                    name : '망개',
                    age : 30
                }
            ]

        }
        // person 객체는 5개의 속성을 가지고 있다.


       


        function fnForObject() {

            for(let prop in person) {   //   'name', 'age', 'hobbies', 'friends', 'home' (순서는 내가 작성한 순서와 다를 수 있다.)
               
                console.log(prop, person.prop);
   
            }

        }




    </script>


    <button onclick="fnForObject();">for in 문</button>



</body>
</html>
 

 

 

 

- 속성값이 제대로 안 보임.

prop에 들어온 것은 문자열이여서 대괄호를 써야함. 

person.prop하면 person객체의 prop 속성이 있는지를 찾음.

 

 

 

 
        function fnForObject() {

            for(let prop in person) {   //   'name', 'age', 'hobbies', 'friends', 'home' (순서는 내가 작성한 순서와 다를 수 있다.)
               
                console.log(prop, person[prop]);
   
            }

        }
 

 

 

 

 

 

 

 

 

ㅁ 객체 속성(property)

- 처음에 속성을 가진 상태로 객체를 만들고, 그 이후에 속성을 추가할 수도 있다.

이걸 동적으로 property를 생성한다고 얘기한다. 

- 기존에 있는 속성을 제거할 수도 있다.

delete 연산자를 이용해서 동적으로 프로퍼티 삭제 가능 .

 

 

- 객체 내에 속성으로 있는 함수를 메소드라고 한다.

(객체가 가지고 있는 함수를 메소드라고 한다)

function 자료형의 속성을 메소드라고 한다.

 

 

 

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
   
    <script>

 
        function fnProperty() {

            // 객체 생성
            const movie = {

                title : '데드풀과 울버린',
                'title en' : 'Deadpool',      //  속성명에  공백, 특수문자가 있으면 따옴표 붙여야 한다.
                showTm : 128,
                openDt : '2024-07-24',
                status : '개봉',
 

                // 객체가 가지고 있는 함수는 메소드라고 한다. printActor라는 속성으로 정의되어있는 메소드이다.
                printActor : function(flag) {
 
                    if(flag == "주연") {
                        console.log('라이언 레이놀즈');
                        console.log('휴 잭맨');
                    }
                    else if(flag == "조연") {
                        console.log('카란 소니');
                        console.log('모레나 바카린');
                    }
 
                }
 

            };
 

            movie.printActor("조연");
           
           

        }





    </script>


    <button onclick="fnProperty();">for in 문</button>



</body>
</html>

 

 

 

- 객체가 가지고 있는 함수(메소드)를 호출하려면 객체명.속성명();

 

 

 

 

 

ㅁ 참고

- window 객체에 alert라는 속성이 있다. 그 속성의 값이 메소드다. 

 
    window.alert('msg');
 

 

- 객체가 가지고 있는 함수(메소드)여서 매개변수를 줬던 거다.

 

 

 

 

 

 

 

ㅁ 동적으로 프로퍼티 추가, 변경, 삭제

- 없는 속성이면 생성된다. 있는 속성이면 변경된다.

- 속성을 문자열 형식으로 써야할 때는 점을 못 쓰고 대괄호로 접근해야 한다.

- 프로퍼티 삭제는 delete 객체명.속성명;

 

 

 
    function fnProperty() {
         
            ......
 

         
            (1) 동적으로 프로퍼티 추가
 
            movie.nation = '미국';   //   없는 속성이면 생성된다. 있는 속성이면 변경된다.
 
 


            (2) 프로퍼티 변경
 
            movie['title en'] = 'Deadpool & Wolverine';
            // 문자열의 형식으로 속성을 써야할 때는 점을 못 쓰고 대괄호로 접근해야 한다.
           
            movie.'title en'  = 'Deadpool & Wolverine'; <- 이거 .
 
 


            (3) 프로퍼티 삭제
 
            delete movie.status;

            console.log(movie)

 

    }
 

 

 


- 객체의 속성명을 문자열로 표기했으면, 접근할 때도 점이 아니라 대괄호로 접근해야 한다.

movie.'title en' 이건 문법적으로 허용되지 않음. 대괄호로 접근해야 한다.

 

 

 

 

 

ㅁ movie 객체를 콘솔창이 아닌 화면상의 특정 요소에 출력

 

 
 
  document.getElementById("result").innerHTML = movie;
 
 

 

 

- innerHTML로 객체를 대입했는데 화면에는 콘솔창처럼 객체에 대한 상세 내용이 나오지 않는다.

- 왜냐면 innerHTML 속성도 속성값이 무조건 문자열이다. 

innerText, innerHTML 모두 대입은 문자만 대입 가능하다.

- 그래서 객체를 쓰게 되면 내부적으로 객체를 문자로 변환시키고자 movie.toString() 메소드가 자동으로 실행된다.

- 객체에 toString 메소드가 없다면(정의하지 않았다면) 객체의 타입을 나타내는 문자열을 반환한다.

 

 

 

 

 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
   
    <script>

 
        function fnProperty() {

            // 객체 생성
            const movie = {

                title : '데드풀과 울버린',
                'title en' : 'Deadpool',
                showTm : 128,
                openDt : '2024-07-24',
                status : '개봉',

                // 객체가 가지고 있는 함수는 메소드라고 한다. printActor라는 속성으로 정의되어있는 메소드이다.
                printActor : function(flag) {
                    if(flag == "주연") {
                        console.log('라이언 레이놀즈');
                        console.log('휴 잭맨');
                    }
                    else if(flag == "조연") {
                        console.log('카란 소니');
                        console.log('모레나 바카린');
                    }
                },
 

                toString : function() {
                    return "제목: " + this.title + "<br>"   //   그냥 title만 쓰면 title이라는 변수를 찾음.
                         + "상영시간: " + this.showTm + "<br>"
                         + "개봉일: " + this.openDt + "<br>";
                }

            };
 

            movie.printActor("조연");
           
            // (1) 동적으로 프로퍼티 추가
            movie.nation = '미국'; // 없는 속성이면 생성된다. 있는 속성이면 변경된다.


            // (2) 프로퍼티 변경
            movie['title en'] = 'Deadpool & Wolverine';
            // 문자열의 형식으로 속성을 써야할 때는 점을 못 쓰고 대괄호로 접근해야 한다.


            // (3) 프로퍼티 삭제 (어떤 객체의 어떤 프로퍼티를 지울건지)
            delete movie.status;
 
 

            console.log(movie)

        }




    </script>


    <button onclick="fnProperty();">for in 문</button>

    <div id="result"></div>



</body>
</html>
 

 

 

 

- toString이라는 이름의 속성을 정의하고 속성 값으로 함수를 대입한다. 

toString 메소드는 리턴값이 있어야 한다. 어떤 문자열을 반환할건지. 

 

 

- 메소드 내에서 현재 이 객체를 가리키고자 할 경우에는 this. 

this. 없이 쓰면 메소드 바깥쪽에서 그러한 이름의 변수를 찾는다.

- 단, 화살표 함수 내에서는 this를 쓸 수 없다.

this 대신 그냥 객체명 쓰면 된다. movie.title