본문 바로가기

Full Stack 교육 회고록

11/22- kotlin / Node.js

728x90
SMALL

[ex01 Any, is, when]

package ex20221122

fun main() {

    // Any : 이름처럼 아무거나 할 수 있는 느낌의 자료형
    // Int, Float, String... 모든 자료형이 될 수 있다

    var str1: String = "abc"
    // str1 = 12345678

    var str2: Any = "abc"
    println(str2)
    str2= 12345
    // println(str2)
    str2 = 'c'

//    Person p1 = new Person
//    p1
//    is Person
//    : 상속관계에서 어디에서 나온 필드/메서드(프로퍼티) 인지 확인하기 위해서! is를 사용한다

    // is Int -> 정수형자료형이 맞는지? 타입 체크
    when(str2){
        is Int -> println("This is Int")
        is String -> println("This is String")
        else -> println("is not Int, String")
    }
}

[ex02 for문]

package ex20221122

fun main() {

    //Java
    //for (int i =0; i<3; i++){
    //      println(i)
    // }

    //Kotlin
    //for(i in 0..2){
    //     println(i)
    // }

    //1 ~ 10 까지 for문을 사용해서 출력해보자
    for(i in 1..10){
        println(i)
    }
    // 1,3,5,7,9를 for문을 사용해서 출력해보자
    for (i in 1 ..9 step 2) println(i)
    // 실행코드가 한 줄이면 {} (중괄호) 생략 가능
    //---------------------------------------
    // 10 ~ 1 까지 for문을 사용해서 출력해보자
    for(i in 10 downTo 1 ) println(i)
    // 10,8,6,4,2를 for문을 사용해서 출력해보자
    for(i in 10 downTo 2 step 2) print(i)
}

[ex03 while문]

package ex20221122

import java.util.Scanner

fun main() {

    // while(조건식){
    // 조건식이 true일 동안, 실행시킬 코드
    //}
    // 단, 조건식은 무조건 결과값으로 true/false를 돌려줘야함!
    // 비교연산자, 논리연산자, Boolean(true)

    //**팩토리얼**

    //1. 입력하는 도구
    val sc = Scanner(System.`in`)

    // 2. 출력문 + 입력하는 부분
    print("숫자를 입력하세요 : ")
    var number = readLine()?.toInt()
    // 3. 곱하기 결과를 누적시키는 변수 (sum과 같은 역할)
    var factorial = 1

    // 4. 반복되는 코드를 while 문으로 감싸기
    while (true) {
        if (number !=null){
            factorial *= number
            number--
        }
        //5. 종료조건
        if(number ==1){
            break
        }
    }
    println(factorial)
}

[ex04label]

package ex20221122

fun main() {

    //label: while문에 이름을(라벨)부여해서
    //break할때 어떤 while문을 종료시킬껀지 정할 수 있다.
    //continue 도 동일하게 어떤 while문을 동작시킬껀지 정할 수 있다.

    outer@while(true){
        println("바깥 while문 작동 중")
        while(true){
            println("안쪽 while문 작동중")
            // 어떤 조건을 만족할 경우 바깥 while문까지 종료
            // 기존에 java 2가지 종료조건이 필요
            break@outer //근접한 while문 한 개만 빠져나간다
        }
    }

}

[ex05함수]

package ex20221122

fun main() {
    sum(5,6)
    println(sum(5,6)) //결과값을 받아오기만 하고
    //출력하는 기능은 따로 없음

    sumPrint(5,6)
    // void ---> Unit
    // void, unit 같은 경우에는 '기능' 자체를 가지고 있는 함수
} // main 밖

//sumPrint : 매개변수가 2개이고, 리턴타입이 Unit
fun sumPrint(num1: Int, num2: Int) {
    println(num1+num2)
}

fun sum(num1: Int, num2: Int): Int{
    // fun+ 함수명(호출명) + (매개변수) : 리턴타입
    // 단, 리턴타입에 자료형이 명시 되어있으면 return이라는 키워드 필요
    return num1 + num2
}

[ex06함수]

package ex20221122

