FrontEnd/JavaScript

#40. JavaScript(배열, 함수, 객체1)

열하나요 2023. 8. 28. 12:34

프로토타입 = 자바의 상속개념?

 

40-1. 배열

<!DOCTYPE html>
<html lang="en">
<head>
    <title>안녕 나는 배열이야 ~</title>

    <style>
        .area{
            width : 300px;
            border : 1px solid black;
        }
        .small{height : 100px;}
        .big{height : 200px;}
    </style>

</head>
<body>

    <h1>배열</h1>
    <p>
        <!-- int char Object // [1] [2] [length]-->
        자바스크립트에서는 변수 선언 시 별도의 자료형을 지정하지 않기 때문에 <br>
        배열도!! var, let, const로 선언을 한다!! <br>
        어떤 자료형이든 상관없이 하나의 배열에 담을 수 있음! (자바의 컬렉션과 유사)
    </p>

    <button onclick="arrayText();">버튼~</button>

    <div class="area small" id="area1"></div>
    <script>
        function arrayText(){

            // 배열의 선언 및 초기화
            let arr = ['홍길동', 15, true, [1, 2, 3]];
            // let arr = [];
            // let arr = new Array(); 이렇게도 할 수 있음. 나중에 할것

            console.log(arr); 
            console.log(arr[2]); // true
            console.log(arr[3][1]); // 2

            let arr2 = arr[3];
            console.log(arr2[2]); // 3

            // 반복문
            /*
            변수명과 id속성값이 중복이 날 수 있어서 이 방법은 굉장히 위험하다.
            절대하면 안되는 방법!!!!!!!!!!!!!!!!!!!!!!!

            for(let i = 0; i < arr.length; i++){
                area1.innerHTML += arr[i] + '<br>';
            }
            */

            const area1 = document.getElementById('area1');

            // 배열의 0번인덱스 ~ 마지막인덱스까지 순차적으로 모두 접근할 때!
            /*
            for(Strings s: list){ s가 요소를 담는 변수
                System.out.println(s);
            })
            */
            
            // for in 문
            // for(let 변수명 in 순차적으로 접근할 배열명)
            for(let i in arr){
                area1.innerHTML += arr[i] + '<br>';
            }
        }
    </script>

    <hr>

    <h3>* 배열의 선언</h3>

    <p>
        배열 선언 시 배열의 크기를 지정한 채로 선언하거나, 따로 크기를 지정하지 않을 수도 있음! <br>
    </p>

    <button onclick="arrayTest2();">확인</button>
    <div id="area2" class="area big"></div>

    <script>
        function arrayTest2(){

            let arr1 = new Array(); // 배열의 크기가 0인 배열
            let arr2 = new Array(2); // 배열의 크기가 2인 배열
            let arr3 = []; // 배열의 크기가 0인 배열

            console.log(arr1);
            console.log(arr2);
            console.log(arr3);

            // 배열에 요소 추가
            arr1[0] = '상우';
            arr1[1] = '마와르';
            arr1[10] = '구촐';


            document.getElementById('area2').innerHTML += arr1 + '<br>';
            console.log(arr1);

            // arr2
            document.getElementById('area2').innerHTML += arr2 + '<br>';

            // arr2에 값 대입
            arr2[0] = '칼림';
            arr2[1] = '독수리';
            arr2[2] = '카눈';
            arr2[3] = '란';

            document.getElementById('area2').innerHTML += arr2.length + '<br>';
            document.getElementById('area2').innerHTML += arr2 + '<br>';
            // 기존 크기 2 => 4개의 값을 넣는다고 해서 크기가 늘어나지 않는다

            // 배열선언과 동시에 초기화
            var arr4 = ['홍길동', '이승철']; // 배열의 크기가 2
            var arr5 = new Array('Java', 'Oracle', 'HTML'); // 배열의 크기가 3

            document.getElementById('area2').innerHTML += arr4 + '<br>' + arr5;
        }
    </script>

    <hr>

    <h3>* Array객체의 메소드</h3>

    <h4> 1) indexOf(찾고자하는 요소) : 배열에서 해당 요소가 위치해있는 인덱스를 반환</h4>

    <div id="area3" class="area small"></div>
    <button onclick="indexOfTest();">확인</button>

    <script>
        function indexOfTest(){

            let arr = ['설날', '추석', '광복절', '개천절', '크리스마스', '한글날'];
            // 실습문제

            // 사용자에게 연휴를 입력받아서
            // let text = window.prompt('연휴를 입력해 주세요');

            // 사용자가 입력한 연휴가 있을 경우 : 당신이 찾는 연휴 XXX은 0번째 인덱스에 있습니다.
            /* for문이용했음
            for(let i in arr){
                if(text == arr[i]){
                    document.getElementById('area3').innerHTML = '당신이 찾는 연휴 ' + text + '는(은) ' + i + '번째 인덱스에 있습니다';
                    break;
                }
                
                // 사용자가 입력한 연휴가 없을 경우 : 당신이 찾는 연휴 XXX은 존재하지 않습니다.
                else {
                    document.getElementById('area3').innerHTML = '당신이 찾는 연휴 ' + text + '는(은) 존재하지 않습니다.';
                }
            }
            */
            /* indexOf이용했음
            console.log(arr.indexOf(text));
            
            if(arr.indexOf(text) >= 0){
                document.getElementById('area3').innerHTML = '당신이 찾는 연휴 ' + text + '는(은) ' + arr.indexOf(text) + '번째 인덱스에 있습니다';
            }
            else{
                document.getElementById('area3').innerHTML = '당신이 찾는 연휴 ' + text + '는(은) 존재하지 않습니다.';
            }
            */
            // 쌤꺼
            let holiday = prompt('찾고자하는 연휴를 입력하세요.');

            const area3 = document.getElementById('area3');
            const index = arr.indexOf(holiday);

            console.log(index);

            if(index == -1){
                area3.innerHTML = '당신이 찾는 연휴 ' + holiday + '는 존재하지 않습니다.';
            }
            else{
                area3.innerHTML = '당신이 찾는 연휴 ' + holiday + '는 ' + index + '번째 인덱스에 있습니다.';
            }

            // 참고. 동등비교 연산자 == 
            console.log(1 == 1); // true
            console.log('1' == 1); //true => 자료형과 무관하게 실제 값만 일치하면 true
            console.log([] == 0); // true => 대체 왜???
            console.log('1' === 1); // false : 값, 자료형 둘 다 일치해야만 true

        }
    </script>

    <hr>

    <h4> 2) concat(배열, 배열, 배열, ...) : 여러 개의 배열을 결합하고자 할 때 사용 </h4>


    <div id="area4" class="area big"></div>
    <button onclick="concatTest();">확인</button>

    <script>
        function concatTest(){
            
            /*
            let arr1 = ['도라', '사울라'];
            let arr2 = arr1;
            arr2[2] = '머시기';
            console.log(arr1); //  ['도라', '사울라', '머시기'] => 얕은 복사됨
            */

            let arr1 = ['도라', '사울라'];
            let arr2 = ['담레이', '하이쿠이', '기러기'];

            const area4 = document.getElementById('area4');

            area4.innerHTML = 'arr1 : ' + arr1 + '<br>';
            area4.innerHTML += 'arr2 : ' + arr2 + '<br>';

            area4.innerHTML += 'arr1기준으로 합침 : ' + arr1.concat(arr2) + '<br>';
            // arr1 = arr1.concat(arr2) + '<br>'; // 원본배열에 합쳐서 원본배열에 대입(복사)
            area4.innerHTML += 'arr1 : ' + arr1 + '<br>';

            area4.innerHTML += 'arr2기준으로 합침 : ' + arr2.concat(arr1) + '<br>';
            area4.innerHTML += '많은 배열을 합침 : ' + arr2.concat([1,2], arr1, ['안녕']);

            // 원본배열에 영향을 끼치지 않음
        }
    </script>

    <hr>

    <h4> 3) reverse() : 배열에 담긴 요소들을 역순으로 바꿔주는 메소드</h4>

    <div id="area5" class="area small"></div>
    <button onclick="reverseTest();">확인</button>

    <script>
        function reverseTest(){

            let arr = ['Apple', 'Banana', 'Lemon', 'Kiwi'];

            const area5 = document.getElementById('area5')

            area5.innerHTML = 'arr : ' + arr + '<br>';
            arr.reverse();
            area5.innerHTML += 'reverse결과 : ' + arr + '<br>';

            // 원본배열에 영향을 끼치는 메소드
            area5.innerHTML += 'reverse의 reverse : ' + arr.reverse() + '<br>';
        }
    </script>

    <hr>

    <h4> 4) sort() : 배열에 담긴 값들을 정렬해주는 메소드</h4>

    <div id="area6" class="area small"></div>
    <button onclick="sortTest();">확인</button>

    <script>
        function sortTest(){

            const area6 = document.getElementById('area6');
            let arr = ['김건희', '김건늬', '김건릐', '김건긔', '김건믜'];

            area6.innerHTML = 'arr : ' + arr + '<br>';
            arr.sort();
            area6.innerHTML += '다시 arr : ' + arr + '<br>';
            // 원본배열에 영향을 끼치는 메소드

            arr.sort().reverse();
            area6.innerHTML += '내림차순 정렬 arr : ' + arr + '<br>';
        }
    </script>

    <hr>

    <h4>
        5_1) push(추가할 요소) : 배열의 맨 뒤에 요소를 추가하고 크기를 반환 <br>
        5_2) pop() : 배열의 맨 뒤 요소를 제거 -> 제거된 요소를 반환
    </h4>

    <div id="area7" class="area" style="height : 500px;"></div>
    <button onclick="pushPopTest();">확인</button>

    <script>
        function pushPopTest(){

            const area7 = document.getElementById('area7');
            let lunchMenu = ['서브웨이', '돈까스', '김밥', '새우볶음밥'];

            area7.innerHTML = 'lunchMenu : ' + lunchMenu + '<br>';
            area7.innerHTML += 'Push 후 크기 : ' + lunchMenu.push('곰탕') + '<br>'; // 5
            area7.innerHTML += lunchMenu + '<br>';

            lunchMenu.pop(); // 제일 뒤에 있는 요소부터 제거
            area7.innerHTML += lunchMenu + '<br>';
            area7.innerHTML += lunchMenu.pop() + '<-- lunchMenu에서 pop한 요소 <br>';
        }
    </script>
    
    <hr>

    <h4>
        6_1) unshift(추가할요소) : 배열의 맨 앞에 요소를 추가하고 크기 반환 <br>
        6_2) shift() : 배열의 맨 앞 요소를 제거하고 제거된 요소를 반환
    </h4>

    <div id="area8" class="area big"></div>
    <button onclick="shiftUnshiftTest();">안녕 나는 버튼이야</button>

    <script>
        function shiftUnshiftTest(){

            const area8 = document.getElementById('area8');
            let lunchMenu = ['곰탕', '꼬리곰탕'];

            area8.innerHTML += 'lunchMenu : ' + lunchMenu + '<br>';
            lunchMenu.unshift('설렁탕');
            area8.innerHTML += 'lunchMenu에 unshift한 결과 : ' + lunchMenu +  '<br>'; //설렁탕, 곰탕, 꼬리곰탕
            area8.innerHTML += 'lunchMenu에 shift한 결과 : ' + lunchMenu.shift(); // 설렁탕(뽑은거 나옴)
        }
    </script>

    <hr>

    <h4>
        7_1) slice(시작인덱스, 끝인덱스) : 배열의 요소들을 추출해주는 메소드 <br>
        7_2) splice(시작인덱스, 제거수, 추가값) : 배열의 요소를 추출해서 제거 및 추가, 추가값은 생략 가능
    </h4>

    <div id="area9" class="area" style="height : 500px;"></div>
    <button onclick="sliceSpliceTest();">확인</button>

    <script>
        function sliceSpliceTest(){

            const area9 = document.getElementById('area9');

            let arr = ['나는', '올 해', '금연을', '하겠다.'];

            area9.innerHTML += 'arr : ' + arr + '<br>';

            // slice
            area9.innerHTML += 'slice결과 : ' + arr.slice(2, 4) + '<br>';
            // 원본배열에 영향을 끼치지 않음!

            // splice
            area9.innerHTML += 'splice결과 : ' + arr.splice(2, 1) + '<br>';
            // 원본배열에 영향을 끼침!
            area9.innerHTML += 'arr : ' + arr + '<br>';
            area9.innerHTML += arr.splice(2, 0, '다이어트') + '<br>'; // 추가할때도 많이 씀
            area9.innerHTML += arr;
        }
    </script>

    <hr>

    <h4>
        8) join(구분자)
        : 배열에 담긴 값들을 하나의 '문자열'로 합쳐서 반환해주는 메소드
    </h4>

    <div id="area10" class="area small"></div>
    <button onclick="joinTest();">확인</button>

    <script>
        function joinTest(){

            const area10 = document.getElementById('area10');

            let arr = ['점', '심', '시', '간'];

            const obj = {};
            
            console.log(arr);
            console.dir(arr);
            area10.innerHTML = 'arr : ' + arr + '<br>';
            area10.innerHTML += obj + '<br>';
            area10.innerHTML += arr.toString() + '<br>';
            // 배열 객체를 html요소에 출력할 경우 내부적으로 toString() 호출 후 돌아온 결과 출력

            area10.innerHTML += 'join : ' + arr.join() + '<br>'; // join : 점,심,시,간
            area10.innerHTML += 'join : ' + arr.join('') + '<br>'; // join : 점심시간
            area10.innerHTML += 'join : ' + arr.join('-') + '<br>'; // join : 점-심-시-간

            // join은 기본적으로 , 을 통해서 하나의 문자열로 합침
            // join메소드를 호출 시 구분자를 제시한다면 해당 구분자로 하나의 문자열이 만들어짐!
        }
    </script>
    
