프론트엔드 수업

VS code 설치 

https://code.visualstudio.com/

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

* extension 설치 

** 설치 팩 **

한글 팩 

Open In Default Browser

 

** 웹 페이지의 구조를 만들기 → HTML 

** 디자인 측면 → CSS

** 프로그램 → JavaScript ⇒ 영상처리 소프트웨어 (미니 프로젝트 Ver 1)

 

## HTMl &JavaScript 를 코딩하기 위한 IDE (통합 개발 환경)  ## 

WebStorm → 유료 

Visual Studio Code + 크롬(=엣지) → MS 무료

## HTML >> HTML 4.0 >> HTML5 (동영상 , 게임, 파일 ...)

## HTML의 문제점 :  다양한 기능을 위해서 플러그인이 필요함 (Flash, ActiveX)

  -->  <!DOCTYPE html> html 5까지 확장 

* HTML5의 기능 

  • 웹 폼 (Web Form)
  • 오디오 , 비디오 (Audio/Video)
  • 캔버스(Canvas)
  • SVG(Scalable Vector Graphics)
  • 웹 스토리지 (Web Storage)
  • 웹 SQL 데이터베이스 (Web SQL database)
  • 인덱스 데이터베이스 (Indexed Database API)
  • 파일 입출력 (File I/O)
  • 위치정보 API (Geolocation API)
  • 웹 워커 (Web Worker)
  • 웹 소켓 (Web Socket)
  • 오프라인 웹 애플리케이션 (Offline Web Application)

- 컴퓨터 : H/W +S/W

- H/W : CPU, RAM, DISK

- S/W : OS, P/L(C, C++), App

- 가상 머신 : Windows Server 2016/2022

- 웹 프로그래밍 : HTML >> HTML5 -----> 캔버스(Canvas) + JavaScript

- 기본적인 태그 공부 

- 본격적인 프로그래밍 (JavaScript) --> 기본 프로그래밍으로써 JavaScript

- 프로그래밍 언어 :

                  컴파일러 : C/C++ , java, C#.... 소스 >> Object 코드(최적화) >> 한방에 실행 

                  인터프리터 (=스크립트) : Python, JavaSCript(웹)... 소스 >> 바로 실행 [특수한 목적, 단점: 느림, 한 줄씩 실행]

 

* 스크립트 언어의 단점 : 타입 선언을 해주지 않는다. 

                                var (변수) 선언은 권장하지만, 변수 선언이 다 이므로, 버그가 생길 확률이 높다. 

#변수

* 변수 이름 규칙 : 딱 보고 무슨 변수인지 알아야 함 

//변수 선언부 : 소문자로 시작 , 의미를 파악하기 쉽게 , 너무 길면 x
        var intNum1, num2, num3;
        var str1, str2;

        var m_myValue = 100;
        function func1(){
            var myValue = 200;
            document.writeln("함수안:"+myValue);
        }
        document.writeln("함수밖:"+m_myValue);
        func1();

* 전역 변수와 지역변수의 이름은 구분지어야 함!!! 

// 코드는 안 헷갈리게 하는게 중요 !!! 
        // document.write 안에 ++ 입력하지 말것 ! 
        ++m_myValue;
        document.writeln("함수밖:"+m_myValue);
        m_myValue++;
        document.writeln("함수밖:"+m_myValue);
        func1();

1-1. 1부터 100까지 홀수의 합계

// 1부터 100까지 홀수의 합계
        var i;
        var numHap =0;
        for(i=1;i<=100;i++){
            numHap += i;
            
        }
        document.writeln("1-1번:"+numHap);

1-2. 1부터 1000까지의  88의 배수의 합계

 //1부터 1000까지의 88의 배수의 합계
        var numHap2 = 0;
        for(i=1;i<=1000;i++){
            if(i%88 == 0){
                numHap2 += i;
                //document.writeln(i);
            }
        }
        document.writeln("1-2번:"+numHap2);

1-3. 12345부터 67890까지 872의 배수의 합계

//12345부터 67890 까지 872의 배수의 합계
        var numHap3 = 0;
        for(i=12345; i<=67890; i++){
            if (i%872==0) {
                numHap3 += i;
                // document.writeln(i);
            }
        }
        document.writeln("1-3번:"+numHap3)

