Learn & Record

HTML CSS JavaScript (flex, direction, warp, justify-content, align, item, content, 연습문제, Boolean, 비교 연산자, 자료형 검사, var, let, const, 형변환) 본문

Dev/HTML CSS JS

HTML CSS JavaScript (flex, direction, warp, justify-content, align, item, content, 연습문제, Boolean, 비교 연산자, 자료형 검사, var, let, const, 형변환)

Walker_ 2024. 3. 26. 16:55

1. flex 자식 요소의 배치방법 지정하기

 - 특징은 float, inline-block 처럼 배치할 요소에 속성을 지정하는 것이 아니라 부모 요소(컨테이너)에 속성을 지정

 

 - display : flex - 자신은 블록 속성을 유지하면서 자식 요소에 flex 환경 설정

 - display : inline-flex - 자신은 인라인 속성으로 변경하면서 자식 요소에 flex 환경 설정

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        main {
            width: 100%;
            height: 100vh; /* vh : Vertical Height. 화면 기준 높이 */
            background: lightcyan;
        }
        section {
            border : 10px solid blue;
        }
        section article {
            width: 100px;
            height: 100px;
            background: aqua;
            border: 1px solid #000;
        }
        section {
            /*display: flex;*/
            display: inline-flex;
        }
    </style>
</head>
<body>
    <main>
        <section>
            <article></article>
            <article></article>
            <article></article>
            <article></article>
            <article></article>
        </section>
    </main>

</body>
</html>

 

 

 - flex-direction 

 - 자식 요소의 정렬 방향 변경하기

 - flex-direction : row - flex의 기본축을 가로로 지정. 주축을 가로로, 교차축을 세로로 지정. 기본값

 - flex-direction : column - flex의 기본축을 세로로 지정. 주축을 세로로 교차축을 가로로 지정.

 - flex-direction : row-reverse - 자식 요소 콘텐츠를 가로 역순으로 정렬

 - flex-direction : column-reverse - 자식 요소 콘텐츠를 세로 역순으로 정렬

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        main {
            width: 100%;
            height: 100vh; /* vh : Vertical Height. 화면 기준 높이 */
            background: lightcyan;
        }
        section {
            border : 10px solid blue;
        }
        section article {
            width: 100px;
            height: 100px;
            background: aqua;
            border: 1px solid #000;
        }
        /*
         */
        section {
            display: flex;
            flex-direction: column;
        }

    </style>
</head>
<body>
    <main>
        <section>
            <article>1</article>
            <article>2</article>
            <article>3</article>
            <article>4</article>
            <article>5</article>
        </section>
    </main>

</body>
</html>

 

 - float-warp :자식 요소에 줄바꿈 지정하기

 - float 속성을 사용하여 레이아웃을 만들 때 모든 자식 요소의 중 너비 값이

 - 부모 요소의 너비 값보다 크면 자동으로 줄 바꿈이 되지만

 - flex 속성에서는 flex-wrap을 설정해야 줄 바꿈을 쓸 수 있음

 

 

 - flex-wrap : nowrap - 자식 요소의 줄 바꿈을 하지 않음. 기본 값

 - flex-wrap : wrap - 자식 요소의 줄 바꿈을 함

 - flex-wrap : wrap-reverse : 자식 요소를 줄바꿈. 여러 줄이 되면 아래에서 위로 배치

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        main {
            width: 100%;
            height: 100vh; /* vh : Vertical Height. 화면 기준 높이 */
            background: lightcyan;
        }
        section {
            border : 10px solid blue;
        }
        section article {
            width: 100px;
            height: 100px;
            background: aqua;
            border: 1px solid #000;
        }
        /*
        
         */
        section {
            display: flex;
            /*

             */flex-flow : row wrap;
        }
    </style>
</head>
<body>
    <main>
        <section>
            <article>1</article>
            <article>2</article>
            <article>3</article>
            <article>4</article>
            <article>5</article>
            <article>6</article>
            <article>7</article>
        </section>
    </main>

</body>
</html>

 

 - flex-direction

 - 자식 요소의 정렬 변경하기

 - justify-content : 기본 축으로 정렬하기

