5. • 변하지 않는 대학 교육
• 무엇을 모르는지 모른다.
• 기본기 부족
• 전공을 생각보다 모른다.
• 안드로이드를 잘한다 == 코드를 잘 짠다 로 착각
• 프레임워크 공부만 한다.
• 코드를 잘 짜기 위한 훈련은 하지 않는다.
• 회사에서 배울 거라는 기대감
원인
6. • 변하지 않는 대학 교육
• 무엇을 모르는지 모른다.
• 기본기 부족
• 전공을 생각보다 모른다.
• 안드로이드를 잘한다 == 코드를 잘 짠다 로 착각
• 프레임워크 공부만 한다.
• 코드를 잘 짜기 위한 훈련은 하지 않는다.
• 회사에서 배울 거라는 기대감
원인
13. • 내 컴퓨터, 서버의 처리 과정까지…
WEB SERVER
기본기 – 내 컴퓨터가 네이버에 접속되는 과정은?
DB OS Network Algorithm Data Structures
DB OS Network Algorithm Data Structures
MY COMPUTER
14. • 안드로이드 개발자는?
기본기 – 내 컴퓨터가 네이버에 접속되는 과정은?
WEB SERVER
DNS SERVER
Application
Transport
Network
Link
Physical
Network
Link
Physical
Application
Transport
Network
Link
Physical
Application
Transport
Network
Link
Physical
Network
Link
Physical
Network
Link
Physical
DB OS Network Algorithm Data Structures
15. • Computer Science = DB + OS + Network + Algorithm + Data Structures
• 1, 0
기본기 – Computer Science
COMPUTER SCIENCE
DB OS Network Algorithm Data Structures
WEB SERVER
MY COMPUTER
1, 0 1, 0
16. • 인프라를 보는 눈이 생긴다.
• 리눅스, 윈도우의 IO 통지 모델의 메커니즘 이해
• #blockingI/O #nonblockingI/O #I/Omultiplexing #signal-drivenI/O #Producer–Consumer #reactor #proactor #epoll
#synchronousI/O #asynchronous I/O #overlappedI/O #IOCP #RIO
기본기 - 네트워크 프로그래밍 - 추천 서적 (심화)
17. • 우선 T자형 인재
• 5대 과목 + git + 언어
기본기 - T
Programing Language
GitDB OS Network Algorithm Data Structures
Framework
18. • 우선 T자형 인재
• 5대 과목 + git + Java + Kotlin + Android
기본기 - T - 안드로이드
GitDB OS Network Algorithm Data Structures
JavaKotlinAndroid
19.
20. • Android Developers 유튜브 채널
• Google IO, Android Dev Summit
• 안드로이드 모든 키워드의 발생지!
키워드의 시작
42. • 정형화된 형태로만 쓴다
• Fragment를 재활용 단위로 가져 감
• xml 문제로 빌드가 안되는 걸 잘 파악하지 못함
• Inflater, View 에 대한 이해가 있으면 좋은 구조의 View를 만들 수 있다.
안드로이드 – Inflater, View
// Fragment
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tech_concert, container, false);
}
// RecyclerView.Adapter
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
return inflater.inflate(R.layout.view_tech_concert, false);
}
46. • Inflate? xml 파일을 읽어와서 파싱한 뒤 객체로 만드는 과정
안드로이드 – Inflate 제대로 이해하기
Object
View,
ViewGroup
Animator
TransitionSet
…
Inflater
LayoutInflater
AnimatorInflater
TransitionInflater
…
inflate
47. • Inflate? IO와 탐색을 동반하기 때문에 비용이 있는 동작
안드로이드 – Inflate 제대로 이해하기
48. • Inflate? IO와 탐색을 동반하기 때문에 비용이 있는 동작
안드로이드 – Inflate 제대로 이해하기
49. 안드로이드 – View 기반으로 이해하기
• Tools – Layout Inspector
• 내가 만든 화면은 어떻게 생겼을까?
50. 안드로이드 – View
• View?
• View는 화면의 직사각형 영역을 차지하며 그리기 및 이벤트 처리를 담당
• View는 UI 구성 요소 (버튼, 텍스트 필드 등)를 만드는 데 사용되는 위젯의 기본 클래스
• ViewGrop은 View의 서브 클래스로 다른 View 또는 다른 ViewGroup들을 보유하는 컨테이너 View
51. • ViewGroup 구현체
• ConstraintLayout, RecyclerView, ViewPager…
안드로이드 – View
public class ConstraintLayout extends ViewGroup
public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild2
public class ViewPager extends ViewGroup
52. • View 트리를 전위 순회하면서 처리해 나가는 구조
• 깊이 우선 탐색 (DFS)
• View 계층을 최소화하는 이유
안드로이드 – View
1
2
3 4 5
6 7
56. 안드로이드 – View
• View 트리를 전위 순회하면서 처리해 나가는 구조
• 깊이 우선 탐색 (DFS)
• View 계층을 최소화하는 이유
• 렌더링 – measure – layout – draw
• 렌더링 뿐만 아니라 터치 이벤트 전달도 유사한 메커니즘으로 전달
• return 값에 따라 전달할지 말지 결정
57. 안드로이드 – Fragment vs View
- UI 기본 구성요소는 Fragment 가 아니라 View
- Fragment는 backstack 처리, activity 와 상호작용 등을 위해 View를 래핑 -> 결국엔 View
58. 안드로이드 – Fragment vs View
- UI 기본 구성요소는 Fragment 가 아니라 View
- Fragment는 backstack 처리, activity 와 상호작용 등을 위해 View를 래핑 -> 결국엔 View
- View를 재활용 단위로 가져가는게 좋다.
- xml 에 넣거나 동적 생성해서 Fragment, DialogFragment, ViewHolder, PopupWindow 등으로 재활용 가능
// Fragment, DialogFragment
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return new CustomView(container.getContext());
}
// RecyclerView.Adapter
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(new CustomView(parent.getContext()));
}
// PopupWindow
PopupWindow popupWindow = new PopupWindow(new CustomView(getContext()));
62. • Docs – Core topics – Activities – Processes and app lifecycle
• Docs – Core topics – Background tasks – Sending operations to multiple threads – Communicate with the UI thread
• Docs – Best Practice – Processes and Threads Overview
비동기 – Android Developer
63. • Docs – Core topics – Activities – Processes and app lifecycle
• foreground process
• visible process
• service process
• cached process
• Docs – Core topics – Background tasks – Sending operations to multiple threads – Communicate with the UI thread
• UI Thread 의 정의와 통신하는 방법
• Handler, Looper, MessageQueue
• Docs – Best Practice – Processes and Threads Overview
• Thread 기본 사용법
비동기 – Android Developer
64. • Callback 에 대한 이해 필수!
• Runnable 왜 있을까?
• subroutines, lambda expressions, blocks, function pointers…
• concurrency vs parallelism
• synchronous vs asynchronous
• blocking vs non-blocking
• Java Concurrent
• #synchronized #volatile #atomic #semaphore #ReentrantLock #LockFree #FalseSharing #ForkJoinPoll
#Executor #BlockingQueue #CountDownLatch #Future…
비동기
68. • 정확한 타이밍에 실행이 보장되길 원하면? Foreground Service
• 특정 조건을 걸고 실행이 보장되길 원한다면? JobScheduler, JobDispatcher, AlarmManager, BroadcastReceivers
비동기 - background processing
https://www.youtube.com/watch?v=IrKoBFLwTN0
69. • Android Jetpack: easy background processing with WorkManager (Google I/O '18)
• GoogleIO 2018 해당 세션을 보도록 하자
• WorkManager
• 기존에 파편화된 백그라운드 처리를 하나로 모아서 아래 조건에 따라 실행
비동기 – WorkManager
https://www.youtube.com/watch?v=IrKoBFLwTN0
70.
71. • 잘 만든 걸까?
• 정석대로 만든 걸까?
• 최적화해서 만든 걸까?
안드로이드 성능 최적화
73. • 안드로이드는 초당 60 프레임을 렌더링
• 1 프레임을 표현하려면? 1/60 = 약 16ms
안드로이드 성능 최적화 – 60fps
https://www.youtube.com/watch?v=HXQhu6qfTVU
74. • Frame Drop
• 시스템이 화면을 새로 그리려는데 다음 프레임이 준비되지 않음
• 유저는 같은 프레임을 다음 갱신까지 32ms 동안 보고 있게 됨
안드로이드 성능 최적화 - Frame Drop
https://www.youtube.com/watch?v=HXQhu6qfTVU
76. • Frame Drop 을 발생시키는 요소 – 8가지
• 개발자 옵션 – Profile GPU rendering
• 선 안으로 모두 들어오는건 이상적인 일
• MinSDK 저사양 단말 기준 적당하게 들어오면 된다.
안드로이드 성능 최적화 – Profile GPU rendering
16ms
77. • Main Thread -> Worker Thread
• UI 업데이트가 순차적으로 진행될 수 있도록 조절
• CPU -> GPU
• GPU 에 안 그려도 되는 부분을 알려준다.
• #ViewHierarchy #DoubleLayoutTaxation #Async #Overdraw #AnimationProperty #Cache #Clipping
#ObjectPool #HardwareAcceleration #VSYNC
안드로이드 성능 최적화
78. 안드로이드 성능 최적화 – Android Performance Patterns
• 2~5분 정도의 동영상으로 안드로이드 전반적인 지식을 비약적으로 올려준다.
• 한글 자막도 있다.
90. • Google 이 말하길…
• Kotlin First!
• 예제 코드 – Kotlin Default
• Kotlin 100% 라이브러리들 등장 중…
• 곧 Java 추월 예정
• Kotlin 은 뿌리부터 새로운 언어가 아님
• 각 언어들에 좋은 점을 차용
• Java Collection 을 그대로 사용, 현재는 Java로 만들어진 라이브러리를 사용해야하는 경우가 대부분…
• Java 도 알아야한다.
• 함수가 1급 객체이며 함수 타입 존재
• 함수를 변수, 인자, 반환 값으로 전달할 수 있다.
언어 - Kotlin
91. • 아직까지 많이 사용되는 언어
• 기존 Java 프로덕트가 상당히 많음
• 객체지향을 잘 알고 쓰면 생산성에 크게 문제 없음
• Android 는 Java8 은 SDK >= 24(Nougat) 부터 제대로 사용 가능
• Min SDK 24 정도 되려면…?
• 현재 Java 13까지… Java 8도 안되는데 Java 9은 언제?
• 갈 길이 멀다…
• Java8 은 함수 타입이 없음
• interface 로 흉내
• RxJava 사용시 어느 정도 모던한 개발 가능
언어 - Java
92. 언어 - 서적 고르는 팁
• Effective ~
• Modern ~
• ~ in Action
• O’REILLY
93. • 쓰고 싶은거 쓰자
• Java
• 내가 지금 자바를 알고 있고 안드로이드를 빨리 배우고 싶다면…
• 가고 싶은 곳이 자바를 사용한다면…
• Kotlin
• 처음 입문한다면…
• 좀 더 모던한 개발을 하고 싶다면…
언어 - Java vs Kotlin
97. • wiki) 프로그래밍 패러다임은 기능에 따라 프로그래밍 언어를 분류하는 방법. 언어는 여러 패러다임으로 분류 할 수
있다.
• 유행
• 프로그래밍 관점을 갖게 해 주고, 결정하는 역할
• 서로 다른 프로그래밍 언어는 서로 다른 프로그래밍 패러다임을 지원
• 새로운 것을 가능하게도 하지만 어떤 기법을 금지 함
• 구조적 프로그래밍에서는 goto 문을 금지
• #StructuredProgramming #Object-OrientedProgramming #FunctionalProgramming #ReactiveProgramming
#FunctionalReactiveProgramming #Modular Programming…
프로그래밍 패러다임
105. • 높은 응집도 낮은 결합도
• 캡슐화가 잘돼있다.
• 가독성이 좋다
• 변경하기 쉽다
• 테스트를 작성하기 쉽다
• 낮은 의존성
좋은 코드
106. • 경험이 없다면 봐도 이해도 안되고 공감도 안된다.
• 알아야할 배경 지식도 많다.
Best Practice
107. • 함수는 한가지 일만 한다
• SRP: 클래스는 한가지 책임만 가진다
• 상속 대신 구성
Best Practice - 우선 이것부터 해보자
108. Best Practice – 함수는 한가지 일만 한다
private void init() {
binding.swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
...
}
});
binding.appbar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
...
}
});
if (isLoggedIn() && StringUtils.isNotBlank(userId)) {
binding.loginName.setText(userId);
} else {
binding.loginName.setText(getString(R.string.need_to_naver_login));
binding.hasPayPoint.setText(getString(R.string.unknown));
binding.chargePayPoint.setVisibility(View.GONE);
}
...
continueWatchingAdapter = new ContinueWatchingRecyclerViewAdapter();
binding.continueWatchingRecyclerView.setAdapter(continueWatchingAdapter);
binding.continueWatchingRecyclerView.addItemDecoration(new HorizontalItemDecoration(
(int) getResources().getDimension(R.dimen.continue_watching_item_horizontal_spacing),
(int) getResources().getDimension(R.dimen.continue_watching__edge_spacing)));
}
109. • 너무 포괄적인 의미
• 동작을 예상하기 어렵다.
• 부수 효과
• Ex) 초기화만 할거라고 예상했는데 특정 flag 값을 바꿔버려서 View가 나타나지 않음
• 점점 커진다.
Best Practice – 함수는 한가지 일만 한다
110. • 네이밍을 잘해서 각각 한가지 일을 하는 private 메소드로 분리
Best Practice – 함수는 한가지 일만 한다
private void initViews() {
initSwipeRefresh();
initAppbarLayout();
initLoginInfo(userId);
initChargePayPointButton();
initSettingButton();
initContinueWatchingRecyclerView();
initMyViewPager();
}
111. • 두 가지 일을 하고싶다면?
Best Practice – 함수는 한가지 일만 한다
public void stopAndStart() {
...
}
112. • 두 가지 일을 하고싶다면?
• 한 가지 일을 하는 함수들을 조합
Best Practice – 함수는 한가지 일만 한다
public void stopAndStart() {
stop();
start();
}
private void stop() {
...
}
private void start() {
...
}
public void stopAndStart() {
...
}
113. • 분리하다 보면 private 메소드가 엄청나게 많아진다
Best Practice – 함수는 한가지 일만 한다
114. • 분리하다 보면 private 메소드가 엄청나게 많아진다
• 리팩토링 신호
• SRP
Best Practice – 함수는 한가지 일만 한다
115. Best Practice - SRP
• The Single Responsibility Principle
• 책임? "어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 함“
• 코드가 많다면? 해당 클래스가 여러 책임을 가졌을 가능성이 높음
• 나눌 수 있는 책임을 분배하여 각각 클래스로…
117. Best Practice - SRP
• Fragment – 영화 1분 미리보기 화면
<ConstraintLayout>
<SurfaceView />
<Button />
<TextView />
<TextView />
<TextView />
…
</ConstraintLayout>
118. Best Practice - SRP
• Fragment – 영화 1분 미리보기 화면
• 각각 하나의 책임을 가지는 커스텀 뷰로…
PreviewView
MovieInfoView
119. Best Practice - SRP
• Fragment – 영화 1분 미리보기 화면
• 각각 하나의 책임을 가지는 커스텀 뷰로…
PreviewView
MovieInfoView
<ConstraintLayout>
<PreviewView />
<MovieInfoView />
<ConstraintLayout />
120. Best Practice – 상속 대신 구성
• 상속(Extension)? is-a
• 구성(Composition)? has-a
121. Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
122. Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
Autobot {
Engine;
Arm;
Leg;
}
123. Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
public class Autobot extends Robot {
}
124. Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
public class Autobot extends Robot {
}
125. Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
public class Autobot extends Robot {
private Wing wing;
private Wheel wheel;
}
126. Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
public class Autobot extends Robot {
private Wing wing;
private Wheel wheel;
}
Autobot {
TourboEngine
}
127. Best Practice – 상속 대신 구성
• 구성했다면?
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
public class Autobot {
private Engine engine;
private Arm arm;
private Leg leg;
private Wing wing;
private Wheel wheel;
}
128. Best Practice – 상속 대신 구성
• 구성했다면?
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
public class Autobot {
private TourboEngine tourboEngine;
private Arm arm;
private Leg leg;
private Wing wing;
private Wheel wheel;
}
129. • 각자의 책임을 가진 클래스로 구성
• 상속은 decorator 형태로…
Best Practice – 상속 대신 구성
130. • 함수는 한가지 일만 한다
• 함수형 프로그래밍의 기본
• SRP: 클래스는 한가지 책임만 가진다
• 나머지 원칙도 저절로 따라옴
• 상속 대신 구성
• 잘못된 상속은 확장이 점점 더 어려워지므로 구성하자.
Best Practice - 우선 이것부터 해보자
134. • 한 가지 일만 하는 함수로 작성했다면 유닛테스트를 작성해보자
• 좋은 구조로 가는 지름길이 되기도 한다.
• CI
• #TDD #BDD #Junit #Dummy #Stub #Spy #Fake #Mock #Mockito #PowerMock #Robolectric #CI #Jenkins
#TestCoverage #Jacoco
테스트
136. T
GitDB OS Network Algorithm Data Structures
JavaKotlinAndroid
Performance OOP Functional
AOSP
Background
Processing
Clean Code
Refactoring
137. 끔찍한 혼종
Reactive
RxJava
GitDB OS Network Algorithm Data Structures
JavaKotlinAndroid
Performance OOP Functional
AOSP
Background
Processing
Clean Code
Refactoring
CI
JenkinsDocker
TDD Unit Test
JUnitAI
ML kit