심화 ) 1-1. 2부터 100까지의 소수를 출력하고 합계

            소수? 1과 자기 자신을 제외하고는 나누어 떨어지지 않는 수 , 

                         2,3,5,7,11,13,17,19,23,29.............

//심화 2부터 1000까지의 소수를 출력하고 합계 
        //실무 : i,j,k --> 배열의 첨자로만 사용.
        var numHap4 =2;
        for(var num= 3; num <= 1000; num++){
            var sosuYN = true;
            for(var div=2; div<num; div++){
                if(num%div == 0){
                    sosuYN = false;
                }
            }
            if (sosuYN == true) {
                // document.writeln(num)
                numHap4 += num;
            }
        }
        document.writeln("심화:"+numHap4);

- 더 나은 코딩 [튜닝 , 자료구조 공부해야 함: 효율성을 갖추기 위해]

 //심화 2부터 1000까지의 소수를 출력하고 합계 
        //실무 : i,j,k --> 배열의 첨자로만 사용.
        var numHap4 =2;
        for(var num= 3; num <= 1000; num+=2){
            var sosuYN = true;
            for(var div=2; div<num/2+1; div++){
                if(num%div == 0){
                    sosuYN = false;
                    break;
                }
            }
            if (sosuYN == true) {
                // document.writeln(num)
                numHap4 += num;
            }
        }
        document.writeln("심화:"+numHap4);

* 버그를 줄이는 코드 (타입 선언)

res = String(23) + String(35) + "abc";
        document.writeln(res);
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //함수 선언부
        function addNumber(n1,n2){
            var reValue;
            reValue = n1 + n2; // 복잡한 로직
            return reValue;
        }
    </script>
    <script>
        //전역 변수 선언부 
        var m_num1=100,m_num2=200;

    </script>
    <script>
        //메인 코드부
        result = addNumber(m_num1,m_num2);
        document.writeln("<h2>"+result+"</h2>");
    </script>
</head>
<body>
    
</body>
</html>

* 배열

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        var ary1 = [10,20,30,40,50,60] //0,1,2,3,4
        var hap = 0;
        for (var i=0;i<ary1.length; i++){
            hap += ary1[i];
        }
        document.writeln("<h2>"+hap+"</h2>");

        var ary2 = new Array(); //빈 배열을 생성
        ary2[0] = 10;
        ary2[1] = 20;
        ary2[2] = 30;
        for(var i =0; i<ary2.length; i++){
            hap += ary2[i];
        }
        document.writeln("<h2>"+hap+"</h2>");
    </script>
</head>
<body>
    
</body>
</html>

* 파일 처리 

퀴즈 2. 

2-1. if 문 연습 --> 점수를 입력 받아서 , A~F까지 학점 출력 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //2-1. if 문 연습 --> 점수를 입력 받아서 , A~F까지 학점 출력 
        var scoreNum = prompt("점수 입력하기:",0);
        var score;
        if(scoreNum > 90){
            score = "A";
        }else if(scoreNum > 80){
            score = "B";

        }else if(scoreNum > 70){
            score = "C";

        }else if(scoreNum > 60){
            score = "D";

        }else if(scoreNum > 50){
            score = "E";
            
        }else{
            score = "F";
            
        }
        document.writeln("학점은 "+score+"입니다.");

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

2-2. 위 if 문을 switch ~case 문으로 변경하기 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //위 if 문을 switch ~case 문으로 변경하기
        var scoreNum = prompt("점수 입력하기:",0);
        document.writeln(parseInt(scoreNum/10)); 
        var score;
        switch (parseInt(scoreNum/10)){
            case 10 : case 9: 
                score = "A";
                break;
            case 8: 
                score = "B";
                break;
            case 7: 
                score = "C";
                break;
            case 6: 
                score = "D";
                break;
            case 5: 
                score = "E";
                break;
            default :
                score = "F";
                break;
        }
        document.writeln("학점은 "+score+"입니다.");
    </script>
</head>
<body>
    
</body>
</html>