justify-content - 기본 축으로 정렬하기
기본 축은 flex-direction 으로 변경

justify-content : flex-start - 자식 요소를 시작쪽부터 정렬
justify-content : flex-end - 자식 요소를 끝쪽부터 정렬
justify-content : center - 자식 요소를 가운데로 정렬

 - space-between : 자식 요소를 양끝부터 나눠서 정렬

 - space-around : 자식 요소의 여백을 균일하게 배분해서 정렬

 - space-evenly : 자식 요소의 여백을 양끝까지 균일하게 배분해서 정렬

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        main {
            width: 100%;
            height: 100vh; /* vh : Vertical Height. 화면 기준 높이 */
            background: lightcyan;
        }
        section {
            border : 10px solid blue;
        }
        section article {
            width: 100px;
            height: 100px;
            background: aqua;
            border: 1px solid #000;
        }
        /*
            justify-content - 기본 축으로 정렬하기
            기본 축은 flex-direction 으로 변경

            justify-content : flex-start - 자식 요소를 시작쪽부터 정렬
            justify-content : flex-end - 자식 요소를 끝쪽부터 정렬
         */
        section {
            height: 100%;
            box-sizing: border-box;
            display: flex;
            flex-flow: row wrap;
            justify-content: space-around;

        }
    </style>
</head>
<body>
    <main>
        <section>
            <article>1</article>
            <article>2</article>
            <article>3</article>
            <article>4</article>
            <article>5</article>
        </section>
    </main>

</body>
</html>

 

 

 - align-content, align-items : 반대 축으로 정렬하기

 - align-content : 자식 요소가 여러 개라서 줄 바꿈이 필요할 때

 - align-content : flex-start : 자식 요소를 시작 방향으로 정렬 

 - align-content : flex-end : 자식 요소를 종료 방향으로 정렬

 - align-content : space-around : 자식 요소들의 여백을 균일하게 배분해서 정렬

 - align-content : space-evenly : 자식 요소들의 여백을 양끝까지 균일하게 정렬

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        main {
            width: 100%;
            height: 100vh; /* vh : Vertical Height. 화면 기준 높이 */
            background: lightcyan;
        }
        section {
            border : 10px solid blue;
        }
        section article {
            width: 100px;
            height: 100px;
            background: aqua;
            border: 1px solid #000;
        }
        /*

         */
        section {
            height: 100%;
            box-sizing: border-box;

            display: flex;
            flex-flow: row wrap;
            flex-direction: column;

            justify-content: space-evenly;

            align-content: space-evenly;
        }
    </style>
</head>
<body>
    <main>
        <section>
            <article>1</article>
            <article>2</article>
            <article>3</article>
            <article>4</article>
            <article>5</article>
            <article>1</article>
            <article>2</article>
            <article>3</article>
            <article>4</article>
            <article>5</article>
        </section>
    </main>

</body>
</html>

 - align-content, align-items : 반대 축으로 정렬하기

 - align-items : 자식 요소가 1개이거나 줄바꿈이 필요없을 때

 - align-items : flex-start : 자식 요소를 시작 방향으로 정렬 

 - align-items : flex-end : 자식 요소를 종료 방향으로 정렬

 - align-items : center : 자식 요소를 가운데로 정렬

 - align-items : stretch : 플렉스 항목을 확장해 교차축을 꽉 채움. 기본 값

 - align-items : baseline - 시작점과 글자 기준선이 가장 먼 플렉스 항목을 시작점으로 배치

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        div {
            width: 600px;
            height: 600px;
            border: 1px solid #333333;
            align-items: center;
            margin: 50px;
        }
        span {
            width : 100px;
            height: 100px;
            background: red;
        }
        div {
            display: flex;
            justify-content: center;
            align-items: center;
        }
    </style>
</head>
<body>
    <div>
        <span></span>
    </div>
</body>
</html>

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body > div {
            border: 2px solid red;
            margin-bottom: 20px;
        }

        body > div > div {
            width: 100px;
            height: 100px;
            border: 2px solid;
            border-radius: 10px;
        }
    </style>
