https://kotlinlang.org/docs/basic-syntax.html
Basic syntax | Kotlin
kotlinlang.org
Package definition and imports
패키지는 소스파일 가장 위에 명시한다.
package seungkyu
class PackageDefinitionAndImports {
}
코틀린에서는 디렉토리와 패키지를 똑같이 맞출 필요는 없다고 한다.
Program entry point
코틀린 애플리케이션이 시작하는 부분은 main 함수 부분이다.
package seungkyu
fun main(args: Array<String>) {
println("Hello, world!")
println(args[0])
}

만약 애플리케이션 실행에서 매개변수를 받고 싶으면, 메인 함수에 저렇게 문자열 배열로 받을 수 있다.
Print to the standard output
print 함수는 매개변수를 standard output에 출력한다.
package seungkyu
fun main(){
print("seungkyu")
println("seungkyu")
}

println은 print에서 한 line을 차지하여 출력하는 함수이다.
다음 출력은 해당 출력의 다음줄부터 시작된다.
Read from the standard input
readln은 standard input으로부터 읽어오는 함수이다.
이 함수는 한 줄 전체를 읽어온다.
package seungkyu
fun main(){
print("Enter your name: ")
val name = readln()
print("Your name: ")
println(name)
println("is contain new line? : ${name.contains("\n")}")
}

엔터키는 제외하고 읽어오는 것을 볼 수 있다.
Functions
아래는 2개의 Int를 매개변수로 받고 Int를 반환하는 함수이다.
fun sum1(a: Int, b: Int): Int {
return a + b
}
아래와 같이 명시적이라면 return과 괄호를 생략 할 수 있다.
fun sum2(a: Int, b: Int) = a + b
만약 return이 아무것도 반환하지 않는다면 Unit으로 return type을 준다.
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
이 때 Unit은 생략이 가능하다.
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}
Variables
코틀린은 val, var 키워드로 변수 선언이 가능하며, 그 뒤에 변수의 이름을 적어준다.
val은 할당이 한 번만 일어나는 변수를 선언 할 때 사용하며, 후에 값이 변하지 않는다.
선언 이후에는 read-only이다.
val x: Int = 5
그에 비해 var은 선언 이후에도 값을 변경 할 수 있다.
fun main(){
var x: Int = 5
x += 1
}
위에서는 변수의 type을 :로 같이 명시해 준 것을 볼 수 있는데, 사실 코틀린은 변수의 타입을 추정이 가능하기 때문에 변수 타입은 생략을 해주어도 된다.
var x = 5
아래와 같이 변수의 타입까지만 선언해두고 값은 나중에 할당하는 것도 가능하다.
fun main(){
val x = 5
val c: Int
c = 3
}
자바와는 다르게, 변수를 클래스 밖인 top level에 선언도 가능하다.
val value = 0
fun main(){
println(value)
}
Creating classes and instances
늘 그렇듯, 클래스를 정의하기 위해서는 class 키워드를 사용한다.
class Shape
클래스의 속성들은 선언이나 body에 작성할 수 있다.
class Rectangle(val height: Double, val length: Double){
val perimeter = (height + length) * 2
}
이 때, 클래스 선언부에 작성된 매개변수를 바탕으로 기본 생성자가 만들어진다.
class Rectangle(val height: Double, val length: Double){
val perimeter = (height + length) * 2
}
fun main(){
val rectangle = Rectangle(10.0, 20.0)
println("The Perimeter is ${rectangle.perimeter}")
}
클래스 간의 상속은 : 을 사용하면 된다.
클래스는 기본적으로 상속이 불가능한 final 상태이지만, 앞에 open 키워드를 붙여주면 상속 가능한 클래스가 된다.
open class Shape
class Rectangle(val height: Double, val length: Double): Shape() {
val perimeter = (height + length) * 2
}
Comments
주석은 //와 /* */를 사용해서 작성 할 수 있다.
//주석입니다.
/* 이것은
주석 블럭입니다 */
String templates
기본적으로 String은 ""이런 형태로 있을 것이다.
자바에서는 문자열들을 붙일 때 +를 사용했지만 코틀린에서는 $을 사용하여 문자열 안에 넣을 수 있다.
val mystring = "${1+2}, but now is $a"
Conditional expressions
조건식도 If를 사용한다.
fun max_result(a: Int, b: Int): Int{
if (a > b){
return a
}
else{
return b
}
}
코틀린에서는 3항 연산자가 없으며, 대신 if 또한 표현식으로 사용된다.
fun max_result(a: Int, b: Int) = if (a > b) a else b
for loop
다른 언어와 마찬가지로 for를 사용해서 반복문을 작성한다.
fun main(){
val items = listOf("apple", "banana", "kiwi")
for (item in items) {
println(item)
}
}
배열에서 in으로 각각의 item을 가져올 수 있다.
while loop
이것도 마찬가지로 while의 괄호 안에 있는 조건이 true일 동안 반복하게 된다.
fun main(){
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
}
when expression
C언어에서의 switch이다.
C언어와는 다르게 다양한 타입으로 분기할 수 있다.
또한 이것도 표현식이기 때문에 when을 사용하여 변수에 값을 할당 할 수 있다.
이 때는 else로 모두 해당하지 않는 경우를 꼭 지정해주어야 한다.
fun main(args: Array<String>) {
val obj = "hi"
val result = when (obj) {
"hi" -> "hello"
"hello" -> "hi"
else -> ""
}
}
Ranges
in 연산자를 사용하여 숫자가 범위 내에 있는지 확인한다.
fun main(){
val x = 10
val y = 9
if(x in 1..y+1){
println("fits in range")
}
}
반복문에서도 이렇게 사용할 수 있다.
for (x in 1..5){
print(x)
}
downTo와 step을 사용하여 증가인지 감소인지와 간격을 지정해 줄 수 있다.
fun main(){
for (x in 1..10 step 2) {
print(x)
}
println()
for (x in 9 downTo 0 step 3) {
print(x)
}
}

Collections
collection을 반복하는 방법
for (item in items){
println(item)
}
map을 사용하여 해당 collection을 반복 할 수도 있다.
val fruits = listOf("banana", "avocado", "apple", "kiwifruit")
fruits
//a로 시작하는 단어 찾기
.filter { it.startsWith("a") }
//정렬
.sortedBy { it }
//대문자로 변환
.map { it.uppercase() }
//각각을 출력
.forEach { println(it) }
Nullable values and null checks
코틀린에서는 null을 허용할 때 명시를 해주어야 한다.
타입의 마지막에 ?를 붙여주면 nullable 타입이다.
fun main(){
val a: Int? = null
val b: Int = 1
}
Type checks and automatic casts
is는 인스턴스가 해당 타입이 맞는지 확인하는 연산자이다.
그리고 is로 검사가 끝나면 해당 타입으로 자동 캐스팅해준다.
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` is automatically cast to `String` in this branch
return obj.length
}
// `obj` is still of type `Any` outside of the type-checked branch
return null
}
fun main() {
fun printLength(obj: Any) {
println("Getting the length of '$obj'. Result: ${getStringLength(obj) ?: "Error: The object is not a string"} ")
}
printLength("Incomprehensibilities")
printLength(1000)
printLength(listOf(Any()))
}
'백엔드 > 코틀린' 카테고리의 다른 글
Concepts:Control flow (1) | 2024.10.05 |
---|---|
Idioms (1) | 2024.10.01 |
코틀린 시작 (0) | 2024.09.28 |