그러나 Java보다 좋은 점은 null 비교할 때 NullPointerException을 던지지 않고 null을 안전하게 다룸. null이라면 비교해서 다르면 false, 같으면 true를 반환
java의 == 연산자 ↔ 코틀린의 === 연산자 : 참조 대상을 비교함(referential equality) : 참조상의 동일성은 참조를 비교하고 두 비교대상이 같은 객체를 참조하는 경우 true를 반환함
문자열 템플릿
${} 로 감싸서 변수 값을 사용할 수 있음
$를 문자로 사용하고 싶은 경우 앞에 백슬래시 붙이기
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 메서드에 해당 문자를 파라미터로 넘겨주면 됨
표현식은 많이, 명령문은 적게
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 을 사용할 수 있음