</head>
<body>
<!-- float, inline-block, flex 사용해서 요소를 수평으로 정렬하기 -->
<h2>요소를 수평으로 정렬하기</h2>

<h4>float 사용</h4>
<style>
    .div_one {
        height: 104px;
    }
.one {
float: left;
}
</style>
<div class="div_one">
    <div class="one">1</div>
    <div class="one">2</div>
    <div class="one">3</div>
</div>

<h4>inline-block 사용</h4>
<style>
.two {
    display: inline-block;
}
</style>
<div>
    <div class="two">1</div>
    <div class="two">2</div>
    <div class="two">3</div>
</div>

<h4>flex 사용</h4>
<style>
.div_three {
    display: flex;
}
</style>
<div class="div_three">
    <div class="three">1</div>
    <div class="three">2</div>
    <div class="three">3</div>
</div>
</body>
</html>

 

 

 - display : flex 추가

 - 컨테이너의 자식 요소에 넓이를 지정하지 않음

 

 - flex-direction이 row인 경우 (기본값)

 - 넓이를 지정하지 않은 경우 내부의 컨텐트에 따라 넓이가 정해짐. inline-block 속성과 유사 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    #container {
        border: 2px solid red;
    }
    .item{
        padding: 10px;
        margin: 10px;
        background: #0bd;
        color: #fff;
    }
    #container{
        display: flex;
    }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
    </div>

</body>
</html>

 

 

 - flex-direction : 자식 요소의 정렬 방향

 - row : 자식 요소를 왼쪽에서 오른쪽으로 배치. 기본 값

 - row-reverse : 자식 요소를 오른쪽에서 왼쪽으로 배치

 - cloumn : 자식 요소를 위에서 아래로 배치

 - column-reverse : 자식 요소를 아래에서 위로 배치

 

 - flex-direction이 column인 경우

 - 넓이를 지정하지 않은 경우 넓이가 100%로 정해짐. block 속성과 유사

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    #container {
        border: 2px solid red;
    }
    .item{
        padding: 10px;
        margin: 10px;
        background: #0bd;
        color: #fff;
    }
    /*
    flex-wrap : 자식 요소를 줄 바꿈

     */
    #container{
        display: flex;
        flex-wrap: wrap;
    }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
        <div class="item">Item 7</div>
        <div class="item">Item 8</div>
    </div>

</body>
</html>

 

 - flex-wrap : 자식 요소를 줄바꿈

 - 여러 줄로 지정할 경우에는 자식요소가 부모 요소의 너비를 넘는 경우 줄바꿈해서 여러 줄로 배치

 - flex-direction : cloumn 일 경우에는 적용이 안됨

 

 - flex-wrap: nowrap : 자식 요소를 줄바꿈 하지 않고, 한줄로 바꿈

 

 - justify-content : flex-start : 줄의 시작 지정에 배치. 왼쪽 맞춤. 

 - justify-content : flex-end : 줄의 끝부분에 배치. 오른쪽 맞춤

 - justify-content : center : 가운데 맞춤

 - justify-content : space-between : 왼쪽과 오른쪽 끝에 있는 요소를 끝에 붙히고, 남은 부분들은 균등 공간 형성 배치

 - justify-content : space-around : 왼쪽과 오른쪽 끝에 있는 공간도 포함해서 균등한 여백을 형성한 상태로 배치

 - justify-content : space-evenly : 항목들 간에 동일한 간격

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    #container {
        border: 2px solid red;
    }
    .item{
        padding: 10px;
        margin: 10px;
        background: #0bd;
        color: #fff;
    }
    /*
    flex-wrap : 자식 요소를 줄 바꿈

     */
    #container{
        display: flex;
        justify-content: flex-start;
    }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
    </div>

