본문 바로가기

전체 글

(55)
코틀린 제네릭이란? (in, out) 코틀린 제네릭의 이해와 활용코틀린은 코드의 타입 안정성을 극대화하기 위해 다양한 기능을 제공합니다. 그중 하나가 바로 **제네릭(Generic)**입니다. 제네릭은 코드를 유연하고 재사용 가능하게 만들면서도 안정성을 유지하는 데 중요한 역할을 합니다. 이 글에서는 코틀린 제네릭의 핵심 개념과 활용법을 체계적으로 정리합니다.제네릭의 기본 개념: 가변성과 제약 조건코드를 작성하다 보면 특정 로직을 다양한 타입에서 재사용하려는 요구가 발생합니다. 예를 들어, 파라미터를 모두 Any로 받는 방식으로 일반화를 시도할 수 있습니다. 그러나 이는 타입 안정성을 저하시켜 의도치 않은 오류를 유발할 수 있습니다.제네릭을 활용하면 다양한 타입에서 재사용 가능한 코드를 작성하면서도, 타입 안정성을 유지할 수 있습니다. 코틀..
Xcode 15에서 배포 도중에 Xcode가 종료되는 오류 Xcode 15로 업데이트하고 나서 앱을 업로드하는 도중 Xcode가 종료되는 문제가 발생했다..해당 경우를 구글링 해봐도 찾을 수 가 없어서 Transporter로 업로드를 시도 해보려는 도중 2024-05-07 14:41:10.895 xcodebuild[32261:255754] [MT] DVTAssertions: ASSERTION FAILURE in DVTFrameworks/DVTFoundation/FilePaths/DVTFilePath.m:570Details:  allocation too small? AllocationSize: 25 String: '앱이름.ipa'Object:   Method:   +_filePathForParent:pathString:Thread:   {number = 1, na..
불변 객체 불변 객체란 객체를 생성한 이후 변하지 않는 객체를 말한다. private, val과 같이 데이터가 변하지 않기 때문에 생성된 객체를 신뢰할 수 있게 된다. 얕은 복사란 해당 객체의 메모리 주소 값만 복사하는 것을 말한다. 주소만 복사하기 때문에 기존 객체가 변하게 되면 영향을 받게 된다. 깊은 복사란 해당객체의 데이터를 복사하는 것을 말한다. 데이터를 복사하기 때문에 기존 객체의 변경에도 영향을 받지 않는다. 코틀린에서는 객체의 .copy()등을 이용한다. 방어적 복사란 생성자를 통하여 초기화할 때 새로운 객체 등으로 감싸서 복사하는 방법이다. 코틀린의 toList(), toMutableList()로 사용할 수 있다. public fun Collection.toMutableList(): MutableL..
inline 함수 inline 고차 함수를 사용할 경우 객체를 생성하여 런타임시 오버헤드가 발생한다. 이를 Inline으로 선언해 주면 객체를 생성하지 않아 오버헤드가 발생하지 않지만 객체를 생성하는 대신 코드를 copy하기 때문에 코드의 양이 많은 함수는 inline을 사용하지 않는게 좋다. 보통 1~3줄의 경우에 사용하는게 좋다. inline함수의 인자로 고차 함수가 존재할 수 있는데 별도 처리를 해주지 않으면 코드를 생성하여 객체를 생성하지 않는다. 하지만 inline함수내에서 다른 함수를 호출할 경우나 전달 받은 파라미터 함수의 사이즈가 너무 커서 inline을 사용하는게 좋지 않은 경우가 있을 수 있다. 이경우에 파라미터에 @noninline 어노테이션을 달아 주면 코드를 생성하지 않고 객체를 생성한다. Reif..
Dagger의 @Binds vs @Provides, @Qualifier vs @Named, @Lazy<T> vs @Provider<T> @Binds interface AnalyticsService { fun analyticsMethods() } // Constructor-injected, because Hilt needs to know how to // provide instances of AnalyticsServiceImpl, too. class AnalyticsServiceImpl @Inject constructor( ... ) : AnalyticsService { ... } @Module @InstallIn(ActivityComponent::class) abstract class AnalyticsModule { @Binds abstract fun bindAnalyticsService( analyticsServiceImpl: Anal..
객체지향의 5대 원칙 (SOLID) 객체지향의 5대 원칙 (SOLID) 모듈 규모의 소프트웨어 구조가 유지보수성, 가독성, 낮은 결합도, 높은 응집도를 만족하도록 하는 것 을 말한다. SRP(Single Responsibility Principle) 단일 책임의 원칙 하나의 모듈은 하나의 액터(변경을 요청하는 사용자, use case에 요청을 하는 사람 혹은 사물, *domain은 책임의 범위다.)에 대해서만 책임져야 한다. (단일 태스크 X) 예를 들어 학생 class에 식사, 공부, 놀기 등의 3가지 메소드가 있다고 가정해 보자 class 학생 { 식사() 공부() 놀기() } 식사 메소드는 학생이 편식하지 않고 밥을 잘 먹었는지 확인 하기 위해 급식 영양 관리소에서 요청을 한다. 공부 메소드는 학생이 공부를 하였는지 확인하기 위해 성..
컴포즈 부수효과 부수효과 컴포저블에는 부수 효과가 없어야 한다. 하지만 앱의 상태를 변경하는 데 필요한 경우 컴포저블의 수명 주기를 인식하는 관리된 환경에서 부수 효과를 호출해야 한다. Compose에서 다양한 가능성 효과를 이용할 수 있기 때문에 과다하게 사용될 수 있는데 이를 방지하기 위해서는 효과(Effect)에서 실행하는 작업이 UI와 관련되고 단방향 데이터 흐름을 중단하지 않아야 한다. LaunchedEffect: 컴포저블의 범위에서 suspend 함수 실행, 취소 실행시점: 컴포지션 실행 종료시점: 해당 컴포지션의 종료 재실행 발생 조건: LaunchedEffect block의 parameter 변경 시 매개변수로 전달된 코드 블록으로 코루틴이 실행되고 LaunchedEffect가 컴포지션을 종료하면 코루틴이..
코틀린 by란? 코틀린에서 by의 사용은 주로 두가지로 나누어 진다. 첫번째는 Property Accessors의 구현을 다른 객체에 위임하는 것이다. 주로 안드로이드 개발을 하면서 흔히 사용되는 by lazy, by inject(), by mutableStateOf()등 있다. private val viewModel: SomeViewModel by lazy { ViewModelProvider(requireActivity())[SomeViewModel::class.java] } private val viewModel: SomeViewModel by viewModels() var someState by remember { mutableStateOf(false) } 위에서 사용되는 by를 이해하기 위해 간단한 예시를 하나 ..