티스토리 뷰
스프링+자바에서는 종종 static 클래스나 매서드를 쓴다.
static 매서드/클래스를 쓰게 되면, 빈보다 먼저 생성되기 때문에 굉장히 유용하게 쓸 수 있는데,
코틀린에서는 특이하게 static이라고 명명하지 않고 다른 이름으로 사용한다.
companion object라는 이름으로 사용하는데 자바에서의 static과는 사용법이 조금 다르다.
공용 클래스에 static 매서드로 만들어진 UTC <-> KST 시간 변환 매서드가 있다고 해보자.
Java
public class CommonUtils {
public static LocalDateTime convertToUtc(LocalDateTime localDateTime) {
if (localDateTime == null) {
return null;
}
ZonedDateTime zonedDateTimeKst = ZonedDateTime.of(localDateTime, ZoneId.of("Asia/Seoul"));
ZonedDateTime zonedDateTimeUtc = zonedDateTimeKst.withZoneSameInstant(ZoneId.of("UTC"));
return zonedDateTimeUtc.toLocalDateTime();
}
public static LocalDateTime convertToKst(LocalDateTime localDateTime) {
if (localDateTime == null) {
return null;
}
ZonedDateTime zonedDateTimeUtc = ZonedDateTime.of(localDateTime, ZoneId.of("UTC"));
ZonedDateTime zonedDateTimeKst = zonedDateTimeUtc.withZoneSameInstant(ZoneId.of("Asia/Seoul"));
return zonedDateTimeKst.toLocalDateTime();
}
}
kotlin
class CommonUtils {
companion object {
fun convertToUtc(localDateTime: LocalDateTime?): LocalDateTime? {
localDateTime ?: return null
val zonedDateTimeKst = ZonedDateTime.of(localDateTime, ZoneId.of("Asia/Seoul"))
val zonedDateTimeUtc = zonedDateTimeKst.withZoneSameInstant(ZoneId.of("UTC"))
return zonedDateTimeUtc.toLocalDateTime()
}
fun convertToKst(localDateTime: LocalDateTime?): LocalDateTime? {
localDateTime ?: return null
val zonedDateTimeUtc = ZonedDateTime.of(localDateTime, ZoneId.of("UTC"))
val zonedDateTimeKst = zonedDateTimeUtc.withZoneSameInstant(ZoneId.of("Asia/Seoul"))
return zonedDateTimeKst.toLocalDateTime()
}
}
}
별도의 scope로 묶어서 관리한다.
클래스의 멤버 매서드와 static 매서드가 혼재되는 걸 막기 위해서 사용되는 것 같다.
특이한 점이 있다면, 확장 함수(Extention) 기능이 있는데 이 companion object의 매서드를 외부에서 추가할 수 있다.
// CommonUtils.Companion의 확장 함수로 다른 시간대로 변경하는 기능을 추가
fun CommonUtils.Companion.convertLocalDateTimeToZone(dateTime: LocalDateTime, zoneId: ZoneId): LocalDateTime {
val zonedDateTime = ZonedDateTime.of(dateTime, ZoneId.systemDefault())
val targetZoned = zonedDateTime.withZoneSameInstant(zoneId)
return targetZoned.toLocalDateTime()
}
val newYorkDateTime = CommonUtils.convertLocalDateTimeToZone(localDateTime, ZoneId.of("America/New_York")) // 뉴욕 시간대로 변환
이게 언제 사용될지는 모르겠는데, 이렇게 분산해서 매서드를 만들어 버리면 오히려 가독성과 사용성을 떨어트리진 않을까? 라는 생각이 든다.
'개발 > Kotlin' 카테고리의 다른 글
Cannot construct instance of [Object] (no Creators, like default constructor, exist) 에러 해결하기 (0) | 2023.12.28 |
---|---|
코틀린 Any 타입 판별하기, 스마트캐스트, when - 자바와 다른 점 2 (1) | 2023.10.28 |
코틀린에서 @Value 사용하기 & lateinit - 자바와 다른 점 1 (0) | 2023.10.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 후쿠오카
- cache
- lambda
- java
- AWS
- openAI API
- 티스토리챌린지
- AOP
- OpenAI
- Log
- Elastic cloud
- CloudFront
- S3
- 람다
- AWS EC2
- elasticsearch
- terraform
- JWT
- EKS
- 오블완
- Spring
- ChatGPT
- OpenFeign
- springboot
- serverless
- GIT
- 스프링부트
- MySQL
- Kotlin
- docker
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함