매일 한줄 코딩

#2. 코틀린 기본 문법. 본문

develop/kotlin

#2. 코틀린 기본 문법.

ShipJH 2022. 6. 6. 23:16
2. 기본 문법 - Basic Syntax

2. 기본 문법 - Basic Syntax

목차.


1. 패키지 정의

1-1. 패키지 정의는 파일 최상단에 위치.

1-2. 디렉터리와 패키지를 일치시키지 않아도 됨.

package my.demo 

import java.util.* // 자바와 비슷

2. 함수 정의

2-1. 함수는 fun 키워드로 정의.

fun sum(a: int, b:int): Int {
 return a+b
}

/*
키워드 명칭(파라미터): 리턴타입 {
	구현부
}
*/

2-2. 함수 몸체가 식(Expression)인 경우 return 생략가능.

이러한 경우 return type이 추론되므로, 생략

fun sum(a: int, b: int) = a + b

1번과 2번이 같은 리턴결과가 됨.

2-3. 리턴 할 값이 없는 경우 Unit(Object)으로 리턴 함.

Unit은 Java에서 void 역할.

fun printConsole(): Unit {
	println("hello")
}
// Unit 은 자바에서 void의 역할을 한다. 이는 반환할 리턴값이 없을때, 사용

// Unit은 아래와같이 생략도 가능하다.
fun printConsole() {
	println("hello")
}

3. 지역 변수 정의

3-1. val: 읽기 전용 변수

값의 할당이 1회만 가능하며 Java의 final과 유사하다.

val a: Int = 1 // 즉시할당.
val b = 2 // Int 타입으로 추론함.
val c: Int // 컴파일 오류. 초기화 필요.
c = 3 // 컴파일 오류, 읽기전용.

3-2. var: Mutable 변수

var x = 5
x += 1

4. 주석

4-1. 한줄 주석

자바와 동일하며 // 로 사용

4-2. 여러 줄 주석

/* */ 로 사용하며 자바와 다르게 중첩 사용 가능.

/* 
/* 중첩~ */
*/

5. 문자열 템플릿 (문자열 보간법)

String interpolation (문자열 보간법)

var a = 1
val s1 = "a is $a' // a is 1
a = 2 
val s2 = "${s1.replace("is", "was")}, but now is $a" //a was 1, but now is 2

6. 조건문

하나만 있는 조건문은 조건식으로 변경 가능

fun maxOf(a: Int, b: Int): Int {
	if (a > b) {
		return a
	} else {
		return b
	}
}

//위와 같은 조건문을 아래와 같은 조건식으로 변경할 수 있다.
fun maxOf(a: int, b: Int) = if (a > b) a else b

7. nullable

값이 null 일 수 있는 경우 타입에 nullable 마크를 명시해야 함.

fun parseIntRetrun(str: String): Int? {
    if (0 == Integer.parseInt(str)) {
        return null;
    } else {
        return Integer.parseInt(str)
    }
}

💡때문에, null을 리턴해주는 메서드(fun) 을 만들고 그것을 호출(사용)할 때에는 null 체크를 해주어야 한다.

fun xyPrint(str1: String, str2: String) {
    val x: Int? = parseIntRetrun(str1)
    val y: Int? = parseIntRetrun(str2)

    if (x != null && y != null) {
        println(x * y);
    } else {
        println("'$str1' or '$str2' is zero.")
    }
}

이렇듯, nullable을 지원해주어 프로그래밍의 안전성을 높임.

8. 자동 타입 변환

타입 체크만 해도 자동으로 타입이 변환이 됨.

fun getStringLength(obj: Any): Int? {
	if (obj is String) {
		//obj가 자동으로 String 타입으로 변환 됨.
		return obj.length 
	}
	return null
}

9. 반복문 while

자바와 같다.

val items = listOf("one", "two", "three")
var index = 0
while (index < items.size) {
	println("index: $index, item is ${items[index]}")
	index++
}

10. when expression

스위치 문처럼 쓰임.

fun whatType(obj: Any): String = 
	when (obj) {
		1 -> "one, number"
		"Hi" -> "Hi, String"
		is Long -> "Long"
		!is String -> "Not String"
		else -> "i'don know"
	}

타입형식도 알아서 찾을 수 있다.

11. ranges ( 범위 체크 )

11-1. In 연산자를 이용해서 숫자의 범위 체크.

val x = 3
if (x in 1..10) {
	println("$x is between 1~10")
}

11-2. range를 이용한 for loop문

for (x in 1..5) { // 1부터 5까지 반복문.
	println(x) 
}

12. collections (컬렉션)

12-1. in을 사용한 컬렉션 loop

val items = listOf("one", "two", "three")
for (item in items) {
	println(item)
}

12-2. in으로 collection 포함되는지 체크

자바의 contain 같은 개념

val items = listOf("one", "two", "three")
when {
	"one" in items -> println("one is 1")
	"two" in items -> println("two is 2")
	"three" in items -> println("three is 3")
	else -> println("???")
}

/*단, one까지만 호출되며, two는 콘솔에 println이 되지 않음.*/

12-3. 람다식을 이용한 컬렉션 filter, map등의 연산

자바의 stream 과 비슷하게 쓰인다.

val items = listOf("t1", "t3", "q2", "t2", "q1")
    items
        .filter { it.startsWith("t") }
        .sortedBy { it }
        .map { it.toUpperCase() }
        .forEach{println(it)}
    
    /*T1
      T2
      T3
    */

Comments