</body>
</html>

 

 - align-item : 수직방향 맞춤

 - 부모 요소에 빈공간이 있으면 자식 요소에 수직 방향으로 어떻게 맞출지 지정

 

 - align-items: flex-start : 부모 요소의 윗부분에 맞춰 배치

 - align-items: flex-end : 부모 요소의 아랫부분에 맞춰 배치

 - align-items: center : 중앙에 배치

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    #container {
        border: 2px solid red;
    }
    .item{
        padding: 10px;
        margin: 10px;
        background: #0bd;
        color: #fff;
    }
    /*
    flex-wrap : 자식 요소를 줄 바꿈

     */
    #container{
        display: flex;
        justify-content: space-evenly;
    }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
    </div>

</body>
</html>

 

 

 - align-item : 수직방향 맞춤

 - 부모 요소에 빈공간이 있으면 자식 요소에 수직 방향으로 어떻게 맞출지 지정

 

 - align-items : flex-start : 부모 요소의 윗부분에 맞춰 배치

 - align-items : flex-end : 부모 요소의 아랫부분에 맞춰 배치

 - align-items : center : 중앙에 배치

 - align-items : stretch : 부모 요소의 높이 또는 콘텐츠의 가장 높이가 높은 자식 요소의 높이에 맞춰 늘어남. 초기값

 - align-items: baseline : 베이스 라인에 배치

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    #container {
        border: 2px solid red;
    }
    .item{
        padding: 10px;
        margin: 10px;
        background: #0bd;
        color: #fff;
    }
    /*
    flex-wrap : 자식 요소를 줄 바꿈

     */
    #container{
        display: flex;
        align-items: baseline;
    }
    .item:nth-child(2){
        padding: 20px;
    }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
    </div>

</body>
</html>

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    #container {
        border: 2px solid red;
    }
    .item{
        padding: 10px;
        margin: 10px;
        background: #0bd;
        color: #fff;
    }
    /*

        * align-content : 여러 줄이 될 때의 맞춤
        자식 요소가 여러 줄이 됐을 때의 수직 방향 맞춤을 지정

        flex-wrap : nowrap이 적용이 되어 있다면 자식 요소가 한 줄이 되므로 align-content 속성이 아무의미가 없음
     */
    #container{
        width: 400px;
        height: 300px;
        
        display: flex;
        flex-wrap: wrap;
    }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
        <div class="item">Item 7</div>
        <div class="item">Item 8</div>
        <div class="item">Item 9</div>
        <div class="item">Item 10</div>
        <div class="item">Item 11</div>
        <div class="item">Item 12</div>
    </div>

</body>
</html>

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    * {
        margin: 0;
        padding: 0;
    }
    #container {
        border: 2px solid red;
    }
    .item{
        padding: 10px;
        margin: 10px;
        background: #0bd;
        color: #fff;
    }
    /*

        * align-content : 여러 줄이 될 때의 맞춤
        자식 요소가 여러 줄이 됐을 때의 수직 방향 맞춤을 지정

        flex-wrap : nowrap이 적용이 되어 있다면 자식 요소가 한 줄이 되므로 align-content 속성이 아무의미가 없음

        align-content : flex
     */
    #container{
        width: 400px;
        height: 300px;

        display: flex;
        flex-wrap: wrap;
        align-content: stretch;
    }
    </style>
</head>
<body>
    <div id="container">
        <div class="item">Item 1</div>
        <div class="item">Item 2</div>
        <div class="item">Item 3</div>
        <div class="item">Item 4</div>
        <div class="item">Item 5</div>
        <div class="item">Item 6</div>
        <div class="item">Item 7</div>
        <div class="item">Item 8</div>
        <div class="item">Item 9</div>
        <div class="item">Item 10</div>
        <div class="item">Item 11</div>
        <div class="item">Item 12</div>
    </div>

</body>
</html>

 

 


연습문제

 - reset.css 파일 생성

 - 이미지 사이즈로 부터 넓이가 1600px 확인

 - 로고는 <h1>, 네비게이션 <nav>, 본문은 <section>으로 전체 레이아웃 작업

 - 전체 레이아웃에 css 적용, 임시로 배경과 높이를 지정해 레이아웃이 틀린 것이 없는지 확인

 

 