fun main() {
    //호출 했을 때 내 이름의 결과값만 가지고 오는 함수!
    getName("조자연")
    println(getName("조자연"))
}
//코틀린은 자료형을 추론할 수 있다
//fun getName(name: String): String{
//    return name
// }
//중괄호 {}안의 코드가 한 줄이면 중괄호랑 returm 키워드를 생략할 수 있다.
// 단, return 키워드 대신 대입연산자 (=) 사용하기
// fun getName(name: String): String = name
// 반환하고 있는 데이터를 보고 리턴타입도 추론이 가능
fun getName(name:String)= name

[ex07지역함수]

package ex20221122

fun main() {

    // add1(5,6)
    // 지역함수를 사용할때에는 먼저 선언부가 있어야 한다
    // 지역함수
    fun add1(a: Int, b: Int): Int{
        return a+b
    }
    add1(3,4)
    add2(5,6)
    // 최상위 레벨 함수 (Top-Level)
} // 최상위 레벨 함수 (Top-Level-Function )

fun add2(a: Int, b: Int): Int{
    return a+b
} //최상위 레벨 함수

[ex08 지역함수]

package ex20221122

fun main() {

    // ex07함수사용해보자
    // add1, add2
    // add1(5,6) //지역함수
    add2(4,5) // static에 올라가 있어서 (공용함수)

}

[ex09 오버로딩]

package ex20221122

fun main() {

    // 오버로딩(OverLoading): 중복정의
    // 한 클래스 내에서 같은 이름의 메소드를 선언
    // 단, 매개변수의 형태가 달라야 한다! (매개변수의 데이터 타입, 갯수)
    // 생성자, println문!!!

    // setName()
    // 미국인 (firstName, middleName, LastName)
    // 한국인 (firstName, lastName)
    setName("스티븐","폴","잡스")

}
// 미국인 이름 등록하는 setName() 만들기 : 매개변수 3개
fun setName(firstName: String, middleName: String, lastName: String){
    //스티븐 폴 잡스
}
// 한국인 이름 등록하는 setName() 만들기 : 매개변수 2개
fun setName(firstName: String, lastName: String){
    //조 자연
}

[ex10 매개변수]

package ex20221122

fun main() {

    //addList를 호출할 때마다 email이 비어있을 경우 "default" 값을
    // 함수 전달인자로 넘겨주는 일이 매우 번거로움
    // 함수 선언하는 부분에서 매개변수의 기본값을 (받아오는 인자가 없을 경우에 대해서) 설정 할 수 있다!
    addList("강예진","aaa@naver.com")
    addList("조자연")
}

// 1. 회원의 이름과 이메일 주소를 저장하는 함수
// 이메일을 입력하지 않았을 경우에 "default"라는 문자열을 저장하기로 약속
fun addList (name:String, email:String = "default"){
    //db저장..//
}// 회원가입(firebase에서 사용할 예정)

[ex11함수형프로그래밍]

package ex20221122

fun main() {

    // 프로그래밍 패러다임
    // : 개발자가 개발하는데 있어서 당연하게 생각하는 패턴, 상식, 개념
    // 절차적 프로그래밍(C), 객체지향 프로그래밍(Java),
    // 함수형 프로그래밍(Kotlin, JavaScript)

    // 일급 객체: 포함 관계를 갖는데 있어서 최상위 레벨
    // ex) Java : 객체(Class)지향 프로그래밍
    // Class 가 변수, 함수, 클래스(inner class) 마저도 안에 품을 수 있다.
    // ex) Kptlin: 함수형 프로그래밍
    // 함수 안에 변수(필드), 메서드(함수) {프로퍼티}, 클래스 등등...

    // 함수를 변수처럼 사용할 수 있어야 완전한 의미를 갖게된다.
    // 1) 함수 참조 (function reference)
    // 2) 람다식(lambda)
}

[ex12함수참조]

package ex20221122

fun todayWeather(){
    println("오늘 광주 날씨는 맑음")
}
// :: 함수이름 ---> 안드로이드 intent
// 함수를 호출해서 변수에 대입이 가능
val weather = ::todayWeather

