오늘은 욕실 수리일정이 잡혀있었다. 그런데 사장님이랑 날짜만 잡아놓고 시간을 안 정해놔서 몇신지 알 수 가 없어서 9시에 일어나서 전화를 했다. 전화했더니 10시반에 오신다고 하시더라. 좀 이르단 생각을 했지만 어쨌든 빨리 끝내고, 빨리 마르면 빨리 쓸 수 있으니까 차라리 잘 된거라고 생각했다.
저번에 잘못된걸 다시 하는거라서 이번엔 좀 더 씨끄러웠다. 씨끄러운 와중에 블로그에 코틀린 관련 글을 좀 썼다.
12시쯤 공사가 마무리 되고 안랙술이랑 닭칼국수를 먹었다. 정말 맛있게 먹고나서 블로그에 글을 완성했다. 완성하고 나니까 아무것도 못하겠어서 시간만 쏟았다가 잠깐 나가서 아이스크림을 사먹고왔다. 그후로도 집중도 못하고 아무것도 못하고 시간만 버리다가 안랙술이랑 저녁으로 월남쌈을 먹었다.
그리고 오늘은 쿠팡에서 시킨 보리차 같은게 왔는데 커피 대신 먹는거라그래서 시킨 물건이다. 마셔보니 보리치이긴한데 약간 커피맛도 나는거같고, 어쨋든 잘 산거같다. 매우 맛있다.
본인의 경우는 info: kotlinc-jvm 1.4.31 (JRE 15.0.2+7) 이렇게 출력이 나왔다.
우리가 늘 하는 Hello World 만들기
적절한 폴더에 hello.kt라는 파일을 만들고 아래와 같이 코드를 넣어본다.
//hello.kt
fun main() = println("Hello World")
cli로 실행시키기
kotlinc-jvm hello.kt -d hello.jar
위 명령어를 실행시키면 hello.kt 코틀린 코틀린코드를 Java바이트 코드로 컴파일시키고 hello.jar를 만들어둔다. jar를 java툴을 이용해서 실행시키면된다.
java -classpath hello.jar HelloKt
hello.kt는 main함수만 가지고있고, 클래스가 아니기때문에 코틀린 컴파일러가 자동으로 확장자를 제거한 파일 이름을 가지고 Kt라는 접미사를 추가한 클래스이름을 만든다.
실행결과는 당연히 Hello World가 나온다.
classpath cli옵션을 열거하지않고, jar옵션으로 실행 가능하다. main()함소를 찾을때 코틀린 컴파일러가 jar 파일에 Main-Class 매니패스트 어트리뷰트를 추가한다.
java -jar hello.jar
현재는 코틀린 스탠다드 라이브러리를 사용하지 않았기 때문에 실행이 잘 되지만 코틀린 스탠다드 라이브러리의 클래스와 함수들을 사용하는 경우 java툴로만 실행한다면 java.lang.NoClassDefFoundError예외가 발생하면서 실패한다. 이를 방지하기위해서는 kotlin-stdlib.jar파일을 클래스패스에 추가해줘야한다.
kotlinc-jvm hello.kt -d hello.jar
java -classpath hello.jar:$KOTLIN_PATH/lib/kotlin-stdlib.jar HelloKt
//위도우인경우 %KOTLIN_PATH% 를 사용, 콜론(:)이 아닌 세미콜론(;)으로 구문해야한다. 등록된 환경변수를 사용하면된다.
ide로 실행하기
코틀린 공식 홈페이지 및 각 ide의 홈페이지와 라이브러리를 참고하면 될거같다. 여기서는 굳이 언급하지 않도록하겠다.
REPL실험
cli에서 kotlinc-jvm 이라고 입력하면 REPL이 실행된다. 아래와같이 조금 사용해보자.
//kotlinc-jvm
Welcome to Kotlin version 1.4.31 (JRE 15.0.2+7)
Type :help for help, :quit for quit
>>> 7 + 5
res0: kotlin.Int = 12
>>> val list = listOf(1,2,3)
>>> list.map{ it * 2}
res2: kotlin.collections.List<kotlin.Int> = [2, 4, 6]
>>>
종료할땐 컨트롤D 를 사용하거나 :quit 라고 입력한다.
REPL에선 이미 존재하는 코드를 불러와서 실행시킬수도 있다.
kotlinc-jvm
Welcome to Kotlin version 1.4.31 (JRE 15.0.2+7)
Type :help for help, :quit for quit
>>> :load hello.kt
>>> main()
Hello World!
>>>
이렇게 REPL에선 존재하는 코드를 컴파일 없이 실행할 수 있다.
스크립트로 실행하기
코틀린은 스크립트로 사용가능하다. 여타 스크립트에 비해서 좋은점이라면 스크립트를 위해 따로 문법 공부를 할 필요가 없다는 점이 있을것이고, 코틀린 스크립트는 문법 오류가 있는 경우 스크립트 실행 전에 실패를하기때문에 컴파일 후 칠행하는것 만큼 안전하다.
연습을 위해서 디렉토리에서 .kts 확장자를 가진파일을 리스팅 하는 스크립트를 만들어보자.
지금까지 작성한 코틀린 파일과 별반 타이가 없다. 차이점이라면 확장자가 kts라는것 뿐이다. 이 코드는 JDK의 java.io 패키지의 File 클래스를 사용한다. 그리고 코틀린이 해당 클래스에 추가한 확장 함수를 사용한다. 현재 디렉토리에 있는 모든 파일중 파일명이 kts로 끝나는 파일만 걸러내서 잡고 해당 파일의 경로를 출력한다.
스크립트 실행을 위해선 kotlinc-jvm 커맨드를 사용한다. -script옵션을 통해서 컴파일 대신 스크립트로써 즉시 실행시킨다.
kotlinc-jvm -script listktsfiles.kts
Unix-Like 시스템을 사용한다면 kotlinc-jvm -script라는 접미어 대신 셔뱅(shebang)을 사용하면된다.
배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 부분과 비교하여 자신의 위치를 찾아서 삽입한다.
매순서마다 원소를 삽입할 수 있는 위치를 찾아서 해당 위치에 넣는다.
두번째 자료(index = 1 )부터 시작한다
1번째 값이 0번째값보다 작으면 1번째 값을 0번째에 넣고 0번째 값을 1번째 자리에 넣는다.
여기까지하면 인덱스 0,1이 정렬된 자료가된다.
2번째 값을 0,1번째 값과 비교한후 적절한 자리에 넣고 해당 자리의원소들은 뒤로 한칸씩 밀린다.
여기까지하면 인덱스 0,1,2가 정렬된 자료가 된다.
3번째 값을 정렬된 자료와 비교하여 적절한 자리에 넣고 원래 자리에있던 원소들은 한칸씩 뒤로간다.
여기까지하면 0,1,2,3이 정렬된 자료가된다.
n까지 반복하면 0부터 n까지 정렬이 완료된다.
장점
안정한 정렬방법이다.
자료의 수가 적을경우 알고리즘이 매우 간단하다.
대부분 정렬이 된 상태일경우 효율적이다.
단점
자료의 이동이 많다.
자료가 많은 경우 적절하지못하다.
알고리즘 예제
3125 12 22 11 처음 상태. 31 [25] 12 22 11 두 번째 원소를 부분 리스트에서 적절한 위치에 삽입한다. <25> 31 [12] 22 11 세 번째 원소를 부분 리스트에서 적절한 위치에 삽입한다. <12> 25 31 [22]11 네 번째 원소를 부분 리스트에서 적절한 위치에 삽입한다. 12 <22>25 31 [11] 마지막 원소를 부분 리스트에서 적절한 위치에 삽입한다. <11> 12 22 25 31 종료.}
삽입정렬Insertion Sort 코틀린 코드
fun insertionSort(arr: IntArray) : IntArray{
var j = 0
var key = 0
for (i in 1 until arr.size) { //0번째 자료는 정렬된것으로 간주한다.
key = arr[i]
j = i
while (--j >= 0 && key < arr[j]) {
arr[j+1] = arr[j]
arr[j] = key
}
}
return arr
}
시간복잡도
최선의경우
비교횟수
이동이 없이 1번의 비교만 이루어진다.
O(n)
최악의 경우
비교횟수
모든 자료를 비교해야하기때문에 n개의 자료를 정렬할경우 n, n-1, n-2 ... 1 번의 비교를해야한다.
설정하고 다시 로그인 혹은 회원가입을 시도하면 아까랑은 다른 메시지를 볼 수 있는데 스프링 플터체인 로그가나오면서 "csrf"어쩌고 하는 로그가 나온다.
CSRF 란 Cross-site request forgery의 약자로 타사이트에서 본인의 사이트로 form 데이터를 사용하여 공격하려고 할 때, 그걸 방지하기 위해 csrf 토큰 값을 사용하는 것이다. 참조: velog.io/@max9106/Spring-Security-csrf
csrf에대해 서치를해보니 mustache는 csrf토큰을 기본적으로 제공을 안해주기때문에 생기는 문제였다. 서치를 좀 해보니 인터셉터를 구현해서 모델에 어트리뷰트로 넣어주는 방법이 있었으나... 그럴리가 없다는 생각에 좀더 검색해보니...