자바 스크립트

 - 기본 자료형 : 불 boolean
 - 참과 거짓 두 가지 값만 가지는 자료형

 

 - 비교 연산자

 - == : 양쪽이 같다

 - !== : 양쪽이 다르다

 - > : 왼쪽이 더 크다

 - < : 오른쪽이 더 크다

 - >= : 왼쪽이 더 크거나 같다

 - <= : 오른쪽이 더 크거나 같다

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <script>
        console.log(1 == 2); // false 양쪽이 같다.
        console.log(1 !== 2); // true 양쪽이 다르다
        console.log(1 > 2); // false 왼쪽이 크다.
        console.log(1 < 2); // true 오른쪽이 크다.
        console.log(1 >= 2); // false 왼쪽이 크거나 같다.
        console.log(1 <= 2); // true 오른쪽이 크거나 같다.

        // 문자열에도 비교 연산자 사용 가능. 내림차순 값이 크다.
        console.log('강아지' > '냐옹이'); // false

        // 논리 부정 연산자(!)
        // 값을 반대로 바꿈
        console.log(!true); // false
        console.log(!false); // true
    </script>

</body>
</html>

 

자료형 검사 : 자료형을 확인 할 때 typeof 연산자 사용

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        /*
        자료형 검사 : 자료형을 확인할 때 typeof 연산자 이용
         */
        let num = 10;
        console.log(num);
        num='하이';
        // typeof 연산자 사용 : typeof(자료)
        console.log(typeof ('안녕하세요')); // string
        console.log(typeof (100)); // number
        console.log(typeof (true)); // boolean

        // 괄호가 없어도 됨 : typeof연산자라서 가능
        console.log(typeof '안녕하세요') // string
        console.log(typeof 100) // number
        console.log(typeof true) // boolean

        console.log(typeof "안녕하세요" === "string"); // true '안녕하세요'의 자료형이 string
        console.log(typeof ("안녕하세요") === "string"); // true '안녕하세요'의 자료형이 string
        console.log(typeof ("안녕하세요" === "string")); // boolean '안녕하세요' === 'string'의 결과값은 false. 즉 boolean

        // 자바 스크립트에서는 변수에 함수를 할당하는 것이 가능
        // 즉, 함수도 하나의 자료형임
        let fun = function () {
            console.log('hello');
        }
        fun();
        console.log(typeof fun); // function
    </script>
</head>
<body>

</body>
</html>

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        /* undefined 자료형 */
        'use strict'; // 엄격 모드

        // 상수와 변수로 선언하지 않은 식별자의 자료형은 undefined
        console.log(typeof(a)); // undefined

        // 변수를 선언하면서 값을 지정하지 않은 경우 식별자의 자료형은 undefined
        // 상수는 선언할 때 반드시 값을 지정해야 하므로 값이 없는 상수는 존재하지 않음
        let b;
        console.log(typeof (b)); // undefined

        c = 100;
        console.log(typeof(c));

    </script>
</head>
<body>

</body>
</html>

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        /*
        변수 : 데이터를 저장하는 장소

        * 식별자
        변수명은 반드시 식별자의 일반 문법을 준수해야 함
        1) 유니코드 문자, 숫자, _(언더바), $ 문자로 구성
        2) 유니코드 문자를 사용할 수 있으나 가급적 영문자만 사용
        3) 숫자는 첫번째 문자가 될 수 없음
        4) $ 문자로 시작하는 이름은 보통 도구나 라이브러리에서 사용하기 떄문에 가급ㅈ거 사용하지 말것

        자바스크립트는 카멜법을 사용
         */
        var num = 10; // var : 변수 선언을 의미
        var str = 'javascript'
        var temp = true;

        document.write(num + '<br>' + str + '<br>' + temp + '<br><br>')

        // 여러 개의 변수를 선언할 경우 다음과 같은 방법으로 선언 가능
        var num, str, temp;
        num = 20;
        str = 'ECMascript'
        temp = false;

        document.write('$(num)<br> $(str)<br> ${temp}<br><br>')

        var num =30, str='jquery', temp = true;
    </script>
</head>
<body>

</body>
</html>

 