fun main() {
    // 함수를 참조해서 변수처럼 사용해보자
    // 함수 참조를 통해서 변수처럼 사용하고 싶으면
    // 변수명 뒤에 .call() 을 붙혀줘야한다!
    // weather.call() 1.1 v
    weather()
}

<오후 node.js>

 

< ch3. http 통신하기 >

http란? www 상에서 정보를 주고받을 수 있는 프로토콜, 주로 html 문서를 주고 받는 데에 쓰임

request란? 클라이언트가 서버로 전달하는 메시지로 서버 측 액션을 유도

response란? 요청에 대한 서버의 답변

http모듈: node.js에서 사용 하는 서버 모듈, http 웹 서버를 생성하는 것과 관련된 모든 기능 담당

server: createServer()를 사용하여

 <ex04 readStream.js>

const fs = require('fs');

//버퍼 -> 스트림 : 버퍼의 크기를 작게 만든 후 여러번 나눠 보내는 방식
                                    //버퍼 크기 지정(기본값:64)
const readStream = fs.createReadStream('./readme.txt',{highWaterMark : 16});
const data = []; //데이터를 담음

//파일 읽기가 시작되면 발생
readStream.on('data', (chunk)=>{ //chunk: 데이터의 부분
    data.push(chunk); //data 배열에 chunk 데이터 넣기
    console.log('data : ', chunk);
});
//파일을 다 읽으면 발생
readStream.on('end',()=>{
    //최종적으로 다시 하나의 문자열로 만들기
    console.log(Buffer.concat(data).toString());
});

<readme.txt>

readme 파일입니다! readme 파일입니다! readme 파일입니다! readme 파일입니다! readme 파일입니다! readme 파일입니다! readme 파일입니다! readme 파일입니다!

<Ex01createServer.js>

//http 모듈
const http = require('http');//웹 브라우저의 요청/응답 처리

http.createServer((req,res)=>{
    //응답코드 : 200/404/500 ...
    //응답 정보 기록
    res.writeHead(200, {'Content-Type':'text/html; chatset=utf-8'});
    //클라이언트로 보낼 데이터, 본문
    res.write('<h1>Hello world!</h1>');
    res.end('<p>node.js</p>'); //응답 종료
}) //listen 메서드 사용해서 콜백함수 넣는 방식
    .listen(8888, ()=>{
        //서버 연결 대기 동안 뭘할건지
        console.log('8888번 포트에서 서버 연결 대기중!');
    });

<Ex02 createServer.js>

const http = require('http');

const server = http.createServer((req,res)=>{
    res.writeHead(200, {'Content-Type':'text/html; chatset=utf-8'});
    res.write('<h1>Hello world!</h1>');
    res.end('<p>node.js</p>');
});
server.listen(8888); //포트번호 지정

//이벤트 리스너 붙이는 방법
server.on('listening', ()=>{
    console.log('8888번 포트에서 서버 연결 대기중 ...');
})

server.on('error',(error)=>{
    console.log(error);
})

<Ex03.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>
</head>
<body>
    <h1>header</h1>
    <p>Hello world!</p>
</body>
</html>

<Ex03html>

const http = require('http');
const fs = require('fs').promises;
                            //비동기
const server = http.createServer(async(req, res)=>{
    //Ex03.html 파일 응답
    //오류처리(200, 500)
    try{
        const f = await fs.readFile('./Ex03.html');
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
        res.end(f);
    }catch(err){
        res.writeHead(500, {'Content-Type' : 'text/html; charset=utf-8'});
        res.end(err.message);
    }
});
server.listen(8888);

server.on('listening', ()=>{
    console.log('8888번 포트에서 서버 연결 대기중...');
})

 

npm install express ->

<Ex05express>

<Ex00.js>

const express = require('express');
const app = express();

app.set('port', process.env.PORT||8888);

app.listen(app.get('port'), ()=>{
    console.log(app.get('port'), '번 포트에서 서버 연결 대기중...');
});

<Ex01FirstExpress.js>

const express = require('express');
const app = express(); //app 생성

