Kotlin을 시작해보자. (변수선언, 자료형, 조건문, 반복문)
Kotlin2020. 8. 29. 01:00
Java 개발자가 Kotlin 을 공부하면서.. 끄적인 노트입니다.
변수
// var : 변수
// val : final 변수
val name:String = "jsmarch"
var age:Int = 39
// name = "Poby" // Compile error
age = 40
println("${name}의 나이는 ${age} 입니다.") // jsmarch의 나이는 40 입니다.
var job = "Developer" // String 으로 명시하지 않아도 타입 추론하여 String으로 자료형을 부여한다.
// 코틀린은 기본적으로 null을 허용하지 않는다.
// 만약 변수를 초기화 하지 않고 사용하면 java에서는 null 로 처리되지만 (primitive type 제외)
// 코틀린은 초기화 되지 않는 변수를 사용할때 compile error 가 발생한다.
var nickName:String
// println(nickName) // Compile error
// Null을 명시적으로 사용하고 싶으면 Type 뒤에 "?"를 추가하면 된다.
// var company:String = null // Compile error
var company:String? = null
// nullable한 변수에 접근해야 할때 java는 항상 null check를 해야하지만 코틀린은 nullable 변수를 쉽게 사용할수 있다.
var phoneNumber:String? = null
// println("나의 phone number는 ${phoneNumber.length} 자리 입니다.") // Nullable 하기때문에 compile error
println("나의 phone number는 ${phoneNumber?.length} 자리 입니다.") // phoneNumber 가 null 이기 때문에 length를 호출하지 않고 null을 출력한다.
자료형
val int: Int = 123
var long: Long = 123
var float: Float = 0.2F
var double: Double = 3.3
var char: Char = 'A'
var boolean: Boolean = false
var string: String = "12345"
var booleanStr = "true"
var multiLineStr: String = """
|여러줄은 이렇게 출력하나봄...
|탭을 없애려면 앞에 | 를 넣으면 된다고하네요
|나름 JAVA 보다 편하네요
""".trimMargin() // trimMargin 으로 marginPrefix (|) 까지의 white space를 제거한다.
println(multiLineStr)
// 타입추론
var int1 = 123
var long1 = 123L
// 문자열 Template을 지원하기 때문에 Java에서 StringBuilder나 StringBuffer 또는 + 로 열심히 붙이거나 MessageFormat 을 사용하거나 했었는데 간단하게 사용할수 있네요..
var stringTemplate = "int는 ${int} 이구요.. String은 ${string}입니다. String은 ${string.length}자입니다. 이렇게도 사용할수 있어요 $booleanStr 이렇게 사용하려면 양옆에 공백이 있어야해요."
println(stringTemplate)
// type 변환 (null을 허용하지 않다보니.. java에서 Wrapper type과 primitive type을 혼용할때 발생할수있는 NPE 위험은 없네요.)
println("String to Int : ${string.toLong()}") // 문자열 format
println("int to String : ${int.toString()}")
println("String to Boolean : ${booleanStr.toBoolean()}")
println("String to Boolean : ${"".toBoolean()}")
// String을 number로 변환시 변환할수 없는 문자열일 경우 Java와 마찬가지로 NuberFromatException 이 발생한다.
try {
println("String to Int (NumberFormatException) : ${booleanStr.toInt()}")
} catch (e: NumberFormatException) {
println("NumberFormatException error : ${e.message}")
}
// Array 생성
var arr: Array<String> = arrayOf("A", "B", "C", "D")
println("Array :: ${arr.contentToString()}")
// 기본 자료형 배열은 이렇게 선언 할 수 있다.
var arrBoolean: BooleanArray = booleanArrayOf(true, false, true, false)
var arrInt: IntArray = intArrayOf(1, 2, 3, 4, 5)
var arrDouble: DoubleArray = doubleArrayOf(1.2, 1.3, 1.4, 1.5)
var arrChar: CharArray = charArrayOf('A', 'B', 'C')
println("BooleanArray :: ${arrBoolean.contentToString()}")
println("IntArray :: ${arrInt.contentToString()}")
println("DoubleArray :: ${arrDouble.contentToString()}")
println("CharArray :: ${arrChar.contentToString()}")
// 생성자로 배열 생성
var arrayStr = Array(10) { i -> "#${i.toString()}#" }
println("ArrayStr :: ${arrayStr.contentToString()}")
조건문
// 기본적인 if, else 문은 Java 와 동일 하니 생략
var aa = "A"
var bb = "B"
// 코틀린은 삼항 연산자가 없다. 대신 if문은 삼항연산자 처럼 값을 할당하는데 사용할수 있다.
var name:String = if(aa == bb) {
"같은 사람"
} else {
"다른 사람"
}
println("같은 사람 일까요? 다른 사람 일까요? 답은 $name")
// block 없이
var nonBlockName:String = if(aa != bb) "다른 사람" else "같은 사람"
println("같은 사람 일까요? 다른 사람 일까요? 답은 $nonBlockName")
// When : Java 의 Switch-case 와 유사함
// case 키워드가 생략되고, :(콜론) 대산 -> 를 사용해서 간단하게 사용 할 수 있음
// multi line 처리가 필요하면 -> {} 중괄호 안에 여러줄을 처리할수 있음
var number:Int = 3
when(number){
0 -> println("0입니다.")
1 -> println("1입니다.")
2 -> println("2입니다.")
3 -> {
println("3입니다.")
println("Multi line 이 필요 하면 이렇게..")
println("사용 하시면 됩니다.")
}
4 -> println("4입니다.")
5 -> println("5입니다.")
else -> println("일치하는 값이 없네요~")
}
// when 은 여러값 or Range or 배열에 포함 되는 지의 조건을 사용 할 수 있다.
var arr:IntArray = intArrayOf(1,2,3)
when(number){
0,1 -> println("0 이거나 1인경우에..")
in 4..6 -> println("4 ~ 6 범위에 속하는 경우")
in arr -> println("arr 에 포함되는 값이 있는경우")
!in arr -> println("arr 에 포함되는 값이 없는 경우")
else -> println("아무 것도 해당 사항 없을때..")
}
반복문
// 코틀린의 for문은 for-each 문이다.
var arr:Array<String> = arrayOf("A", "B", "C", "D", "E")
for(value in arr){
println("For-Each : ${value}")
}
// Index를 사용하기
for(idx in arr.indices) {
println("Index 사용해보기 : idx :: ${idx}, value: ${arr[idx]}")
}
// Range 사용하기
for(idx in 5..10){
println("Range 사용해보기 : $idx")
}
// index 와 value 같이 사용하기
for((idx, value) in arr.withIndex()){
println("Index와 Value 같이 사용하기 : idx : $idx , value : $value")
}
// While 은 Java와 동일하니 Skip
// do-while Java와 동일, 차이점은 do-while 문 안에서 선언된 변수를 사용 할 수 있음
// continue, break 는 Java와 동일, label 은 살짝 다름 :(콤마) 대산 @(at) 사용
for(value in arr){
label@ for(idx in 1..5){
println("Label Test value : ${value}, idx : ${idx}")
if(idx > 2){
break@label
}
}
}