목록분류 전체보기 (392)
Hanbit the Developer
서론 Activity, Fragment에서 Lifecycle이 어떻게 동작하는지 top-down으로 알아본다. Activity, Fragment가 어떻게 Lifecycle을 갖는가? ComponentActivity, Fragment는 LifecycleOwner라는 인터페이스를 구현한다. // ComponentActivity.java /** * Base class for activities that enables composition of higher level components. * * Rather than all functionality being built directly into this class, only the minimal set of * lower level building blocks ..
아이템 49: 하나 이상의 처리 단계를 가진 경우에는 시퀸스를 사용하라 *Sequences | Kotlin Documentation를 읽어보시는 것을 적극 권장합니다. Sequences는 Iterable과 매우 흡사하지만, 연산을 lazy하게 해서 더 효율적으로 처리하도록 설계되어 있으며, 다음과 같은 장점이 있다: 자연스러운 순서를 유지한다. 최소한만 연산한다. 무한 시퀸스 형태로 사용할 수 있다. 각각의 단계에서 컬렉션을 만들어 내지 않는다. 자연스러운 순서를 유지한다. .filter { print("F$it, "); it % 2 == 1 } .map { print("M$it, "); it * 2 } .forEach { print("E$it, ") } 위 코드를 listOf(1, 2, 3)와 sequ..
아이템 45: 불필요한 객체 생성을 피하라 객체 생성 비용 실제로 필요한 데이터보다 더 많은 용량을 차지한다. 추가적인 함수 호출이 필요하다. 생성되는 과정에 비용이 있다. 객체가 생성되고 메모리 영역에 할당되고 래퍼런스를 만드는 등의 작업이 필요하다. 객체 생성 줄이기 싱글톤 활용 예시: LinkedList 클래스에서 Empty가 자주 사용되기 때문에 object를 붙여 싱글톤으로 활용한다. 캐시 활용(Memoization): 메모리를 활용하여 시간을 줄인다. 메모리 관리를 위해 SoftReference 사용하면 좋다. *WeakReference vs SoftReference: WeakReference는 래퍼런스가 끊기고 GC 타이밍이 되면 GC를 곧바로 하지만, SoftReference는 다 같으나 ..
배경저는 카카오브레인 패스파인더 2기 인턴십 프로그램에 참여하였습니다.(2023.06.28~2023.08.29) 두 달 동안의 인턴십 프로그램을 회고하고자 이 글을 작성합니다.*패스파인더에 대한 더 자세한 내용은 카카오브레인 Blog(https://blog.kakaobrain.com/team/1253)를 참고해주세요!협업 및 커뮤니케이션저희 프로젝트에는 기술적으로 안드로이드, 프론트엔드, 백엔드, LLM 분야가 필요했습니다. 저는 팀에서 안드로이드 개발자, 프론트엔드 개발자, LLM 프롬프트 엔지니어 역할을 하였습니다.그라운드 룰 정의개발, 협업, 근무, 애자일과 관련된 그라운드 룰을 팀과 정의하였습니다.특히 “의견에 근거가 있어야 한다.”, “특정 의견으로 결정되었다면 모두가 헌신한다.”, “자유롭고 ..
배경 Kotlin의 Coroutines에서 예외 처리를 하는 방식은 다양합니다. 오늘은 세 가지 예외 처리 방식의 장단점을 비교하고자 합니다. try-catch block viewModelScope.launch { try { val data = getServiceListUseCase() // Handle data } catch (e: Exception) { // Handle exception } } - 장점: 직관적이고 간단합니다. 세부적인 예외 유형에 따른 처리가 쉽습니다. - 단점: 반복적인 사용 시 코드 중복이 발생할 수 있습니다. 예를 들어, 여러 곳에서 네트워크 요청을 수행하는데 동일한 예외 처리 로직을 적용하는 경우, 코드의 중복이 발생합니다. CoroutineExceptionHandler v..
아이템 36: 상속보다는 컴포지션을 사용하라 상속의 장점 다형성을 활용할 수 있다. 상속의 단점 복잡한 계층구조가 만들어지기 쉽다. 인터페이스 분리 원칙 위배: 불필요한 것까지 가져온다. 코드를 읽기 어렵다. 컴포지션 장점 다른 클래스의 public한 것들에만 의존하므로 안전하다. 유연하다. 컴포지션 단점 상속 사용 시 보다 코드를 수정해야 하는 경우가 더 많다. → 일반적으로 컴포지션을 사용하는 것이 좋다. → 상속을 사용하는 경우: 명확한 ‘is-a’ 관계 아이템 37: 데이터 집합 표현에 data 한정자를 사용하라 data 한정자를 붙이면 다음과 같은 함수가 자동으로 생성된다: equals() hashCode() toString() copy() componentN() 장점: 가독성: Pair vs ..
아이템 33: 생성자 대신 팩토리 함수를 사용하라 장점은 다음과 같다: 함수에 네이밍 가능 → 가독성 확보(ex. ArrayList(3): 3이 무슨 의미일까? 의문 → ArrayList.withSize(3)) 다른 타입 리턴 가능(ex. listOf(): 각자의 플랫폼에서 다른 구현체를 반환할 수 있다.) 싱글톤 사용 가능 아직 존재하지 않는 객체 리턴 가능 → 빌드 이전에 코드에서 해당 타입을 사용할 수 있다는 뜻 가시성 제어 inline, reified 사용 가능 복잡한 객체 생성 생성자와 달리 슈퍼클래스나 기본생성자를 호출하지 않아도 됨 팩토리 함수 유형 companion 팩토리 함수 확장 팩토리 함수(fun Tool.Companion.createBigTool(): BigTool): compani..
https://www.acmicpc.net/problem/18186 18186번: 라면 사기 (Large) 라면매니아 교준이네 집 주변에는 N개의 라면 공장이 있다. 각 공장은 1번부터 N번까지 차례대로 번호가 부여되어 있다. 교준이는 i번 공장에서 정확하게 Ai개의 라면을 구매하고자 한다(1 ≤ i www.acmicpc.net 아이디어 1. 블럭 하나를 여러 블럭으로 나누어 돈을 절약할 수 있다. B, C 값에 따라서 1, 2, 3번 구매 옵션의 비용이 달라진다. 경우에 따라 (블럭 3 비용) > (블럭 1 비용) + (블럭 2 비용)이 성립하는 등의 케이스가 발생할 수 있다. 극단적으로, B = 1, C = 100인 경우 블럭 1은 1원, 블럭 2는 101원이 들기 때문에 블럭 1로 나누어 구매하는 ..
아이템 26: 함수 내부의 추상화 레벨을 통일하라 올바른 예시: fun makeCoffee() { boilWater() brewCoffee() pourCoffee() } 잘못된 예시: fun makeCoffee() { // boil water val water = findWater() val kettle = findKettle() kettle.boil(water) brewCoffee() pourCoffee() } 아이템 27: 변화로부터 코드를 보호하려면 추상화를 사용하라 추상화 할 수 있는 방법은 다음과 같다: 상수로 추출한다. 동작을 함수로 래핑한다. 함수를 클래스로 래핑한다. 인터페이스 뒤에 클래스를 숨긴다. 보편적인 객체를 특수한 객체로 래핑한다. 다만 추상화가 과도하면 코드가 복잡해지기 때문에 ..
아이템 19: knowledge를 반복하여 사용하지 말라 프로그래밍의 가장 큰 규칙은 다음과 같다: 프로젝트에서 이미 있던 코드를 복사해서 붙여넣고 있다면, 무언가가 잘못된 것이다. knowledge 의도적인 정보를 뜻하며 코드나 데이터로 표현할 수 있다. 상속 시 오버라이드가 안 되게 강제한다는 것은 ‘해당 메서드가 슈퍼클래스와 동일하게 동작하기 원한다’는 knowledge를 함유한다. 알고리즘 작동 방식, UI 형태, 원하는 결과 등이 모두 의도적인 정보이다. 가장 중요한 knowledge 두 가지는 다음과 같다: 로직: 프로그램이 어떤 식으로 동작하는지, 프로그램이 어떻게 보이는지 공통 알고리즘: 원하는 동작을 하기 위한 알고리즘 둘의 차이점은, 전자의 경우 계속해서 변하지만 후자는 그렇지 않다는 ..