//get : get요청 받는다!
app.get('/',(req,res)=>{ //root로 get 요청시
    res.send('Hello World!'); //작성한 텍스트 응답
});

app.listen(8888,()=>{
    //8888포트로 오는 요청 기다림
    console.log('8888 포트에서 서버 연결 대기중 ...');
});

<Ex02.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>
</head>
<body>
    <h1>header</h1>
    <p>hello node!</p>
</body>
</html>

<Ex02.js>

const express = require('express');
const app = express();

//app.set('key',value) : 키에 값을 저장하도록 설정
app.set('port', process.env.PORT||8888);
                //기본 포트가 있다면 그 번호로 포트 지정
                //그렇지 않으면 8888

app.get('/home', (req, res)=>{ // 라우팅
    //http 모듈 -> html 파일을 응답하기 위해서 필요한 것 -> fs 모듈
                //현재파일 경로
    //응답 헤더 작성하지 않아도 됨
    res.sendFile(__dirname+'/Ex02.html'); //파일 응답
});

app.listen(app.get('port'), ()=>{
    console.log(app.get('port'), '번 포트에서 서버 연결 대기중...');
});

<Ex03middleware.js>

const express = require('express');
const app = express();

app.set('port', process.env.PORT||8888);

app.get('/', (req,res)=>{
    res.send('Hello node!'); //응답
    next(); //다음 미들웨어로 넘어가도록 제어해주는 기능
})

//미들웨어: 요청 응답 사이에 무언가를 처리해주는 함수
const myLog = function(req,res){ 
    console.log('LOGGED');
}
app.use(myLog); //만든 미들웨어 app 붙여주기

app.listen(app.get('port'), ()=>{
    console.log(app.get('port'), '번 포트에서 서버 연결 대기중...');
});

<Ex04.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>
</head>
<body>
    <img src="./ping.gif">
</body>
</html>

<Ex04.js>

const express = require('express');
const app = express();

app.set('port', process.env.PORT||8888);

//static : 정적파일 경로 지정(미들웨어)
app.use(express.static(__dirname+'/public'));

app.get('/', (req, res)=>{
    //Ex04 html 클라이언트로 바로 응답을 하는 게 아니라
    //static 미들웨어를 거친 후 클라언트에 도착
    //html 내에 폴더 경로 지정하지 않더라도 자동으로 서버에서 static
    //폴더(public) 에 해당 파일을 찾은 후 띄어줌
    //경로가 드러나지 않으니 보안상 도움이 될 수 있음
    res.sendFile(__dirname+'/Ex04.html');
})

app.listen(app.get('port'), ()=>{
    console.log(app.get('port'), '번 포트에서 서버 연결 대기중...');
});

<Ex05.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>
</head>
<body>
    <form action="http://localhost:8888/get" method="get">
        ID : <input type="text" name="id"><br>
        PW : <input type="password" name="pw"><br>
        <input type="submit" value="GET">
    </form>
    <form action="http://localhost:8888/post" method="post">
        ID : <input type="text" name="id"><br>
        PW : <input type="password" name="pw"><br>
        <input type="submit" value="POST">
    </form>
</body>
</html>

<Ex05.js>

const express = require('express');
const bodyParser = require('body-parser');
//post 요청 시 body 파싱을 위해 추가
const app = express(); 

//bodyParser 미들웨어 추가
app.use(bodyParser.urlencoded({extended:true}));

app.set('port', process.env.PORT||8888);

app.get('/get', (req,res)=>{
    //user/1 -> parameter
    //'/user/{id}'
    //req.params.id
    //req.params.pw
    //쿼리스트링? name=value&name2=value2
    let id = req.query.id;
    let pw = req.query.pw;

    res.send('id : '+id+' pw : '+pw);
})

app.post('/post', (req,res)=>{
    let id = req.body.id;
    let pw = req.body.pw;

    res.send('id : '+id+' pw : '+pw);
})


app.listen(app.get('port'), ()=>{
    console.log(app.get('port'), '번 포트에서 서버 연결 대기중...');
});
728x90
LIST