Android Study Jam에 참여하게 되어서, 코틀린을 이용한 안드로이드 앱 개발 스터디를 진행하게 되었다. 다만 나는 코틀린을 단 한번도 공부한 적이 없어서, 코틀린 기초부터 공부하고 넘어가고자 한다.
모든 내용은 코틀린 공식 홈페이지 문서(kotlinlang.org/docs/home.html)에서 가져왔다. 공부하면서 끄적인 내용을 그대로 가져온 것이라, 설명이 간결하고 짧다. 공부하는대로 추가될 가능성 有.
0. 패키지 정의 및 Imports
- 패키지는 소스 파일의 가장 위에 추가함.
- 패키지는 package, 디렉터리의 Import는 import를 통해 가능.
1. 프로그램의 진입점
- 코틀린 응용 프로그램의 진입점은 main함수.
(가장 먼저 실행된다는 의미) - main함수는 아무런 인수가 없을 수도, String 배열 형태의 인수를 받을 수도 있음. (C언어와 비슷한 느낌)
fun main () {
println("Hello World!")
}
//String 배열을 인수로 갖는 또다른 main의 형태
fun main (args: Array<String>) {
println(args.contentToString())
}
2. Kotlin의 출력문
- print : 전달받은 값을 기본 출력으로 print.
- println : 전달받은 값을 기본 출력으로 print한 후, 행 바꿈을 함. (Line break)
3. Functions
- 함수의 기본 형태는 아래와 같음.
fun 함수이름 (인수 이름: 인수 타입): 반환타입 {
return
}
//Example
fun greeting (name: String): String {
return("Hello, $name");
}
- 함수의 몸통(body) 부분은 표현식이 올 수도 있음. 이 때, 함수의 반환(return)값의 타입은 '추론됨'.
fun sum(a: Int, b: Int): Int {
return a + b
}
//위 함수를 표현식으로 바꾼 표현
/*
위와는 달리 반환 타입이 정의되지 않기 때문에, 반환 형식을 추측하여 반환하게 됨.
*/
fun sum(a: Int, b: Int) = a + b
- 함수의 반환 타입으로는 Unit이 쓰이는 경우가 있음. Unit은 Java나 C언어의 void와 같은 역할을 수행.
(아무것도 반환하지 않음을 의미.)
fun attachString(a: String, b: String): Unit {
println("$a $b")
}
//Unit은 생략될 수 있음. 위와 아래는 같은 코드.
fun attachString(a: String, b: String) {
println("$a $b")
}
4. 변수
: 코틀린에서 변수를 선언할 때 쓰이는 표현에는 var와 val의 2가지가 있음.
- val : 쉽게 말해 '바뀔 수 없는 변수'. 초기화 시 단 한 번 값을 할당할 수 있으며, 그 이후로는 값을 재할당하는 것이 불가능.
- var : val과는 달리 언제든지 값을 재할당하는 것이 가능한 변수. (단, 처음 선언한 타입으로만 재할당이 가능함)
5. Class & Instance
- 클래스의 선언에는 class 가 사용됨.
class Shape
- 클래스의 속성은 클래스의 선언부 혹은 body에 나열될 수 있음.
class Shape(var height: Double, var length: Double) {
var perimeter = (height + length) * 2
}
- 클래스 간 상속은 : (콜론)으로 나타냄. 클래스들은 기본적으로 final 이기 떄문에, 클래스를 상속 가능하게 만들고 싶다면 open을 명시해야 함.
//Shape 클래스를 상속 가능하게 만듦.
open class Shape
class Rectangle(var height: Double, var length: Double): Shape {
var perimeter = (height + length) * 2
}
6. 주석
: 코틀린에서 주석을 나타내는 방법은 2가지.
- // : 한 줄에 대해 주석 처리를 할 때 사용.
- /* */ : 여러 줄에 대해 주석 처리를 할 때 사용.
7. String Templates
: 문자열 내에 변수를 넣어서 대치하는 것이 가능.
- $ : 문자열 내에 변수를 넣어 대치하고 싶을 때 사용.
var nickname = "Happiva"
val greeting = "Hello, $nickname"
//대치 결과 : Hello, Happiva
※ 코틀린에선 $가 대치를 위해 사용되기 때문에, 그냥 하나의 문자로써 $를 사용하고 싶다면 \$라고 표시해야 하는듯.
- 수식을 넣는 것도 가능.
var nickname = "Happiva"
val greeting = "Hello, $nickname"
val greeting2 = "${greeting.replace("Hello", "Hi")}"
//결과 : Hi, Happiva
8. 조건식
- if문 : 형식 자체는 타 언어와 같지만, 코틀린에서는 if문이 하나의 표현식으로 사용될 수 있음.
fun max(a: Int, b: Int) = if (a > b) a else b
8-1. 반복문
- for문 : 형식은 파이썬과 같음.
val colors = listOf("Black", "Red", "Yellow")
for (color in colors) {
println(color)
}
- while문 : 형식은 타 언어와 같음.
val colors = listOf("Black", "Red", "Yellow")
var index = 0
while (index < colors.size)
{
println("${colors[index]}")
index++
}
8-2. when 문
: C언어의 switch문과 비슷한 느낌의 식.
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hi" -> "Greeting"
is Long -> "Long"
!is String -> "Not a String"
else -> "unknown"
}
9. 범위(Ranges)
- in : 숫자가 특정 범위 안에 들어가는지의 여부를 판정할 때 사용. 부정의 경우 !in 으로 사용하면 됨.
val a = 5
val b = 10
// a가 '1 이상 b + 1' 이하인지 판별
if (a in 1..b+1) {
println("In range")
}
- step : 지정한 숫자만큼 건너뜀.
for (x in 1..10 step 3) {
print(x)
}
//1에서 시작하여 3씩 건너뛰며 print
//output : 14710
- downTo : 지정한 숫자까지 역순으로 줄여나감.
for (x in 12 downTo 0 step 3) {
print(x)
}
//12부터 시작하여 0에 까지 3씩 줄어들음.
//output : 129630
10. Collections (컬렉션)
: JAVA의 List, Map 등을 가리키는 자료구조.
- in : 컬렉션 안에 해당 오브젝트가 존재하는 지를 나타내는 연산자.
//Collection 안의 모든 항목에 대해 접근
for (item in items) {
println(item)
}
11. Nullable values
: null이 될 가능성이 있는 값들.
- ? : Nullable 값을 나타내는 데 사용됨.
fun parseInt(str: String): Int? {
// ~
}
//str이 정수를 갖고 있지 않으면 null 을 반환함.
※ Nullable 값에 대해서는 꼭 null인지 확인하는 과정이 필요.
12. Type 체크 & 자동 형변환(Automatic casts)
- is : 표현식이 타입의 인스턴스인지 확인.
fun checkIfString(obj: Any): Boolean {
if (obj is String) {
//이 분기에서 obj는 String으로 자동 형변환 됨.
return true;
}
else return false;
}
13. Nothing Type
- throw : 코틀린에서 예외처리에 사용. throw 표현식의 타입은 Nothing.
- Nothing : 아무런 값을 갖지 않으며, 항상 예외를 처리하는 함수에 대해 반환형으로 사용될 수 있음.
(즉, 아무것도 반환하지 않는 함수를 정의할 때 사용.)
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
14. Lambda식 & 익명 함수(Anonymous Function)
: 함수 리터럴(Function Literals), 따로 선언되지는 않지만 표현식으로써 처리됨.
max(strings, { a, b -> a.length < b.length })
//{ a, b -> a.length < b.length } 는 max 함수의 두 번째 인수이자 함수 리터럴.
1. 람다식은 늘 중괄호로 감싸여야 함.
2. 함수의 body는 '->' 다음에 위치함.
3. 람다식의 반환 타입이 Unit이 아니라면, body의 마지막 표현식이 반환값으로 취급됨.
- it : 람다식은 한 개의 패러미터만을 갖는 경우가 많음. 이 때, 단 한개의 패러미터를 명시하지 않고 it으로 표기하여 사용하는 것이 가능. -> 또한 생략하는 것이 가능.
ints.filter{ it > 0 }
//(it: Int) -> Boolean
'공부 > Programming Language' 카테고리의 다른 글
C++ 3일차 (1) | 2021.05.03 |
---|---|
C++ 2일차 (0) | 2021.04.30 |
C++ 1일차 (0) | 2021.04.28 |
C++ 공부 (0) | 2021.04.28 |
Kotlin 기본 문법 - 2 (0) | 2021.04.02 |