본문 바로가기
728x90

전체 글249

아이템 2 - 변수의 스코프를 최소화하라 상태를 정의할 때는 변수와 프로퍼티의 스코프를 최소화하는 것이 좋습니다. 프로퍼티: 클래스의 일부로 객체의 상태를 나타낸다. 인스턴스 변수, 스태틱 변수 프로퍼티보다는 지역 변수를 사용하는 것이 좋습니다. 최대한 좁은 스코프를 갖게 변수를 사용합니다. 프로그램을 추적하고 관리하기 쉽기 때문. 변수는 읽기 전용 또는 읽고 쓰기 전용 여부와 상관 없이, 변수를 정의할 때 초기화되는 것이 좋습니다. 여러 프로퍼티를 한꺼번에 설정해야 하는 경우에는 구조분해 선언(destructuring declarration)을 화용하는 것이 좋습니다. 구조분해: 객체가 가지고 있는 여러 값을 분해해서 여러 변수를 한꺼번에 초기화 할 수 있다. // 책에 있는 예시도 좋치만 좀 더 간단한 예시 // data class 는 구조.. 2024. 3. 25.
아이템 52 - mutable 컬렉션 사용을 고려하라 아이템 1 - 가변성을 제한하라 와의 연관된 아이템 2024.03.23 - [공부/이펙티브코틀린] - 아이템 1 - 가변성을 제한하라 immutable 컬렉션보다 mutable 컬렉션이 좋은 점은 성능적인 측면에서 더 빠르다는 것이다. immutable 컬렉션에 요소를 추가하려면, 새로운 컬렉션을 만들면서 여기에 요소를 추가해야 합니다. plus 함수는 새로운 객체를 반환합니다. 이처럼 컬렉션을 복제하는 처리는 비용이 굉장히 많이 드는 처리입니다. 이러한 복제 처리를 하지 않는 mutable 컬렉션이 성능적 괌점에서 좋습니다. 정리 가변 컬렉션은 일반적으로 추가 처리가 빠르다. item 1: 가변성을 제한하라 에서 언급한 immutable 컬렉션은 안전하다 측면에서는 좋다. 일반적인 지역 변수는 이때 언.. 2024. 3. 25.
아이템 1 - 가변성을 제한하라 아이템 1: 가변성을 제한하라. 가변 프로퍼티 var -> 프로그램 실행중에 변경될 수 있음을 의미 mutable 객체 -> 내부 상태를 변경할 수 있는 객체 변할 수 있는 지점은 줄일수록 좋다 코틀린에서 가변성 제한하기 읽기 전용 프로퍼티 - 읽기 전용 프로퍼티는 val 키워드 사용하여 정의 -> 한번 초기화되면 변경할 수 없다. - 프로퍼티가 가르키는 객체의 상태가 불변임을 가르키는 것은 아니다. val list = mutableListOf(1, 2, 3) list = mutableListOf(4, 5, 6) //에러 - list 는 mutableListOf 를 통해 생성된 가변 리스트를 가리키는 읽기 전용 프로퍼티 - list 가 val 로 선언되었기 때문에 list = mutableListOf(4.. 2024. 3. 23.
30장 - 모범 사례 async 코루틴 빌더 뒤에 await 를 호출하지 마세요 async 로 비동기 작업을 정의한 뒤, 아무것도 하지 않은 채 연산이 완료되는 걸 기다리는건 아무 의미가 없습니다. // 이렇게 구현하지 마세요. suspend fun getUser(): User = coroutineScope { val user = async { repo.getUser() }.await() user.toUser() } // 이렇게 구현하세요. suspend fun getUser(): User { val user = repo.getUser() return user.toUser() } withContext(EmptyCoroutineContext) 대신 coroutineScope 를 사용하세요 withContext 와 corouti.. 2024. 3. 16.
29장 - 코루틴을 시작하는 것과 중단 함 숮 어떤 것이 나을까? 여러 개의 동시성 작업을 수행해야 하는 경우 사용할 수 있는 함수는 두 종류가 있다. 코루틴 스코프 객체에서 실행되는 일반 함수 중단 함수 class CoroutineTest29 { @Test fun `29_1 test`() { main_29_1() /* send: Notificationabc(message=Message #4) send: Notificationabc(message=Message #3) send: Notificationabc(message=Message #0) send: Notificationabc(message=Message #2) send: Notificationabc(message=Message #1) NotificationsSender를 통해 모든 알림이 전송되었습니다. */ } .. 2024. 3. 16.
3장 - this js 에서 this 는 기본적으로 실행 컨텍스트가 생성될 때 함께 결정된다. this 는 함수를 호출할 때 결정된다 할 수 있다. 함수를 어떤 방식으로 호출하느냐에 따라 값이 달라지는 것 전역 공간에서의 this 전역공간에서의 this 는 전역 객체를 가르킴 브라우저 환경에서는 window, Node.js 환경에서는 global 입니다. 2024. 3. 12.
18장 - 핫 데이터 소스와 콜드 데이터 소스 채널만으로 부족하다라는 것을 깨닫음. 채널은 값을 핫 스트림으로 가지지만, 콜드 스트림이 필여힐 때가 있음 핫 데이터, 콜드 데이터 차이를 이해하는 것이 소프트웨어적인 측면에서 상당히 유용하다 할 수 있다. List, Set과 같은 컬렉션은 핫 이며, Sequence 와 Stream 은 콜드입니다 Channel 은 핫이지만, Flow 와 (Observable, Sigle 과 같은)RxJava 스트림은 콜드입니다. 핫 VS 콜드 핫 데이터 스트림은 열정적이라 데이터를 소비하는 것과 무관하게 원소를 생성하지만 핫 데이터 스트림의 빌더와 연산은 즉각 실행됩니다. 콜드 데이터 스트림은 게을러서 요청이 있을 때만 작업을 수행하며 아무것도 저장하지 않습니다. 콜드 데이터 스트림에서는 원소가 필요할 때까지 실행되지 .. 2024. 3. 10.
16장 - 채널 채널은 송신자와 수신자의 수에 제한이 없으며, 채널을 통해 전송된 모든 값은 단 한 번만 받을 수 있습니다. SendChannel 은 원소를 보내거나(또는 더하거나) 채널을 닫는 용도로 사용됩니다. ReceiveChannel 은 원소를 받을 때(또는 꺼낼때) 사용됩니다. 채널의 진입점을 제한하기 위해 ReceiveChannel 이나, SendChannel 중 하나만 노출시키는 것도 가능합니다. 원소를 보내고 받는 함수가 중단 함수인 것은 필수적인 특징입니다. receive: 호출했는데 채널에 원소가 없다면 코루틴은 원소가 들어올 때 까지 중단됩니다. send: 채널의 용량이 다 찼을 때 중단됩니다. *중단 함수가 아닌 함수로 보내거나 받아야 한다면 trySend, tryReceive 를 사용할 수 있다... 2024. 3. 2.
14장 - 공유 상태로 인한 문제 위 예제에서는 방어적 복사로 toList 를 사용했습니다. downloaded 로 반환된 객체를 읽을 때와 변경 가능한 리스트에 원소를 추가할 때 발생할 수 있는 충돌을 피하기 위함입니다.users 를 읽기만 가능한 리스트(List) 와 읽고 쓰기가 가능한 프로퍼티(var) 로 선언할 수도 있습니다.방어적 복사를 하지 않아도 되고 downloaded 함수를 보호할 필요도 없지만 컬렉션에 원소를 추가하는 작업의 효율이 떨어지게 됩니다.개인적으로 두번째 방법을 선호하지만, 실제 현업의 많은 프로젝트에서 변경 가능한 컬렉션을 사용하고 있으므로 첫 번째 방법을 예로 들었습니다. users.toList()를 통해 생성된 복사본은 List 타입입니다. 이 복사본은 기본적으로 변경할 수 없습니다. 즉, 복사본은 수정.. 2024. 3. 1.
728x90