HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/Kotlin/
시작

시작

REPL

  • :load Hello.kt 와 같은 식으로 코틀린 파일을 불러올 수 있고 해당 파일의 메서드들을 바로 실행 가능함
    • # Hello.kt fun main() = println("Hello World") :load Hello.kt main()

스크립트

  • 확장자를 kts 로 만들면 스크립트로 실행이 가능함
java.io.File(".") .walk() .filter { file -> file.extension == "kts" } .forEach { println(it) }
  • 스크립트로 실행 방법
    • kotlinc-jvm -script <name>.kts
    • Unix-like 시스템에서는 shebang을 이용하여 바로 실행이 가능
    • // greet.kts #!/usr/bin/env kotlinc-jvm -script println("hi") $ ./greet.kts

자바 개발자를 위한 코틀린 필수사항

  1. 더 적은 타이핑
      • 세미콜론 생략
      • 변수 타입 지정 생략 (적절한 변수이름 정하기)
      • 클래스와 함수는 생략 가능. 코드가 컴파일되거나, 스크립트로 실행될 때 코틀린은 JVM에서 실행하기 위해 필수적으로 필요한 랩퍼 클래스와 메서드를 생성
      • try-catch 는 선택사항 (checked 이든 unchecked 이든 예외 처리를 강제하지 않음)
        • 예외 처리를 위해서는 방어적 프로그래밍을 하는 게 좋다.
  1. 현명한 경고
      • 컴파일 시간에 빠른 경고를 받을 수 있다면, 개발자들은 잠재적 문제를 사전에 대처할 수 있다.
      • <애자일 프랙티스> 에서 애자일 개발에서 경고를 오류처럼 다루는 것이 올바른 소프트웨어 개발 습관이다. 라고 강조했음.
      • kotlinc-jvm -Werror 로 경고를 오류처럼 다룰 수 있음
  1. var 보다는 val
      • immutable 변수(상수 또는 값)를 정의하기 위해서는 val 을 사용
      • var로 정의된 변수는 뮤터블하다.
        • 뮤터블한 코드는 오류가 발생할 가능성이 더 높고, 병렬화 하기가 더 어렵다.
  1. 향상된 동일성 체크
      • java의 equals() ↔ 코틀린의 == 연산자 : 값을 비교함. 구조상의 동일성 structural equality
        • 그러나 Java보다 좋은 점은 null 비교할 때 NullPointerException을 던지지 않고 null을 안전하게 다룸. null이라면 비교해서 다르면 false, 같으면 true를 반환
      • java의 == 연산자 ↔ 코틀린의 === 연산자 : 참조 대상을 비교함(referential equality) : 참조상의 동일성은 참조를 비교하고 두 비교대상이 같은 객체를 참조하는 경우 true를 반환함
  1. 문자열 템플릿
      • ${} 로 감싸서 변수 값을 사용할 수 있음
      • $를 문자로 사용하고 싶은 경우 앞에 백슬래시 붙이기
  1. RAW 문자열
      • “”” 를 이용하여 이스케이프 처리 안하고 문자열을 사용할 수 있고, 멀티라인으로도 사용이 가능함
      • 멀티라인 문자열
      fun createMemoFor(name: String): String { if (name == "Eve") { val memo = """Dear $name, a quick reminder about the party we have scheduled next Tuesday at the 'Low Ceremony Cafe' at Noon. | Please plan to...""" return memo } return "" } println(createMemoFor("Eve")
      • 위와 같이 작성하면 memo가 프린트 될 때 공백이 추가 되어 있음.
      fun createMemoFor(name: String): String { if (name == "Eve") { val memo = """Dear $name, a quick reminder about the |party we have scheduled next Tuesday at |the 'Low Ceremony Cafe' at Noon. | Please plan to...""" return memo.trimMargin() } return "" } println(createMemoFor("Eve")
      • trimMargin() 메서드를 사용하면 수직선(|) 문자가 나올 때 까지 공백을 제거함
      • 수직선이 시작점에 있지 않으면 무시
      • 수직선 문자를 문장 내용으로 사용하고 싶을 때는, 다른 문자(eg. ~)를 사용하고 trimMargin 메서드에 해당 문자를 파라미터로 넘겨주면 됨
  1. 표현식은 많이, 명령문은 적게
      • Java, C#, Javascript같은 언어들은 표현식(expression) 보다는 명령문(statement)을 더 많이 가지고 있다(if, for, try ..)
      • 명령문(statement)을 많이 사용하지만, 어두운 면이 있다. 상태가 변하고, 변수를 변하게 하고, 파일을 작성하고, 데이터베이스를 업데이트하고, 리모트 웹서버에 데이터를 전송하고, 하드 드라이브를 오염시키는 것 등. 명령문 보다는 표현식(expression)이 좋다. 표현식은 결과를 리턴해주고, 어떤 상태도 변화시키지 않는다.
      fun canVote(name: String, age: Int): String { var status: String if (age > 17) { status = "yes, please vote" } else { status = "nope, please come back" } return "$name, $status" } println(canVote("Eve", 12))
      명령문은 아무런 리턴값을 주지 않으면서 뮤터블 변수를 만들고, 메서드 안에서 변수를 수정하게 만든다.
      val status = if (age > 17) "yes, please vote" else "nope, please come back" return "$name, $status"
      if를 statement이 아닌 expression으로 이용 → val 을 사용할 수 있음