2. 기본 문법 - Basic Syntax
목차.
1. 패키지 정의
1-1. 패키지 정의는 파일 최상단에 위치.
1-2. 디렉터리와 패키지를 일치시키지 않아도 됨.
package my.demo
import java.util.* // 자바와 비슷
2. 함수 정의
2-1. 함수는 fun 키워드로 정의.
fun sum(a: int, b:int): Int {
return a+b
}
/*
키워드 명칭(파라미터): 리턴타입 {
구현부
}
*/
2-2. 함수 몸체가 식(Expression)인 경우 return 생략가능.
이러한 경우 return type이 추론되므로, 생략
fun sum(a: int, b: int) = a + b
1번과 2번이 같은 리턴결과가 됨.
2-3. 리턴 할 값이 없는 경우 Unit(Object)으로 리턴 함.
Unit은 Java에서 void 역할.
fun printConsole(): Unit {
println("hello")
}
// Unit 은 자바에서 void의 역할을 한다. 이는 반환할 리턴값이 없을때, 사용
// Unit은 아래와같이 생략도 가능하다.
fun printConsole() {
println("hello")
}
3. 지역 변수 정의
3-1. val: 읽기 전용 변수
값의 할당이 1회만 가능하며 Java의 final과 유사하다.
val a: Int = 1 // 즉시할당.
val b = 2 // Int 타입으로 추론함.
val c: Int // 컴파일 오류. 초기화 필요.
c = 3 // 컴파일 오류, 읽기전용.
3-2. var: Mutable 변수
var x = 5
x += 1
4. 주석
4-1. 한줄 주석
자바와 동일하며 // 로 사용
4-2. 여러 줄 주석
/* */ 로 사용하며 자바와 다르게 중첩 사용 가능.
/*
/* 중첩~ */
*/
5. 문자열 템플릿 (문자열 보간법)
String interpolation (문자열 보간법)
var a = 1
val s1 = "a is $a' // a is 1
a = 2
val s2 = "${s1.replace("is", "was")}, but now is $a" //a was 1, but now is 2
6. 조건문
하나만 있는 조건문은 조건식으로 변경 가능
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
//위와 같은 조건문을 아래와 같은 조건식으로 변경할 수 있다.
fun maxOf(a: int, b: Int) = if (a > b) a else b
7. nullable
값이 null 일 수 있는 경우 타입에 nullable 마크를 명시해야 함.
fun parseIntRetrun(str: String): Int? {
if (0 == Integer.parseInt(str)) {
return null;
} else {
return Integer.parseInt(str)
}
}
💡때문에, null을 리턴해주는 메서드(fun) 을 만들고 그것을 호출(사용)할 때에는 null 체크를 해주어야 한다.
fun xyPrint(str1: String, str2: String) {
val x: Int? = parseIntRetrun(str1)
val y: Int? = parseIntRetrun(str2)
if (x != null && y != null) {
println(x * y);
} else {
println("'$str1' or '$str2' is zero.")
}
}
이렇듯, nullable을 지원해주어 프로그래밍의 안전성을 높임.
8. 자동 타입 변환
타입 체크만 해도 자동으로 타입이 변환이 됨.
fun getStringLength(obj: Any): Int? {
if (obj is String) {
//obj가 자동으로 String 타입으로 변환 됨.
return obj.length
}
return null
}
9. 반복문 while
자바와 같다.
val items = listOf("one", "two", "three")
var index = 0
while (index < items.size) {
println("index: $index, item is ${items[index]}")
index++
}
10. when expression
스위치 문처럼 쓰임.
fun whatType(obj: Any): String =
when (obj) {
1 -> "one, number"
"Hi" -> "Hi, String"
is Long -> "Long"
!is String -> "Not String"
else -> "i'don know"
}
타입형식도 알아서 찾을 수 있다.
11. ranges ( 범위 체크 )
11-1. In 연산자를 이용해서 숫자의 범위 체크.
val x = 3
if (x in 1..10) {
println("$x is between 1~10")
}
11-2. range를 이용한 for loop문
for (x in 1..5) { // 1부터 5까지 반복문.
println(x)
}
12. collections (컬렉션)
12-1. in을 사용한 컬렉션 loop
val items = listOf("one", "two", "three")
for (item in items) {
println(item)
}
12-2. in으로 collection 포함되는지 체크
자바의 contain 같은 개념
val items = listOf("one", "two", "three")
when {
"one" in items -> println("one is 1")
"two" in items -> println("two is 2")
"three" in items -> println("three is 3")
else -> println("???")
}
/*단, one까지만 호출되며, two는 콘솔에 println이 되지 않음.*/
12-3. 람다식을 이용한 컬렉션 filter, map등의 연산
자바의 stream 과 비슷하게 쓰인다.
val items = listOf("t1", "t3", "q2", "t2", "q1")
items
.filter { it.startsWith("t") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach{println(it)}
/*T1
T2
T3
*/