코루틴 장점멀티플랫폼에서 작동시킬 수 있기 때문에 코틀린을 사용하는 모든 플랫폼에서 사용할 수 있다.기존 코드 구조를 광범위하게 뜯어고치지 않고 코루틴을 도입할 수 있다. 안드로이드에서의 코루틴 사용흔한 애플리케이션 로직은 다음과 같다.하나 이상의 소스(API, 뷰 구성요소, 데이터베이스, 설정, 다른 애플리케이션)로부터 데이터를 얻어온다. 데이터를 처리한다.가공된 데이터로 무엇인가를 한다. (화면에 보여주기, 데이터베이스에 저장, API로 전송) 기존의 구현 방식과 코루틴을 사용한 예제를 비교하여 두 방법이 어떻게 다른지 알아보자.예제 상황 - API로 뉴스를 가져와서 정렬한 후, 화면에 띄운다. 1) 가장 간단한 방법fun onCreate() { val news = getNewsFromApi()..
자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 도우미 클래스(?)를 캡슐화하거나 코드를 사용하는 곳에 가까이 두고 싶을 때 유용하다. 코틀린에서는 클래스 내부에 다른 클래스를 정의할 수 있는 두 가지 방법이 있다. 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만을 가지면 다른 함수는 가지지 않는다. VO(Value Object)값 자체를 표현하는 역할을 한다.DTO와 반대로 로직을 포함할 수 있다.불변성을 가지는 데이터를 저장하기 때문에 setter를 가지지 않는다.다른 메모리를 가지는 객체라도, 모든 속성 값이 같다면 같은 객체라고 판단한다.객체를 생성하는 시점에 유효성 검사를 한다. class User(private val name: String, private val age: Int)예를 들어 name, age의 속성을 가지는 User 클래스가 있다고 가정하자. val user1 = Use..
영역 함수는 내가 코틀린에서 가장 좋아하는 기능이고, 그만큼 많이 사용해 왔다. 불필요한 일회성 변수를 선언하지 않아도 되고, 코드의 가독성이 증가하는 점이 좋다! 하지만 정작 영역 함수 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" 라는 문..