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
}
}