본문 바로가기

프로그래밍

[WHY?] ConcurrentHashMap은 어떻게 동시성을 보장할까 HashTable 동시성을 보장하는 Map 자료구조 중 하나이다. 그러나 성능이 좋지 않은 오래된 녀석이라 잘 사용하지 않는다. public synchronized int size() { return count; } public synchronized V put(K key, V value) { ... } Java API 문서를 보면 알겠지만, synchronized 범벅을 통해 동시성을 보장한다. 동시성을 보장해주는 synchronized는 편리한 키워드지만 컬렉션의 get, put 등 모든 메소드에 사용하게 되면, 당연히 성능이 저하된다. ConcurrentHashmap 결론적으로 ConcurrentHashmap은 좋은 성능과 함께 동시성을 보장한다. 어떻게 그럴 수 있을까? public V get(O.. 더보기
[WHY?] Static 무엇일까? Static이 정확히 뭘까? Static 변수 public Static{ public String notStatic; public static String staticVariable = "sv"; public static void main(String[] args) { } public void someMethod() { } } 위와 같은 Static 클래스가 존재할 때, notStatic은 인스턴스 변수, StaticVariable은 클래스 변수이다. 인스턴스 변수는, 객체의 생성과 함께 시작되고 저장된다. - new 연산자로 생성되고 Heap 영역에 저장된다. 클래스 변수는 클래스의 생성과 함께 저장된다. - 클래스에 대한 정보와 클래스 변수는 메소드 영역에 저장된다. 즉, 생명 주기도 다르고 저장되는.. 더보기
Jetpack Compose 정리1. 기본 구성 Compose는 선언형 UI로, 기존의 xml을 사용하던 방식과는 다르다. Activity에 @Composable 어노테이션을 붙여 사용하고, 여러 Compose의 코드들로 UI를 구성할 수 있다. Compose를 사용했을 때의 장점은 코드 감소, 직관적, 빠른 개발 속도, 강력한 성능이라 할 수 있는데, 왜 이런 장점을 가지는지 공부하며 알아보자! @Composable fun MessageCard(msg: Message) { // Add padding around our message Row(modifier = Modifier.padding(all = 8.dp)) { Image( painter = painterResource(R.drawable.profile_picture), contentD.. 더보기
Delegate란? 대리자 (임시저장을 생활화하자.............................ㅠㅠㅠ) 대리자는 어떤 프로퍼티가 작업을 수행할 때, 다른 객체에게 위임하여 그 객체의 메서드가 실행되게 하는 것이다!! class Example { var p: String by Delegate() } class Delegate { operator fun getValue(thisRef: Any?, property: KProperty): String { return "$thisRef, thank you for delegating '${property.name}' to me!" } operator fun setValue(thisRef: Any?, property: KProperty, value: String) { println.. 더보기
[하톡시그널] Retrofit으로 Nest.js와 통신하는 과정에서 있던 일.. 배경 매칭 시스템을 이렇게 구현하기로 했다. 매칭하기 버튼 클릭 -> (POST) 매칭 대기열에 추가 -> 반복 (POST) 매칭 됐는지 확인 (0.1초마다 보냄) 이렇게 확인하는 POST 요청을 3개 클라이언트에서 계속 보낸다. 매칭이 완료됐을 때, 확인 요청을 한 각 클라이언트에게 ROOM 정보를 준다. 문제 1. POST Response로 받을 데이터를 data class로 만들어 뒀다. 그 구조는 아래와 같다. @Parcelize data class roomInfo( val user1: userData?, val user2: userData?, val user3: userData? ) : Parcelable @Parcelize data class userData( val Id: String?, v.. 더보기
[하톡시그널] Retrofit으로 서버와 연결하기 처음으로 안드로이드에서 서버와 연결하는 과정 이슈 1. http와 통신하기 현재 서버가 http로 올라가 있었는데, private val moshi = Moshi .Builder() .add(KotlinJsonAdapterFactory()) .build() private val retrofit = Retrofit .Builder() .addConverterFactory(MoshiConverterFactory.create(moshi)) .baseUrl(BASE_URL) .build() interface MatchingApiService{ @POST("/room/entrance") suspend fun StartMatch(@Body body: MatchingRequest): Response } object .. 더보기
PintOS Project 4. File System Project4. File System 1.Indexed and Extensible Files 1번과제는 2가지 목표가 있다. 하나는 FAT을 이용해 File system을 구현하는 것이다. 또, 현재는 파일의 크기가 limit이 있는데 얼마든지 확장할 수 있는 구조를 만들어야 한다. 파일은 의미 있는 정보를 담는 논리적인 단위이다. 이 파일은 메타데이터 (파일의 진짜 정보!)를 가지고, 이름 길이 등등을 가진다. 원하는 파일을 열고 닫고 쓰고 읽기 위해서는 파일에 접근해야한다. 이 방법론에 관한 내용이 핵심이다. 한 섹터는 512 bytes이고 어떤 파일이 총 10개의 섹터가 필요하다고 하자. 10개의 연결된 섹터로 파일을 저장하면 좋겠지만 이럴 경우 외부단편화가 발생하기 쉬워진다. 때문에 우리는 10.. 더보기
Project3. Virtual Memory (PintOS) Project3. Virtual Memory 1. Memory Management 늘 그래왔듯, 가장 기초 즉 이 project3가 흘러가는 코드의 시작을 공부한다. Project2까지는 load를 어떻게 해왔는지 생각해보자. 우리는 process_exec -> load -> load_segment -> setup_stack 등의 방식으로 메모리를 적재했다. (load_segment, setup_stack은 주의깊게 보지 못했을 수 있다.) 그러나 프로그램 전체를 메모리에 load 하는 것은 매우 비효율적이다. 그래서 우리는 lazy_load를 사용한다. 지금 당장 사용해야할 부분만 load하고, 사용하지 않는 부분은 표시만 해둔다고 생각하면 될 것 같다. 이렇게 하면 당장 큰 프로그램을 모두 load하.. 더보기