</body>
</html>

 

40-2. 함수

<!DOCTYPE html>
<html lang="en">
<head>
    <title>함수</title>
    <style>
        .area{
            width : 500px;
            height : 100px;
            border : 1px solid lightcoral;
            background-color: hotpink;
        }
    </style>
</head>
<body>

    <h1>함수! (function) </h1>

    <!-- 
        * 함수의 종류

        1. 선언적 함수 : 이름이 있는 함수, 이름을 가지고 호출해서 실행함

        2. 익명 함수   : 이름이 없는 함수, 함수 식별자 대신 변수에 함수를 대입해서 함수코드를 저장하는 구현 방식
    -->

    <h3>선언적 함수</h3>

    <pre onclick="test1();">
        [ 표현법 ]
        function 함수식별자(매개변수, 매개변수){

            해당 함수를 호출했을 때 실행할 코드;

            return 결과값;
        }
        - 매개변수가 없는 경우 생략 가능
        - 반환할 결과값이 없는 경우 return 결과값; 생략가능
    </pre>
    
    <div id="area1" class="area" onclick="test1();"></div>
    <button onclick="test1();">나불렀어???</button>

    <script>
        function test1(){ // 재활용할 수 있지~, 가독성, 유지보수가 좋아짐
            document.getElementById('area1').innerHTML = 'test1() 호출됨! <br>';
        }
    </script>

    <hr>

    <h3>* 익명함수</h3>

    <pre>
        [ 표현법 ]
        변수/속성 = function(){

            소스코드가 어쩌구저쩌구;

        }
        => 특정 변수나 속성에 대입하는 함수가 필요할 경우 사용됨
            (주로 이벤트 핸들러 작성 시 사용)
    </pre>

    <button id="btn">버튼</button>
    <div id="area2" class="area"></div>

    <script>
        const btn = document.getElementById('btn'); // 버튼 요소객체

        btn.onclick = function(){ // 이벤트 속성에 대입하는 function == 이벤트핸들러
            document.getElementById('area2').innerHTML = '이벤트 핸들러를 통해 실행됨! <br>';

        }
        // console.dir(btn);
    </script>

    <hr>

    <h2>함수의 매개변수</h2>
    
    <button onclick="test3('프로개발자');">실행확인</button>
    <button onclick="test3(10);">실행확인</button>
    <button onclick="test3(true)">실행확인</button>
    <button onclick="test3([1,2,3])">실행확인</button>
    <button onclick="test3(prompt('이름을 입력하세요!!'))">실행확인</button>
    <!-- 자료형에 상관없이 인자값과 매개변수의 개수가 동일하다면 실행하는데 문제가 없음! -->

    <button onclick="test3();">실행확인</button> 
    <!-- 정의해둔 매개변수 개수보다 적게 전달하는것 가능!(실행에 문제 없음) / 단, undefined로 뜸(변수선언은 헀으나 초기화를 안한 상태) -->

    <button onclick="test3('하나', '둘')">실행확인</button>
    <!-- 정의해둔 매개변수 개수보다 많게 전달하는것 가능!(실행에 문제 없음) / 단, 초과된 전달값은 사라짐 -->

    <div id="area3" class="area"></div>

    <script>
        function test3(value){ // 매개변수 작성시 자료형 지정 X. var, let X => 변수명만 적음
            // 다 되니까 실수하기 딱 좋음!
            // alert(value[0]); 이런거..
            document.getElementById('area3').innerHTML = value; 
        }
    </script>

    <hr>

    <h3>* 매개변수 관련 배열</h3>

    <p>
        함수 호출 시 전달하는 값은 내부적으로 arguments라는 배열에 담김 <br>
        * arguments : 모든 함수마다 내부적으로 하나씩 존재하는 배열 객체
    </p>

    <button onclick="test4(1,7,15,486,254,55,7,8,9,17,99);">나는 버튼</button>
    <div id="area4" class="area"></div>

    <script>
        function test4(){
            console.log(arguments);

            // test4함수 호출 시 전달한 인자값들의 총합과 평균을 구해서
            // id속성값이 area4인 div요소의 innerHTML속성에 대입해주세요.

            const area4 = document.getElementById('area4');

            console.log(test4.arguments[0]);

            let sum = 0;
            for(let i in test4.arguments) {
                sum += test4.arguments[i];
            }
            area4.innerHTML = sum;
            let avg = sum/arguments.length;
            area4.innerHTML = avg;
        }
    </script>

    <hr>

    <h3>
        * 매개변수 있는 함수에 this키워드를 전달하기*********************
        **************************************************************
        ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
        ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
        ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
        ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
        ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
        ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
        ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
    </h3>

    <button onclick="test5(this);">버튼</button> <!-- this : 해당 요소객체 버튼 자체 -->
    <button id="abc" onclick="test5(this.innerHTML);">버튼2!</button>
    <button id="btn33" onclick="test5(this.id);">버튼3!</button>
    <button type="bytton" value="버튼4" onclick="test5(this.value);">버튼4</button>

    <script>
        function test5(a){
            console.log(a);
        }
    </script>

    <hr>

    <h2>* 일반적인 값을 반환하는 경우 </h2>

    <button onclick="test6();">실행확인</button>
    <div id="area6" class="area"></div>

    <script>

        function test6(){
            document.getElementById('area6').innerHTML += '랜덤값 : ' + rand();
        }; // 보편적으로 밑에 또 뭐가 있으면 ; 달아주고 마지막으로 있는 애는 안달아줌.

        // 1 ~ 100 사이의 랜덤한 난수를 생성해서 "반환"해주는 함수
        function rand(){

            // Math.random() => 0.0 ~ 0.9999999999
            // Math.random() * 100 => 0.0 ~ 99.999999999999
            // Math.random() * 100 + 1 => 1.0 ~ 100.9999999999
            // parseInt(Math.random() * 100 + 1) => 1 ~ 100
            return parseInt(Math.random() * 100 + 1);
        }
    </script>

    <h3> * 익명함수를 리턴하는 경우 </h3>

    이름 : <input type="text" id="userName">
    <button onclick="test7()();">실행</button>

    <script>
        function test7(){

            let name = document.getElementById('userName').value;


            return function(){
                alert(name + '님 안녕~');
            }
            
        }
    </script>

