프로그래밍 351

[Java] Buffer의 구조와 주요 메소드 다루기

Java NIO Buffer는 Channel과 상호작용할때 사용된다. Channel에서 Buffer로 데이터를 읽어들일 수 있고, 다시 Channel로 쓰여질 수 있다. Channel을 통하지 않고 Buffer를 직접 다룰 수도 있는데, Buffer의 구조와 주요 메소드들을 살펴보면서 알아보도록 하겠다. Buffer의 구조 Buffer는 데이터를 읽고, 쓸 수 있는 메모리 블록이다. 그리고 커서 역할을 하는 다음 3개의 속성 값들을 가지고 있다. capacity: 버퍼의 사이즈 position limit Buffer는 읽기, 쓰기 모드로 나뉘어지는데 각 모드에 따라 커서가 하는 일을 살펴보자. 쓰기 모드 (Write Mode) [ ][ ][ ][ ][ ]. ⭡ ⭡ position limit, capaci..

유한상태머신(FSM)으로 텍스트 젤다의 전설 만들기

유한상태머신이란? 유한 상태 기계(finite-state machine, FSM) 또는 유한 오토마톤(finite automaton, FA; 복수형: 유한 오토마타 finite automata)는 컴퓨터 프로그램과 전자 논리 회로를 설계하는 데에 쓰이는 수학적 모델이다. 간단히 '상태 기계'라고 부르기도 한다. 유한 상태 기계는 유한한 개수의 상태를 가질 수 있는 오토마타, 즉 추상 기계라고 할 수 있다. 이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 되며, 현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다. 이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른 상태로 변화할 수 있으며, 이를 전이(Transition)이라 한다. 특정한 유한 오토마톤은 현재 상..

Coil 인터셉터를 활용한 이미지 로딩 최적화 방법

