메모리 관리를 자동으로 해준다고 해서 메모리 관리를 완전히 무시해 버리면, 메모리 누수가 발생하여 `OutOfMemoryError`가 발생할 수 있습니다. 따라서 '더 이상 사용하지 않는 객체의 레퍼런스를 유지하면 안 된다'라는 규칙을 지키는 것이 좋습니다. 안드로이드에서는 Activity를 여러 곳에서 자유롭게 접근하기 위해서 companion 프로퍼티에 이를 할당해 두는 경우가 있습니다.class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) activity = this } co..
data class DialogConfig( val icon: Int = -1, val title: Int = -1, val onCancelListener: (() -> Unit)? =null)fun makeDefaultDialogConfig() = DialogConfig( icon = R.drawble.ic_dialog, title = R.string.dialog_title, onCancelListener = { it.cancel() })코틀린은 함수형 스타일과 객체 지향 스타일로도 작성할 수 있습니다. OOP는 객체를 생성해서 사용하므로, 객체를 생성하는 방법을 정의하여야 합니다. 객체 생성 방식에 따라서 다른 특징이 생기기에 여러 방법을 알아야 합니..

추상화(abstraction)은 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말합니다. 간단하게 말하자면, 추상화는 복잡성을 숨기기 위해 사용되는 형식을 의미합니다. 대표적인 예로는 인터페이스가 있습니다. 어떤 객체애 대한 추상화는 여러 가지가 나올 수 있고, 객체는 여러 형태로 추상화해서 표현할 수 있습니다. 추상화를 하려면 객체에서 무엇을 감추고 무엇을 노출해야 하는지를 결정해야 합니다. 프로그래밍에서의 추상화프로그래밍에서 하는 일은 기본적으로 추상화입니다. 예를 들어 숫자를 입력하면, 이는 내부적으로 0과1이라는 형식으로 표현됩니다. 추상화를 설계한다는 것은 단순하게 모듈 또는 라이브러리로 분리한다는 의미가 아닙니다. 강력한 프로그래밍 언어들이 갖고 있는 기..
아이템 19 - knowledge를 반복해서 사용하지 말라프로그래밍의 가장 큰 규칙은 아래와 같습니다 "프로젝트에서 이미 있던 코드를 복사해서 붙여놓고 있다면, 무언가가 잘못된 것이다." Knowledge프로그래밍에서 knowledge는 넓은 의미로 '의도적인 정보'를 뜻합니다. 알고리즘의 작동 방식, UI의 형태, 우리가 원하는 결과등이 모두 '의도적인 정보'입니다. 그 중 2가지를 뽑자면 아래와 같습니다.비즈니스 Logic: 프로그램이 어떠한 식으로 동작하는지와 프로그램이 어떻게 보이는지공통된 알고리즘: 원하는 동작을 하기 위한 알고리즘둘의 가장 큰 차이점은 시간에 따른 변화입니다. 로직은 시간이 지나면서 변하지만, 알고리즘은 크게 변하지 않습니다. knowledge가 반복되면 확장성을 막고, 쉽게..
1장을 시작하며 사람들이 코틀린을 사용하는 가장 큰 이유는 바로 코틀린의 안정성(Safey)입니다. 코틀린은 다양한 설계지원을 통해서 애플리케이션의 잠재적인 오류를 줄여줍니다. 다만, 코틀린을 안전하게 사용하려면 개발자가 뒷받침을 해야 합니다. 그렇기 때문에 이번장에서는 코틀린이 안전을 위해 사용하는 기능들을 알아보고, 이를 올바르게 사용하는 방법을 알아볼 것입니다. 이번장의 목표는 `오류가 덜 발생하는 코드를 만드는 것`입니다. 아이템 1 - "가변성을 제한하라" 상태(state) var을 사용하거나 mutable 객체를 사용하면 값이 변동될 여지가 생기게 됩니다. 이를 상태(state)라고 합니다. 상태를 가지게 되는 경우, 이제는 객체의 사용 방법뿐만이 아니라 객체의 상태에 대한 이력(history..

코루틴 코틀린에서는 동시성 기능을 처리할 수 있도록 다양한 클래스와 함수를 코루틴으로 지원합니다. 코루틴이란? 코루틴은 이러한 동시성 작업을 간편하게 처리할 수 있게 해줍니다. 코루틴과 서브루틴의 차이점 서브루틴은(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) 클래스나 함수의 자료형을 임의의 문자로 지정해서 컴파일 다임에 자료형 점검을 할 때 사용합니다. 타입 매개변수는 영어 대문자로 표시하며 아래와 같이 사용될 수 있습니다. 다만 이에 대한 규칙이 존재하는 것은 아닙니다. 그렇기에 유형에 더 구체적인 이..