2-3. 위 1-3을 배열에 저장한 후에, 합계를 출력하기 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //위 1-3을 배열에 저장한 후에, 합계를 출력하기 
        //12345부터 67890 까지 872의 배수의 합계
        var arNum = new Array();
        var numHap3 = 0;
        var k=0;

        for(var i=12345; i<=67890; i++){
            if (i%872==0) {
                arNum[k] = i;
                // document.writeln(arNum[k]);
                k++;
            }
        }
        // document.writeln(arNum.length);
        for( var j = 0; j < arNum.length; j++){
            // document.writeln(arNum[j]);
            numHap3 += arNum[j];
        }
        document.writeln(numHap3);  

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

2-4. 구구단 출력하기 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //구구단 출력하기 
        var i , j ; 
        for(i=2; i<10;i++){
            for(j=1;j<10;j++){
                document.writeln(i+"+"+j+"="+i*j+"<br>");
            }
        }
    </script>
</head>
<body>
    
</body>
</html>

2-5. 두 숫자를 입력받고 , 더하기 /빼기 / 곱하기 /나누기/나머지/제곱 결과를 출력(함수처리 )

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //두 숫자를 입력받고 , 더하기 /빼기 / 곱하기 /나누기/나머지/제곱 결과를 출력(함수처리 )
        var num1= prompt();
        var num2 = prompt();
        parseInt(num1);
        parseInt(num2);
        var result;

        function addNum(n1,n2){
            result = parseInt(n1)+parseInt(n2);
            return document.writeln("합은"+result);
        }
        function subNum(n1,n2){
            result = n1-n2;
            return document.writeln("뺄셈은"+result);
        }
        function multNum(n1,n2){
            result = n1*n2;
            return document.writeln("곱셈은"+result);
        }
        function divNum(n1,n2){
            result = n1/n2;
            return document.writeln("나눗셈은"+result);
        }
        function sqrtNum(n1,n2){
            sqrN1 = sqrt(n1);
            sqrN2 = sqrt(n2);
            return document.writeln("제곱은 : "+sqrN1+","+sqrN2);
        }

        addNum(num1,num2);
        subNum(num1,num2);
        multNum(num1,num2);
        divNum(num1,num2);
        sqrtNum(num1,num2);


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

