Front-end/Js

Js 설정 및 기초(function, event) - AWS 풀스택 과정 16일차

awspspgh 2024. 8. 5. 20:32

오늘은 Java Script의 function, event에 대해서 공부해보겠습니다

 

목차
1. 설정
2. let
3. function
4. event
5. operators
6. 느낀 점

 

1. 설정

- VSCode에서 파일 생성하고 파일명 뒤에 .js를 붙입니다

 

- 웹 사이트에서 F12를 누른 후 console에서 출력된 값과 Error를 찾을 수 있습니다

 

 

2. let

- 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>
    <!-- 자바 스크립트 파일 연결 -->
    <script src="01_let.js"></script>
    <script> // 자바 스크립트 안(주의)
        console.log("head 태그 안 자바 스크립트 작성")
    </script>
    <style>
        /* css영역 */
    </style>
</head>
<body>
    <script>
        // 자바 스크립트 안 (주의)
        console.log("body 태그 상단 자바 스크립트 작성")
    </script>
    <h1>자바 스크립트 사용법</h1>
    <ol>
        <li>&lt;script&gt; 작성 &lt;/script&gt; </li>
        <li>파일명.js 파일을 만들어서 코드 작성 후 src 경로로 연결</li>
        <li>hearder 안에도 script 작성가능 (사용시 주의)</li>
        <li>body 태그 내 가장 하단에 script를 위치시켜 작성 (가장 많이 사용)</li>
        <li>마지막 끝처리 ; (필수사항은 아님.)</li>
    </ol>
    <!-- 자바 스크립트 파일 연결 -->
     <script src="파일연결.js"></script>
     <script> 
    //  직접작성(일반적)
        console.log("body 태그 상단 자바 스크립트 작성")
     </script>
</body>
</html>

 

- Js

/* 
주석 외부파일 자바 스크립트
*/ 
console.log("외부파일 자바 스크립트 작성")

function mySecondFunction(){
    console.log("두 번째 함수 외부 let.js 파일에 위치")
}

 

▷ 출력

 

<!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>
    <ul>
        <li>값을 담고 있는 메모리 공간의 이름</li>
        <li>java => 자료형 변수명 (int, double, float, long ... 8개의 자료형)</li>
        <li>자바 스크립트는 변수를 선언하는 역할만 함.(자료형이 없음)</li>
        <li>var(비권장), let, const</li>
        <li>var 변수의 중복선언이 가능</li>
        <li>
            var a = 10;
            var a = [10,20,30]; => 가능
        </li>
        <li>
            let은 중복선언 불가능, 재할당은 가능
            자바에서 사용되는 지역변수의 개념
        </li>
        <li>
            let name = '홍길동';
            name = '김영이'; => 재할당 가능 o
            let name = '박순이'; => 재선언 불가능 x
        </li>
        <li>
            const : 중복선언 불가능, 재할당도 불가능
            const name = "홍길동";
            name = "김영이"; => 재할당 불가능 x
        </li>
        <li>const : 고정된 값을 사용하는 규칙, 객체, 엘리먼트 정의시 사용</li>
        <li>
            스코프(scope) : 사용범위(변수의 사용범위)
            { } 안에서만 사용가능
            스코프를 벗어나면 재선언 가능
        </li>
    </ul>
    <script>
        // 변수 선언
        // camelCase : java, c에서 주로 사용 / JS에서도 사용
        // 변수명으로 선언할 값이 여러 단어를 복합한 값일 경우
        // myFirst
        // 자바스크립트에서 문자값 '', "" 둘 다 가능 (짝은 맞춰야 함.)
        // 변수 안의 문자는 '' 일반적
        let myFirst = 'hong';
        console.log(myFirst);
        myFirst = 'kim';
        console.log(myFirst);

        // 선언없이 변수 사용 가능(java, C는 불가능)
        // 선언없이 변수를 사용하면 그 변수는 전역변수로 사용되어 영향을 미치므로
        // 가급적 사용X
        mySecond = 100;
        console.log(mySecond);
        /*
            자바에서는 문자열 => "문자열로 인식", char ch = 'c'; '한 문자만 가능'
            자바 스크립트의 문자열
            "문자열로 인식" => 큰따옴표(더블 쿼테이션)
            '문자열로 인식' => 작은따옴표(싱글 쿼테이션)
            `문자열로 인식` => 백틱(자주 사용함 특별한 기능이 있음)
        */

        // 변수명은 숫자로 시작할 수 없음
        // 상수 : 한 번 선언 시 값을 변경하지 않고 사용 => const
        // 상수는 대문자로 선언
        const MY_NAME = 'HONG';
        console.log(MY_NAME);
        // MY_NAME = 'KIM';    error

        // typeof : 해당 변수의 타입을 확인
        console.log(typeof myFirst);
        // 백틱 : `` 내부에 변수명을 삽입하여 사용 가능. ${변수명}
        console.log('내 이름은' + myFirst + "입니다.");
        console.log(`내 이름은 ${myFirst}입니다.`);

        // 이름, 나이, 주소의 변수 선언 후 값을 넣고
        // 콘솔에 출력 내 이름은 OOO, 나이는 OO, OOO에 살고 있습니다.
        let myName = 'AAA';
        let myAge = 'BB';
        let myAddress = 'CCC';
        console.log('내 이름은 ' + myName + ', 나이는 ' + myAge + ', ' + myAddress + '에 살고 있습니다.')
        console.log(`내 이름은 ${myName}, 나이는 ${myAge}, ${myAddress}에 살고 있습니다.`)

    </script>