var를 이용한 변수 선언의 문제점

 - 기존의 자바스크립트에서는 var를 이용해 변수를 선언

 - 그러나 var로 변수를 선언하는 것은 몇 가지 문제점이 있어서 모던 자바스크립트 개발에서는 거의 이용되지 않음

 - 그 문제점 1) 변수를 덮어 쓸 수 있다는 점과 2) 다시 선언 (재선언) 할 수 있다는 점

 

 - var로 선언한 변수를 덮어쓰거나 재선언하는 예

var val1 = 'var 변수'
console.log(val1)

// var 변수는 덮어쓰기 가능
val1= 'var 변수 덮어 쓰기';
console.log(val1)

// var 변수는 재선언 가능
var var1 = 'var 변수를 재선언'
console.log(val1)

 

 - 덮어쓰기 가능

 - 한 번 정의한 변수에 다른 값을 대입할 수도 있음

 - 덮어 쓰고 싶을 때도 많지만 프로그램을 작성하다 보면 덮어 쓰고 싶지 않을 때도 많기 때문에 무조건 덮어 쓰는 것은 좋지 않음

 

 - 재선언 가능

 - 완전히 같은 변수명을 여러 위치에서 변수를 정의할 수 있음

 - 프로그램 실행 순서에 따라 어느 변수가 사용되는지 해석하기 어려우므로 재선언은 기본적으로 안되는 편이 좋음

 

 - 변수 선언에 var만 사용하는 경우 프로젝트 규모가 커짐에 따라 의도치 않은 시점에 변수를 덮어 쓰거나 재선언하는 등의 문제가 발생

 - 그래서 ES2015에서는 새로운 변수 선언 방법으로 const와 let이 추가

 

 

 

 - let을 이용한 변수 선언

 - let로는 재선언 할 수 없음

 - 단, let은 변수를 덮어 쓸 수는 있음

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        let val2 = 'let 변수'
        console.log(val2)

        val2 = 'let 변수 덮어 쓰기'
        console.log(val2)

        // 재선언 실행
        let val3 = 'let 변수'
        console.log(val3)

        // let은 재선언 불가능
        let val3 = 'let 변수 재선언' // 에러
        // let.html:18 Uncaught SyntaxError: Identifier 'val3' has already been declared
        // 이미 선언되어 재선언 할 수 없다는 메시지

        // 이렇게 let은 var를 이용했을 때 문제가 되었던 재선언을 개선한 변수 정의 방법
        // 덮어 쓰기를 허가만 할 변수는 let을 이용해야 함
    </script>
</head>
<body>
</body>
</html>

 

 - const를 이용한 변수 선언

 - const는 재선언, 덮어 쓰기가 모두 불가능한 가장 엄격한 변수 선언 방법

 - constant (상수)라는 의미에서 이런 이름을 사용

 - 다음은 const로 정의한 변수를 덮어 쓰려고 할 때의 예

 

 - const를 이용한 변수 선언은 덮어 쓰기를 사전에 감지해서 알려주기 때문에 '실수로 덮어쓰는' 사태를 피할 수 있음

 - 물론 let과 마찬가지로 재선언을 해도 에러가 발생

 

 - 그러나 변수 종류에 따라 const로 정의해도 변수값을 변경할 수 있는 경우가 있으므로 주의

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        const val1 = 'const 변수'
        console.log(val1)

        // const 변수를 덮어 쓰기 불가능
        val1 = 'const 변수 덮어 쓰기'
        // Uncaught TypeError: Assignment to constant variable.

        /*
        const
         */
    </script>
</head>
<body>

