본문 바로가기

Develop/[Kotlin] UOS notice

코틀린의 함수와 매개변수

kotlin에서 함수를 정의하는 방법은 java와 조금 다르다. 그래서 코드를 더 간결하게 할 수 있다.

package gunhoflash.uosnotice.noticeItemList

import java.util.ArrayList

class NoticeItemList
{
// GF
var items: MutableList<NoticeItem> = ArrayList()
var size: Int = 0
private set

fun addNewItem(position: Int, content: String, details: String)
{
val noticeItem = NoticeItem((position + 1).toString(), content, details)
items.add(noticeItem)
size++
}

fun addNewItem(content: String, details: String)
{
val noticeItem = NoticeItem((size + 1).toString(), content, details)
items.add(noticeItem)
size++
}

fun addNewItem(content: String, details: String, link: String)
{
val noticeItem = NoticeItem((size + 1).toString(), content, details, link)
items.add(noticeItem)
size++
}

fun addNewItem(position: Int, content: String, details: String, link: String)
{
val noticeItem = NoticeItem((position + 1).toString(), content, details, link)
items.add(noticeItem)
size++
}

class NoticeItem
{
val id: String
val content: String
val details: String
val link: String

constructor(id: String, content: String, details: String)
{
this.id = id
this.content = content
this.details = details
this.link = ""
}

constructor(id: String, content: String, details: String, link: String)
{
this.id = id
this.content = content
this.details = details
this.link = link
}

override fun toString(): String
{
return content
}
}
}



java에서 kotlin으로 변환된 코드이다. 생성자와 함수가 매개변수에 따라 overload 되어있다. 그런데 kotlin에서는 함수의 매개변수가 '기본값'을 가질 수 있다. 그래서 함수와 생성자를 overload 하지 않아도 가능하게 되었다.



package gunhoflash.uosnotice.noticeItemList

import java.util.ArrayList

class NoticeItemList
{
// GF
var items: MutableList<NoticeItem> = ArrayList()
var size: Int = 0
private set

fun addNewItem(content: String, details: String, link: String="", position: Int = size)
{
val noticeItem = NoticeItem((position + 1).toString(), content, details, link)
items.add(noticeItem)
size++
}

class NoticeItem
{
val id: String
val content: String
val details: String
val link: String

constructor(id: String, content: String, details: String, link: String)
{
this.id = id
this.content = content
this.details = details
this.link = link
}

override fun toString(): String
{
return content
}
}
}



코드가 한결 줄어들었다.

한편, class의 constructor에서 변수 초기화 부분은 다음과 같이 줄일 수 있다.

(constructor에서 특별한 실행이 있는 경우, class 내에 init {} 를 작성한다.)



package gunhoflash.uosnotice.noticeItemList

import java.util.ArrayList

class NoticeItemList
{
// GF
var items: MutableList<NoticeItem> = ArrayList()
var size: Int = 0
private set

fun addNewItem(content: String, details: String, link: String="", position: Int = size)
{
val noticeItem = NoticeItem((position + 1).toString(), content, details, link)
items.add(noticeItem)
size++
}

class NoticeItem(val id: String, val content: String, val details: String, val link: String)
{
override fun toString(): String
{
return content
}
}
}



충분히 코드가 짧아졌다....지만 더 짧게 할 수도 있다.



package gunhoflash.uosnotice.noticeItemList

import java.util.ArrayList

class NoticeItemList
{
// GF
var items: MutableList<NoticeItem> = ArrayList()
var size: Int = 0
private set

fun addNewItem(content: String, details: String, link: String="", position: Int = size)
{
val noticeItem = NoticeItem((position + 1).toString(), content, details, link)
items.add(noticeItem)
size++
}

class NoticeItem(val id: String, val content: String, val details: String, val link: String)
{
override fun toString(): String = content
}
}



toString가 return하는 것은 content라는 변수로, 타입이 명확하게 String이다.

따라서 toString 함수의 리턴형을 숨겨도 된다.



package gunhoflash.uosnotice.noticeItemList

import java.util.ArrayList

class NoticeItemList
{
// GF
var items: MutableList<NoticeItem> = ArrayList()
var size: Int = 0
private set

fun addNewItem(content: String, details: String, link: String="", position: Int = size)
{
val noticeItem = NoticeItem((position + 1).toString(), content, details, link)
items.add(noticeItem)
size++
}

class NoticeItem(val id: String, val content: String, val details: String, val link: String)
{
override fun toString() = content
}
}