</body>
</html>

 

▷ 출력

 

◈ date type

<!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>
    <ul>
        <li>숫자 : Number => 정수, 실수, NaN(not a Number : 숫자가 아님)</li>
        <li>문자 : String => "", '', `` 감싼 데이터</li>
        <li>불리언 : Boolean => true / false</li>
        <li>
            객체 : Object => 1개 이상의 데이터가 특정 구조를 가지고 있는 형태
            {키 : 값} {} : 아무값이 없어도 1개의 객체로 취급
        </li>
        <li>
            배열 : Array => [1,2,3] 형태의 집합
            (java/python list와 같은 형태 index(순서) length(길이)가 있음)
        </li>
        <li>알 수 없는 값 : null => 인지가 안 된 상태</li>
        <li>미지정된 값 : undefined => 선언은 되었지만 값이 할당되지 않음</li>
    </ul>
    <script>
        let num = 123;
        let str = 'string';
        let bool = true;
        let obj = {name:'hong'}; // 많이 사용
        let obj2 = new Object(); // 자바 스크립트에서 제공하는 내장 객체
        let arr = [1,2,3,4]; // 많이 사용
        let arr2 = new Array();
        let undi = undefined;
        let ne = null;
        let undi2;
        console.log(undi2);
        console.log(obj);
        console.log(typeof obj);
        console.log(obj2);
        console.log(arr);
        console.log(typeof arr);
    </script>
    <ol>
        <li>
            기본자료형 : 값이 메모리에 주소값을 가르키는 곳에 직접 할당이 되어있는 값
            number, boolean, string(참조자료형이지만 편의상 기본자료형과 같이 사용)
        </li>
        <li>
            참조자료형 : 값이 저장되어 있는 주소를 할당(간접할당)
            string, array, object, function, null, undifind
        </li>
        <li>
            == 같다(값만 비교) != 같지 않다
        </li>
        <li>
            === 같다(값과 타입이 같은지 비교) !== 같지 않다
        </li>
        <li>
            삼항연산자 => (조건식) ? true : false
        </li>
    </ol>
    <script>
        let num1 = '10'
        let num2 = 10;
        console.log(num1 === num2 ? "t" : "f");
    </script>
</body>
</html>

 

▷ 출력

 

