자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 도우미 클래스(?)를 캡슐화하거나 코드를 사용하는 곳에 가까이 두고 싶을 때 유용하다. 코틀린에서는 클래스 내부에 다른 클래스를 정의할 수 있는 두 가지 방법이 있다. nested class와 inner class인데, 먼저 nested class에 대해 알아보자. nested class sealed class Error(val message: String) { class NetworkError : Error("Network failure") class DatabaseError : Error("Database cannot be reached") class UnknownError : Error("An unknown error has occu..
data class Cash(val dollars: Int) { fun mul(factor: Int): Cash { return Cash(dollars * factor) } } 우아한테크코스에서 수업을 들으며, "불변 객체"에 대해 학습했다. 불변 객체의 특징과 장점은 아래와 같다. 생성자를 통해서만 초기화한다. 변경할 수 없기 때문에 동시에 접근해도 항상 같은 값을 보장한다. 실패 원자성을 보장한다. (메서드를 수행하다가 예외가 발생하는 경우에도 메서드 수행 전 상태와 동일함을 보장) 도메인의 불변 객체를 값 객체(VO)라고도 한다. 이러한 불변 객체에도 단점이 있다. 값을 변경할 때마다 인스턴스를 생성하기 때문에 메모리 측면에서 비효율적일 수 있다는 점이다. (하지만 불변 객체는 메모리를 걱정하는 것..
companion object class WithCompanion { ... companion object { val i = 3 fun f() = i * 3 } } fun main() { println(WithCompanion.i) println(WithCompanion.Companion.i) WithCompanion.f() WithCompanion.Companion.f() } 클래스의 일부만 싱글톤으로 구현하고 싶을 때 사용한다. 클래스명.Companion 로 companion object에 접근할 수 있고 Companion은 생략 가능하다. 클래스명으로 접근할 수 있기 때문에 클래스 내에 companion object는 단 하나만 생성 가능하다. (일반 object는 클래스 내에 여러개 구현 가능) ..
우아한테크코스에서 강의를 듣던 중, "유효성 검증이 필요한 불변 프로퍼티를 가변 프로퍼티로 변경하게 되었을 때, 그 프로퍼티에 대한 유효성 검증은 어떻게 할 것인가"에 대한 주제가 나왔었다. 이해를 위해 실제 코드를 보며 설명하겠다. class Car(name: String, position: Int) { var name: String = name private set var position: Int = position private set init { require(name.length
DTO(Data Transfer Object) 로직을 가지고 있지 않으며, 오로지 데이터를 저장하고 다른 곳에 데이터를 전달하는 역할을 한다. getter와 setter만을 가지면 다른 함수는 가지지 않는다. (kotlin은 data class로 선언하면 getter, setter를 생성하지 않아도 된다.) VO(Value Object) 값 자체를 표현하는 역할을 한다. DTO와 반대로 로직을 포함할 수 있다. 불변성을 가지는 데이터를 저장하기 때문에 setter를 가지지 않는다. 다른 메모리를 가지는 객체라도, 모든 속성 값이 같다면 같은 객체라고 판단한다. 객체를 생성하는 시점에 유효성 검사를 한다. class User(private val name: String, private val age: In..
영역 함수는 내가 코틀린에서 가장 좋아하는 기능이고, 그만큼 많이 사용해 왔다. 불필요한 일회성 변수를 선언하지 않아도 되고, 코드의 가독성이 증가하는 점이 좋다! 하지만 정작 영역 함수 6개가 어떤 차이를 가지는지, 어떤 경우에 사용하면 적절한지 확실히 알지 못하고 있는 것 같아 제대로 알아보려고 한다.. 영역 함수는 범위 함수, 범위 지정 함수라고도 불린다. 영역 함수가 필요한 경우 (1) val user = User() user.name = "abc" user.age = 20 print(user) 영역 함수를 사용하지 않은 경우의 간단한 예제를 작성해봤다. user 객체의 프로퍼티를 변경하고, user를 출력하기 위해 객체명인 user를 계속해서 사용한다. val user = User().apply..
보통 프로젝트를 진행할 때 콘솔에 값을 출력할 일은 거의 없지만, 우테코 프리코스를 진행하면서 콘솔창에 출력된 값을 테스트할 일이 생겼다. 우테코에서 미리 구현한 NsTest를 활용해 테스트했지만, 어떻게 돌아가는지 궁금해서 코드를 뜯어봤다. 사실 System.out, OutputStream 등등은 다 java.io 라이브러리이기 때문에, 문법만 코틀린이고 관련 내용은 자바다.. 먼저 printWinners()라는 함수는 게임 우승자를 출력하는 함수라고 가정하자. 이 함수를 테스트하기 위해 필요한 given-when-then은 다음과 같다. given: pobi, woni가 담겨있는 winners 리스트 when: printWinners() 호출 then: "최종 우승자 : pobi, woni" 라는 문..
우테코 프리코스를 하다보니 테스트 코드를 작성할 일이 자주 생겼다. 오랜만에 작성해보니까 헷갈려서.. 자주 쓰이는 어노테이션과 함수들을 정리해보려고 한다. Junit 자바를 위한 단위 테스트 라이브러리. Junit 어노테이션 @Test 함수 위에 선언해 테스트 함수임을 지정 @Test(timeout=밀리초) 테스트 함수의 수행 시간을 제한 테스트할 함수가 수행되는 시간이 어노테이션 매개변수로 지정한 시간을 넘긴다면 fail @Test(expected=예외) 테스트할 함수의 예외를 지정 매개변수로 지정한 예외가 발생해야 테스트 pass @Ignore 해당 어노테이션이 선언된 테스트 함수는 무시하도록 지정 @BeforeEach 해당 어노테이션이 선언된 함수는 모든 @Test 함수가 실행되기 전에 실행된다. ..