Front-end/Js

Js 기초(class)- AWS 풀스택 과정 21일차

awspspgh 2024. 8. 12. 22:28

오늘은 class에 대해서 배워보도록 하겠습니다

 

목차
1. array 복습
2. try ~ catch
3. class
4. 예제 문제
5. 느낀 점

 

 

1. array 복습

<!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 memberObject = {
            name: 'hong',
            age: 30,
            married: true,
            favors: ["Baseball", "Game", "Movie", "etc..."]
        };
        
        const memberObject2 = {
            name: 'kim',
            age: 25,
            married: false,
            favors: ["Coffee", "Dog", "Movie", "etc..."]
        };

        const member = [];
        member.push(memberObject);
        /*
        console.log(member);
        console.log(member);
        // memberObject를 3개 복사하여 저장
        for(let i = 0; i < 3; i++){
            member.push(memberObject);
        }
        console.log(member);
        // 2번째 member를 kim으로 변경
        member[1].name = 'kim';
        console.log(member);
        // memberObject는 하나의 객체 (다 똑같은 객체 -> class 생성)
        */
        member.push(memberObject2);
        console.log(member);

        // 객체의 값을 전부 분해하여 콘솔에 찍기
        // for of : 배열의 내용을 탐색할 때
        // for in : 객체 안의 내용을 탐색할 때
        // 객체 값을 출력 객체명[키명] = value 리턴
        console.log(member[0].name);
        console.log("-- 배열 객체 --");
        for(let mem of member){
            // 첫 번째 member 객체 값
            for(let keyName in mem){
                if(keyName == 'favors'){
                    console.log('--취미--');
                    for(let f of mem[keyName]){
                        console.log(f);
                    }
                }else{
                    console.log(keyName+" : "+mem[keyName]);
                }
            }
        }
    </script>
</body>
</html>

 

▷ 출력

 

▣ 리스트 출력하기

<!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>
    <h1>내가 좋아하는 가수</h1>
    <form action="">
        이름 : <input type="text" id="name"><br>
        나이 : <input type="text" id="age"><br>
        주소 : <input type="text" id="address"><br>
        playList : <br>
        <input type="text" id="first">
        <input type="text" id="second">
        <input type="text" id="third">
        <button type="button" id="add">등록</button>
    </form>
    <script>
        const people = [];
        const musician1 = {
            name : '',
            age : 0,
            address : '',
            playList : {
                first : '',
                second : '',
                third : '',
            }
        }
        const musician2 = {
            name : '',
            age : 0,
            address : '',
            playList : {
                first : '',
                second : '',
                third : '',
            }
        }
        const musician3 = {
            name : '',
            age : 0,
            address : '',
            playList : {
                first : '',
                second : '',
                third : '',
            }
        }

        let cnt = 0;
        // people에 객체를 3개 등록
        document.getElementById('add').addEventListener('click', ()=>{
            cnt ++;
            const name = document.getElementById('name').value;
            const age = document.getElementById('age').value;
            const address = document.getElementById('address').value;
            const first = document.getElementById('first').value;
            const second = document.getElementById('second').value;
            const third = document.getElementById('third').value;

            switch(cnt){
                case 1:
                    console.log('-- 등록 --');
                    musician1.name = name;
                    musician1.age = age;
                    musician1.address = address;
                    musician1.playList.first = first;
                    musician1.playList.second = second;
                    musician1.playList.third = third;
                    console.log(musician1);
                    people.push(musician1);
                    break;
                case 2:
                    musician2.name = name;
                    musician2.age = age;
                    musician2.address = address;
                    musician2.playList.first = first;
                    musician2.playList.second = second;
                    musician2.playList.third = third;
                    console.log(musician1);
                    people.push(musician2);
                    break;
                case 3:
                    musician3.name = name;
                    musician3.age = age;
                    musician3.address = address;
                    musician3.playList.first = first;
                    musician3.playList.second = second;
                    musician3.playList.third = third;
                    console.log(musician1);
                    people.push(musician3);
                    // 3명의 데이터를 콘솔에 for문으로 순회 나열
                    console.log("-- 배열 객체 --");
                    for(let result of people){
                        for(let keyName in result){
                            if(keyName == 'playList'){
                                console.log('-- playList --');
                                // 다시 객체 안
                                for(let key in result[keyName]){
                                    console.log(result[keyName][key]);
                                }
                            }else{
                                console.log(keyName + ' : ' + result[keyName]);
                            }
                        }
                        console.log('----------');
                    }
                    break;
            }
        });
    </script>
</body>
</html>

 

▷ 출력

입력

 

출력

 

2. try ~ catch