3. 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>
    <h1>함수(function) : 특정 기능을 수행하기 위해 작성한 코드</h1>
    <ul>
        <li>함수는 호출되어야만 실행(자바의 method와 같은 의미)</li>
        <li>자바는 class => method 생성</li>
        <li>자바 스크립트는 어디서든 function 생성 가능</li>
    </ul>
    <ul>
        <li>function이라는 키워드를 사용하여 정의</li>
        <li>
        function 함수명(파라미터){
            로직 작성;   
            return 값;
        }
        </li>
        <li>
            함수명 : 기능을 함축하는 의미로 작성
        </li>
        <li>
            파라미터(매개변수) : 선택적으로 작성(없어도 ()는 있어야 함.)
        </li>
        <li>
            자바 스크립트에서는 파라미터의 자유도가 높아 다양한 형태로 사용가능.
        </li>
        <li>
            return 함수 종료의 역할과 동시에 특정 값을 호출한 위치로 반환
        </li>
    </ul>
    <!-- <script>               
        console.log('다른 자바 스크립트 영역');          
        myFirstFunction();                        선언되기 전에 호출함 error
    </script> -->

    <!-- 함수 호출 전에 미리 링크 연결 -->
    <script src="01_let.js"></script>
    <script>
        // 함수 선언 전 호출
        console.log("myFirstFunction 함수 선언전 호출")
        myFirstFunction();

        // 함수 정의
        function myFirstFunction(){
            console.log("내가 처음 만든 함수 body 하단 스크립트 위치")
        }

        // 호출
        myFirstFunction();

        // let.js안의 함수 호출
        mySecondFunction();

        // sum 함수를 생성 
        // 파라미터 숫자 2개를 받아서 콘솔에 두 수의 합계를 출력하는 함수
        function sum(a, b){
            console.log(`두 수의 합 : ${a + b}`);
        }
        sum(10, 20);

        function sum1(a, b){
            return a+b;
        }
        let num1 = 10
        let num2 = 20
        let s = sum1(num1, num2);
        console.log(s);
        </script>

    <!-- 이 위치에서는 함수 인지가 안 됨. -->
    <!-- <script src="01_let.js"></script> -->
    <script>
        console.log('다른 자바 스크립트 영역');
        myFirstFunction();
    </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>
    <ul>
        <li>파라미터 : 함수 내부에서 사용될 값을 외부에서 전달 받는 값</li>
        <li>파라미터의 개수는 제한이 없으나, 많으면 관리가 힘듦</li>
        <li>파라미터의 타입도 제한이 없음 전달된 타입을 그대로 사용</li>
        <li>
            파라미터의 변수명은 외부 변수명과 같아도 상관없고, 달라도 상관없음
            함수 내부에서 사용될 값이므로 함수 내부의 지역변수와 이름이 다르기만 하면 됨
        </li>
        <li>
            return의 유무에 따라 값을 리턴할 수 있고, 종료 시점도 결정
        </li>
    </ul>
    <script>
        let myName = "홍길동"; // js 스크립트 안에서의 변수

        function callName(name){
            // 파라미터명 : name
            let yourName = "김영이"; // function 내부 변수

            console.log(`나의 이름은 : ${myName}`); //외부변수
            console.log(`너의 이름은 : ${yourName}`); //내부변수
            console.log(`친구 이름은 : ${name}`); //파라미터
        }

        callName("박순이");
        console.log(`나의 이름은 : ${myName}`); //외부변수
        // console.log(`너의 이름은 : ${yourName}`); //내부변수
        console.log(`친구 이름은 : ${name}`); //파라미터
        
        // return이 있는 함수는 return 값을 받을 변수가 필요함.

        function sum(a, b){
            return a+b;
        }
        let result = sum(10,20);
        console.log(result);

        // 표현식 함수
        const myFunc = function(name2){
            return "Hello~!! " + name2;
        }

        let result2 = myFunc('hong');
        console.log(result2);

        // 화살표 함수(Arrow Function)
        const arrowFunc =(param1, param2) => {
            return param1 + param2;
        }
        let arrowResult = arrowFunc(100,200);
        console.log(arrowResult)

        const arrowFunc2 = (p1, p2) => (p1 + p2);
        let arrowResult2 = arrowFunc2(1000, 2000);
        console.log(arrowResult2);

        const arrowFunc3 = (p1, p2) => {
            console.log(p1 + p2);
        }
        arrowFunc3(3, 5);
    </script>
</body>
</html>

 

▷ 출력

 

◈ object