</body>
</html>

 

40-3. 객체1

<!DOCTYPE html>
<html lang="en">
<head>
    <title>객체는 쉽다~ 첫번째!!!</title>

    <style>
        .area{
            background-color : khaki;
            border : 1px solid goldenrod;
        }

        .small{height : 250px}
        .big{height : 500px}
    </style>
</head>
<body>

    <h1>객체</h1>

    <p>
        Property(속성) + Value(속성값)을 한 쌍으로 저장할 수 있는 구조 <br>
        여러 속성을 하나의 변수에 저장할 수 있도록 해주는 데이터 타입 <br>

        * 객체는 중괄호를 {} 사용해서 생성하고 <br>
        중괄호 안에 객체에 필요로 하는 속성(Property)들을 정의함(속성 : 속성값)  <br>
        참고로 속성값으로는 모든 자료형의 값을 담을 수 있음

        -> 자바스크립트에서 객체 : 자바의 HashMap과 비슷한 개념 <br>
    </p>

    <pre>
        [ 표현법 ]
        var 변수명(== 객체명) = {
            속성명 : 속성값,
            속성명 : 속성값,
            속성명 : 속성값,
            ...
        }
    </pre>

    <button onclick="test1();">실행확인</button>
    <div id="area1" class="area big"></div>

    <script>
        function test1(){

            // 젤리

            // 제품명 : 웰치 후르트스낵 믹스드후르트
            // 가격 : 17000
            // 재료 : 혼합과일퓨레, 설탕
            // 회사 : 농심

            // 배열
            var arr = ['웰치 후르트스낵 믹스드후르트', 17000, ['혼합과일퓨레', '설탕'], '농심'];
            // 각각의 인덱스를 알아야 됨... 힘들어

            // 객체
            let jelly = {
                productName : '웰치 후르트스낵 믹스드후르트',
                price : 17000,
                'material' : ['혼합과일퓨레', '설탕'],
                company : '농심'
            }

            console.log(arr); // [~~~]
            console.log(jelly); // {~~~}

            const area1 = document.getElementById('area1');
            area1.innerHTML += 'arr : ' + arr + '<br>';
            area1.innerHTML += 'jelly : ' + jelly + '<br>'; // [object object]로 출력됨
            // 속성과 프로토타입이 출력됨(?)

            // 해당 객체 내부의 각 속성에 접근하는 방법
            // 방법 1. .을 이용해서 접근하는 방법 : 객체명.속성명
            area1.innerHTML += '<b>방법 1. 객체명.속성명으로 접근하기 </b><br>';
            area1.innerHTML += 'jelly.productName : ' + jelly.productName + '</br>';
            area1.innerHTML += 'jelly.price : ' + jelly.price + '<br>';
            area1.innerHTML += 'jelly.material : ' + jelly.material + '<br>';
            area1.innerHTML += 'jelly.material[0] : ' + jelly.material[0] + '<br>';
            area1.innerHTML += 'jelly.material[1] : ' + jelly.material[1] + '<br>';
            area1.innerHTML += 'jelly.company : ' + jelly.company + '<br>';

            // 방법 2. 대괄호를 이용하는 방법 : 객체명['속성명']
            area1.innerHTML += '<b>방법 2. 객체명["속성명"]으로 접근하기</b><br>';
            area1.innerHTML += 'jelly["productName"] : ' + jelly["productName"] + '<br>';
            area1.innerHTML += 'jelly["price"] : ' + jelly["price"] + '<br>';
            area1.innerHTML += 'jelly["material"] : ' + jelly["material"] + '<br>';
            area1.innerHTML += 'jelly["material"][0] : ' + jelly["material"][0] + '<br>';
            area1.innerHTML += 'jelly["material"][1] : ' + jelly["material"][1] + '<br>';
            area1.innerHTML += 'jelly["company"] : ' + jelly["company"] + '<br>';
        }
    </script>

    <hr>

    <h3>* 객체 생성</h3>

    <button onclick="test2();">실행</button>
    <div id="area2" class="area small"></div>

    <script>
        function test2(){

            var user = {
                'user name' : '홍길동', // 속성명에 공백은 안됨 ''를 붙이면 쓸 수 있음
                'age!!' : 20 // 속성명에 특수문자는 안됨 ''를 붙이면 쓸 수 있음
            };

            console.log(user);

            const area2 = document.getElementById('area2');
            
            // .을 이용 => 접근불가
            // area2.innerHTML = '유저네임 : ' + user.user name + '<br>';

            // 유일하게 쓸 수 있는 방법이야
            area2.innerHTML = 'user name : ' + user["user name"] + '<br>';
            area2.innerHTML += 'age!! : ' + user["age!!"] + '<br>';
        }
    </script>

    <hr>

    <h3>* 객체의 반복문</h3>

    <p>
        인덱스 개념이 없기 때문에 단순 for문은 사용 불가능, for in문 사용 가능 <br>
        객체가 가지고 있는 모든 속성들에 대해서 순차적으로 접근하고자 할 때 사용 가능
    </p>

    <button onclick="test3();">실행</button>
    <div id="area3" class="area small"></div>

    <script>
        function test3(){

            const area3 = document.getElementById('area3');

            let arr = ['치킨', 12000, '가마치통닭'];

            for(let i in arr){
                area3.innerHTML += arr[i] + '<br>';
            }

            // in 키워드 뒤에 배열을 제시했다면
            // 반복할 때마다 0에서부터 마지막 인덱스까지의 인덱스가 i에 담김

            let student = {
                name : '홍길동',
                age : 15,
                grade : 3,
                address : '한양'
            }


            // in 키워드 뒤에 객체를 제시 시
            // 반복할 때마다 해당 객체의 속성명들이 key(변수명)에 담김

            // . 이용
            for(let key in student){
                area3.innerHTML += 'key : ' + student.key + '<br>';
                // 진짜 말 그대로 student객체한테 가서 key라는 속성명에 접근
                // .을 가지고 접근 => 객체명.속성명 => 사용불가
            }

            // [] 이용
            for(let key in student){
                area3.innerHTML += key + ' : ' + student[key] + '<br>';
            }
        }
    </script>

    <hr>

    <h3>* 객체의 메소드 속성</h3>

    <p>
        객체의 속성 중 함수자료형인 속성을 메소드라고 부른다.
    </p>

    <button onclick="test4();">실행확인</button>
    <div id="area4" class="area small"></div>

    <script>
        function test4(){

            const area4 = document.getElementById('area4');

            let name = '이승철';

            let bird = {
                name : '미미',
                kind : '회색앵무',
                eat : function(food){ // 이 경우 속성명이 function의 이름이 되므로 익명함수 작성

                    area4.innerHTML += this.kind + '인 ' + this.name + '가 ' + food + '를 먹습니다. <br>';

                    // => 메소드 속성안에서 같은 객체 내의 속성을 호출할 경우 this.을 앞에 붙인다.
                    // => 만약 속성명과 변수명이 동일한 경우에는 this.을 안붙이면 변수가 호출됨!
                }
            };
            bird.eat('지렁이');
        }
    </script>

    <hr>

    <h3>* in과 with</h3>

    <p>
        in : 객체 내에 해당 속성이 있는지 확인해주는 키워드 <br>
        with : 코드를 줄여주는 키워드
    </p>

    이름 : <input type="text" id="name"> <br>
    국어 : <input type="text" id="kor"> <br>
    수학 : <input type="text" id="math"> <br>
    생물 : <input type="text" id="fish"> <br>

    <button onclick="test5();">실행</button>
    <div id="area5" class="area big"></div>

    <script>
        function test5(){

            // 객체 만들기

            // 객체명 : student
            // 속성명 : 속성값
            // name : 사용자가 입력한 이름값
            // kor : 사용자가 입력한 국어점수
            // math : 사용자가 입력한 수학점수
            // fish : 사용자가 입력한 낚시점수
            // getSum : 점수의 합계를 구해서 반환해주는 익명함수
            // getAvg : 점수의 평균을 구해서 반환해주는 익명함수

            let name = document.getElementById('name').value;
            let kor = Number(document.getElementById('kor').value);
            let math = Number(document.getElementById('math').value);
            let fish = Number(document.getElementById('fish').value);

            let student = {
                name :  name,
                kor : kor,
                math : math,
                fish : fish,
                getSum : function() {
                    return this.kor + this.math + this.fish;
                },
                getAvg : function() {
                    return this.getSum()/3;
                },
                toString : function(){
                    return this.name + ', ' + this.kor + ', ' + this.math + ', ' + this.fish;
                }
            }
            console.log(student);
            // console.log(student.getSum()); // 값 꺼내오기 
            // console.log(student.getAvg()); // 값 꺼내오기

            let arr = [1, 2, 3];

            const area5 = document.getElementById('area5');
            area5.innerHTML += 'arr : ' + arr + '<br>';
            area5.innerHTML += 'student : ' + student + '<br>';

            // 해당 객체에 해당 속성이 존재하는가? => '속성명' in 객체명 : 있으면 true 없으면 false

            area5.innerHTML += 'student객체에 name속성이 존재하나? : ' + ('name' in student) + '<br>';
            area5.innerHTML += 'student객체에 test속성이 존재하나? : ' + ('test' in student) + '<br>'; 

            area5.innerHTML += 'student.name : ' + student.name + '<br>';
            area5.innerHTML += 'student.math : ' + student.math + '<br>';
            with(student){
                area5.innerHTML += '학생이름 : ' + name + '<br>';
                area5.innerHTML += '수학점수 : ' + math + '<br>';
            }
        }
        
    </script>

    <h3>* 객체의 속성 추가 및 제거</h3>

    <button onclick="test6();">실행</button>
    <div id="area6" class="area small"></div>

    <script>
        function test6(){
            
            let arr = [];

            // 빈객체 생성
            let student = {};

            // ************************ 객체에 속성을 추가하는 방법 ************************
            // 객체명.추가할속성명 = 속성명에해당하는밸류값;
            student.name = '홍길동';
            student.hobby = ['산책'];
            student.age = 60;

            // 속성명이 중복되는 경우 기존에 존재하는 속성에 접근하는 것이기 때문에 값이 덮어씌어짐
            student.age = 20;

            // with 키워드를 쓴다면?
            with(student){
                address = '한양';
                phone = '010-2323-3434';
            } // with의 경우 속성추가가 불가능하다!!! 속성값을 가져오는 용도로만 사용할 수 있음

            console.log(student);

            // 메소드 속성 추가
            student.toString = function(){
                return this.name + ', ' + this.hobby + ', ' + this.age;
            }

            document.getElementById('area6').innerHTML = student.toString();
            // [object Object]

            // 객체에 속성 제거
            // delete(객체명.속성명)
            delete(student.toString);

            console.log(student);

        }
    </script>

</body>
</html>