분류 전체보기 (271) 썸네일형 리스트형 [Android] Fragment 잘 사용하기 개요 Android의 Fragment는 유용한 만큼 매우 복잡한 컴포넌트이다. 단순히 Fragment를 사용하는 것은 디버그하기 어려운 많은 문제를 마주칠 수 있다. 이런 문제를 피하기 위한 다양한 솔루션을 알아보자. 1. 새로운 Fragment를 onCreate에서 savedStateInstance의 체크 없이 생성하는 것 흔히 다음과 같은 코드를 자주 확인할 수 있다. override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) supportFragmentManager.beginTransaction() .replace(R.id.conta.. [Flutter] Android/iOS Native Platform 코드 사용하기 개요 회사에서 Android/iOS Native로 개발된 SDK를 Flutter에서 사용하기 위해 알게 된 내용을 정리한 글이다. Flutter의 구조 Flutter App(client)와 각 platform host로의 통신은 다음과 같은 흐름을 가진다. 이 때, 메시지와 응답은 비동기적으로 처리된다. 유의해야할 점은 Flutter가 Dart를 통해 channel method를 비동기로 실행했더라도, 해당하는 실제 platform method는 메인 스레드에서 호출해야 한다. [참고] MethodChannel은 각 platform에 맞는 method 호출이 가능하게 한다. 이 클래스를 통해 약간의 보일러 플레이트를 통해 Plugin을 개발할 수 있다. 이 때, 각 platform에 맞게 변화하는 cod.. [iOS] Weak, Strong Reference 개요 저번 포스팅에서 소개한 내용처럼 iOS(Swift, Objective-C)는 ARC를 사용한다. 이 과정에서 iOS의 참조 방식은 Weak, Strong, Unowned 세 가지로 나뉜다. Strong 객체를 참조하고 Reference Count를 증가시킨다. 기존에 A 객체에서 X를 참조하고 있으면 count = 1이고, B가 X를 참조하도록 선언하면 count = 2가 된다. A와 B가 X를 참조하는 reference를 모두 nil로 만들 때 할당이 해제된다. var a1: A? = A() var a2: A? = a1 var a3: A? = a2 a1 = nil a2 = nil a3 = nil //해제 Strong을 사용할 시 유의해야되는 점은 Strong Reference Cycle이 생길 수.. [iOS] Auto Referencing Counting Auto Referencing Counting Auto Referencing Counting(이하 ARC)는 자동으로 메모리를 관리하는 메커니즘이다. 객체에 대한 참조 수를 관리하고 특정 객체의 참조 수가 0이 되었을 때 해당 객체를 메모리에서 해제한다. JVM 진영에서는 Garbage Collector(이하 GC)와 유사하지만 다른 점이 많다. ARC는 컴파일 타임에 결정되지만, GC는 런타임에 수행된다. Objective-C에서는 메모리 관리를 수동으로 수행했지만, 최근 버전에는 ARC를 지원하며, Swift는 ARC를 자동으로 지원한다. ARC가 동작하는 원리 위에서 언급한 것 처럼 Objecitve-C는 메모리 관리를 수동으로 했다. 이 때, 참조 수를 증가시키기 위해 retain, 감소시키기 위.. 8. Effective Kotlin - 사용하지 않는 객체의 레퍼런스를 제거하라 사용하지 않는 객체의 레퍼런스를 제거하라 Java와 같은 메모리 관리를 자동으로 해주는 프로그래밍 언어를 사용할 경우, 해제(free)를 따로 고려하지 않는다. 하지만, 메모리 관리를 완전히 무시해버리면 메모리 누수가 발생하여 OOM(Out Of Memory)가 발생한다. 따라서, 필요 없는 객체의 레퍼런스는 명시적으로 끊어주어야 한다. 메모리 문제는 굉장히 사소한 곳에서 발생한다. class Stack { private val elements: Array = arrayOfNulls(DEFAULT_CAPACITY) private var size = 0 fun push(e: Any?) { ensureCapacity() elements[size++] = e } fun pop(): Any? { if (size.. 7. Effective Kotlin - 인라인 클래스의 사용을 고려하라. inline class 특정 class의 Default 생성자의 프로퍼티가 하나일 경우 inline을 사용하면, 해당 객체를 사용하는 위치가 모두 해당 프로퍼티로 교체된다. inline class Millis(private val time: Int) { // ... } 이러한 inline 클래스는 타입만 일치한다면 값을 바로 넣는 것도 가능하다. val time: Millis = Millis(3000) // 컴파일 시 다음 형태로 변경 val time: Int = 3000 inline 클래스에 존재하는 메서드는 컴파일 시 모두 정적 메서드로 만들어진다. inline class Name(private val value: String) { fun greet() { print() } } // 실제 코드 val.. 6. Effective Kotlin - 함수를 파라미터로 갖는 함수에 inline을 사용하라 함수 타입 파라리터를 갖는 함수에 inline 한정자를 붙여라 inline의 역할은 컴파일 시점에 '함수를 호출하는 부분'을 '함수의 본문'으로 대체하는 역할을 한다. inline fun repeat(times: Int, action: (Int) -> Unit) { for (index in 0 until times) { action(index) } } repeat(10) { print (it) } 위의 repeat는 컴파일 시점에 아래와 같이 교체된다. for (index in 0 until times) { print(index) } inline을 사용하면 다음과 같은 장점이 있다. reified를 사용할 수 있다. 더욱 빠르게 동작한다. 비지역(non-local) 리턴을 사.. 5. Effective Kotlin - 효율성 효율성 과거에 비해 메모리의 값이 저렴해지고 개발자의 몸 값이 오르면서, 메모리 효율적인 코드를 작성하는 것에 대해 관대함이 생겼다. 하지만, 효율성을 고려한 코드는 대부분의 경우에서 옳다. 그 과정에서 가독성과 효율성의 trade-off도 고려한다면 최적이다. 불필요한 객체 생성을 피하라 객체 생성에는 언제나 비용이 들어간다. 다양한 레벨에서 객체 생성을 피할 수 있다. 예를들어 JVM에서는 하나의 가상 머신에서 동일한 문자열을 처리하는 코드가 여러 개가 존재할 경우, 기존 문자열을 재활용한다. 또한, Integer, Long과 같은 박싱 타입도 작은 수에서는 재활용한다. val str1 = "Kotlin" val str2 = "Kotlin" print(str1 == str2) //true print(.. 이전 1 2 3 4 5 6 ··· 34 다음