최근 인프런에 좋은 코틀린 강의가 올라와서 다시 코틀린 공부를 하고 있는데 배운 내용과 예전에 정리한 내용을 토대로 블로그에 정리하면 좋을 거 같아서 글을 써보려고 합니다.
자바 코드를 코틀린 코드로 변환하고 둘의 차이점을 비교하면서 글을 정리해보도록 하겠습니다.
먼저, 자바에서 두 정수를 인자로 하고 매개변수로 받은 두 정수를 합한 결과를 리턴하는 함수를 만들어보도록 하겠습니다.
public int sum(int leftPort, int rightPort) {
return leftPort + rightPort;
}
위와 같은 코드를 코틀린으로 바꿔서 사용하면 다음과 같습니다.
fun sum(leftPort: Int, rightPort: Int): Int {
return leftPort + rightPort
}
코틀린에서는 함수를 선언할 때 다음과 같이 선언합니다.
fun 함수이름(변수이름: 변수타입 ...): 함수의리턴타입 {
// body, business logic
}
차이점을 설명드리면 다음과 같습니다.
- 코틀린에서는 함수를 선언할 때 fun 키워드를 사용합니다.
- 코틀린에서는 자바와 달리 접근 지정자를 생략하면 public으로 간주합니다. (자바는 protected)
- 코틀린에서는 body가 하나의 값으로 간주되는 경우 block을 없앨 수도 있고, block이 없다면 반환 타입을 없앨 수도 있습니다.
여기서 3번째 내용은 뭐지? 싶을 수 있는데 다음 코드를 참조해주시면 좋을 거 같습니다.
// block 을 생략했으며, 함수의 리턴 값을 알려주기 위해 return 대신 = 를 사용
fun sum1(leftPort: Int, rightPort: Int): Int = leftPort + rightPort
// 함수의 리턴 타입을 생략할 수도 있다.
fun sum2(leftPort: Int, rightPort: Int) = leftPort + rightPort
먼저 sum1에 대해서 설명드리면 위에서 만들어준 자바 코드의 sum 메서드와 코틀린 코드의 sum과 동일한 기능을 수행하고 있습니다. 그에 더해 block (중괄호 { })을 생략하였고, block을 생략함과 동시에 어떤 값을 리턴해줄 것인지 알려주기 위해 = 를 사용하였습니다.
sum2는 sum1을 좀 더 축약시킨 형태입니다. 이전에 "Kotlin - 시작하기"에 정리를 해뒀지만 코틀린은 컴파일될 때 자료형을 검사하는 정적 언어라고 정리했습니다. sum 메서드를 살펴보면 매개변수로 넘어온 정수형 leftPort, rightPort의 합을 리턴하는 메서드입니다. 그렇다면 리턴하는 결과 역시 정수형 + 정수형은 정수형임을 알 수 있기 때문에 위와 같이 함수의 리턴 타입을 생략할 수 있습니다!
여기서 몇 가지 특징을 더 설명드리면 다음과 같습니다.
코틀린은 인자에 default 값을 추가할 수 있습니다.
fun main() {
signup("왕탁이1", "admin@gmail.com")
signup("왕탁이2")
}
fun signup(name: String, email: String = "default") {
println("이름: ${name}, 이메일: ${email}")
}
/**
* result
* 이름: 왕탁이1, 이메일: admin@gmail.com
* 이름: 왕탁이2, 이메일: default
*/
위처럼 변수 email에 값이 들어오지 않으면 저희가 미리 지정해둔 default로 설정되는 것을 알 수 있습니다.
코틀린은 매개변수에 이름을 부여하여 이름과 함께 함수 호출도 가능합니다.
저희가 default 값을 지정할 수 있음을 위에서 알아봤습니다. 근데, 여기서 매개변수 이름과 함께 함수 호출도 가능합니다! 코드로 확인해보시죠!
fun main() {
signup(age = 26, name = "왕탁이")
signup(email = "admin@gmail.com")
signup()
}
fun signup(name: String = "anonymous", email: String = "default", age: Int = 0) {
println("이름 : ${name}, 이메일: ${email}, 나이: ${age}")
}
/**
* 이름 : 왕탁이, 이메일: default, 나이: 26
* 이름 : anonymous, 이메일: admin@gmail.com, 나이: 0
* 이름 : anonymous, 이메일: default, 나이: 0
*/
이런 식으로 변수 이름을 통해서 함수를 호출하고 있기 때문에 함수에서 정의되어 있는 인자의 순서와 상관없이 호출할 수 있습니다. 또한, default parameter를 사용했기 때문에 매개변수로 넘기지 않은 인자에 대해서는 값이 default로 할당되어 있는 것을 확인할 수 있습니다.
가변 인자를 사용하여 매개변수의 개수가 고정되지 않은 함수를 사용할 수 있습니다.
자바에서의 가변 인자는 ... 을 통해서 구현할 수 있는데, 다음처럼 자바 코드를 코틀린 코드로 변경할 수 있습니다.
public void main(String[] args) {
printNumbers(1, 2, 3);
printNumbers(1, 2, 3, 4);
}
public void printNumbers(int ... numbers) {
for (int number : numbers) {
System.out.print(number + " ");
}
System.out.println();
}
fun main() {
printNumbers(1, 2, 3)
printNumbers(1, 2, 3, 4)
val array = intArrayOf(1, 2, 3, 4)
printNumbers(*array)
}
fun printNumbers(vararg numbers: Int) {
for (number in numbers) {
print("${number} ")
}
println()
}
또한, 이 가변 인자를 코틀린에서 사용하기 위해서는 배열을 바로 넣는 대신 스프레드 연산자 (*)을 붙여주어야 합니다.
오늘은 코틀린에서 함수를 통해 다룰 수 있는 다양한 방법을 정리해봤는데 요약하자면 다음과 같습니다!
- 코틀린에서 함수를 사용하는 문법은 자바와 다릅니다! - fun 함수이름(매개변수이름: 타입..): 리턴타입
- 코틀린의 함수에 body가 하나의 값으로 간주될 경우 block을 없앨 수 있고 = 를 사용하여 어떤 값을 리턴할지 명시해야 하며, block이 없다면 반환 타입을 없앨 수도 있습니다.
- 함수 파라미터에 기본 값을 설정해줄 수 있습니다.
- 함수를 호출할 때 특정 파라미터의 이름을 지정하여 호출할 수 있습니다.
- 가변 인자에는 vararg 키워드를 사용하며, 가변인자 함수를 배열과 호출할 때는 *를 붙여주어야 합니다.
출처: 자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) - 인프런 | 강의
이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
출처: Do it! 코틀린 프로그래밍
Do it! 코틀린 프로그래밍 - 교보문고
기초 문법부터 안드로이드 활용까지 | “휩쓸릴 것인가? 올라탈 것인가?”10년간 실무와 교육을 병행한 안드로이드 전문 개발자 ‘황영덕’의 코틀린 입문서!휩쓸리느냐 올라타느냐. 코틀린을
www.kyobobook.co.kr
'Kotlin' 카테고리의 다른 글
Kotlin - 변수와 자료형, 연산자 (1) | 2022.04.06 |
---|---|
Kotlin - 시작하기 (0) | 2022.04.02 |