Class

    [Kotlin] value class 한 번에 정리하기

    타입을 안전하게 만들기 위한 방식 우리가 아이디와 비밀번호로 로그인하는 간단한 로그인 시스템을 만든다고 해보자. 이런 로그인 시스템을 만들기 위해서 우리는 아이디나 비밀번호 값을 받기 위해 다음과 같이 LoginInfo 클래스를 선언하고 아이디(id)와 비밀번호(password)를 표현하기 위해 String 타입을 사용할 수 있다. data class LoginInfo( val id: String, val password: String ) 하지만, 이렇게 아이디나 비밀번호를 String 타입 값으로 설정하는 것은 안전하지 않다. String은 이곳저곳에서 다 쓰이는 타입이기 때문에 언제든 실수가 일어날 수 있기 때문이다. 예를 들어 다음과 같이 id 자리에 password를 넣고 password 자리에 ..

    [Kotlin] inner class 를 통해 중첩 클래스에서 바깥쪽 클래스 참조하기

    자바의 중첩 클래스 문제와 코틀린의 중첩 클래스 자바에서는 내부에 선언되는 중첩 클래스에서 기본적으로 바깥쪽 클래스의 변수를 참조할 수 있었다. 예를 들어 다음과 같이 OuterClass와 InnerClass가 있는 경우 InnerClass의 함수인 getOuterClassValue에서 OuterClass의 변수인 outerClassValue를 참조할 수 있었다. public class OuterClass { String outerClassValue = "outerClassValue"; class InnerClass { String getOuterClassValue() { return outerClassValue; } } } 하지만, 이 방식은 내부의 클래스에서 항상 외부의 클래스에 대한 참조를 유지한다..

    [Kotlin] internal 변경자 사용법 한 번에 정리하기

    internal 변경자(Modifier)의 의의internal 변경자는 코틀린에서 클래스 혹은 함수에 모듈 수준의 가시성을 설정하기 위해 사용하는 변경자이다. 모듈 수준의 가시성이란 모듈 내에서는 public처럼 어디에서나 접근 가능하지만, 모듈 외부에서 접근하지 못하는 변경자이다. internal을 설정해야 하는 경우는 다양하다. 모듈 내부에서만 사용하는 함수에 internal을 설정해 외부에서 접근하지 못하도록 만드는 경우가 일반적이며, 외부에는 인터페이스만 공개하고 모듈 내부에서 인터페이스의 구현체(클래스)를 만들어 사용하는 경우에 유용하다. internal 변경자 사용 예시대표적으로 우리가 사용하는 젯브레인사에서 개발한 코루틴 라이브러리의 경우 Mutex 인터페이스의 구현체인 MutexImpl을 ..

    [Kotlin] Kotlin의 sealed interface란 무엇인가?

    sealed class의 한계와 sealed interface의 등장sealed class는 클래스를 상속하는 서브 클래스를 컴파일러에서 알 수 있도록 하기 위해 만들어졌다. 아래의 UIState와 같은 간단한 상속구조라면 sealed class로도 충분하다. sealed class UIState() data object Loading : UIState() data class Success(val data: UIData) : UIState() data class Error(val error: Exception) : UIState()하지만, sealed class를 사용하면, 다른 클래스들이 둘 이상의 sealed class를 상속받지 못하게 되는 한계가 있다. 예를 들어 다음과 같은 코드를 만들어보자.s..

    [GraphQL] 9. GraphQL fragment 사용해 query의 중복 제거하기

    GraphQL의 fragment 앞선 글들에서 사용되었던 방법으로는 GraphQL의 특정 블록들을 여러 번 재사용해야 하는 블록의 경우 매번 중복해서 써야한다. 예를 들어 다음 두개 Query들이 있다고 해보자. query QueryFilm1 { film(filmID: 1) { title director producers } } query QueryFilm2 { film(filmID: 2) { title director producers } } 위 쿼리들에서는 title, director, producers들이 중복해서 사용된다. 이 필드들을 하나로 묶어 하나의 필드처럼 쓸 수 있다면 중복을 줄일 수 있을 것이다. GraphQL의 fragment가 바로 이 역할을 한다. GraphQL의 fragment는..