<!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>Object : 객체</h1>
    <ul>
        <li>Object : 데이터의 구조를 상세 특징으로 표현하려는 형식</li>
        <li>
            const로 선언하는 것이 일반적
            : 객체의 구조를 보호. 지속력있게 유지 및 확보하기 위함
        </li>
        <li>{키(속성명) : 값, 키 : 값, 키 : 값, ...}</li>
        <li>속성명 : key, 값 : value</li>
        <li>같은 Object안의 같은 속성명은 불가능 (key는 중복불가능)</li>
        <li>객체 내부에서 속성값으로 사용될 수 있는 데이터는 제한이 없다</li>
        <li>
            객체의 속성값으로 익명함수를 정의 => 메서드라고 부름
            메서드의 이름은 속성명이 됨
        </li>
    </ul>
    <script>
        const car={
            name: 'myCar',
            year: 2024
        };
        console.log(car);
        // car = 100; 재할당 불가능
        let myCar={
            name: 'mySuperCar',
            year: '2024'
        }
        console.log(myCar);
        // let으로 객체 정의가 가능은 하지만 일반적이지 않음.
        // 객체의 기능이 사라짐. - 객체를 활용하려고 했던 목적이 사라짐
        myCar = 100;
        console.log(myCar);
        console.log("-----------------------");

        const me = {
            name : 'AAA',
            age : 20,
            address : 'BBB',
            isDeveloper: true,
            'hobby':'coffee',
            'myFavor':'game',
            avail:{
                year : 2020,
                title : 'javaScript',
                ver : 'ES6+',
                profect: 'Back-End',
                intro:function(title, ver){
                    console.log(`ex1) ${title} : ${ver}`); //함수 내부에 해당 변수가 없음.
                    console.log(`ex2) ${this.title} : ${this.ver}`);
                    console.log(`ex2) ${me.avail.title} : ${me.avail.ver}`);
                }
            }
        };
        console.log(me);
        console.log(me.name);
        console.log(me.address);
        console.log(me.avail.title);
        console.log(me.avail.intro);
        me.avail.intro('java', 'JDK11'); // 함수를 실행
        console.log("---------------");
        console.log(me['address']);
        console.log(me['hobby']);
        console.log(me['avail']['title']);
        me['avail']['intro']('java', 'JDK8');

        let keyName = 'name';
        console.log(me.keyName); // undefined
        console.log(me['keyName']); // keyName이 변수값으로 들어올 경우 사용

        // 객체 생성
        // 좋아하는 가수의 인적사항, 가수의 플레이리스트 3곡
        // 이름, 나이, 주소, 플레이리스트 객체, 함수(p1, p2, p3) => console에 출력
        // 출력
        // 이름(나이), 주소
        // 가수의 노래 : 플레이리스트 3곡
        // 함수 실행

        const musician ={
            name : 'ChungHa',
            age : 28,
            address : 'Seoul',
            playList :{
                first : 'Roller Coaster',
                second : '벌써 12시',
                third : 'Play',
            },
                jukebox : function(first, second, third){
                    console.log('가수의 노래: ' + first + ', ' + second + ', ' + third)
                    console.log(`가수의 노래: ${this.first}, ${this.second}, ${this.third}`)
                }
        }
        let p1 = "why don't you know";
        let p2 = "Love u";
        let p3 = "snapping";
        console.log(`${musician.name}, ${musician.age}, ${musician.address}`);
        musician.jukebox(p1, p2, p3)

    </script>
</body>
</html>

 

▷ 출력

 

4. event

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .s{
            background-color: bisque;
            color: grey;
        }
    </style>
