사용자의 관점에서 애플리케이션 외부적으로 제대로 작동하는지 확인하는 것이 목표인 테스트는 개발자에게 유용하지만 충분하지는 않습니다. 이것만으로는 해당 요소가 올바르게 작동한다는 것을 완전하게 보증할 수는 없습니다. 그렇기 때문에 단위 테스트(Unit Test)가 필요합니다. 확인할 내용단위 테스트는 일반적으로 다음과 같은 내용을 확인합니다. 1. 일반적인 유스케이스이는 사용될 것이라고 예상되는 정상적인 입력 값에 대해 프로그램이 의도한 대로 작동하는지 확인하는 경우입니다.fun get(list: List, index: Int): Int { return list[index]}@Testfun `인덱스의 해당하는 값을 가져올 수 있어야 한다`() { val numbers = listOf(1, 2,..
상태(state)var을 사용하거나 mutable 객체를 사용하면 값이 변동될 여지가 생기게 됩니다. 이를 상태(state)라고 합니다. 상태를 가지게 되는 경우, 이제는 객체의 사용 방법뿐만이 아니라 객체의 상태에 대한 이력(history)에 의존하게 됩니다. 그렇기에 코틀린에서는 주로 3가지 방법을 사용해서 가변성을 제한합니다.val (읽기 전용 프로퍼티)가변 컬렉션과 읽기 전용 컬렉션 구분하기데이터 클래스의 copy valval을 사용해 읽기 전용 프로퍼티를 만들 수 있습니다. 다만 이러한 val의 값이 항상 변하지 않는다는 말은 아닙니다. val이 mutable 하거나 getter를 정의해서 다른 변경 가능한 프로퍼티를 참조한다면, val 값도 변할 수 있습니다. 아래의 예시에서 person은 ..
코루틴 코틀린에서는 동시성 기능을 처리할 수 있도록 다양한 클래스와 함수를 코루틴으로 지원합니다. 코루틴이란? 코루틴은 이러한 동시성 작업을 간편하게 처리할 수 있게 해줍니다. 코루틴과 서브루틴의 차이점 서브루틴은(subroutine)은 함수를 호출했을 때 결과를 반환하는 순수 함수입니다. 이런 서브루틴 함수는 순차적으로 처리됩니다. 코루틴(Corutine)은 상태를 관리하고 일시 중단했다가 다시 시작할 수 있는 일시중단 함수로 구성합니다. 동시성 프로그래밍 동시성 프로그래밍은 기존의 순서대로 명령들이 실행되는 구조에서 벗어나 명령들이 불규칙한 순서대로 실행될 수 있게 해주는 프로그래밍 기법입니다. 멀티쓰레딩은 동시성 프로그래밍의 한 방법이지만, 동시성 프로그래밍이 꼭 병렬처리 및 멀티쓰레딩을 의미하지는..
파일 I/O 처리 파일 처리는 Input / Output에 대한 데이터 처리를 말합니다. 이런 데이터가 처리되어 흐르는 `데이터의 흐름`을 Stream이라고 합니다. 자바에서는 이러한 기능을 수행하기 위해 입출력을 위한 기본 패키지인 `java.io`에 InputStream과 OutputStream이 존재하고 이를 기반으로 상속하여 바이트 단위로 처리하도록 하는 ByteArrayInputStream과 ByteArrayOutputStream이 있습니다. 바이트 스트림 데이터를 읽고 쓸 때 바이트 스트림을 사용합니다. 사용하는 방법은 아래와 같습니다. import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream val inScr = byt..
제네릭의 정의 제네릭이란 자료형의 타입을 일반화하는 것을 의미합니다. 이는 내부에서 타입을 지정하는 것이 아니라, 외부에서 사용 시점에 자료형을 지정하게끔 일반화시켜 두는 방법입니다. 제네릭을 사용하면 함수나 클래스 등을 일반화시켜 재사용하기 쉽게 만들 수 있습니다. 제네릭은 object 같은 싱글톤 패턴을 사용하는 상황에서는 사용할 수 없습니다. 오직 하나의 객체만 생성하기에 굳이 일반화할 필요가 없기 때문입니다. 타입 매개변수(Type Parameter) 클래스나 함수의 자료형을 임의의 문자로 지정해서 컴파일 다임에 자료형 점검을 할 때 사용합니다. 타입 매개변수는 영어 대문자로 표시하며 아래와 같이 사용될 수 있습니다. 다만 이에 대한 규칙이 존재하는 것은 아닙니다. 그렇기에 유형에 더 구체적인 이..
클래스 위임(delegation) 클래스 위임은 다른 클래스에 자기 클래스가 할 일을 다른 클래스에 맡겨 처리하는 것을 말합니다. 보통 하나의 클래스에는 하나의 책임을 부여해서 설계하는 방식을 사용합니다. 하지만 위임은 2개의 클래스가 동일한 책임을 가지고 나눠서 처리합니다. 이는 구현 상속에 대한 좋은 대안으로 입증되었으며 코틀린에서는 by를 사용하여 쉽게 구성할 수 있습니다. 클래스 위임을 위해서는 위탁자 클래스(delegator), 수탁자 클래스(delegate), 두 클래스가 상속하는 인터페이스로 구성합니다. 인터페이스 동일한 일을 나눠서 처리하라면 일단 두 클래스 사이의 공통된 인터페이스가 필요합니다. interface Base { fun print() } 수탁자 클래스 수탁자 클래스는 실제 기..
함수형 프로그래밍 함수형 프로그래밍은 프로그램의 주요 구성요소로 함수를 사용하며, 함수의 조합으로 프로그램을 작성하는 것을 강조합니다. 기본적으로 함수형 프로그래밍은 선언형 프로그래밍 의 특성을 함수들의 조합을 사용하여 구현하는 패러다임입니다. 그럼 선언형 프로그래밍은 뭘까요? 이를 위해서는 명령형 프로그래밍을 함께 이야기해야 합니다. 선언형 프로그래밍 vs 명령형 프로그래밍 선언형과 명령형의 차이는 무엇(What)을 할 것인지, 어떻게(How) 할 것인지를 설명하는 방식에 차이가 있습니다. 개발자는 먼저 명령형 프로그래밍을 기반으로 개발해 왔습니다. 다만 복잡하게 엉켜있는 코드를 관리하는 것은 매우 힘든 일이었습니다. 그렇기에 큰 문제를 작은 순수 함수로 나눠서 해결하는 기법인 함수형 프로그래밍 을 사..
추상 클래스(Abstract Class) 추상 클래스는 직접 인스턴스화 할 수 없고 다른 클래스의 상위 역할만 할 수 있는 클래스를 말합니다. 클래스를 추상 클래스로 만들기 위해서는 abstract라는 변경자 키워드를 붙여야 합니다. 좀 더 쉽게 말하자면 기본 함수를 강제하고 기본 속성을 가질 때 사용합니다. 아래의 예시를 보겠습니다. abstract class Animal { abstract val species: String abstract fun makeSound() } class Dog : Animal() { override val species: String = "개" override fun makeSound() { println("멍멍!") } } fun main() { val dog = Do..