본문 바로가기
Computer Science/Kotlin

[Kotlin 기초] 2. 코틀린 변수와 함수

by sy.cho__ 2024. 4. 30.

오늘은 코틀린 언어에서 변수 , 함수를 생성하는 방법에 대해 알아보겠습니다.

 

개발환경은 IntelliJ IDE , Kotlin Playground 모두 사용 가능하니 편하신 환경에서 진행하시면 됩니다.

 

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org

 

개발환경 설정 방법이 필요하신 분은 아래 링크 참조 부탁드릴게요.

 

[Kotlin] 1. 코틀린 개발환경 구성하기

안녕하세요.오늘은 본격적인 Kotlin에 대해 학습하기 앞서 코틀린 개발환경을 Setup하는 과정부터 같이 해보겠습니다.  그전에 코틀린와 자바가 어떻게 다른지, 코틀린이 어떻게 탄생했는지에 대

toberich.co.kr

 

 

변수

1. 기본선언

기본적으로 코틀린에서 변수를 선언하는 방법은 아래와 같습니다. 

val 변수이름 : 데이터타입 = 값

 

예를 들어 Integer 정수 값을 표현하는 변수를 선언하고 싶다면

// Kotlin
val a : Int = 1 // 세미콜론 생략가능

// Java
int a = 1;

 

이렇게 선언할 수 있습니다. Java에서 꼭 사용해야하는 세미콜론을 생략해도 되고 데이터 타입을 뒤에 작성하는게 차이점입니다.

굳이 데이터 타입을 선언하지 않아도 됩니다. 

// Kotlin
val a  = 1 // 데이터타입 생략 가능

 

이렇게 변수를 선언해도 코틀린이 자동으로 데이터타입을 할당해줍니다. 

 

2. 지연할당

지연할당은 말 그대로 변수를 먼저 선언하고 값을 나중에(지연) 할당하는 것을 말합니다. 

예를 들어

// Kotlin
val b : Int
b = 2

 

이렇게 Int타입의 변수 b를 우선 선언하고, 필요에 따라 나중에 값을 할당할 수 있습니다.

여기서 주의해야 될건, 지연할당을 할 경우 데이터 타입을 꼭 선언해야 합니다.

// Kotlin
val b  // -> Data type을 설정하지 않으면 Error 발생
b = 2

 

위와 같이 데이터 타입을 선언하지 않고 지연할당하게 되면 컴파일 오류가 발생하기 때문에 주의하셔야 합니다.

 

3. val - var의 차이

앞서 예제에서는 모두 변수 앞에 val이라는 타입을 선언했습니다. 

여기서 val은 value의 줄임랄로 값을 할당하면 수정이 불가능합니다. 즉, read only라고 보면 됩니다. 

Java에서 final이라는 키워드와 동일하다고 볼 수 있습니다. 

// Kotlin
// val : value - 수정 불가능 readonly
val d : String = "Hello"
d = "world" // Error

// Java
final int d = 2;

 

위와 같이 선언하면서 Hello라는 값을 할당한 뒤, 나중에 값을 바꾸면

컴파일 에러가 발생합니다. 

 

그래서 프로그램 로직 상 값의 변경이 필요한 변수가 필요하다면 val대신 var를 사용합니다.

var는 varible의 약자로 말 그래도 변수. 값의 변경이 가능합니다. 

// Kotlin
// var : variable - 값 재할당 가능
 var d : String = "Hello"
 d = "world" //가능
 d = 123 // 단, 다른 Data type은 Error

 

var 키워드를 사용하면 위와 같이 값을 변경할 수 있습니다.

단, 다른 데이터 타입으로 변경은 불가합니다. 자동 Type casting은 되지 않는다는거죠. 이 부분 주의해야 합니다. 

 

자 변수에 대해서는 이쯤에서 마무리하고 (어렵지 않죠?!)

Kotlin 함수에 대해 알아보겠습니다. 


 

함수

1. 기본선언

Kotlin에서 기본적으로 함수를 선언하는 방식은 아래와 같습니다.

// Kotlin Function
fun MethodName(ParameterName : DataType) : ReturnDataType { 
	...
}

 

Java와 달리 함수 앞에 fun이라는 키워드가 들어갑니다. 

Parameter가 있는 경우 DataType도 함께 입력해줘야 하고, 반환 타입은 함수명 뒤에 붙이면 됩니다

 

변수 2개를 덧셈하는 간단한 sum 함수를 작성해볼게요

 

fun main() {
    val result : Int = sum(10,20)
    println(result)
    
}

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

 

kotlin playground 실행결과

 

 

2. 표현식 스타일

Kotlin에서는 반환하는 값을 간단하게 표현 가능할 경우 함수 몸통(대괄호) 없이 사용할 수 있는데

이걸 표현식 스타일이라 합니다. 

 

