☕ Java

    [Kotlin] Companion Object

    클래스 없이 정의 할 수 있는 객체다. 싱글톤 역할을 한다. 클래스 내부에 정의하지만 클래스 인스턴스와 별개로 존재한다. 정적으로 접근이 가능하다.(상속 불가능) 공통 메서드인 Util Class를 대체할 수 있다. 공통 상수인 Enum 혹은 static을 관리할 수 있다. class MyClass { companion object { fun createInstance(name: String): MyClass { // 인스턴스 생성 로직 return MyClass(name) } const val VERSION = "1.0.0" } private val name: String constructor(name: String) { this.name = name } fun getName(): String { re..

    Java Stream 사용법 ( 당신의 Stream은 안녕하십니까? )

    Java 8의 Stream은 2014년에 공식적으로 등장해서 2023년인 현재 10년 째를 맞이하고 있다.이전에도 Stream에 관한 글을 작성했었지만 이번엔 좀 더 실무적인 관점에서 설명을 해보려고 한다.2024년 9월 추가 - 롬복의 @With를 사용하면 함수형 프로그래밍을 유지할 수 있다는 사실..!대다수 놓치고 있는 사실 Stream을 한번이라도 써본 사람은 코드가 간결해진다는 장점은 알고 있을 것이다.하지만 Stream을 간결하게만 사용할 뿐 쉽게 놓치고 있는 부분이 하나가 있다.그건 바로 함수형 프로그래밍의 원칙이다.이 원칙이 무엇인지 알기 위해 일단 Stream 공식 문서를 확인해보자. Stream 공식 가이드 문서 Base interface for streams, which are sequ..

    커스텀 어노테이션과 리플렉션

    커스텀 어노테이션 Retention은 '보유'라는 뜻이다. Retention Policy(보유 정책)은 크게 Compile과 Runtime 두개로 나뉜다. Retention은 어느 영역까지 어노테이션을 유지시킬 것인지에 대한 기능이다. Retention Policy를 Compile로 설정하면 Runtime 진입 시에 해당 어노테이션이 사용되지 못하도록 클래스 파일에는 해당 어노테이션이 삭제된다. 사용자가 만드는 기능은 대부분 Runtime 에 속한다. Compile 단계에만 머무는 경우는 @Getter와 @Setter가 대표적이다. 컴파일 단계에 get, set 메소드를 만들어주고 클래스 파일에 해당 @Getter @Setter 어노테이션을 없애버리기 때문이다. @Target(ElementType.TYP..

    [Kotlin] Optional vs Kotlin Nullable 문법 비교하기

    번외 Optional을 안쓰고 전부 Kotlin 문법으로 하기 val user = userRepository.findByUsername(username) .orElseThrow { CannotFindUserException(username) } val user = userRepository.findByUsername(username) ?: throw CannotFindUserException(username) Optional optionalValue = // Optional 타입의 값 String result = optionalValue.orElse("default"); // 값이 존재하면 해당 값을 사용하고, 값이 없으면 "default"를 사용 Optional optionalValue = // Opt..