일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 회고
- 책
- 코틀린
- 자바
- 알고리즘
- 병럴프로그래밍
- android
- 스레드
- theming
- 병렬프로그래밍
- 커스텀상태
- 알게되는
- 디자인패턴
- 코루틴
- ReactiveProgramming
- viewmodel
- 안드로이드스튜디오
- Rxjava
- Gradle
- Kotlin
- mockito
- 안드로이드
- g 단위테스트
- 글또
- k8s
- kotlin강좌
- 안드로이드강좌
- 테스트
- Compose
- Coroutine
- Today
- Total
목록전체 글 (154)
선생님, 개발을 잘하고 싶어요.
작업(task) 👉 추상적, 명확하게 구분된 업무 단위 애플리케이션 요구 사항을 작업 단위로 분할하면 프로그램 구조 간결 트랜잭션 범위 지정으로 오류 효과적 대응 작업 실행의 병렬성 극대화 스레드에서 작업 실행 작업의 범위를 어디까지로 할 건가 정해야한다. 완전히 독립적인 동작 👉 병렬성 보장을 위함 작업 스케줄링, 부하 분산(load balancing)을 하려면 작업 단위를 충분히 작게 구성 작업을 순차적으로 실행 가장 간단한 방법, 단일 스레드에서 작업 목록을 순차적 실행 작업마다 스레드를 직접 생성 작업 요청 마다 스레드를 생성한다. 다음과 같은 결과 작업 처리하는 기능이 메인 스레드와 분리 👉 서버의 응답 속도 🆙 동시에 여러 작업을 병렬로 처리할 수 있다 👉 서버의 처리 속도 🆙 프로그램이 동시..
자바 기본 라이브러리를 보면 병렬 프로그램 작성 시 필요한 여러 가지 동기화 도구가 마련되어있다. 스레드 안전한 컬렉션 클래스 동시 동작 스레드 간 작업 조율하는 동기화 클래스 동기화된 컬렉션 클래스 Vector, Hashtable, Collections.synchronizedXxx 스레드 안정성 확보 방법 👉🏻 클래스 내부에 캡슐화 해 내부 값을 한 번에 한 스레드만 사용할 수 있도록 제어 동기화된 컬렉션 클래스의 문제점 클라이언트 코드에서 두 개 이상의 연산을 묶어서 사용하는 경우 반복, 컬렉션 내부의 모든 항목을 차례로 가져다 사용 이동, 특정한 순서에 맞춰 지금 항목의 다음 항목 위치로 이동 없는 경우에만 추가하는 기능 개별 연산에 대한 스레드 안전은 지켜주지만, 그 연산을 조합한 복합 연산은 적..
스레드 안전성 확보한 컴포넌트를 안전하게 서로 연결해 사용한다면 규모 있는 컴포넌트나 프로그램을 좀 쉽게 작성할 수 있을 것 스레드 안전한 클래스 설계 🌟 스레드 안전성 확보할 때 고려사항 객체의 상태를 보관하는 변수는? 그 변수가 가질 수 있는 값의 범위는? 객체 내부 값을 동시에 사용할 때 그 과정을 관리할 정책은? 객체 상태는 내부 변수에 의해서 결정된다. 동기화 정책 👉 값이 계속 변하는 상황에서도 값을 안전하게 사용하도록 조절하는 방법 객체 불변성, 스레드 한정, 락 등 어떻게 사용해야 스레드 안전성을 확보할 수 있는지 명세 어떤 변수를 어떤 락으로 막아야 하는지 명세 (e.g. @GuardedBy) 동기화 요구사항 정리 스레드 안전성을 확보했다? 👉 여러 스레드가 동시에 클래스를 사용하는 상황..
여러 개의 스레드에서 객체를 동시에 사용하려 할 때 섞이지 않고 안전하게 동작하도록 객체를 공유하고 공개하는 방법을 살핀다. 크리티컬 섹션? 코드 블록을 동기화할 때 항상 메모리 가시성(Memory Visibility) 문제가 발생한다. 반드시 달성돼야 하는 거 변수를 사용하고 있을 때 다른 스레드가 해당 변수 값을 사용하지 못하도록 막아야한다. 동기화 블록을 빠져나가고 나면 다른 스레드가 변경된 값을 즉시 사용할 수 있어야한다. 가시성 변수에 값을 저장하고 이후에 값을 다시 읽으면, 아까 저장한 값을 가져올 수 있을거라고 예상한다. 하지만 멀티 스레드 환경에서는 특정 변수의 값을 가져갈 때 다른 스레드가 작성한 값을 가져갈 수 없을 수 있다. 심지어 값을 읽지 못할 수 있다. 🌟 메모리상 공유된 변수를..
공유되고 변경할 수 있는 상태에 대한 접근을 관리하는 것이다. 공유됐다 👉 여러 스레드가 특정 변수에 접근할 수 있다. 변경할 수 있다(mutable) 👉 해당 변수 값이 변경될 수 있다는 뜻이다. 스레드 안정성은 코드를 보호하는 게 아니라, 데이터에 제어 없이 동시 접근하는 걸 막으려는 의미 스레드가 하나 이상 변수에 접근하고 + 변수에 값을 쓰면 👉 해당 변수에 접근할 때 관련된 모든 스레드가 동기화를 통해 조율해야 한다. 🌟 어떤 스레드가 변경할 수 있는 상태 변수를 적절한 동기화 없이 접근한다면 그 프로그램은 잘못됐다. 이런 문제를 해결하는 3가지 방법이 있다. 변수를 스레드 간에 공유하지 않는다. (스택에 저장된 변수 접근 등) 변수를 변경할 수 없도록 만든다. 접근할 땐 언제나 동기화를 사용한..
작업을 동시에 실행하는 일에 대한 간략한 역사 운영체제: 여러 개의 프로그램을 각자의 프로세스 내에서 동시에 실행 프로세스: 각자가 서로 격리된 채, 독립적으로 실행되는 프로그램 운영체제가 프로세스마다 메모리, 파일 핸들, 보안 권한등의 자원을 할당한다. 프로세스간 통신: 소켓, 시그널 핸들러, 공유 메모리, 세마포어, 파일 등으로 통신 프로그램 동시 실행으로 해결하는 문제들 자원 활용 IO 대기와 같이 유용하지 않은 일을 하며 자원을 점유하고 있으면 비효율적이다. 차라리 다른 프로그램을 사용하는 게 바람직하다. 공정성 한 프로그램을 모두 끝내야 다른 프로그램을 시작하는 것 보다는 더 작은 단위로 컴퓨터를 공유하는 게 바람직하다. 편의성 여러 작업을 전부 처리하는 하나의 프로그램을 작성하는 것보다 각기 ..
다루는 거 영역 특화 언어, DSL, Domain-Specific Language 수신 객체 지정 람다, invoke 관례 API에서 DSL로 클래스간 상호작용을 이해하기 쉽고 명확하게 표현할 수 있게 만드는 것이 목표 2부에서 살펴본 내용은 API를 깔끔하게 작성할 수 있게 돕는 코틀린 특성 깔끔하다는 것은? 코드를 읽을 때, 어떤 일이 벌어질지 명확하게 이해할 수 있어야함. 이를 위해서 이름과 개념의 선택을 잘 해야한다. 코드가 간결해야함, 불필요한 구문이나 보일러플레이트가 가능한 적어야한다. 개념적 DSL? 범용 프로그래밍 언어: 모든 문제를 충분히 풀 수 있는 기능을 제공 영역 특화 언어: 특정 과업 또는 영역에 초점을 맞추고 그 영역에 필요하지 않은 기능을 제거, (e.g. SQL, 정규식) D..
다루는 거 애노테이션(annotation) 라이브러리가 요구하는 의미를 클래스에게 부여 리플렉션(reflection) 실행 시점에 컴파일러 내부 구조를 분석 애노테이션 메타데이터를 선언에 추가해 애노테이션을 처리하는 도구가 컴파일 시점이나 실행 시점에 적절한 처리 애노테이션 인자로 원시 타입 값, 문자열, enum, 클래스 참조, 다른 애노테이션 클래스 그리고 이러한 배열이 들어갈 수 있다. 애노테이션 인자는 컴파일 시점에 알 수 있어야한다. 코틀린 한 소스코드의 선언을 컴파일한 결과가 여러 자바 선언과 대응하는 경우가 있다. (e.g. var로 선언한 property는 getter, setter에 대응된다) 사용 지점 대상(use-site target) 선언으로 애노테이션을 붙일 요소를 정할 수 있다...