Coil의 이미지 파이프라인은 아래 5가지의 메인 파트로 이루어져 있는데, Interceptor는 그 중 첫번째로 실행되는 녀석이다. Interceptor -> Mapper > Keyer -> Fetcher -> Decoder 커스텀 Interceptor를 이용하면 일종의 캐시 레이어(Cache Layer)를 만들 수 있다. 요청을 가로채서 요청 파라미터를 수정하거나...HTTP Request를 했지만 휴대폰 내에 파일이 있다면 File로 돌려버리거나 말이다. 또, 앱에서 정의한 커스텀 스키마로 이미지를 불러오는 것도 가능해진다. 어찌되었건 지금 간단히 예시로 볼 것은 Unsplash 이미지를 불러올때 이미지 사이즈를 최적화 시켜주는 Interceptor다. (Github에 많이 떠돌아다니는 코드다 ㅋㅋ..

Java/Kotlin에서의 예외처리에 관하여

Java Exception Hierarchy Throwable은 모든 Exception 객체들의 부모 클래스다. 크게는 Error와 Exception으로 구분할 수 있고, Exception은 또 다시 Checked Exception과 Unchecked(Runtime) Exception으로 구분 된다. Error Error는 회복불가능한(non-recoverable) 오류다. 런타임에 Error가 발생하면 핸들링할 수 없다. 대표적으로는 메모리 부족(Out of Memory), 네트워크 포화(Network Saturation), 하드웨어 결함 등이 있다. Error를 인스턴스화 하거나 상속하거나, 직접 예외를 던지거나, 처리를 하려해서는 안된다. 위로 전파하는 것이 가장 좋다. Exception - Che..

WGSL 기본

Shader의 Lifetime Shader Creation const-expressions에 대한 값을 확정 리터럴 @const 함수 const 선언 값 Pipeline Creation override-expressions 대한 값을 확정 Shader Execution runtime-expressions에 대한 값을 확정 let 선언 값 함수 호출 변수 참조, 포인터 가변 내용 WGSL 함수 문법 Rust와 문법과 사용방법이 동일하다. fn negate(v: vec3f) -> vec3f { return -v; } EntryPoints @vertex, @fragment, @comute 어노테이션이 붙은 함수는 Shader Entrypoint다. @must_use @must_use 어노테이션이 붙은 함수는 ..

[wgpu] 파이프라인 (Pipeline)

Pipeline Pipeline은 OpenGL로치면 Shader의 강력한 버전이라고 보면 된다. Pipeline은 데이터 세트에 대해 작업을 수행할때 GPU가 해야할 모든 일을 설명한다. *Shader는 GPU가 데이터에 대해 어떤 동작을 수행할지 알려주는 작은 프로그램이다. Shader의 종류 Vertex Fragment Compute Vertex Vertex는 3D혹은 2D 공간에서의 한 점이다. 2개로 선을, 3개로 삼각형을 만들 수 있다. Vertex를 조작하여 모양을 이룬다. Fragment Vertex가 모여서 Fragment를 형성한다. Fragment는 각각의 픽셀들이 어떤 색상으로 그려질지를 정의한다. WGSL WebGPU Shading Language의 약자로, WebGPU를 위한 Sh..

Android Studio Custom Shortcuts

Tool Windows Logcat: Cmd + 8 App Inspection: Cmd + 4 Window > Editor Tabs 오른쪽으로 창 나누기(Split and Move Right): Option + Cmd + 방향키(우) 하단으로 창 나누기(Split and Move Down): Option + Cmd + 방향키(하) 다음 창으로 이동(Goto Next Splitter): Option + Cmd + ] 이전 창으로 이동(Goto Previous Splitter): Option + Cmd + [ 창 합치기(Unsplit All): Option + Cmd + U 현재 탕의 다른 탭 닫기(Close Other Tabs): Option + Cmd + W

Javadoc 알고 쓰기

Java 수업때 가장 등한시했던 부분이 바로 Javadoc이었는데 이제 정말 필요한 상황이 왔다. 코드를 작성하는 시간보다 코드를 다시 보고, 다른사람에게 설명하는데 쓰는시간이 배로 많다. 잘 작성된 Javadoc은 이런 비효율적인 일을 줄여줄 수 있다. 기계인간 Johngrib님의 포스팅과 javadoc 문서를 참고했다. 예시 코드는 Android Source Code다. 작성 원칙 코드의 역할을 3초안에 파악할 수 있도록하는 것이 목적이다. 가독성이 중요하다. 세부 구현은 언제든지 바뀔 수 있으므로 구현에 대한 내용은 적지 않는다. 루프를 돌아서 반환한다던가 하는 설명 @deprecated /** * Main Sidecar interface definition that will be used by t..

[Hilt] Custom Component의 활용 - 지역별 DB 생성하기

Hilt의 Component와 Scope Hilt에서는 안드로이드 앱의 다양한 생명주기에 맞는 미리 정의된 컴포넌트 들을 제공한다. 컴포넌트 위의 어노테이션은 해당 컴포넌트의 수명에 대한 바인딩 범위를 지정한다. 이렇게 어노테이션을 붙이면 해당 컴포넌트와 오브젝트는 생명주기를 같이하게 된다. 바인딩은 Scoped와 Unscoped 두 가지 유형으로 나누어지는데, 기본적으로는 Unscoped 바인딩이다. Unscoped: 해당 바인딩이 요청될 때마다 새로운 인스턴스가 생성됨 Scoped: 범위가 지정된 컴포넌트의 인스턴스 당 한 번만 생성되며, 해당 바인딩에 대한 모든 요청은 동일한 인스턴스를 공유함 @Module @InstallIn(FragmentComponent::class) object FooModu..

[Jetpack Compose] @Immutable과 @Stable이란

Stable과 Unstable Recomposition이 일어날때, Compose는 Stable과 Unstable로 유형을 구분한다. - Stable: 불변하는 것(Immutable), 혹은 Recomposition간에 값이 변경되었는지 여부를 추적할 수 있는 경우. - Unstable: Recomposition간에 값이 변경되었는지 알 수 없는 경우. 만약에 어떤 타입이 Stable하다면 Skip할 수 있지만 Unstable하다면 다시 그려야하므로, Stable과 Unstable하다는 것은 Compose에게 아주 중요하고 이것은 결국 성능에까지도 영향을 미치게 된다. 따라서 가능한한 클래스를 Immtable하게 만든다면 성능에 조금이나마 도움이 될 것이다. @Immutable @Immutable은 컴포..