Android Kotlin 기본문법
업데이트:
카테고리: Android
/기본문법과 변수
fun main() {
var myName = "Sohee"
print("Hello " + myName)
}
위의 코드와 같이 구성되있는 부분이 파일의 기본구조이다. 이 코드안에 들어있는 코드블록들이 실행하게 된다.
var와 val의 차이
var
은 선언 후 재 할당이 가능하다.
val
은 선언 후 재 할당이 불가능하다.
실제로 구동도 val
가 좀 더 빠르다.
코틀린의 타입
코틀린은 타입 언어이다. 그러므로 모든 변수는 타입을 가지고 있다.
정수 데이터 타입
Byte
: 8bitShort
: 16bitInt
: 32bitLong
: 64bit
타입을 직접 지정해주는 방법은 val myByte: Byte = 12
식으로 변수 뒤에 타입을 적어준다.
var myAge = 31
을 작성하였을 때 따로 타입을 지정하지 않아도 타입이 알아서 정해지는데 이것을 타입 추론이라고 한다.
부동 소수점 숫자 타입
Float
: 32bitDouble
: 64bit
Float
을 따로 지정하지 않고 val myFloat = 13.37F
와 같이 값뒤에 F를 넣어주면 Float로 인식하게 된다.
기본적으로 코틀린은 소수점 타입의 기본값을 Double로 갖고 있기 때문에 그렇다.
논리 타입
Boolean
: ture, false
따로 지정하지 않고 true와 false만 적어줘도 코틀린 내부에서 타입 추론을 통해 자동으로 전환된다.
문자 타입
char
: ‘문자 1개’String
: ‘문자열’
작은따옴표(‘’) 안에 적혀있는 데이터는 모두 문자로 인식한다.
String
은 결국 문자열이기 때문에 인덱스([0])로 각각의 문자에 접근할 수 있다.
문자열 합치기
다른 언어에서는 변수와 문자열을 합칠 때 +
를 사용하여 합치는데 코틀린을 변수와 문자열을 합칠 때 "첫번째 문자열 {$firstChar}"
로 문자열 내부에 ${}
를 통해서 변수를 넣어준다.
연산자
산술 연산자
+
: 값을 더한다.-
: 값을 뺀다.*
: 값을 곱한다./
: 값을 나눈 몫을 준다.%
: 값을 나눈 나머지를 준다.
이 때 연산하려는 값을 서로 타입이 맞거나 아님 결과에 타입을 지정해줘야 타입 에러가 발생하지 않는다.
비교 연산자
==
: 값이 같은지 비교!=
: 값이 다른지 비교<
: 보다 작은지 비교>
: 보다 큰지 비교<=
: 보다 작고 같은지 비교>=
: 보다 크고 같은지 비교
if문 - 흐름제어
var height1 = 170
var height2 = 189
// 해당 값이 참일 때 실행
if (height1 > height2) {
println("use raw force")
// if 구문이 거짓이고 다음 조건이 참이면 실행
}else if (height1 == height2){
println("use your power technique 1337")
// 위의 모든 조건이 거짓이면 실행
}else{
println("use technique")
}
When문
특정한 변수를 값에 따라 조건을 보는 문이다.
Js에 Switch문과 유사하다.
var season = 3
// () 안에는 바라볼 변수를 작성한다.
when(season){
// 여기에는 바라보는 변수에 따른 실행값을 작성한다.
1 -> println("Spring")
2 -> println("Summer")
3 -> {
println("Fall")
println("Autumn")
}
4 -> println("Winter")
// 아무것도 만족하지 못하면 else문으로 빠진다.
else -> println("Error")
}
//범위로 값을 지정하고 싶다면
when(season){
// 범위로 지정하고 싶을때는 in과 ..을 이용한다.
in 1..2 -> println("Upper")
// 내림차순은 DownTo를 사용
in 4 DownTo 3 -> println("Downer")
// 직접 지정하고 싶으면 ,로 구분하여 넣으면 된다.
1,2,3,4 -> print("Wow")
// in 앞에 !을 붙어 해당 범위외로 설정가능하다.
!in 10..20 -> ...
}
// 특정 타입을 검사할 때는 is를 사용한다.
when(season){
is Int -> ...
is Double -> ...
is String -> ...
}
While문 - 반복문
조건이 참이면 안에 코드를 계속하여 실행한다.
계속 코드가 돌아가지 않도록 조건 종료문이 반드시 필요하다
var x = 1
while(x<=10) {
println("$x")
x++
}
Do While문
while문과 비슷하지만 do안에 반복할 코드를 넣고 while문에 종료조건을 넣는다.
while문과의 차이점은 조건이 거짓이요도 do안의 코드는 한번 시행된다는 점이 차이가 있다.
var x = 1
do{
x++
}while (x <= 10)
for문
while문과 달리 조건에 들어갈 변수를 따로 지정하지 않아도 된다. for문 안에 있는 범위를 돌면서 코드를 실행한다.
// 오름차순
for (num in 1..10){
print("$num")
}
for (num in 1 until 10){
...
}
// 내림차순(downTo) + 건너뛰는 범위 설정(step)
for (num in 10 downTo 1 step 2){
...
}
break & continue
break
: 루프를 아예 끝내 더 이상 반복하지 않음continue
: 해당 루프를 건너뛰고 다음 루프를 시작함
함수
아래에 함수를 지정하고 main함수에서 불러서 사용하면 된다.
fun main(){
myFunction() // "..."
var result = addUp(5, 3)
print("$result") // 8
}
// 기본구조 키워드-이름-매개변수-코드
fun myFunction(){
print("...")
}
// 무언가를 리턴한다면 return 타입도 지정해야 한다.
fun addUp(a: Int, b: Int) : Int{
return a + b
}
흔히 불리는 단어로 메서드와 함수가 있는데
메서드는 객체 안에 들어있는 함수이고, 함수는 가장 바깥에 존재한다.
Nullable
변수가 null
을 가질 것인지 아닌지 체크한다.
fun main(){
var name : String = "Sohee"
// 이미 String으로 지정이 되어있기 때문에 null을 넣을 수 없다.
name = null
// 타입 마지막에 ?을 붙이면 nullable하게 데이터가 들어갈 수 있다.
var nullableName : String? = "Sohee"
nullableName = null
// nullable한 타입의 속성을 체크할 수 있다.
var len = nullableName?.length
// nullable한 값이 있든 없든 한번 체크한다.
// 숏컷 if문의 예시
nullableName?.let { println(it.length) }
}
엘비스 연산자와 Not null 단정
var nullableName : String? = "Sohee"
// ?: 엘비스 연산자
// nullable 변수가 빈칸이면 디폴트 값인 "Guest"가 name에 지정된다.
val name = nullableName ?: "Guest"
// !! Not null 타입 단정
print(nullableName!!.toLowerCase()) // sohee