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
'Full Stack 교육 회고록' 카테고리의 다른 글
11/24 node.js / kotlin (1) | 2022.11.24 |
---|---|
11/23 - kotlin, 안드로이드 스튜디오, node.js (0) | 2022.11.23 |
11/21- node.js / 오후 Kotlin (0) | 2022.11.21 |
11/18 - Kotlin, (0) | 2022.11.18 |
10/20 - 프로젝트 시작(프론트엔드) (0) | 2022.11.12 |