fun max(a:Int, b:Int) : Int{
return if(a>b) a else b
}
fun main(args: Array<String>) {
println(max(1,2))
}
위에서는 코틀린으로 if~else문을 사용하였다.
이를 자바에서 3항 연산자로 표현을 하였었다. 아래와 같이.
public int max(int a, int b){
return a>b ? a : b
}
expression은 값을 반환하는 형태이고 statement는 아무런 값을 만들지 않는다.
자바에서 이런 모든 제어문이 statement이지만, kotlin에선 반복문을 제외하고는 모두 expression이다.
//if문의 expression
fun max(a:Int, b:Int) : Int = if(a>b) a else b
//type inference를 이용하여 간소화
fun max(a:Int, b:Int) = if(a>b) a else b
type inference를 컴파일러에서 해주기에 return type을 생략할 수 있다.
단, expression 형태의 함수에서만 가능하다.
코틀린에서 변수는 반드시 val, var로 시작해야 한다.
이 키워드는 변수의 시작을 알리면서 변수가 immutable type인지 mutable type인지 나타낸다.
따라서 val로 지정된 불변타입 변수는 추후에 값을 변경할 수 없으며, 변경시 compile error가 난다.
java의 final이 val과 유사하다고 보면 된다.
//immutable
val a = "b"
//mutable
var c = "case"
//초기화
val garde : Int
grade = 1
변수도 타입 추론이 가능하다.
초기화 시 값을 할당하지 않는다면? 반드시 type을 명시해야 한다.
이건 나중에 따로 더 자세하게 다뤄야겠다.
코틀린에서 함수나, 변수에 한정자를 명시적으로 나타내지 않으면 모두 public이다.
자바에서 property란, 멤버 변수와 이 멤버 변수의 getter, setter를 의미한다.
코틀린에선 이게 분리된 property를 간단하게 표시할 수 있도록 하는 요소를 가진다.
즉, 멤버 변수를 선언하면 그에따른 getter, setter는 컴파일러가 자동으로 생성해준다.
(코틀린의 특징에서 봤었다)
fun Person(
val name : String //immutable임으로 컴파일러가 getter만 생성한다.
var isMarried : Boolean //mutable임으로 컴파일러가 getter/setter 모두 생성한다.
)
fun main(args : Array<String>){
val person = Person("Bob", true)
println(person.name) //실제로 getter
println(person.isMarried) //실제로 getter 가 불린다.
}
자바에선 person.getName()으로 값을 얻거나 setd을 해야 했지만
코틀린에선 컴파일러가 자동으로 생성해주고 그를 부르기만 하면 된다.
단 "isXXXX"인 이름의 멤버변수의 경우 setter에만 set을 붙이고 getter에는 "isXXX"를 그대로 쓴다.
ex. person.isMarried() / person.setMarried(true)
getter/ setter 특정 구현부에 넣고 싶은 경우가 있다.
이런 경우, 직접 get(), set() 메서드를 구현하여 넣을 수 있다.
그 경우, 아래와 같이 가능하다.
class Rectangle(val height: Int, val width: Int){
val isSquare : Boolean
get() {
return height == width
}
}
fun main(args : Array<String>){
val rectangle = Rectangle(41,43)
println(rectangle.isSquare)
}