Kotlin Basic - 함수와 변수
출처 : Kotlin in Action
Kotlin in Action - YES24
코틀린이 안드로이드 공식 언어가 되면서 관심이 커졌다. 이 책은 코틀린 언어를 개발한 젯브레인의 코틀린 컴파일러 개발자들이 직접 쓴 일종의 공식 서적이라 할 수 있다. 코틀린 언어의 가장
www.yes24.com
Hello World 알아보기
fun main() {
val greetings : String = "Hello, World!"
println(greetings)
}
- 함수선언은 fun 키워드를 사용한다
- 파라미터 이름 뒤에 타입을 쓴다 ( 파라미터 : 타입 )
- 자바 표준 라이브러리를 간결하게 사용할 수 있게 감싼 래퍼인 "코틀린 표준 라이브러리"가 있다
System.out.println -> println
- 줄끝에 세미콜론(;)을 붙이지 않아도 된다
함수
fun max(a: Int, b: Int) : Int {
return if (a > b) a else b
}
- 함수를 선언하기 위한 키워드인 fun을 사용한다
- fun 다음에 함수 이름을 작성한다
- 함수 이름 뒤에는 괄호를 쓰고 그 안에 파라미터 목록을 작성 한다
- 리턴 타입은 파라미터 괄호 뒤에 콜론(:)을 쓰고 뒤에 적는다
코틀린의 if는 식이다
코틀린의 if는 자바와 다르게 식(expression)이다
그래서 아래의 코드는 문제가 없이 컴파일 된다
return if (a > b) a else b
식은 값을 만들어 내며, 다른식의 하위 요소로 계산에 참여 가능하다.
식이 본문인 함수
fun max(a: Int, b: Int) : Int {
return if (a > b) a else b
}
---
fun max(a: Int, b: Int) : Int = if (a > b) a else b
위의 max 함수는 중괄호로 이루어진 함수이고 밑의 max 함수는 식으로만 이루어진 함수다
- "="을 사용하여 식의 결과값을 바로 받는다
- return을 사용하지 않아도 된다
- 여러줄로 이루어질 경우에는 사용할 수 없다
코틀린에서는 타입을 선언하지 않아도 코틀린이 자동으로 타입을 추론하여 타입을 지정해 준다. 이런 타입추론은 편리하기 하지만 다른 사람이 코드를 볼 때 불편할 수도 있다. 밑의 코드처럼 쉽게 추론할 수 있는 함수가 있는 반면 여러 단계를 거쳐 반환 되는 값에 대해서는 사람이 추론하기 어렵기 때문이다. 심지어 자신이 작성했던 코드도 어떤 타입이 리턴되는지 확인이 불가능 할 수 있다.
조금 번거러워도 타입을 적어주자.
참고로 중괄호로 이루어진 함수의 경우에는 타입을 꼭 입력해 주어야 한다 그렇지 않으면 Unit 타입이 지정되며, 아무값도 반환하지 않는 자바의 void와 같게 된다.
fun max(a: Int, b: Int) = if (a > b) a else b
---
fun max(a: Int, b: Int) : Int = if (a > b) a else b
코틀린에서는 식이 본문이 함수가 자주 쓰인다, if, when, try 등의 더 복잡한 식에도 쓰인다
식이 본문인 함수의 반환 타입만 생략 가능하다
변수
코틀린에서는 변수 선언 키워드 뒤에 변수명을 쓰고, 그 변수명뒤에 타입을 명시하거나 생략할 수 있다
val question = "Foo, Bar"
val question : String = "Foo, Bar"
val answer = 42
// 원한다면 타입을 명시해도 된다
val answer : Int = 42
// 부동소수점 상수를 사용한다면 변수타입은 Double이 된다
val yearToCompute = 7.5e6
val yearToCompute : Double = 7.5e6
초기화를 하지 않고 변수를 선언하려면 변수타입을 반드시 명시해줘야 한다
// 변수를 먼저 선언한다. 아직 초기화를 하지 않았다
// 변수의 타입을 선언해주어야 한다
val answer : Int
val answer = 42
값이 변할수 있는 변수와 변할수 없는 변수
val
- value
- 변경이 불가능한 참조를 저장하는 변수다
- 초기화하고 나면 변경이 불가능하다
- 자바의 final 변수에 해당한다
var
- variable
- 변경이 가능한 참조를 저장하는 변수다
- 변수의 값이 바뀔수 있다
- 자바의 일반 변수에 해당한다
코틀린에서는 기본적으로 val 키워드를 사용하고 꼭 필요할 때만(엔티티의 값 변경 등) var 키워드로 변경을 권장한다
val 변수는 실행 할때 한번만 초기화 되어야한다.
하지만 어떤 블록이 실행될 때 초기화 문장이 하나만 실행됨을 컴파일러가 확인 할 수 있다면 조건에 따라 val 값을 다른 여러값으로 초기화 가능하다
val message: String
if (isConfirm()){
message = "Success"
} else {
message = "Failed"
}
val 키워드는 참조 자체는 불변이라고 해도 참조가 가르키는 객체의 내부값은 변경할 수 있다
// 처음 할당되는 ArrayList는 그 참조자체는 변경 불가능하다
// 하지만 그 객체 내부의 값들을 추가, 삭제 될수 있다
val languages : ArrayList<String> = arrayListOf("Java")
languages.add("Kotlin")
languages.add("NodeJS")
languages.add("Python")
참조 객체 변경에 따른 변수 선언 키워드
var 로 선언된 MutableList같은 경우에는 참조 자체가 변경될수도 있고 객체 내부의 값도 변경될 수 있어 지양해야한다. 보통 var로 선언된 컬렉션의 경우에는 객체 내부 변경이 불가능한 List, Set 등을 사용하며 아예 참조가 교체 될 수 있게 하자
// var로 선언된 변경가능한 컬렉션
var list1 : MutableList<String> = mutableListOf("Java", "Kotlin", "NodeJs")
// list에 요소가 추가 될수도 있으나
list1.add("Python")
// list 자체가 변경될 수도 있다
list1 = mutableListOf("Pizza", "Chicken", "Soup")
// var로 선언할 경우에는 ImmutableCollection을 사용하는것이 좋다
var list2 : List<String> = listOf("Java", "Kotlin")
// 요소가 변경될 수 없음을 알려주자
// val로 선언된 컬렉션은 객체 내부만 변경됨을 알 수 있다
val list3 : MutableList<String> = mutableList("Java")
var 키워드는 참조 자체는 불변이라고 하더라도 타입 자체를 변경할 수 없다
// 아래의 코드는 컴파일 오류 발생
var answer = 42
answer = "no answer"
문자열 템플릿
문자열안에 변수를 사용할 수 있게 해주는 문자열 템플릿 기능을 지원한다
val name = "Brown"
println("Hello $name!")
>>> Hello, Brown!
// 복잡한 식은 중괄호로 묶는다
val member = Member("Brown", 27)
println("member name : ${member.name}")
>>> member name : Brown
// $문자를 넣고 싶다면 이스케이프 시킨다
println("\$x")
>>> $x
// 중괄호 안의 식에서 큰 따옴표를 사용할 수 있다
val args : Array<String> = arrayOf()
println("Hello, ${if (args.isNotEmpty()) args[0] else "someone"}!")
>>> Hello, someone!