위에 예제로 사용한 sum함수를 표현식 스타일로 변형하면 아래와 같이 사용할 수 있습니다. 

fun main() {
    val result : Int = sum2(10,20)
    println(result)
    
}

// 표현식 스타일
fun sum2(a : Int, b : Int) : Int = a + b

// 표현식 & 반환타입 생략
fun sum3(a : Int, b : Int)  = a + b

// 단, 몸통이 있는 함수는 반환 타입을 제거하면 컴파일 오류
fun sum4(a : Int, b : Int) {
    return a + b
}

 

return할 값을 '반환타입 = ' 뒤에 작성하면 됩니다. 얼핏보면 람다함수와 비슷한것을 알 수 있습니다. 

반환 타입을 생략해도 자동으로 타입을 추론하여 할당해주기 때문에 컴파일 오류 없이 사용하실 수 있습니다. 

 

단, 표현식 함수가 아닌 몸통(대괄호)이 있는 함수의 경우 반환 타입을 제거하면 컴파일 오류 발생하니 이점 주의해주세요!

 

3. 반환타입이 없는 함수

반환이 없는 함수에서는 굳이 반환타입을 사용하지 않아도 괜찮습니다

fun printSum(a: Int, b : Int) {
    println("$a + $b = ${a+b}")
}

 

return문이 없는 경우엔 반환 타입이 없더라도 에러가 발생하지 않습니다. 

이렇게 Kotlin에서는 반환타입이 없을 경우 자동으로 Unit이라는 타입으로 반환합니다. Java의 void와 유사하다고 볼 수 있죠. 

// 반환타입이 없는 함수는 Unit을 반환한다.
fun printSum(a: Int, b : Int) : Unit {
    println("$a + $b = ${a+b}")
}

 

굳이 이 부분은 크게 신경쓰지는 않아도 괜찮습니다!

 

4. Named argument

Named argument는 함수의 파라미터에 이름을 할당하는 것을 말합니다. 코드로 한번 설명드리면

fun main() {
    log(message = "Info log")
    log(level = "DEBUG" , message = "Debug log")
    log(level = "WARN" , message = "Warning log")
    log(level = "ERROR" , message = "Error log")
}

// Named argument
// Method에 들어가는 parameter가 많을수록 편리함
fun log(level : String = "INFO", message: String) {
    println("{$level} $message")
}

 

log함수를 보면  level과 message라는 2개의 파라미터가 있습니다.

main 함수에서 log함수를 호출할때 변수 앞에 파라미터명을 입력하여 호출하는 것을 볼 수 있습니다. 

이것을 Named argument라고 부르며 함수 호출 시 변수의 순서가 달라져도 똑같이 결과를 나타내는 것을 볼 수 있습니다. 

 

fun main() {
    log(message = "Info log") // level 값이 없을 경우 함수의 Default 값을 사용
    log(message = "Debug log", level = "DEBUG") // level, message 순서 스위치
    log(level = "WARN" , message = "Warning log")
    log(message = "Error log", level = "ERROR") // level, message 순서 스위치
} 

// Named argument
// Method에 들어가는 parameter가 많을수록 편리함
fun log(level : String = "INFO", message: String) {
    println("{$level} $message")
}

 

아래 실행결과를 확인하면 변수 입력하는 순서가 달라졌지만 목적에 맞게 파라미터 값이 전달되었다는 것을 알 수 있습니다.

그리고 첫번째 함수 호출인 Info log의 경우, level 파라미터 값을 생략했는데요. 

이렇게 값을 생략하는 경우, 함수 선언문에 있는 값(INFO)를 사용하는데 이를 Default Parameter라고 합니다. 

 

 

 

Java에서는 Named argument 기능을 제공하지 않기 때문에 자칫 변수 순서가 달라지면

Runtime exception 오류를 범할 수 있는 가능성이 큽니다. 

 

그리고 이 기능은 파라미터가 많은 경우 더 활용성이 향상됩니다. 

파라미터가 많은 함수가 좋은 함수는 아니지만 10~20개의 파라미터가 필요할 경우,

개발자가 실수를 일으키기 쉽기 때문에 Named argument를 사용하면 휴먼 에러를 최소화할 수 있습니다. 

 


 

오늘은 코틀린에서 변수와 함수를 만들고 호출하는 방법에 대해 알아보았습니다.

다음 포스팅에선 흐름제어 if-else, if-else문 한줄로 사용하기 그리고 when 문법에 대해 알아보겠습니다.

 

 

[Kotlin 기초] 3. 코틀린 if-else, when 사용 방법, if-else 한줄 사용법

안녕하세요 오늘은 Kotlin언어에서 반복문과 흐름제어 문법에 대해 알아보겠습니다. 흐름제어라는 말은 쉽게 말하면 개발자가 원하는 흐름으로(조건으로) 코드가 실행되는걸 의미합니다. 대표

toberich.co.kr

 

 

반응형