</head>
<body>
    <h1>이벤트 객체 : 전역객체로서 모든 태그에 객체를 참조시킬 수 있다.</h1>
    <ul class="uls">
        <li>
            a tag / button tag에 이벤트를 참조시켜 사용
            클릭에 대한 반응을 기대할 수 있게 만드는것이 일반적
        </li>
        <li>
            a tag는 자체 이동 (href 속성)이 구현
            별도로 이동을 막는 코드가 필요
        </li>
        <li>
            객체에 이벤트를 부여하는 방식이 크게 3가지
        </li>
        <li>
            각자 목적과 작동방식이 다름
        </li>
    </ul>
        <ul class="uls">
            <li>
                화면에 출력 영역을 document(영역 / 객체)라고 한다.
            </li>
            <li>
                DOM 영역
            </li>
            <li>
                tag : html element, 속성은 attribute, 일반 텍스트 textNode라고 함
            </li>
            <li>
                html 객체를 가져올 때 
                id 속성으로 가져오기 : getElementById('idName')
                class 속성으로 가져오기 : querySelector('selector') => . #
            </li>
            <li>
                html 화면에 출력할 때
                html element로 출력 : innerHtml라는 property를 사용
                일반 텍스트로 출력 : innerText라는 property를 사용
            </li>
        </ul>
        <button onclick="eventFun()">클릭해보세요.</button>
        <button onclick="eventFun2()">클릭해보세요.</button>
        <button onclick="eventFun3('세 번째 버튼입니다.')">클릭해보세요.</button>
        <br>
        <button id="btn">button</button>
        <button id="test">test</button>

        <h1 id="printResult"></h1>

        <script>
            const printResult = document.getElementById('printResult');
            console.log(printResult);
            
            //onclick = 하나의 이벤트만 등록가능.
            const test = document.getElementById('test');
            test.onclick = function(){
                alert("Hi~!!");
            }

            //button #btn 객체 가져오기
            document.getElementById('btn').addEventListener('click', ()=>{
                // addEventListerner 씌우는 방법
                // 여러 개의 이벤트를 등록할 수 있음. (자주 사용)
                alert('button click !!');
            })

            function eventFun(){
                printResult.innerText='첫 번째 버튼을 클릭했습니다.';
            }
            function eventFun2(){
                printResult.innerHTML=`<span class="s">두 번째 버튼을 클릭했습니다.</span>`;
            }
            function eventFunc3(param1){
                printResult.innerHTML=`<span class="s">${param1}</span>`;
            }

            const ul = document.querySelectorAll('.uls');
            console.log(ul);
            console.log(ul[0]);
            console.log(ul[1]);
        </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태그에 표시 -->
     <button id="btn">button</button>
     <h1 id="h1"></h1>

     <script>
        const btn = document.getElementById('btn');
        const h1 = document.getElementById('h1');
        btn.addEventListener('click', ()=>{
            h1.innerText='ABC';
        })
     </script>
</body>
</html>

 

▷ 출력

 

5. operators

<!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>
    <ul>
        <li>산술연산자 : 사칙연산(+ - * /), 나머지(%), 제곱(**) 등..</li>
        <li>
            대입연산자 : = += *= -= 자체값을 연산하여 다시 대입
            a = b : a 변수에 b 변수의 값을 대입하라
            a += b : a 변수에 a + b 값을 대입하라 a = a + b
        </li>
        <li>
            비교연산자 : 이상(>=), 이하(<=), 초과(>), 미만(<), 같다(==), 다르다(!=)
            비교연산자의 결과는 항상 true / false
        </li>
        <li>
            논리연산자 : and(&&), or(||), not(!)
        </li>
        <li>
            증감연산자 : ++(1씩 증가) --(1씩 감소)
        </li>
        <li>
            비트연산자 : 웹 분야에서는 활요도가 낮음.
        </li>
        <li>
            삼항연산자 : (조건식) ? true : false
        </li>
    </ul>
    <script>
        let kor = 90;
        let eng = 100;
        let math = 78;

        let sum = kor + eng + math;
        console.log(sum);
        let avg = sum / 3;
        // 각 점수를 표시하고, 세 점수의 합계하고 평균을 출력
        console.log(`국어: ${kor}, 영어: ${eng}, 수학: ${math}, 합계: ${sum}, 평균: ${avg}`);
    </script>
</body>
</html>

 

6. 느낀 점

Java와 Java Script가 서로 다른 언어라는 것은 알고 있었지만 기본적인 용어부터 확실히 다른 점이 이해하는 것에서 어려움을 느꼈고 Html, Css를 번갈아가면서 같이 코딩을 하다보니 헷갈리기도 했다. 꼭 복습을 여러 번 해야할 것 같다.