<!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>
    <h1>
        try~catch : 예외 처리 프로세스
        예상되는 에러를 try{code...} 영역에 배치를 하고, 만약 에러가 발생하면,
        catch(err){code...} 영역에서 처리하는 예외처리 프로세스
    </h1>
    <ul>
        <li>
            try 영역 : 에러가 발생할 수 있는 코드를 실행
            자바 스크립트에서 에러가 발생하면 에러 발생 라인부터 동작이 멈춤.
            에러가 발생해도 다음 코드로 넘어감
        </li>
        <li>
            catch(err){ } : 에러가 발생하면 예외처리를 하는 곳
        </li>
        <li>
            try~catch로 예외처리를 하면 프로세스가 멈추지 않고, 지속시킬 수 있음
        </li>
        <li>
            finally 영역: 예외처리와 상관없이 무조건 실행되어야 하는 코드를 넣는 영역
        </li>
        <li>
            throw : 예외를 고의적으로 발생시키는 키워드 throw + 예외발생 후 처리코드
        </li>
    </ul>
    <script>
        console.log('프로세스 시작');
        let num = 0;
        try{
            alert('경고창');
            throw new '경고창 에러시 문구';
            console.log(10 + num);
            console.log(10 - num);
        }catch(err){
            console.log(err.name);
            console.log(err.message);
        }finally{
            console.log("꼭 출력되어야 하는 문구");
        }
    </script>
</body>
</html>

 

▷ 출력

 

3. class

<!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>
    <h1>
        클래스, 생성자, 객체
    </h1>
    <!-- 
        클래스는 생성 기본 문법
        - 클래스는 반드시 첫 글자 대문자
        class MyClass{
            //생성자 : 자바 스크립트의 생성자는 1개만 허용
            constructor(param){
                ...
            }
            //method 정의
            methodName(param){
                ...
            }
            methodName(param){
                ...
            }
            // getter / setter
            get name() {
                return this.name;
            }
            set name(value){
                this.name = value;
            }
        }
    -->
    
    <script>
        class Car{
            constructor(name, year){
                this.name = name;
                this.year = year;
                this.model = '';
            }
        }
        let myCar1 = new Car('쏘나타', 2023);
        myCar1.model = "XG";
        console.log(myCar1);
        let myCar2 = new Car('그랜저', 2022);
        console.log(myCar2);
        let myCar3 = new Car();
        myCar3.name = '아반떼';
        myCar3.year = 2024;
        myCar3.model = 'XD';
        consol.log(myCar3);
    </script>
</body>
</html>

 

▷ 출력

 

<!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>
        // class 객체 생성 / 일반 객체 생성
        // 계좌 이름, 금액, 입금, 출금, 이체

        // 일반 객체 생성
        const myAccount = {
            name : 'hong',
            balance : 0,
            //입금
            deposit: function(amount){
                this.balance += amount; // 누적
            },
            //출금
            withdraw: function(amount){
                this.balance -= amount;
            },
            //이체
            transfer: function(amount, otherAccount){
                this.balance -= amount;
                otherAccount.balance += amount;
            }
        }

        const yourAccount = {
            name : 'kim',
            balance : 10000,
            //입금
            deposit: function(amount){
                this.balance += this.amount; // 누적
            },
            //출금
            withdraw: function(amount){
                this.balance -= amount;
            },
            //이체
            transfer: function(amount, otherAccount){
                this.balance -= amount;
                otherAccount.balance += amount;
            }
        }
        console.log(myAccount.name, ":", myAccount.balance);
        myAccount.deposit(10000);
        console.log(myAccount.name, ":", myAccount.balance);
        myAccount.withdraw(3000);
        console.log(myAccount.name, ":", myAccount.balance);
        myAccount.transfer(2000, yourAccount);
        console.log(myAccount.name, ":", myAccount.balance);
        console.log(yourAccount.name, ":", yourAccount.balance);
        console.log('--------------------');

        //class로 객체 생성
        class BankAccount{
            constructor(name, balance){
                this.name = name;
                this.balance = balance;
            }
            //입금
            deposit(amount){
                this.balance += amount; // 누적
                return this.balance;
            }
            //출금
            withdraw(amount){
                this.balance -= amount;
                return this.balance;
            }
            //이체
            transfer(amount, otherAccount){
                this.balance -= amount;
                otherAccount.balance += amount;
                return this.balance;
            }
        }
        let leeAcc = new BankAccount('lee', 5000);
        let choiAcc = new BankAccount('choi', 10000);
        console.log(leeAcc.name, ":", leeAcc.balance);
        console.log(choiAcc.name, ":", choiAcc.balance);
        console.log(leeAcc.deposit(10000));
        console.log(leeAcc.name, ":", leeAcc.balance);
        console.log(leeAcc.withdraw(3000));
        console.log(leeAcc.transfer(10000, choiAcc));
        console.log(choiAcc.name, ":", choiAcc.balance);
    </script>
</body>
</html>

 

▷ 출력

 

◈ get, set

