07. 컴포넌트 바인딩된 모듈로 부터 오브젝트 그래프를 생성하는 핵심적인 역할 @Component 사용 interface, abstract class 에만 붙일 수 있음 컴파일 타임에 'Dagger', @Component가 붙은 클래스 이름이 합쳐진 형식의 이름을 가짐 @Component가 갖는 속성 modules : 컴포넌트에 바인드되는 @Module 이 지정된 클래스 배열 모듈이 다른 모듈을 포함한 경우 해당 모듈까지 컴포넌트에 구현해야함 dependencies : 컴포넌트에 다른 컴포넌트의 의존성을 사용하는 경우 클래스 배열 오브젝트 크래프 Dagger에서는 컴포넌트, 모듈, 객체 등의 관계를 컨테이너 or (오브젝트)그래프 라고 함 [Hello World 예제의 그래프] 컴포넌트 매서드 @Comp..
06. 모듈 컴포넌트에 의존 성을 제공하는 역할 (@Module 이 붙은 클래스) 프로바이더 모듈 클래스 내 메서드에 @Provides 어노테이션을 붙여서 컴파일 타임에 의존성을 제공하는 바인드된 프로바이드를 만들 수 있다 반환 타입을 보게되는데 이때 컴포넌트 내에 중복되는 반환타입이 있으면 안된다. import dagger.Module import dagger.Provides @Module class MyModule { @Provides fun provideHelloWorld(): String = "Hello World" @Provides fun provideSSLee(): String = "Lee Sang Su" // error! } 또는 컴포넌트에 바인드된 메서드의 반환형은 @Provides 메서드..
3. Dagger2란 무엇인가? 자바와 안드로이드를 위한 강력하고 빠른 의존성 주입 프레임워크 특징 리플렉션을 사용하지 않음 (리플렉션 : 리플렉션은 구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API) 런 타임에 바이트 코드도 생성하지 않음 컴파일 타임에 애노테이션 프로세서에 의해 의존성 주입과 관련된 모든 코드를 분석하고 자바 소스 코드를 생성 Dagger 전에는 자바 진영에서 Guice를 사용했는데 리플렉션을 사용 및 런 타임에 오브젝트 그래프를 구성하여 성능에 악영향을 끼치는 경우가 많았음 Guice와 비슷한 API를 가지며 더 빠른 Dagger1(2012) 이후 구글 코어 라이브러리 팀과 함께 Dagger2를 만들어 현재까지 발전 프로..
1. 의존성 주입이란? 의존성 주입(DI, Dependency Injection) 하나의 객체의 다른 객체의 의존성을 제공하는 기술 의존성과 주입 의존성 : 객체 지향에서 두 클래스 간의 관계, 일반적으로 둘중 하나가 다른 하나를 필요로함 class CPU class Computer { private val cpu: CPU init { cpu = CPU() } } 위 코드를 보면 컴퓨터를 생성할 떄 CPU가 강하게 결합한다. 다른 CPU로 변경이 불가능 -> 'Computer가 CPU에 의존성을 갖는다' 주입 : 생성자나 메서드를 통해 외부로 부터 생성자 객체를 전달 받는 것 class CPU class Computer { private var cpu: CPU? = null fun setCPU(cpu: ..
7. 안드로이드 애플리케이션 설계 패턴 (MVC, MVP, MVVM) 일반적인 MVC, MVP, MVVM 디자인 패턴 7.1. MVC 디자인 패턴 Model, View, Controller 로 관심사 분리 안드로이드 플랫폼 등장 초기에 자연스럽게 적용되기 시작 모델의 역할 애플리케이션의 비즈니스 로직, 사용 되는 데이터를 다룸 표현 형식에 의존적이지 않고, 사용자에게 보이지 않아 어떻게 보일지 신경쓰지 않아도됨 비즈니스 데이터 = DBMS에 의해서 관리 몇 함수를 통해서 데이터를 제공, 입력, 수정 안드로이드에서 데이터베이스의 Entity 를 담당하는 POJO 클래스를 포함한 SQLite, Room, Realm 등 [POJO 클래스 예시] data class Employee( var name: Stri..
4. 안드로이드의 특징 일반적인 애플리케이션 하나의 진입점을 가지고, 하나의 프로세스에서 실행 안드로이드 애플리케이션 액티비티, 서비스, 브로드케스트 리시버, 콘텐츠 프로바이더를 대표적인 컴포넌트로 구성 여러 프로세스로 실행가능 진입점 또한 다양 짧은 시간에 여러 어플과 상호 작용 인스타로 사진찍고 카카오톡으로 공유하는 도중에 전화가 걸려오면? 또는 메모리 부족으로 강제 종료되면? 그래도 사용자는 복귀후 작업을 재개하고 싶을 것이다. (이러한 처리를 잘 해주어야함) 컴포넌트의 생명 주기는 안드로이드 시스템이 제어권을 가지기 때문에 데이터 등을 컴포넌트에 저장하는 것은 치명적일 수 있다. 5. 안드로이드 애플리케이션 설계 원칙 액티비티와 프래그먼트의 클래스 의존성을 최소화하는 것이 좋다. 그 반대의 경우 ..
3. 클린 아키텍처 소프트웨어의 관심사를 계층별로 분리하는 소프트웨어 디자인 철학 주요 원칙 : 코드 종속성이 외부로부터 내부로 의존 내부 계층 코드는 외부 계층의 기능을 알 수 없음 외부 계층에 존재하는 변수, 함수, 클래스 등 모든 엔티티는 안쪽 계층에서 다시 등장 불가 데이터 형식도 계층 간에 별도로 유지하는 것이 좋아 가장 추상 적인 영역은 가장 가운데 있는 녀석 비즈니스 로직을 포함. 플랫폼, 프레임워크에 의존하면 안됨 외부 원은 네트워크, 데이터베이스 접근 등 플랫폼에 특정한 구체적 구현 세부사항이 포함됨. 내부로 갈 수록 추상화 캡슐화 수준이 높아짐 장점 : 계층을 분리. 계층 간의 의존성을 단방향으로 유지. 코드의 재사용성 용이 및 유닛 테스트가 쉬워짐 Entities 전사적 비즈니스 규칙..
1. 애플리케이션 설계란? 구성 요소간 유기적 관계를 표현 요구사항 해결을 위한 계획 및 과정 텍스트, 그림, 다이어그램 등으로 표현 애플리케이션은 일단 구현되고 나면 변경하는데 큰 비용이 듦 잘 설계된 어플리케이션은 유지 보수비를 줄여줌. 성능, 보안, 안정성 등 측면에서 많은 이점이 있음 앱의 경우 미래에 나오는 플랫폼 호환성, 정책 등으로 끊임없는 변화에 대한 대응이 필요함 2. 애플리케이션의 설계 원칙 로버트 C. 마틴의 객체지향 프로그래밍 및 설계에 대한 SOLID 원칙 1. 단일 책임 원칙(Single Responsibility Principle) 모든 클래스는 하나의 책임만 가져야하며, 클래스는 그 책임을 완전히 캡슐화해야 함. 어떤 클래스나 모듈 또는 매서드가 단 하나의 기능만을 가져야 한..
1. 안드로이드 4대 요소 Activity, Service, Broadcast Receiver, Content Provider 정리 안드로이드 앱을 만들고 프로그래밍 하기위해 기본이 되는 개념인 안드로이드 4대 요소인 엑티비티, 서비스, 방송 수신자, 컨텐츠 제공자에 대해서 정리하려고합니다. 🤓 안드로이드의 4대 요소 Activity Service Broadcast Receiver Content Provider 그외 알아두면 좋은 것 Intent View Fragment 아래는 이를 표현한 그림인데 발로그려서 그림 상태가 좋지 않아도 양해바랍니다. 그럼 하나씩 까보도록 하죠. 2. 엑티비티(Activity) 엑티비티는 사용자가 보게되는 인터페이스 화면을 가지고 있는 요소로 UI 화면을 구성하게 되며 ac..
1. 코틀린 버전 1.4 에서 1.5 대로 업데이트 후 코드 작동 안함 얼마전 배포된 코틀린 버전 15.2 을 받고 나서 원래는 1.4.30 버전에서 잘 동작하던 코드가 동작하지 않는 현상을 발견했다. 처음에는 intelij프로젝트 설정을 잘 못한건가 해서 계속 다시만들고 source root directory 도 바꿔가면서 몇 시간동안 삽질을 하였다. 해당 코드는 코테를 보면서 알고리즘 문제를 풀며 작성한 코드로 해당 테스트에서 사용한 코틀린 컴파일러 버전대는 1.3.x 이었던 걸로 기억한다. 불과 1~2주 정도 전이라 나의 ide도 코틀린 1.4 버전대를 사용하고 있어서 문제가 되지 않았다. 문제의 코드 class Solution { fun solution(bricks: IntArray, n: Int..