코루틴이란 together를 뜻하는 co와 작업들의 집합을 뜻하는 Routine이 합쳐져 만들어진 단어로 '협동 루틴'을 뜻한다. 일반적으로 루틴은 하나의 입구와 출구를 가지는 반면, 코루틴은 여러개의 입구와 출구를 가질 수 있다. 이런 특징으로 이전에 실행이 중단된 지점에서 다시 실행을 재개할 수 있는 기능을 가진다. 코루틴의 개념 코루틴을 이해하기 위해서는 3개의 기본 개념을 이해해야 한다. Coroutine Scope (코루틴 스코프): MainScope, GlobalScope, Coroutine Scope 등이 있다. Coroutine Builders (코루틴 빌더): 코루틴을 생성하는 메소드를 의미한다. launch, async, withContext, runBlocking 등이 있다. Coro..
안드로이드 개발을 하다 보면 어쩔 수 없이 동시성에 관련된 문제들을 마주치기 마련이다. 안드로이드 개발에서는 코틀린의 코루틴을 통해 UI 스레드가 중단되는 문제를 효율적으로 처리할 수 있다. 이제부터 코루틴에 대한 기본 개념과 사용 방법을 알아보고자 한다. 자바 동시성 코틀린이 존재하기 전 자바에서는 동시성을 어떻게 처리했을까? 바로 자바 동시성 기본 요소를 사용하는 것이다. 자바 동시성 기본 요소를 사용하면 스레드 안전성을 달성할 수 있다. 하지만 엄청난 단점이 존재한다. 대부분의 동시성 연산이 Blocking 연산임으로 스레드를 블럭하고 실행을 재개할 때 Context Switch(문맥 교환)를 해야 하므로 프로그램 성능에 부정적인 영향을 미치게 된다. 그래서 동시성 스레드를 많이 사용하는 것은 비실..
때로는 우리가 프로그램에서 표현하고 싶은 개념이 몇 가지 정해진 변종의 집합으로 구성될 때가 있다. 이런 경우에는 똑같은 타입을 공유하는 미리 정의된 상수 집합을 표현하는 이넘 클래스를 사용해 표현할 수 있다. 이넘 클래스에 대한 설명은 아래의 게시글에서 참고할 수 있다. Enum Class 이넘 클래스란? 이넘 클래스는 미리 정의된 상수들로 이뤄진 제한된 집합을 표현하는 클래스다. 정수, 문자열 등과 비교할 때 이넘을 사용하면 어떤 값이 가능한 범위 안에 들어가 있는지를 일 everyday-develop-myself.tistory.com 하지만 어떤 경우에는 각 종류별로 애트리뷰트가 다를 수 있다. 한번 어떤 계산이 성공인지 실패인지를 표현하는 예제를 추상 클래스를 사용해 만들어 보겠다. 다만 성공인 ..
이넘 클래스란? 이넘 클래스는 미리 정의된 상수들로 이뤄진 제한된 집합을 표현하는 클래스다. 정수, 문자열 등과 비교할 때 이넘을 사용하면 어떤 값이 가능한 범위 안에 들어가 있는지를 일일이 검사할 필요가 없으므로, 정해진 상수들로 이뤄진 집합을 타입 안전하게 아룰 수 있다. 다음은 간단한 이넘 클래스의 예시이다. enum class Result { SUCCESS, ERROR } fun Result.isSuccess() = this == Result.SUCCESS fun main() { println(Result.SUCCESS.isSuccess()) // true println(Result.ERROR.isSuccess()) // false } 추가로 이넘은 내부 클래스나 함수 본문에서 정의할 수 없다. ..
보통의 상위 클래스는 자기 자신에 대한 인스턴스를 만들 수 있는 타입들이다. 하지만 별도의 인스턴스가 있을 수 없고 구체적인 경우를 구현한 다른 클래스의 인스턴스만 만들 수 있는 추상적인 개념을 표현하는 클래스라면 인스턴스 생성은 바람직하지 않다. 그렇다면 추상적인 개념을 표현하려면 어떤 타입의 클래스를 사용해야 할까? 이 질문에 대한 대답이 바로 추상 클래스이다. 추상 클래스란? 추상 클래스는 자바에서도 지원하는 방식이다. 추상 클래스는 직접 인스턴스화 할 수 없고 다른 클래스의 상위 역할만 할 수 있는 클래스를 뜻한다. 클래스를 추상 클래스로 만들기 위해서는 abstract라는 변경자 키워드를 붙여야 한다. abstract class Entity(val name: String) // Success: ..
변수 캡슐화란? 변수 캡슐화는 객체 지향 프로그래밍에서 중요한 원칙 중 하나이다. 이는 클래스의 맴버 변수를 외부에서 직접 접근하는 것이 아니라, 해당 변수에 대한 접근을 제한하고 메서드를 통해 간접적으로 변수에 접근하는 것을 말한다. 변수 캡슐화를 하면 다음과 같은 이점이 생긴다. 정보 은닉: 변수를 private로 선언할 수 있어 클래스 내부의 데이터를 보호하고, 외부에 불필요한 세부 구현을 감춘다. 접근 제어: getter와 setter 메서드를 통해 변수에 접근하므로, 변수에 대한 유효성 검사, 제한된 접근 권한 설정 등을 수행할 수 있다. 유연성과 유지보수성: 변수에 대한 의존성을 제한하여 클래스 내부의 구현 변경에 유연하게 대처할 수 있으며, 코드의 유지보수성을 향상시킨다. 설명만 듣고선 알기..
요즘 들어 개인 프로젝트를 진행한다고 블로그를 작성하는 것에 소홀했었다. 안드로이드 개발을 한다고 하면 반드시 마주치게 되는 것이 바로 REST API와 Retrofit이다. 안드로이드 스튜디오 자체에서 다 해결할 수 있다면 사용하지 않을 수 도 있겠지만 앵간하면 분명 위의 2가지와 마주치게 될 것이다. 좋은 개발자가 되기 위해서는 관련 개념에 대한 깊은 이해가 필요하기에 이 게시글을 통해 이해를 하고 넘어가고자 한다. REST API REST API는 REpresentational State Transfer API의 약자로 HTTP 프로토콜을 사용해서 클라이언트와 서버 간 통신을 위한 아키텍처를 정의하는 웹 서비스 디자인 패턴이다. HTTP & HTTPS HTTP(HyperText Transfer Pr..
HATEOAS란? HATEOAS(Hypermedia as th engine of application state)는 클라이언트가 API에서 제공되는 자원 간 관계를 탐색하고 이를 통해 애플리케이션 상태를 변경할 수 있는 기능을 제공한다. 만약 REST API에서 HATEOAS를 적용하지 않은 응답 예시를 들어보면, 클라이언트가 서버에스 응답받은 리소스의 URI를 기반으로 클라이언트가 가능한 동작을 수행하기 어렵다는 것이다. 이를 예를 들어 설명해 보겠다. 다음과 같은 REST API가 있다고 가정해 보겠다. GET /users/1 위의 API를 호출하면 서버는 클라이언트에게 원하는 유저의 정보를 반환할 수 있다. 그 응답은 아래와 같다. { "id": 1, "name": "John Smith", "em..