</body>
</html>

 

 - const로 정의한 변수를 변경할 수 있는 예

 - 문자열이나 수치 등 프리미티브 타입 primitive type 종류의 데이터는 const를 이용해 정의한 경우 덮어쓰기 가능

 - 하지만 객체나 배열 등 오브젝트 타입 object type 이라 불리는 데이터들은 const로 정의해도 도중에 값을 변경 가능

 

 - 프리미티브 타입 primitive type

 - boolean, number, String, undefined, null, Symbol

 - 오브젝트 타입

 - 객체, 배열, 함수 등 프리미티브 타입 이외의 것

 

 - const를 이용해 정의한 객체의 속성값을 변경, 추가하는 예

 - 객체 정의

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        const obj1 ={
            name: '길동',
            age: 24
        }
        console.log(obj1)

        // 속성값 변경
        obj1.name = 'tom';
        console.log(obj1)

        // 속성 추가
        obj1.address = 'daegu'
        console.log(obj1)

        // address : 'daegu', age:24, name:'tom'
        // const로 정의해도 객체 내용은 자유롭게 변경할 수 있음
        // 즉, 객체를 정의할 때는 기본적으로 const를 이용

        // 재할당은 에러가 남
        // obj1 = {
        //     name: '길동',
        //     age: 24
        // }

        // const를 이용해 정의한 배열 값을 변경, 추가 하는 예
        // 배열 정의
        const arr1 = ['dog', 'cat']
        console.log(arr1);

        // 값 변경
        arr1[0] = 'bird'
        console.log(arr1)

        // 값 추가
        arr1.push('monkey')
        console.log(arr1)
        // 배열도 const를 이용해 정의했어도 값은 자유롭게 변경할 수 있음
        // 따라서 배열 역시 기본적으로 const를 이용해 정의
    </script>
</head>
<body>

</body>
</html>

 

숫자 자료형으로 변환하기
다른 자료형을 숫자 자료형으로 변환할 때는 Number() 함수를 사용

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        /*
        숫자 자료형으로 변환하기
        다른 자료형을 숫자 자료형으로 변환할 때는 Number() 함수를 사용
         */
        // prompt로 입력을 받으면 기본형이 문자열
        const rawInput = prompt('inch 단위의 숫자를 입력해주세요.'); // 숫자를 입력
        console.log(typeof rawInput); // string

        // 입력받은 데이터를 숫자형으로 변경하고 cm 단위로 변경
        const inch = Number(rawInput)
        console.log(typeof inch) // Number
        const cm = inch * 2.54;

        // 출력
        alert(inch + 'inch는 ' + cm + 'cm 입니다.');
        alert(`${inch}inch는 ${cm}cm 입니다.`)
    </script>
</head>
<body>

</body>
</html>

 

 - 연습문제

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        const rawInput = prompt('cm 단위의 숫자를 입력해주세요.')
        const cm = Number(rawInput)
        const inch = cm / 2.54

        alert(`${cm}cm는 ${inch}inch 입니다.`)
    </script>
</head>
<body>

</body>
</html>

 

 - 자료형변환

 - Boolean으로 Number을 형변환 시 0이 아니면 모두 True가 나온다

문자열을 불린으로 형변환. 빈 문자열은 false, 나머지는 true

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        /*
        * 자료형 변환

         */
        var number = 100;
        console.log(typeof(number)) // number

        number = String(number); // 숫자 자료형을 문자 자료형으로 변환
        console.log(typeof(number)) // string
        console.log(number) // 100

        // 불 자료형으로 변환하기 : Boolean() 함수 사용
        var number = 200; // var의 경우에는 중복 선언이 가능하다. 이전 것이 무효화 된다
        console.log(typeof(number)) // number
        console.log(number) // 200

        number = Boolean(number)
        console.log(typeof(number)) // boolean
        console.log(number); // true

        let num = 0;
        console.log(typeof(num)) // number
        console.log(num) // 0

        num = Boolean(num);
        console.log(typeof(num)) // boolean
        console.log(num) // false. 0은 false로 변환

        // 문자열을 불린으로 형변환. 빈 문자열은 false, 나머지는 true
        let string2 = 'hello'
        console.log(typeof(string2)) // string

        string2 = Boolean(string2)
        console.log(typeof(string2)) // boolean
        console.log(string2) // true

        let string3 = '';
        console.log(typeof(string3)) // string

        string3 = Boolean(string3);
        console.log(typeof(string3)) // boolean
        console.log(string3) // false
    </script>
</head>
<body>

</body>
</html>

 


공부 과정을 정리한 것이라 내용이 부족할 수 있습니다.

부족한 내용은 추가 자료들로 보충해주시면 좋을 것 같습니다.

읽어주셔서 감사합니다 :)