##미션 (3일차) ##
2차원 배열 처리 (= 영상 처리 PreStudy) : 8x8 배열을 사용하기 
1. 영상을 어둡게 처리 
2. 영상을 반전하기 (0->255,1->254 ... 254->1, 255->0)
3. 영상을 상하 및 좌우 미러링하기 
4. 영상을 흑백으로 처리하기. 127기준 (흑백은 0과 255만 존재하는 이미지)
5. 영상을 흑백으로 처리하기 . 평균값 기준 
-- 이후 <심화> --
6. 영상을 흑백으로 처리하기 . 중앙값 기준

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        var image; //2차원 배열 (이미지 --> 2차원 배열)
        var ROW = 8, COL=8; //행,열을 지정후 작업 --> 이미지의 사이즈를 알아낸 후 작업
        image = new Array(ROW);
        for(var i=0; i<ROW; i++){
            image[i] = new Array(COL);
        }

        //이미지 --> 배열로 읽어들이기 (Loding)
        for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                image[i][k] = Math.floor(Math.random() * 256);
                //  image[i][k] = Math.floor(i+k);
            }
        }

        //이미지를 출력하기
        for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
                
            }
            document.write("<br>");
        }
        document.write("<br>");
        
        //영상처리 1 : 사진을 50밝게 처리하자 . 
        for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                if (image[i][k] + 50 > 255)
                    image[i][k] += 255;
                else
                    image[i][k] += 50;
                
            }
        }
         //이미지를 출력하기
         for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
                
            }
            document.write("<br>");
        }
        document.write("1번 문제 <hr>");
        
        //1. 영상을 어둡게 처리

        for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                if (image[i][k]-50 > 255) {
                    image[i][k] += 255;
                }
                else if(image[i][k]-50 < 0){
                    image[i][k] += 0;
                }
                else{
                    image[i][k] -= 50
                }
            }
        }

        //이미지를 출력하기 
        for(var i=0; i<ROW; i++){
            for(var k=0;k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
            }
            document.write("<br>");
        }
        document.write("1번 <hr>");

        //2. 영상을 반전하기 (0->255,1->254 ... 254->1, 255->0)
        for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                image[i][k]= Math.abs(255-image[i][k]);
            }
        }

        //이미지를 출력하기 
        for(var i=0; i<ROW; i++){
            for(var k=0;k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
            }
            document.write("<br>");
        }
        document.write("2번 <hr>");

        //3. 영상을 상하 및 좌우 미러링하기 
       image.reverse(); 
        for(var i=0; i<ROW; i++){
            image[i].reverse();
            for(var k=0;k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
            }
            document.write("<br>");
        }
        document.write("3번 <hr>");

        //4.영상을 흑백으로 처리하기. 127기준 (흑백은 0과 255만 존재하는 이미지)
        for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                if(image[i][k] <= 127){
                    image[i][k] = 0;
                }
                else{
                    image[i][k] = 255;
                }
            }
        }
        //이미지를 출력하기 
        for(var i=0; i<ROW; i++){
            for(var k=0;k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
            }
            document.write("<br>");
        }
        document.write("4번 <hr>");

        //5. 영상을 흑백으로 처리하기 . 평균값 기준
        var sum = 0; 
        var avg = 0;

        for(var i=0; i<ROW; i++){
            for(var k=0; k<COL; k++){
                sum += image[i][k];
            }
        }

        avg = Math.floor(sum/(ROW*COL));

        for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                if(image[i][k] <= avg){
                    image[i][k] = 0;
                }
                else{
                    image[i][k] = 255;
                }
            }
        }
        //이미지를 출력하기 
        for(var i=0; i<ROW; i++){
            for(var k=0;k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
            }
            document.write("<br>");
        }
        document.write("5번 <hr>");

        //6. 영상을 흑백으로 처리하기 . 중앙값 기준
        for(var i=0 ; i<ROW;i++){
            for(var k=0; k<COL; k++){
                console.log(image[i].sort());
                image[i].sort(function(a,b){
                    if(a > b){
                        return 1;
                    }
                    if(a === b){
                        return 0;
                    }
                    if(a < b){
                        return -1;
                    }
                });
            // document.write(image[i][k]+", ");

            }
        }
        console.log(image[4][4]);
        var median = image[4][4];
        for(var i=0; i<ROW;i++){
            for(var k=0; k<COL; k++){
                if(image[i][k] <= median){
                    image[i][k] = 0;
                }
                else{
                    image[i][k] = 255;
                }
            }
        }
       

        //이미지를 출력하기 
        
        for(var i=0; i<ROW; i++){
            for(var k=0;k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
            }
            document.write("<br>");
        }
        document.write("<br>6번 <hr>");


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


10. 영상을 2배 축소하기
11. 영상을 2배 확대하기

//10. 영상을 2배 축소하기
        COL = COL/2;
        ROW = ROW/2;

        //이미지를 출력하기 
        
        for(var i=0; i<ROW; i++){
            for(var k=0;k<COL; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
            }
            document.write("<br>");
        }
        document.write("<br>10번 <hr>");
        
        //11. 영상을 2배 축소하기
        COLN = COL*2;
        ROWN= ROW*2;
        console.log(COLN+"+"+ROWN);
        image = new Array(ROWN);
        for(var i=0; i<ROWN; i++){
            image[i] = new Array(COLN);
        }

         //이미지 --> 배열로 읽어들이기 (Loding)
         for(var i=0; i<ROWN;i++){
            for(var k=0; k<COLN; k++){
                image[i][k] = Math.floor(Math.random() * 256);
                //  image[i][k] = Math.floor(i+k);
                console.log(image[i][k]);
            }
        }

        //이미지를 출력하기 
        
        for(var i=0; i<ROWN; i++){
            for(var k=0;k<COLN; k++){
                document.write(String(image[i][k]).padStart(3,'0')+" ");
            }
            document.write("<br>");
        }
        document.write("<br>11번 <hr>");

7, 영상을 90도 회전시키기 
8. 영상을 감마 변환하기
9. 영상을 파라볼라 변환하기