본문 바로가기
공부/Programming Language

Kotlin 기본 문법 - 1

by Piva 2021. 3. 23.

  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. 변수

: 코틀린에서 변수를 선언할 때 쓰이는 표현에는 varval의 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