프로그래머스 콜라츠 추측 문제를 풀다가 다른 사람의 풀이에서 tailrec 키워드를 처음 접했습니다. https://school.programmers.co.kr/learn/courses/30/lessons/12943 그래서 재귀 함수와 반복문, 그리고 꼬리 재귀를 정리해보았습니다. 재귀 함수와 반복문 재귀 함수란 자기 자신을 계속 호출하는 함수입니다. 반복적으로 자기 자신을 부르면서 stack 영역에 쌓이기 때문에, 루프(반복문)에 비해 더 많은 자원을 소비하고 성능이 떨어집니다. 종료 조건을 제대로 설정하지 않은 경우 무한 재귀는 stack overflow가 발생하며 프로그램이 비정상 종료되는 반면, 루프는 무한 실행됩니다. 재귀 함수의 장점 자원을 더 소비하더라도, 재귀 함수는 가독성 측면에서 뛰어납..
Kotlin
호텔 예약 콘솔 프로그램 과제를 진행하던 중.. 방 번호와 체크인 날짜, 체크아웃 날짜를 입력하면 예약 가능 여부를 판단해서 사용자에게 보여주는 부분을 나름 순조롭게 구현했습니다.하고 있다고 생각했습니다.. 처음 생각한 검증 로직 체크인 날짜가 오늘 이전이 아닌지 체크인 날짜가 기존 예약된 내역의 체크인 날짜와 체크아웃 날짜 사이에 존재하지 않는지 (체크인 날짜 포함, 체크아웃 날짜 비포함) 체크아웃 날짜가 체크인 날짜 이후인지 체크아웃 날짜가 기존 예약된 내역의 체크인 날짜와 체크아웃 날짜 사이에 존재하지 않는지 (체크인 날짜 비포함, 체크아웃 날짜 포함) 이렇게 네 가지였습니다. 누군가 체크아웃 한 날에 체크인 할 수 있다는 사실에 주의해서 코드를 작성했습니다. fun validateDate(room..
kotlin에서 array를 만들기 위해서는 arrayOf(), arrayOfNulls(), emptyArray() 함수를 이용하거나 Array 생성자를 이용할 수 있습니다. (코틀린 공식 사이트 참고 - https://kotlinlang.org/docs/arrays.html#create-arrays) Array 생성자 이용해서 array 만들기 val 변수명 = Array(size) {함수} array의 size, 그리고 array의 원소의 값을 반환하는 함수가 필요합니다. 값이 0인 원소를 3개 가지는 array를 만들어 보겠습니다. val initArray = Array(3) { 0 } initArray.forEach { print(it) } // 000 0부터 4까지의 원소를 가지는 array입니..
지연초기화 변수나 상수의 값을 나중에 초기화합니다. lateinit 변수의 값을 초기에 정의하지 않고 나중에 대입합니다. "" 처럼 공백으로 처리하는 것보다 가독성이 좋습니다. isInitialized 변수 사용 전 값이 초기화되었는지 확인합니다. 값이 아니라 참조 형태로 사용해야 하므로 ::를 붙여줍니다. lazy 상수를 사용하는 시점에 값을 대입합니다. 예시 코드로 사용 방식을 확인하세요 :D class Member { lateinit var name:String var age:Int = 0 val address: String by lazy { println("address 초기화!") "seoul" } fun displayInfo() { if(this::name.isInitialized) { pri..
Kotlin의 특징 JVM 언어와 100% 호환되는 프로그래밍 언어 직관적이고 간결한 문법 Null 처리에서 높은 안정성 Java와 무엇이 다른가요? Kotlin 공식 사이트에서는 Java 대신 Kotlin을 사용할 때의 이점을 이렇게 말하고 있습니다. https://kotlinlang.org/docs/faq.html#what-advantages-does-kotlin-give-me-over-the-java-programming-language Kotlin is more concise. Rough estimates indicate approximately a 40% cut in the number of lines of code. It's also more type-safe, for example, supp..