이 포스팅은 Kotlin in Action, 드미트리 제메로프 & 스베트라나 이사코바, 에이콘출판사(2017)을 읽고 개인 학습용으로 정리한 글입니다.
함수 최상위 수준에 정의 가능
-> 자바와 달리 꼭 클래스 안에 넣을 필요 X
배열도 일반적인 클래스와 마찬가지
-> 자바와 달리 배열 처리를 위한 문법 따로 존재하지 X
코틀린 표준 라이브러리
-> 여러가지 자바 표준 라이브러리 함수를 간결하게 사용할 수 있게 감싼 래퍼(Wrapper) 제공
-> ex. System.put.println 대신 println 사용
fun max(a : Int, b : Int) : Int{
return if(a > b) a else b
}
코틀린의 if 식은 자바 3항 연산자와 비슷함
(a > b)? a : b
식(statement): 값을 만들어 냄, 다른 식의 하위 요소로 계산에 참여 가능
-> 코틀린에서 루프를 제외한 대부분의 제어구조는 식임
문(sentence): 값을 만들어내지 X
-> 코틀린에서 대입문
fun max(a : Int, b : Int) : Int = if(a > b) a else b
fun max(a : Int, b : Int) = if(a > b) a else b
식이 본문인 함수는 반환 타입 생략 가능
-> 컴파일러가 타입 추론(type inference)
블록이 본문인 함수는 반환 타입 생략 불가능 & 반드시 return문 있어야
val: 변경 불가능한 참조(immutable), 초기화하고 나면 재대입 불가능
-> 자바의 final 변수
var: 변경 가능한 참조(mutable)
기본적으로 모든 변수 val로 선언 -> 나중에 필요할 때만 var로 변경
val 참조 자체는 불변이어도 그 참조가 가리키는 객체의 내부 값은 변경될 수 있음
val languages = arrayListOf("Java")
languages.add("Kotlin")
문자열 템플릿: 자바의 문자열 접합연산과 동일한 기능
컴파일러는 각 식을 컴파일 시점에 검사
-> 존재하지 않는 문자열을 템플릿 안에 넣으면 컴파일 오류
문자열 템플릿 안에서 변수 이름만 사용하는 경우라도 중괄호로 감싸는 것이 좋다
fun main(args:Array<String>) {
var name = "sunjoo"
println("Hello, ${if(name.isNotBlank()) name else "someone!"}")//Hello, sunjoo
name = ""
println("Hello, ${if(name.isNotBlank()) name else "someone!"}")//Hello, someone!
}
public class Person{
private final String name;
public Person(String name){
this.name = name;
}
public String getName(){
return name;
}
}
class Person(val name : String)
자바에서는 데이터를 필드(field)에 저장, 멤버 필드의 가시성은 보통 private
-> 클라이언트에게 접근자 메서드(accessor method) 제공 (getter, setter)
자바는 필드와 접근자를 한데 묶어 프로퍼티(property)라 부름
class Person(val name : String, var isMarried : Boolean)
읽기 전용 프로퍼티
-> 비공개 필드, 공개 게터 생성됨
변경할 수 있는 프로퍼티
-> 비공개 필드, 공개 게터, 공개 세터 생성됨
코틀린에서 Person 클래스 사용하기
-> 게터/세터 호출 대신 프로퍼티 직접 사용
class Person(val name: String, var isMarried:Boolean)
fun main(args:Array<String>) {
val person = Person("Bob", true) //new 키워드 사용하지 않고 생성자 호출
println(person.name)//Bob
println(person.isMarried)//true
person.isMarried = false
println(person.isMarried)//false
}
class Rectangle(val height:Int, val width: Int){
val isSquare: Boolean
get(){
return height == width
}
}
fun main(args:Array<String>) {
val rec1 = Rectangle(4, 5)
println(rec1.isSquare)//false
val rec2 = Rectangle(3, 3)
println(rec2.isSquare)//true
}
같은 패키지에 속해있다면 다른 파일에서 정의한 선언이어도 직접 사용 가능
다른 패키지에 속해있다면 다른 파일에서 정의한 선언 임포트를 통해 불러와야
코틀린에서는 클래스 임포트와 함수 임포트에 차이 X
-> 최상위 함수는 그 이름으로 임포트 가능
패키지 이름 뒤에 *를 추가하면 패키지 안의 모든 선언 임포트
(최상위에 정의된 함수, 프로퍼티 포함)