<!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>
        // 생성자 함수 : 클래스의 함수화
        // class, 생성자함수, 객체
        // 일반 함수와 생성자 함수는 별반 차이가 없음.
        // 1. 반드시 new를 통해 실행
        // 2. 반드시 함수 첫 글자를 대문자로 시작

        class PersonClass{
            constructor(first, last, age, addr){
                this.firstName = first;
                this.lastName = last;
                this.age = age;
                this.addr = addr;
            }

            get personInfo(){
                return `${this.firstName}, ${this.lastName} (${this.age}) : ${this.addr}`;
            }
        }
        // get을 호출시 ()가 없음.
        const my = new PersonClass('kim', 'minji', 20, 'seoul');
        console.log(my);
        console.log(my.personInfo);

        // 위의 클래스를 생성자 함수로 변환
        function PersonObject(first, last, age, addr){
            this.firstName = first;
            this.lastName = last;
            this.age = age;
            this.addr = addr;
            this.getPersonInfo = function(){
                return `${this.firstName}, ${this.lastName} (${this.age}) : ${this.addr}`;
            }
        }

        const my2 = new PersonObject('lee', 'minji', 23, 'seoul');
        console.log(my2);
        console.log(my2.getPersonInfo());

        // 객체로 생성
        const person = {
            firstName: '',
            lastName: '',
            age: '',
            address: '',
            setInfo: function(first, last, age, addr){
                this.firstName = first;
                this.lastName = last;
                this.age = age;
                this.addr = addr;
            },
            get personInfo(){
                return `${this.firstName}, ${this.lastName} (${this.age}) : ${this.addr}`;
            },
            set setFirstName(first){
                this.firstName = first;
            }
        };
        person.setInfo('park', 'minji', 25, 'seoul');
        console.log(person);
        // get, set은 둘 다 ()가 없음.
        console.log(person.PersonInfo);
        // set 설정
        person.setFirstName = 'lee';
        console.log(person.PersonInfo);
    </script>
</body>
</html>

 

▷ 출력

 

▣ 나이 출력

<!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>
        // class User 생성
        // name, birth를 받아서 멤버변수로 저장
        // get age() 나이를 리턴
        // status() 성인인지 미성년자인지 리턴 (콘솔에 출력)
        let day = new Date();
        today = Number(day.toLocaleDateString());
        let check = 0;
        
        class User{
            constructor(name, birth){
                this.name = name;
                this.birth = birth;
            }

            get age(){
                let birthday = new Date(this.birth);
                let todayYear = new Date().getFullYear();
                return todayYear - birthday.getFullYear();
            }
            status(){
                if(this.age < 20){
                    return '미성년자';
                }else{
                    return '성인';
                }
            }
        
        }
        const hong = new User('hong', '2009-09-30');
        console.log(hong.age);
        console.log(hong.status());

        const kim = new User('kim', '1990-01-01');
        console.log(kim.age);
        console.log(kim.status());
    </script>
</body>
</html>

 

▷ 출력

 

4. 예제 문제

◎ 문제

▶ 1번

구구단

 

◎ 정답

▶ 1번

<!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>
    <!-- 구구단 문제 -->
     <h1>
        <button type="button" id="startBtn">문제출제</button>
     </h1>
     <ol id="q"></ol>
     <h1>
        <button type="button" id="compareBtn">정답확인</button>
     </h1>
     <h3 id="printRatio"></h3>

     <script>
        //input.style.backgroundColor = 'green'
        //style을 객체의 속성으로 줄 때 camelCase로 변경하여 속성을 줌.
        //정답 Object ans1 ans2 ... 
        const ansObj = {}; //정답을 담을 객체
        //ansObj[`ans${i}`] = dan * incre;
        let quizArea = document.getElementById('q');
        let count=0; //전체개수
        let correct = 0; //정답개수

        document.getElementById('compareBtn').addEventListener('click',()=>{
            correct=0;
            count=0;
            
            while(count < 10){
                count++;
                // let userInput = document.getElementById(`userAns${count}`);
                let userInput = document.getElementById('userAns'+count);
                if(userInput.value == ansObj[`ans${count}`]){
                    correct++;
                    userInput.value += " : 정답!!";
                    userInput.style.backgroundColor = 'green';
                }else{
                    userInput.value += " : 오답!!";
                    userInput.style.backgroundColor = 'red';
                }
            }
            document.getElementById('printRatio').innerText = 
            `정답갯수 : ${correct}, 정답률 : ${(correct/count).toFixed(2)*100}%`;
        });

        document.getElementById('startBtn').addEventListener('click',()=>{
            count=0;
            document.getElementById('printRatio').innerText = "";
            let q = '';
            do{
                count++;
                let dan = Math.floor(Math.random()*8)+2;
                let incre = Math.floor(Math.random()*9)+1;
                let answer = dan * incre;
                ansObj[`ans${count}`] = answer;  //object에 정답 추가
                //값 뿌리기
                 q+= `<li>${dan} * ${incre} = <input type="text" id="userAns${count}"> </li>`; 
            }while(count < 10);
            quizArea.innerHTML = q;
            console.log(ansObj);
        });

     </script>

</body>
</html>

 

5. 느낀 점

구구단 문제를 풀 때 innerHTML를 이용해 input을 여러 개 생성을 하려는 파트에서 똑같은 id가 여러 개이면 인지를 못한다는 점을 몰라서 제대로 풀 지 못했었다. 오늘 내용을 복습하면서 ``, ${}를 중심으로 공부해야겠다고 생각했다.