* 해당 내용은 Kotlin 공식 레퍼런스에 있는 "Basic Syntax" 내용을 번역하고 제 방식으로 이해해서 작성하였습니다.
1. Package 정의와 import 방법
package com.example.suhwanc
import kotlin.text.*
소스 파일의 맨 윗부분에 이런 식으로 선언하면 된다.
import 맨 뒤 '*' 표시는 kotlin.text 안에 있는 모든 라이브러리를 가져온다는 의미로 자주 쓰이니 꼭 알아두자.
2. 프로그램 시작 지점
fun main(){
println("Hello World!")
}
코틀린 프로그램은 main 함수가 시작이다.
함수 선언은 앞에 fun을 붙이면 되고, 반환형과 파라미터는 따로 선언을 해주어야 한다.
여기서는 println("Hello World!")라는 문장만 써두었는데
print는 출력하기 위한 함수이고 그 뒤에 ln을 붙이면 뒤에 개행(엔터) 문자를 붙인 것이 된다.
내부에는 공백도 되고 어떤 자료형도 출력할 수 있다.
3. 함수
fun sum(a: Int, b:Int) : Int{
return a + b
}
fun main(){
println(sum(1, 2))
}
함수의 기본틀은 이러하다.
1) fun 선언
2) 함수 이름 (여기서는 sum)
3) 소괄호() 안에 파라미터 (함수로의 전달 값)
4) 함수의 리턴 자료형 (여기서는 : Int)
5) 함수의 표현식 body (중괄호{} 내부 코드)
코틀린은 자료형을 나타낼 때 ": (자료형)"와 같은 방식으로 나타낸다.
변수 선언 시에도 "var a: Int" 이런 식으로 선언해주는데, 이후에 변수 부분에서 더 자세히 언급하겠다.
함수의 반환형을 나타낼 때도 똑같이 파라미터 담는 () 괄호 뒤에 ": (자료형)"을 넣은 후 중괄호에 함수 내용을 추가하면 된다.
4. 변수
1) 상수 val
fun main(){
val a: Int = 1
a = 2
}
val은 상수로서 처음 선언부에서만 값이 들어갈 수 있다. 읽기 전용 지역 변수라고도 한다.
다음과 같이 선언 이후 값을 대입하면 오류가 발생하게 된다.
2) var
fun main(){
var a: Int = 1
a = 2
}
var은 재할당이 가능한 변수로, 주로 자주 쓰인다.
이 둘은 모두 변수 이름 뒤에 자료형을 명시해주어야 한다.
하지만
fun main(){
var a = 2
var s = "hello"
println(a)
}
이런 식으로 자료형을 굳이 언급하지 않아도 뻔히 무슨 자료형인지 아는 것들은 명시하지 않아도 된다.
프로그램이 자동으로 자료형을 구분해 대입한다.
5. 주석
// 한 줄 주석
/*
여러 줄 주석
*/
주석은 다음과 같이 한 줄로 처리하려면 "//"을 여러 줄을 쓰고 싶다면 "/* ~ */"을 붙여 쓰면 된다.
6. 문자열 템플릿
var who = "바보"
var s = "suhwan is $who"
who = "천재"
val s2 = "${s.replace("is", "was")}, but now is $who"
println(s2)
코틀린은 문자열 내부에 템플릿 표현형을 포함할 수 있게 되어있다.
예컨대, 이 기능은 문자열 안에서 외부 변수를 가져온다고 생각하면 된다.
이 부분은 "나 코틀린 좀 해봤어!"의 기준이 되는 영역인데, 코틀린을 정확히 이해하고 있다면
자바처럼 println("suhwan is" + "바보")와 같이 바보처럼 짜지 않고 위에 방식처럼 달러를 사용해 깔끔하게 처리한다는 것이다.
7. 조건문
fun maxOf(a:Int, b:Int): Int{
if(a > b) return a
else return b
}
fun main(){
println(maxOf(1, 3))
}
두 값을 받아 더 큰 값을 리턴하는 함수이다.
여러 언어처럼 if, else if, else 구조를 따르며 이 부분은 스킵하겠다.
8. Nullable 변수
fun main(){
var x:Int? = 5
x = null
println(x)
}
코틀린은 null 문자를 담을 수 있는 변수가 있고, 담지 못하는 변수가 있다.
자바 코드를 짜면서 null 포인터 에러에 엉엉 울던 시절은 지나갔다.. 우리가 담을지 안 담을 지 미리 정할 수 있는데
담으려면 물음표를 자료형 뒤에 붙이면 되고, 안 담으려면 그대로 두면 된다.
보통은 담지 않으므로 ?가 없는 버전이 기본형이 되겠다.
9. Type checks and automatic casts
fun getStrlen(str: Any):Int?{
//인자로 받은 str이 문자열이 아니라면
if(str is String) return str.length
else return null
}
코틀린은 "is" 또는 "as"를 통해 해당 변수가 어떤 자료형인지 미리 체크할 수 있게 한다.
위 코드를 해석하자면, 인자로 어떤 자료형이든 일단 받은 후 "is String" 문구를 if 문에 넣어서
함수가 받은 인자가 문자열인지 아닌지 확인해주는 기능을 한다.
이러한 방법을 타입 캐스팅이라 한다.
10. for 반복문
var animals = listOf("koala", "tiger", "fox")
for(animal in animals){
println(animal)
}
다음과 같이 특정 배열의 원소들을 하나씩 순회하며 꺼내거나, 출력할 수 있다.
fun main(){
for(x in 0..10){
println(x)
}
}
또는 범위를 지정해 출력할 수도 있는데 이 부분도 참 신기하다.
0.. 10처럼 한눈에 봐도 0부터 10까지라는 구문을 쓸 수 있다는 점인데 .. 표시는 코틀린에서 범위를 의미한다.
정확히 말하면 .. 표시를 기준으로 앞~뒤 범위라는 것이다.
11. while 반복문
var animals = listOf("koala", "tiger", "fox")
var idx = 0;
while(idx < animals.size){
println(animals[idx])
idx++
}
while 반복문은 for 반복문과 다르게 정확히 끝낼 지점을 파악하지 못할 때, 또는 끝낼 지점은 컴퓨터가 계산해야하는 상황에 자주 쓰인다.
위 코드에서도 배열의 크기보다 작으면 계속 인덱스를 늘려가며 배열 안의 원소들을 출력하고,
배열의 크기와 같아지는 순간 while 반복문을 빠져나오게 된다.
12. When expression
fun describe(obj: Any): String =
when(obj){
1 -> "하나"
"Hello" -> "안녕"
is Int -> "정수"
!is String -> "넌 문자열이 아니야"
else -> "Unknown"
}
fun main() {
println(describe(1))
println(describe("Hello"))
println(describe(1000))
println(describe(2L))
println(describe("other"))
}
결과
이것도 신기하다.
공식 문서에서는 C언어의 switch 구문과 비슷하다고 한다. 그런데 좀 알기 쉽게 -> 모양을 사용한다는 점과 코드가 switch 구문보다 훨씬 간결해보인다는 장점이 있다.
주의할 점은 switch문의 default 처럼, 여기서도 반드시 else를 넣어줘야한다. 공식 문서에선 이부분을 mandatory(필수) 라고 한다. 영어 공부할겸 적어놨다.
'Android' 카테고리의 다른 글
[Android] Firebase Cloud Messaging - 친구 폰 토큰 가지고 알람 마구 보내기 (0) | 2021.06.10 |
---|---|
MainActivity.kt 기본 설명 (0) | 2021.01.29 |
문자열 리소스화 & 다국어 지원 기능 (4) | 2021.01.27 |
Android Studio 프로젝트 구성 (0) | 2021.01.27 |