- 클래스 정의 없이 파일 생성 가능
- 클래스명이 파일명과 달라도 됨
- main 함수 작성 시 (args: Array<String>) 생략해도 동작에 문제 없음
- 콘솔에 출력하기 위해 print 또는 println 사용
- 세미콜론을 찍어도 오류는 나지 않지만, kotlin에서는 사용하지 않는 것을 권장
- 한 줄에 여러 명령을 쓰기 위해서는 세미 콜론 필요(ex println("얼른 끝내고"); println("안드로이드 해야지"))
변수 선언
선언 형식 : val or var 변수명 [:타입] = 값
최초 선언 시에 타입이 결정되고 변수는 한 번 타입이 결정 되면 동일한 타입의 값만 담을 수 있음
(1) 선언 후 초기화 : 반드시 변수명 옆에 콜론을 구분자로 붙여 타입을 지정해야 함
var 변수명 : 타입
변수명 = 값
ex)
var age:Int
agd = 20
(2) 선언과 동시에 초기화 : 타입이 생략 되어도 타입을 추론해서 자동으로 인식
var 변수명 = 값
ex)
var name = "둘리"
var age = 3
원시 문자열과 문자열 템플릿
(1) 원시 문자열
: """ """ 사용하면 문자열 안에 엔터, 스페이스,탭, 이스케이프 문자 사용 가능
fun main(args: Array<String>) {
/* 일반 문자열 사용 */
var str = "일반 문자열 안에는 \n\n문자열 안에 엔터나 스 페 이 스\t그리고 탭을 자유롭게 사용할 수 있으며\n" +
"이스케이프 문자 사용도\n 가능하다"
/* RawString 사용 */
var raw = """원시 문자열 안에서는
문자열 안에 엔터나 스 페 이 스 그리고 탭을 자유롭게 사용할 수 있으며
이스케이프 문자 사용도
가능하다"""
}
(2) 문자열 템플릿
: 문자열 안에서 '$' (문자열 템플릿)을 활용해서 변수의 값을 바로 적용할 수 있음
fun main(args: Array<String>) {
var num1 = 10
var num2 = 20
var strWithNum = "Hello, $num1"
println(strWithNum)
}
출력 결과
Hello, 10
: 문자열 템플릿을 활용할 때 $에 { }를 쓰면 표현식(연산 결과나 속성 값)을 쓸 수 있음
fun main(args: Array<String>) {
var str2 = "\n\t Hello \t\n"
var trimStr = "trimStr : $str2.trim()" //사용불가
var trimStr = "trimStr : ${str2.trim()}" //{}사용하기
println(trimStr)
var sum = "sum : ${num1 + num2}"
println(sum)
}
타입의 종류와 저장 가능 크기
fun main(args: Array<String>) {
println("정수형 값의 최소/최대값")
println("Byte min : ${Byte.MIN_VALUE} max : ${Byte.MAX_VALUE}")
println("Short min : ${Short.MIN_VALUE} max : ${Short.MAX_VALUE}")
println("Int min : ${Int.MIN_VALUE} max : ${Int.MAX_VALUE}")
println("Long min : ${Long.MIN_VALUE} max : ${Long.MAX_VALUE}")
println("실수형 값의 최소/최대값")
println("Float min : ${Float.MIN_VALUE} max : ${Float.MAX_VALUE}")
println("Double min : ${Double.MIN_VALUE} max : ${Double.MAX_VALUE}")
println("문자형 값의 최소/최대값")
println("Char min : ${Char.MIN_VALUE.code} max : ${Char.MAX_VALUE.code}")
println("논리형 값의 최소/최대값")
//println("Boolean : ${Boolean.MIN_VALUE} max : ${Boolean.MAX_VALUE}")
// 에러 : 논리형은 저장 크기를 따로 알 수 없다
}
명시적 형변환
: 코틀린에서는 자동형변환이 적용되지 않으므로 명시적 형변환을 해주어야 함
fun main(args: Array<String>) {
var byteValue: Byte = 65
println(byteValue)
/* Int, Short, Long, Float, Double 타입으로 각각 변환하는 메서드 호출 */
var intValue: Int = byteValue.toInt()
println(intValue)
var shortValue: Short = byteValue.toShort()
println(shortValue)
var longValue: Long = byteValue.toLong()
println(longValue)
var floatValue: Float = byteValue.toFloat()
println(floatValue)
var doubleValue: Double = byteValue.toDouble()
println(doubleValue)
/* Char 타입으로 변환 */
//var charValue: Char = byteValue.toChar()
var charValue: Char = byteValue.toInt().toChar()
println(charValue)
/* 문자열을 기본 타입으로 변환 */
var intString: String = "1234"
var doubleString: String = "1.234"
var stringToInt: Int = intString.toInt()
var stringToDouble: Double = doubleString.toDouble()
println(stringToInt)
println(stringToDouble)
var booleanString: String = "true"
var stringToBoolean: Boolean = booleanString.toBoolean()
println(stringToBoolean)
/* 기본 타입을 문자열로 변환 */
var num: Int = 123
var intToString: String = num.toString()
println(num)
var wrongNumberString: String = "문자열"
//var wrong: Int = wrongNumberString.toInt()
/* 어떤 타입이던 뒤에 물음표를 붙이면 null 참조를 저장할 수 있다.
* 코틀린에서는 null 체크를 위한 다양한 도구를 제공하는데
* 여기서 사용한 물음표의 의미는 null이 될 수 있는 타입 확장이다. */
var wrong: Int? = wrongNumberString.toIntOrNull() //숫자로 변환하거나 실패할 경우 null 반환
println(wrong)
}
Any 타입
: 모든 타입의 값을 대입할 수 있는 최상위 타입
Any 타입의 변수에는 초기화 이후에도 어떤 종류의 값이든 대입 가능
fun main(args: Array<String>) {
var anyValue: Any
anyValue = 100
// ::class.simpleName으로 코틀린의 타입을 확인할 수 있다 (::class => .getClass())
println(anyValue::class.simpleName)
anyValue = "Hello"
println(anyValue::class.simpleName)
anyValue = 1.234
println(anyValue::class.simpleName)
/* Any 타입 배열을 선언하면 모든 종류의 값을 저장할 수 있음 */
var anyTypeArr: Array<Any> = arrayOf(1, 1.234, "Hello")
}
null 값 대입을 허용하는 타입으로 선언
/* 기본적으로 null 값 대입을 허용하지 않는 타입(Int)으로 선언 */
var num = 100
/* null값 대입 불가 */
//num = null
/* null을 대입 받을 수 있는 Int? 타입의 변수 선언 */
var a: Int? = 100
/* null값 대입 가능 */
a = null
Null Check
Null값이 입력 불가능한 타입은 바로 호출해도 되지만 Nullable한 타입은 호출 시 Null Check가 필요
(1) let 함수를 이용한 null 타입 값 접근
let 함수 : 범위 함수로서 변수의 값이 null이 아닌 경우에 실행할 코드 블럭을 작성할 수 있게 도와주는 함수
var c: String? = null
c?.let {
println(it.length)
}
// it: value-parameter로 c가 null이 아닌 경우 c를 의미
출력 결과
null
(2) 안전호출 연산자(Safe-call Operator)를 이용하는 방법
'?' 와 ' . '을 붙여 null 일 경우 변수 값에 접근하지 않고 바로 null값을 반환 함
var len: Int? = c?.length
println(len)
출력 결과
null
(3) 엘비스(Elvis) 연산자(?:)를 이용하는 방법
연산자 왼쪽의 피연산자가 null이 아닐 경우 해당 값을 반환하고 null일 경우 오른쪽 피연산자를 반환 함
var one = null ?: 1
println(one)
var two = 2 ?: 1
println(two)
var result = c?.length ?: 0
println(result)
출력 결과
1
2
0
(4) ' !! ' 를 사용하는 방법
null 값이 아님을 보장하는 연산자(!!)를 사용해 null을 허용하지 않는 타입으로 변환
var nullableStr: String? = null
//null을 가질 수 없는 타입이기 때문에 컴파일 에러 발생
//var str: String = nullableStr
//!!연산자를 이용하여 타입을 null 불가능한 타입으로 변경할 수 있지만
//여기에서는 컴파일 에러를 런타임 에러로 변경한 것 뿐으로 NPE이 발생한다
//var str: String = nullableStr!!
var nullableString2: String? = "Hello"
var str: String = nullableString2!!
println(str.length) //String 타입은 속성에 별도의 연산자를 사용하지 않아도 안전하게 접근 가능
출력결과
5
(5) null을 반환하는 타입 변환 메소드
null을 허용하는 타입 ' ? ' toIntOrNull()을 형변환 실패시에는 null을 반환 받을 수 있도록 작성할 수 있음
var wrongNumberString = "숫자아님";
var wrong: Int? = wrongNumberString.toIntOrNull()
println(wrong)
출력결과
null
'프로그래밍 > Kotlin' 카테고리의 다른 글
[코틀린 / Kotlin] class 정의 , inti 블록 (0) | 2022.10.19 |
---|---|
[코틀린 / Kotlin] 반복문(while문, do-while문, for문 , break, continue) (0) | 2022.10.19 |
[코틀린 / Kotlin] 조건문 (if 문, when case 문) (0) | 2022.10.19 |
[코틀린 / Kotlin] 연산자 (산술, 복합, 대입, 인덱스 연산자, in 연산자, .. 연산자 ) (0) | 2022.10.19 |
[코틀린 / Kotlin] 배열과 상수(array, const val, val) (0) | 2022.10.19 |