SlideShare uma empresa Scribd logo
1 de 138
Baixar para ler offline
NAVER WEBTOON | Son App Tech | 안중환
안드로이드개발자로드맵
소개
• 삼성 소프트웨어 멤버십
• 2016년 7월 입사
• 네이버 – 오디오클립 – 안드로이드 시작
• 네이버 웹툰 – 시리즈온
• 딱 3년차
배경
https://www.mk.co.kr/news/special-edition/view/2015/06/574273/
• 변하지 않는 대학 교육
• 무엇을 모르는지 모른다.
• 기본기 부족
• 전공을 생각보다 모른다.
• 안드로이드를 잘한다 == 코드를 잘 짠다 로 착각
• 프레임워크 공부만 한다.
• 코드를 잘 짜기 위한 훈련은 하지 않는다.
• 회사에서 배울 거라는 기대감
원인
• 변하지 않는 대학 교육
• 무엇을 모르는지 모른다.
• 기본기 부족
• 전공을 생각보다 모른다.
• 안드로이드를 잘한다 == 코드를 잘 짠다 로 착각
• 프레임워크 공부만 한다.
• 코드를 잘 짜기 위한 훈련은 하지 않는다.
• 회사에서 배울 거라는 기대감
원인
• 기본기가 부족합니다.
• 기본기가 뭐야?
기본기
• DB + OS + Network + Algorithm + Data Structures
기본기 – 알아야할 최소한의 전공 지식
DB OS Network Algorithm Data Structures
기본기 – 내 컴퓨터가 네이버에 접속되는 과정은?
WEB SERVER
DNS SERVER
MY COMPUTER
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
MY COMPUTER
Network
• 내 컴퓨터, 서버의 처리 과정까지…
WEB SERVER
기본기 – 내 컴퓨터가 네이버에 접속되는 과정은?
DB OS Network Algorithm Data Structures
DB OS Network Algorithm Data Structures
MY COMPUTER
• 안드로이드 개발자는?
기본기 – 내 컴퓨터가 네이버에 접속되는 과정은?
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
• 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
• 인프라를 보는 눈이 생긴다.
• 리눅스, 윈도우의 IO 통지 모델의 메커니즘 이해
• #blockingI/O #nonblockingI/O #I/Omultiplexing #signal-drivenI/O #Producer–Consumer #reactor #proactor #epoll
#synchronousI/O #asynchronous I/O #overlappedI/O #IOCP #RIO
기본기 - 네트워크 프로그래밍 - 추천 서적 (심화)
• 우선 T자형 인재
• 5대 과목 + git + 언어
기본기 - T
Programing Language
GitDB OS Network Algorithm Data Structures
Framework
• 우선 T자형 인재
• 5대 과목 + git + Java + Kotlin + Android
기본기 - T - 안드로이드
GitDB OS Network Algorithm Data Structures
JavaKotlinAndroid
• Android Developers 유튜브 채널
• Google IO, Android Dev Summit
• 안드로이드 모든 키워드의 발생지!
키워드의 시작
• Android Weekly
키워드 수집 – Android Weekly
• 1년 마다 열리는 컨퍼런스
• Naver Deview, if kakao, Airbnb Open, Facebook F8, 드로이드 나이츠…
• Facebook 페이지
• 생활코딩, GDG, 9XD, 안드로이드 개발자 모임…
• 오픈소스
• Pretty Awesome Lists, Android Arsenal, ExoPlayer…
• 모임 플랫폼에서 올라오는 네트워킹 행사
• onoffmix, festa, event-us, meetup…
• Medium
• AndroidPub, ProAndroidDev…
• 블로그
• 커니의 안드로이드 , 박상권의 삽질블로그, Pluu Dev, 아라비안 나이트, 돼지왕 왕돼지 놀이터, Realm…
키워드 수집 – 커뮤니티, 컨퍼런스
• Android Developer 사이트에 다 나와있어!!
안드로이드 입문
• Android Developer 사이트에 다 나와있어!!
• 어디에??
안드로이드 입문
• Android Developer
• Android Developer Medium
• Android Developer Blog
• Google Sample, Code Lab
• CodePath Android Cliffnotes
안드로이드 입문
• Android Developer
• ENGLISH!
• 처음 보이는 상단 화면 (2019.07 기준)
안드로이드 - Android Developer
• Android Developer
• ENGLISH!
• 처음 보이는 상단 화면 (2019.07 기준)
안드로이드 - Android Developer
• Android Studio – USER GUIDE
• 주로 IDE사용법
• 빌드, 디버깅, 테스트, 프로파일, 배포
• Gradle 관련 내용은 대부분 여기 있음
안드로이드 - Android Developer – Android Studio
• Jetpack
안드로이드 - Android Developer - Jetpack
• Kotlin
• 안드로이드에서는 코틀린을 어떻게 사용하는지…
안드로이드 - Android Developer - Kotlin
• Android Developer
• Docs – GUDIES
Android Developer – Docs - GUDIES, REFRENCES
• Android Developer
• Docs – GUDIES, REFRENCES
Android Developer – Docs - GUDIES, REFRENCES
• Android Developer
• Docs – SAMPLES
• https://github.com/googlesamples
Android Developer – Docs - SAMPLES
• Android Training Course, Codelabs
• 코드 베이스로 하나씩 익혀나가고 싶다면…
Android Developer - Android Training Course, Codelabs
• Summary, Advanced, Troubleshooting, Best Practice
• 간혹 공식 문서에 빠진 내용이 나오기도 한다.
Android Developer – Medium, Blog
CodePath Android Cliffnotes
• OPEN SOURCE
• 사용법부터 각종 꿀팁, 관련 오픈소스까지 소개
1. Android Developer 검색
• DOCS – GUIDE, REFERENCES, SAMPLES
2. Android Developer Medium, Blog 검색
3. CodePath Android Cliffnotes 검색
4. 구글링
안드로이드 - API 사용법 익히기
• Android Developer 사이트에 다 나와있어!!
• 진리
• 정말 전부 다 있다.
• 구글링 하기 전에 Android Developer 부터 보는 습관을 기르자
안드로이드 – Android Developer
• 4대 컴포넌트
• Activities, Services, Broadcast receivers, Content providers
• Jetpack
• Fragment
• ConstraintLayout, ViewPager, RecyclerView…
안드로이드
• 4대 컴포넌트
• Activities, Services, Broadcast receivers, Content providers
• Jetpack
• Fragment
• ConstraintLayout, ViewPager, RecyclerView…
• Inflater
• View
안드로이드
• 정형화된 형태로만 쓴다
• 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);
}
• Inflate? “부풀게 하다”
안드로이드 - Inflate 제대로 이해하기
• Inflate? “부풀게 하다”
안드로이드 – Inflate 제대로 이해하기
<!--view_tech_concert.xml-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="2019" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="테크콘서트" />
</LinearLayout>
• Inflate? “부풀게 하다”
안드로이드 – Inflate 제대로 이해하기
<!--view_tech_concert.xml-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="2019" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="테크콘서트" />
</LinearLayout>
LinearLayout linearLayout = new LinearLayout(getContext());
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
TextView yearTextView = new TextView(getContext());
LinearLayout.LayoutParams yearParams = new
LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
yearParams.gravity = Gravity.CENTER;
yearTextView.setLayoutParams(yearParams);
yearTextView.setText("2019");
linearLayout.addView(yearTextView);
TextView techConcertTextView = new TextView(getContext());
LinearLayout.LayoutParams techConcertParams = new
LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
techConcertParams.gravity = Gravity.CENTER;
techConcertTextView.setLayoutParams(techConcertParams);
techConcertTextView.setText("테크콘서트");
linearLayout.addView(techConcertTextView);
inflate
• Inflate? xml 파일을 읽어와서 파싱한 뒤 객체로 만드는 과정
안드로이드 – Inflate 제대로 이해하기
Object
View,
ViewGroup
Animator
TransitionSet
…
Inflater
LayoutInflater
AnimatorInflater
TransitionInflater
…
inflate
• Inflate? IO와 탐색을 동반하기 때문에 비용이 있는 동작
안드로이드 – Inflate 제대로 이해하기
• Inflate? IO와 탐색을 동반하기 때문에 비용이 있는 동작
안드로이드 – Inflate 제대로 이해하기
안드로이드 – View 기반으로 이해하기
• Tools – Layout Inspector
• 내가 만든 화면은 어떻게 생겼을까?
안드로이드 – View
• View?
• View는 화면의 직사각형 영역을 차지하며 그리기 및 이벤트 처리를 담당
• View는 UI 구성 요소 (버튼, 텍스트 필드 등)를 만드는 데 사용되는 위젯의 기본 클래스
• ViewGrop은 View의 서브 클래스로 다른 View 또는 다른 ViewGroup들을 보유하는 컨테이너 View
• ViewGroup 구현체
• ConstraintLayout, RecyclerView, ViewPager…
안드로이드 – View
public class ConstraintLayout extends ViewGroup
public class RecyclerView extends ViewGroup implements ScrollingView, NestedScrollingChild2
public class ViewPager extends ViewGroup
• View 트리를 전위 순회하면서 처리해 나가는 구조
• 깊이 우선 탐색 (DFS)
• View 계층을 최소화하는 이유
안드로이드 – View
1
2
3 4 5
6 7
• View 트리를 전위 순회하면서 처리해 나가는 구조
• 깊이 우선 탐색 (DFS)
• View 계층을 최소화하는 이유
• 렌더링 – measure
안드로이드 – View
Root ViewGroup - measure
└ 1depth ViewGroup - measure
└ └ 2depth View - measure
└ └ 2depth Veiw - measure
└ └ 2depth View - measure
└ 1depth View - measure
└ 1depth View - measure
1
2
3 4 5
6 7
• View 트리를 전위 순회하면서 처리해 나가는 구조
• 깊이 우선 탐색 (DFS)
• View 계층을 최소화하는 이유
• 렌더링 – measure – layout
안드로이드 – View
Root ViewGroup - layout
└ 1depth ViewGroup - layout
└ └ 2depth View - layout
└ └ 2depth Veiw - layout
└ └ 2depth View - layout
└ 1depth View - layout
└ 1depth View - layout
Root ViewGroup - measure
└ 1depth ViewGroup - measure
└ └ 2depth View - measure
└ └ 2depth Veiw - measure
└ └ 2depth View - measure
└ 1depth View - measure
└ 1depth View - measure
1
2
3 4 5
6 7
• View 트리를 전위 순회하면서 처리해 나가는 구조
• 깊이 우선 탐색 (DFS)
• View 계층을 최소화하는 이유
• 렌더링 – measure – layout - draw
안드로이드 – View
Root ViewGroup - draw
└ 1depth ViewGroup - draw
└ └ 2depth View - draw
└ └ 2depth Veiw - draw
└ └ 2depth View - draw
└ 1depth View - draw
└ 1depth View - draw
Root ViewGroup - layout
└ 1depth ViewGroup - layout
└ └ 2depth View - layout
└ └ 2depth Veiw - layout
└ └ 2depth View - layout
└ 1depth View - layout
└ 1depth View - layout
Root ViewGroup - measure
└ 1depth ViewGroup - measure
└ └ 2depth View - measure
└ └ 2depth Veiw - measure
└ └ 2depth View - measure
└ 1depth View - measure
└ 1depth View - measure
1
2
3 4 5
6 7
안드로이드 – View
• View 트리를 전위 순회하면서 처리해 나가는 구조
• 깊이 우선 탐색 (DFS)
• View 계층을 최소화하는 이유
• 렌더링 – measure – layout – draw
• 렌더링 뿐만 아니라 터치 이벤트 전달도 유사한 메커니즘으로 전달
• return 값에 따라 전달할지 말지 결정
안드로이드 – Fragment vs View
- UI 기본 구성요소는 Fragment 가 아니라 View
- Fragment는 backstack 처리, activity 와 상호작용 등을 위해 View를 래핑 -> 결국엔 View
안드로이드 – 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()));
• Thread
• Executor
• CompletableFuture (java 8, sdk>=24)
• AsyncTask
• Loader
• WorkManager
• Rx
• Coroutine
비동기
• Thread
• Executor
• CompletableFuture (java 8, sdk>=24)
• AsyncTask
• Loader
• WorkManager
• Rx
• Coroutine
비동기
• 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
• 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
• 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…
비동기
비동기 – 추천 서적
비동기 – Thread, MessageQueue, Handler, Looper
https://academy.realm.io/kr/posts/android-thread-looper-handler/
• 이 그림을 이해하면 끝!
• #Consumer–ProducerPattern #MainThread #UiThread #MessageQueue #Handler #MainLooper #Looper
#HandlerThread
• Rx
• Coroutine
비동기
• 정확한 타이밍에 실행이 보장되길 원하면? Foreground Service
• 특정 조건을 걸고 실행이 보장되길 원한다면? JobScheduler, JobDispatcher, AlarmManager, BroadcastReceivers
비동기 - background processing
https://www.youtube.com/watch?v=IrKoBFLwTN0
• Android Jetpack: easy background processing with WorkManager (Google I/O '18)
• GoogleIO 2018 해당 세션을 보도록 하자
• WorkManager
• 기존에 파편화된 백그라운드 처리를 하나로 모아서 아래 조건에 따라 실행
비동기 – WorkManager
https://www.youtube.com/watch?v=IrKoBFLwTN0
• 잘 만든 걸까?
• 정석대로 만든 걸까?
• 최적화해서 만든 걸까?
안드로이드 성능 최적화
안드로이드 성능?
• 안드로이드는 초당 60 프레임을 렌더링
• 1 프레임을 표현하려면? 1/60 = 약 16ms
안드로이드 성능 최적화 – 60fps
https://www.youtube.com/watch?v=HXQhu6qfTVU
• Frame Drop
• 시스템이 화면을 새로 그리려는데 다음 프레임이 준비되지 않음
• 유저는 같은 프레임을 다음 갱신까지 32ms 동안 보고 있게 됨
안드로이드 성능 최적화 - Frame Drop
https://www.youtube.com/watch?v=HXQhu6qfTVU
안드로이드 성능 최적화 - Frame Drop
• Frame Drop 을 발생시키는 요소 – 8가지
• 개발자 옵션 – Profile GPU rendering
• 선 안으로 모두 들어오는건 이상적인 일
• MinSDK 저사양 단말 기준 적당하게 들어오면 된다.
안드로이드 성능 최적화 – Profile GPU rendering
16ms
• Main Thread -> Worker Thread
• UI 업데이트가 순차적으로 진행될 수 있도록 조절
• CPU -> GPU
• GPU 에 안 그려도 되는 부분을 알려준다.
• #ViewHierarchy #DoubleLayoutTaxation #Async #Overdraw #AnimationProperty #Cache #Clipping
#ObjectPool #HardwareAcceleration #VSYNC
안드로이드 성능 최적화
안드로이드 성능 최적화 – Android Performance Patterns
• 2~5분 정도의 동영상으로 안드로이드 전반적인 지식을 비약적으로 올려준다.
• 한글 자막도 있다.
안드로이드 성능 최적화 - 추천 서적
안드로이드 성능 최적화
안드로이드 프레임워크
안드로이드 프레임워크
• 필요할까?
• NDK 개발 시에는 필수
• 코드 레벨까지 보는 건 비추
• 성능 최적화시에도 알아야할 내용들이 많기 때문에 어느 정도는 알아야 한다..
안드로이드 프레임워크
안드로이드 프레임워크 – AOSP
• Android Open Source Project
• Configure – RUNTIME
• #.class #.dex #Dalvik #ART #D8 #R8 #AOT #JIT
• 컴파일러 관련 내용
• Develop – GRAPHICS
• #SurfaceView #TextureView #BufferQueue, #SurfaceFlinger, #Surface, #Canvas, #SurfaceHolder
• 화면 렌더링 관련 내용
• Develop - ARCHITECTURE
• #HAL #Context #Parcel # BinderIPC #SystemServices #MediaServer #SystemServer
• IPC 관련 내용
안드로이드 프레임워크 - AOSP
안드로이드 프레임워크 – 추천 서적
• Java vs Kotlin
언어 - 무엇을 해야할까?
• Google 이 말하길…
• Kotlin First!
• 예제 코드 – Kotlin Default
• Kotlin 100% 라이브러리들 등장 중…
• 곧 Java 추월 예정
• Kotlin 은 뿌리부터 새로운 언어가 아님
• 각 언어들에 좋은 점을 차용
• Java Collection 을 그대로 사용, 현재는 Java로 만들어진 라이브러리를 사용해야하는 경우가 대부분…
• Java 도 알아야한다.
• 함수가 1급 객체이며 함수 타입 존재
• 함수를 변수, 인자, 반환 값으로 전달할 수 있다.
언어 - Kotlin
• 아직까지 많이 사용되는 언어
• 기존 Java 프로덕트가 상당히 많음
• 객체지향을 잘 알고 쓰면 생산성에 크게 문제 없음
• Android 는 Java8 은 SDK >= 24(Nougat) 부터 제대로 사용 가능
• Min SDK 24 정도 되려면…?
• 현재 Java 13까지… Java 8도 안되는데 Java 9은 언제?
• 갈 길이 멀다…
• Java8 은 함수 타입이 없음
• interface 로 흉내
• RxJava 사용시 어느 정도 모던한 개발 가능
언어 - Java
언어 - 서적 고르는 팁
• Effective ~
• Modern ~
• ~ in Action
• O’REILLY
• 쓰고 싶은거 쓰자
• Java
• 내가 지금 자바를 알고 있고 안드로이드를 빨리 배우고 싶다면…
• 가고 싶은 곳이 자바를 사용한다면…
• Kotlin
• 처음 입문한다면…
• 좀 더 모던한 개발을 하고 싶다면…
언어 - Java vs Kotlin
언어 – Kotlin - 추천 서적
Coming Soon
• 2017년부터 해마다 열리는 코틀린 컨퍼런스
언어 – Kotlin - Kotlinconf
언어 – JAVA – 추천 서적
• wiki) 프로그래밍 패러다임은 기능에 따라 프로그래밍 언어를 분류하는 방법. 언어는 여러 패러다임으로 분류 할 수
있다.
• 유행
• 프로그래밍 관점을 갖게 해 주고, 결정하는 역할
• 서로 다른 프로그래밍 언어는 서로 다른 프로그래밍 패러다임을 지원
• 새로운 것을 가능하게도 하지만 어떤 기법을 금지 함
• 구조적 프로그래밍에서는 goto 문을 금지
• #StructuredProgramming #Object-OrientedProgramming #FunctionalProgramming #ReactiveProgramming
#FunctionalReactiveProgramming #Modular Programming…
프로그래밍 패러다임
• Kotlin, Java 는
• 객체지향프로그래밍(Object-Oriented Programming)
• 함수형프로그래밍(Functional Programming)
패러다임
객체지향프로그래밍 – 추천 서적
• #OOP #클래스 #객체 #메시지 #추상화 #캡슐화 #상속 #구성 #다형성 #S.O.L.I.D
객체지향프로그래밍 - 5대 원칙
• OOP의 5대 원칙
1. 단일 책임 원칙(Single responsibility principle) - SRP
2. 개방 폐쇄 원칙(Open/closed principle) - OCP
3. 리스코프 치환 원칙(Liskov substitution principle) - LSP
4. 인터페이스 분리 원칙(Interface segregation principle) - ISP
5. 의존관계 역전 원칙(Dependency inversion principle) – DIP
객체지향프로그래밍 – 디자인 패턴
• SOURCE MAKING
• 디자인 패턴 의도가 잘 나와있음
• 클래스가 아닌 함수가 재활용 단위
• 함수는 1급 객체
• #람다 #클로저 #순수함수 #고차함수 #lazy #커링 #재귀 #메모이제이션 #모나드
함수형프로그래밍 – 추천 서적
• Best Practice
• 좋은 코드를 짜는 방법을 훈련
잘 변하지 않는 것들…
• 높은 응집도 낮은 결합도
• 캡슐화가 잘돼있다.
• 가독성이 좋다
• 변경하기 쉽다
• 테스트를 작성하기 쉽다
• 낮은 의존성
좋은 코드
• 경험이 없다면 봐도 이해도 안되고 공감도 안된다.
• 알아야할 배경 지식도 많다.
Best Practice
• 함수는 한가지 일만 한다
• SRP: 클래스는 한가지 책임만 가진다
• 상속 대신 구성
Best Practice - 우선 이것부터 해보자
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)));
}
• 너무 포괄적인 의미
• 동작을 예상하기 어렵다.
• 부수 효과
• Ex) 초기화만 할거라고 예상했는데 특정 flag 값을 바꿔버려서 View가 나타나지 않음
• 점점 커진다.
Best Practice – 함수는 한가지 일만 한다
• 네이밍을 잘해서 각각 한가지 일을 하는 private 메소드로 분리
Best Practice – 함수는 한가지 일만 한다
private void initViews() {
initSwipeRefresh();
initAppbarLayout();
initLoginInfo(userId);
initChargePayPointButton();
initSettingButton();
initContinueWatchingRecyclerView();
initMyViewPager();
}
• 두 가지 일을 하고싶다면?
Best Practice – 함수는 한가지 일만 한다
public void stopAndStart() {
...
}
• 두 가지 일을 하고싶다면?
• 한 가지 일을 하는 함수들을 조합
Best Practice – 함수는 한가지 일만 한다
public void stopAndStart() {
stop();
start();
}
private void stop() {
...
}
private void start() {
...
}
public void stopAndStart() {
...
}
• 분리하다 보면 private 메소드가 엄청나게 많아진다
Best Practice – 함수는 한가지 일만 한다
• 분리하다 보면 private 메소드가 엄청나게 많아진다
• 리팩토링 신호
• SRP
Best Practice – 함수는 한가지 일만 한다
Best Practice - SRP
• The Single Responsibility Principle
• 책임? "어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 함“
• 코드가 많다면? 해당 클래스가 여러 책임을 가졌을 가능성이 높음
• 나눌 수 있는 책임을 분배하여 각각 클래스로…
Best Practice - SRP
• Fragment – 영화 1분 미리보기 화면
Best Practice - SRP
• Fragment – 영화 1분 미리보기 화면
<ConstraintLayout>
<SurfaceView />
<Button />
<TextView />
<TextView />
<TextView />
…
</ConstraintLayout>
Best Practice - SRP
• Fragment – 영화 1분 미리보기 화면
• 각각 하나의 책임을 가지는 커스텀 뷰로…
PreviewView
MovieInfoView
Best Practice - SRP
• Fragment – 영화 1분 미리보기 화면
• 각각 하나의 책임을 가지는 커스텀 뷰로…
PreviewView
MovieInfoView
<ConstraintLayout>
<PreviewView />
<MovieInfoView />
<ConstraintLayout />
Best Practice – 상속 대신 구성
• 상속(Extension)? is-a
• 구성(Composition)? has-a
Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
Autobot {
Engine;
Arm;
Leg;
}
Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
public class Autobot extends Robot {
}
Best Practice – 상속 대신 구성
• 상속으로 확장
public class Robot {
private Engine engine;
private Arm arm;
private Leg leg;
}
public class Autobot extends Robot {
}
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;
}
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
}
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;
}
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;
}
• 각자의 책임을 가진 클래스로 구성
• 상속은 decorator 형태로…
Best Practice – 상속 대신 구성
• 함수는 한가지 일만 한다
• 함수형 프로그래밍의 기본
• SRP: 클래스는 한가지 책임만 가진다
• 나머지 원칙도 저절로 따라옴
• 상속 대신 구성
• 잘못된 상속은 확장이 점점 더 어려워지므로 구성하자.
Best Practice - 우선 이것부터 해보자
고인 물
• 키워드 수집
• 좋은 코드를 짜기 위한 훈련
기록
• 블로그 추천
• 한 가지 일만 하는 함수로 작성했다면 유닛테스트를 작성해보자
• 좋은 구조로 가는 지름길이 되기도 한다.
• CI
• #TDD #BDD #Junit #Dummy #Stub #Spy #Fake #Mock #Mockito #PowerMock #Robolectric #CI #Jenkins
#TestCoverage #Jacoco
테스트
커뮤니케이션
• 개발을 잘한다 != 일은 잘한다
T
GitDB OS Network Algorithm Data Structures
JavaKotlinAndroid
Performance OOP Functional
AOSP
Background
Processing
Clean Code
Refactoring
끔찍한 혼종
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
[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵

Mais conteúdo relacionado

Mais procurados

차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서Jeongmin Cha
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)수보 김
 
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드NAVER Engineering
 
[개인 프로젝트] 쿠버네티스를 이용한 개발환경 자동화 구축시스템 - 프로토타입
[개인 프로젝트] 쿠버네티스를 이용한 개발환경 자동화 구축시스템 - 프로토타입[개인 프로젝트] 쿠버네티스를 이용한 개발환경 자동화 구축시스템 - 프로토타입
[개인 프로젝트] 쿠버네티스를 이용한 개발환경 자동화 구축시스템 - 프로토타입choi sungwook
 
PS향유회 세미나 - 출제 뉴비를 위한 출제 a to b.pdf
PS향유회 세미나 - 출제 뉴비를 위한 출제 a to b.pdfPS향유회 세미나 - 출제 뉴비를 위한 출제 a to b.pdf
PS향유회 세미나 - 출제 뉴비를 위한 출제 a to b.pdfSesangCho
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들Chris Ohk
 
Why Users Are Moving on from Docker and Leaving Its Security Risks Behind (Sp...
Why Users Are Moving on from Docker and Leaving Its Security Risks Behind (Sp...Why Users Are Moving on from Docker and Leaving Its Security Risks Behind (Sp...
Why Users Are Moving on from Docker and Leaving Its Security Risks Behind (Sp...Amazon Web Services
 
이병철의 개발자 포트폴리오
이병철의 개발자 포트폴리오이병철의 개발자 포트폴리오
이병철의 개발자 포트폴리오Lee ByeongCheol
 
Container Security
Container SecurityContainer Security
Container SecurityJie Liau
 
심성환 개발자 포트폴리오
심성환 개발자 포트폴리오심성환 개발자 포트폴리오
심성환 개발자 포트폴리오Seonghwan Shim
 
Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법pyrasis
 
Kotlin의 코루틴은 어떻게 동작하는가
Kotlin의 코루틴은 어떻게 동작하는가Kotlin의 코루틴은 어떻게 동작하는가
Kotlin의 코루틴은 어떻게 동작하는가Chang W. Doh
 
Android Developer JeongJaeyun
Android Developer JeongJaeyunAndroid Developer JeongJaeyun
Android Developer JeongJaeyunjaeyunjeong1
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]Yurim Jin
 
Docker intro
Docker introDocker intro
Docker introOleg Z
 
Docker Tutorial For Beginners | What Is Docker And How It Works? | Docker Tut...
Docker Tutorial For Beginners | What Is Docker And How It Works? | Docker Tut...Docker Tutorial For Beginners | What Is Docker And How It Works? | Docker Tut...
Docker Tutorial For Beginners | What Is Docker And How It Works? | Docker Tut...Simplilearn
 

Mais procurados (20)

차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
차정민 (소프트웨어 엔지니어) 이력서 + 경력기술서
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
200819 NAVER TECH CONCERT 03_화려한 코루틴이 내 앱을 감싸네! 코루틴으로 작성해보는 깔끔한 비동기 코드
 
[개인 프로젝트] 쿠버네티스를 이용한 개발환경 자동화 구축시스템 - 프로토타입
[개인 프로젝트] 쿠버네티스를 이용한 개발환경 자동화 구축시스템 - 프로토타입[개인 프로젝트] 쿠버네티스를 이용한 개발환경 자동화 구축시스템 - 프로토타입
[개인 프로젝트] 쿠버네티스를 이용한 개발환경 자동화 구축시스템 - 프로토타입
 
PS향유회 세미나 - 출제 뉴비를 위한 출제 a to b.pdf
PS향유회 세미나 - 출제 뉴비를 위한 출제 a to b.pdfPS향유회 세미나 - 출제 뉴비를 위한 출제 a to b.pdf
PS향유회 세미나 - 출제 뉴비를 위한 출제 a to b.pdf
 
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
고려대학교 컴퓨터학과 특강 - 대학생 때 알았더라면 좋았을 것들
 
Why Users Are Moving on from Docker and Leaving Its Security Risks Behind (Sp...
Why Users Are Moving on from Docker and Leaving Its Security Risks Behind (Sp...Why Users Are Moving on from Docker and Leaving Its Security Risks Behind (Sp...
Why Users Are Moving on from Docker and Leaving Its Security Risks Behind (Sp...
 
이병철의 개발자 포트폴리오
이병철의 개발자 포트폴리오이병철의 개발자 포트폴리오
이병철의 개발자 포트폴리오
 
Container Security
Container SecurityContainer Security
Container Security
 
심성환 개발자 포트폴리오
심성환 개발자 포트폴리오심성환 개발자 포트폴리오
심성환 개발자 포트폴리오
 
Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법
 
Git
GitGit
Git
 
Kotlin의 코루틴은 어떻게 동작하는가
Kotlin의 코루틴은 어떻게 동작하는가Kotlin의 코루틴은 어떻게 동작하는가
Kotlin의 코루틴은 어떻게 동작하는가
 
Android Developer JeongJaeyun
Android Developer JeongJaeyunAndroid Developer JeongJaeyun
Android Developer JeongJaeyun
 
Rich domain model
Rich domain modelRich domain model
Rich domain model
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Git
GitGit
Git
 
신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]신입 개발자 생활백서 [개정판]
신입 개발자 생활백서 [개정판]
 
Docker intro
Docker introDocker intro
Docker intro
 
Docker Tutorial For Beginners | What Is Docker And How It Works? | Docker Tut...
Docker Tutorial For Beginners | What Is Docker And How It Works? | Docker Tut...Docker Tutorial For Beginners | What Is Docker And How It Works? | Docker Tut...
Docker Tutorial For Beginners | What Is Docker And How It Works? | Docker Tut...
 

Semelhante a [TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵

Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가? Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가? 정민 안
 
커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님NAVER D2
 
예비 개발자를 위한 소프트웨어 세상 이야기
예비 개발자를 위한 소프트웨어 세상 이야기예비 개발자를 위한 소프트웨어 세상 이야기
예비 개발자를 위한 소프트웨어 세상 이야기수보 김
 
React native development
React native developmentReact native development
React native developmentSangSun Park
 
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리Sa-ryong Kang
 
스프링캠프2014 - 즐거운 개발을 위한 스마트한 습관
스프링캠프2014 - 즐거운 개발을 위한 스마트한 습관스프링캠프2014 - 즐거운 개발을 위한 스마트한 습관
스프링캠프2014 - 즐거운 개발을 위한 스마트한 습관Daekwon Kang
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기Sunghyouk Bae
 
김현섭 Portfolio [Web Developer Beginner]
김현섭 Portfolio [Web Developer Beginner]김현섭 Portfolio [Web Developer Beginner]
김현섭 Portfolio [Web Developer Beginner]KIM HYUNSUP
 
my activities before getting a job
my activities before getting a jobmy activities before getting a job
my activities before getting a jobDeo Kim
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기) YoungSu Son
 
[Hello World 천안아산] 안드로이드 입문
[Hello World 천안아산] 안드로이드 입문[Hello World 천안아산] 안드로이드 입문
[Hello World 천안아산] 안드로이드 입문Taeho Kim
 
How to implement your dream 20150427
How to implement your dream 20150427How to implement your dream 20150427
How to implement your dream 20150427Will Kim
 
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료지원 정
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST_NHNent
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVONYounghan Kim
 
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디Youngbin Han
 
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호 track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호 양 한빛
 
Open source engineering - 0.1
Open source engineering - 0.1Open source engineering - 0.1
Open source engineering - 0.1YoungSu Son
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Sung-tae Ryu
 

Semelhante a [TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵 (20)

Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가? Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
Let'Swift 2023 iOS 애플리케이션 개발 생산성 고찰
- 정시 퇴근을 위해 우리는 어떻게 해야할 것인가?
 
커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님커뮤니티와 함께한 예비개발자 성장기- 조성수님
커뮤니티와 함께한 예비개발자 성장기- 조성수님
 
예비 개발자를 위한 소프트웨어 세상 이야기
예비 개발자를 위한 소프트웨어 세상 이야기예비 개발자를 위한 소프트웨어 세상 이야기
예비 개발자를 위한 소프트웨어 세상 이야기
 
React native development
React native developmentReact native development
React native development
 
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
Droid knights 2019 - (Large-scale App을 위한) Android Architecture 총정리
 
스프링캠프2014 - 즐거운 개발을 위한 스마트한 습관
스프링캠프2014 - 즐거운 개발을 위한 스마트한 습관스프링캠프2014 - 즐거운 개발을 위한 스마트한 습관
스프링캠프2014 - 즐거운 개발을 위한 스마트한 습관
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기
 
김현섭 Portfolio [Web Developer Beginner]
김현섭 Portfolio [Web Developer Beginner]김현섭 Portfolio [Web Developer Beginner]
김현섭 Portfolio [Web Developer Beginner]
 
my activities before getting a job
my activities before getting a jobmy activities before getting a job
my activities before getting a job
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 
[Hello World 천안아산] 안드로이드 입문
[Hello World 천안아산] 안드로이드 입문[Hello World 천안아산] 안드로이드 입문
[Hello World 천안아산] 안드로이드 입문
 
How to implement your dream 20150427
How to implement your dream 20150427How to implement your dream 20150427
How to implement your dream 20150427
 
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
오픈소스 컨트리뷰톤 2020 backend.ai 발표자료
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON
 
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
1.Create Project Sunshine - 시온고등학교 안드로이드 스터디
 
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호 track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
track2 01. 서버리스 아키텍처 소셜미디어 개발기인데요. React를 썼어요/ 삼성SDS, 도경태 & 양선호
 
okspring3x
okspring3xokspring3x
okspring3x
 
Open source engineering - 0.1
Open source engineering - 0.1Open source engineering - 0.1
Open source engineering - 0.1
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망
 

Mais de NAVER Engineering

디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIX디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIXNAVER Engineering
 
진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)NAVER Engineering
 
서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트NAVER Engineering
 
BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호NAVER Engineering
 
이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라NAVER Engineering
 
날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기NAVER Engineering
 
쏘카프레임 구축 배경과 과정
 쏘카프레임 구축 배경과 과정 쏘카프레임 구축 배경과 과정
쏘카프레임 구축 배경과 과정NAVER Engineering
 
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기NAVER Engineering
 
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)NAVER Engineering
 
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기NAVER Engineering
 
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활NAVER Engineering
 
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출NAVER Engineering
 
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우NAVER Engineering
 
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...NAVER Engineering
 
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법NAVER Engineering
 
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며NAVER Engineering
 
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기NAVER Engineering
 
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기NAVER Engineering
 
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기NAVER Engineering
 

Mais de NAVER Engineering (20)

React vac pattern
React vac patternReact vac pattern
React vac pattern
 
디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIX디자인 시스템에 직방 ZUIX
디자인 시스템에 직방 ZUIX
 
진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)진화하는 디자인 시스템(걸음마 편)
진화하는 디자인 시스템(걸음마 편)
 
서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트서비스 운영을 위한 디자인시스템 프로젝트
서비스 운영을 위한 디자인시스템 프로젝트
 
BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호BPL(Banksalad Product Language) 무야호
BPL(Banksalad Product Language) 무야호
 
이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라이번 생에 디자인 시스템은 처음이라
이번 생에 디자인 시스템은 처음이라
 
날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기날고 있는 여러 비행기 넘나 들며 정비하기
날고 있는 여러 비행기 넘나 들며 정비하기
 
쏘카프레임 구축 배경과 과정
 쏘카프레임 구축 배경과 과정 쏘카프레임 구축 배경과 과정
쏘카프레임 구축 배경과 과정
 
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기
 
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
200820 NAVER TECH CONCERT 15_Code Review is Horse(코드리뷰는 말이야)(feat.Latte)
 
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
200819 NAVER TECH CONCERT 10_맥북에서도 아이맥프로에서 빌드하는 것처럼 빌드 속도 빠르게 하기
 
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
200819 NAVER TECH CONCERT 08_성능을 고민하는 슬기로운 개발자 생활
 
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
200819 NAVER TECH CONCERT 05_모르면 손해보는 Android 디버깅/분석 꿀팁 대방출
 
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
200819 NAVER TECH CONCERT 09_Case.xcodeproj - 좋은 동료로 거듭나기 위한 노하우
 
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
200820 NAVER TECH CONCERT 14_야 너두 할 수 있어. 비전공자, COBOL 개발자를 거쳐 네이버에서 FE 개발하게 된...
 
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
200820 NAVER TECH CONCERT 13_네이버에서 오픈 소스 개발을 통해 성장하는 방법
 
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
200820 NAVER TECH CONCERT 12_상반기 네이버 인턴을 돌아보며
 
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
200820 NAVER TECH CONCERT 11_빠르게 성장하는 슈퍼루키로 거듭나기
 
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
200819 NAVER TECH CONCERT 07_신입 iOS 개발자 개발업무 적응기
 
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
200819 NAVER TECH CONCERT 06_놓치기 쉬운 안드로이드 UI 디테일 살펴보기
 

Último

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 

Último (6)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 

[TECHCON 2019: MOBILE - Android]3.안드로이드 개발자 로드맵

  • 1.
  • 2. NAVER WEBTOON | Son App Tech | 안중환 안드로이드개발자로드맵
  • 3. 소개 • 삼성 소프트웨어 멤버십 • 2016년 7월 입사 • 네이버 – 오디오클립 – 안드로이드 시작 • 네이버 웹툰 – 시리즈온 • 딱 3년차
  • 5. • 변하지 않는 대학 교육 • 무엇을 모르는지 모른다. • 기본기 부족 • 전공을 생각보다 모른다. • 안드로이드를 잘한다 == 코드를 잘 짠다 로 착각 • 프레임워크 공부만 한다. • 코드를 잘 짜기 위한 훈련은 하지 않는다. • 회사에서 배울 거라는 기대감 원인
  • 6. • 변하지 않는 대학 교육 • 무엇을 모르는지 모른다. • 기본기 부족 • 전공을 생각보다 모른다. • 안드로이드를 잘한다 == 코드를 잘 짠다 로 착각 • 프레임워크 공부만 한다. • 코드를 잘 짜기 위한 훈련은 하지 않는다. • 회사에서 배울 거라는 기대감 원인
  • 7.
  • 8.
  • 9. • 기본기가 부족합니다. • 기본기가 뭐야? 기본기
  • 10. • DB + OS + Network + Algorithm + Data Structures 기본기 – 알아야할 최소한의 전공 지식 DB OS Network Algorithm Data Structures
  • 11. 기본기 – 내 컴퓨터가 네이버에 접속되는 과정은? WEB SERVER DNS SERVER MY COMPUTER
  • 12. 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 MY COMPUTER Network
  • 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 • 안드로이드 모든 키워드의 발생지! 키워드의 시작
  • 21. • Android Weekly 키워드 수집 – Android Weekly
  • 22. • 1년 마다 열리는 컨퍼런스 • Naver Deview, if kakao, Airbnb Open, Facebook F8, 드로이드 나이츠… • Facebook 페이지 • 생활코딩, GDG, 9XD, 안드로이드 개발자 모임… • 오픈소스 • Pretty Awesome Lists, Android Arsenal, ExoPlayer… • 모임 플랫폼에서 올라오는 네트워킹 행사 • onoffmix, festa, event-us, meetup… • Medium • AndroidPub, ProAndroidDev… • 블로그 • 커니의 안드로이드 , 박상권의 삽질블로그, Pluu Dev, 아라비안 나이트, 돼지왕 왕돼지 놀이터, Realm… 키워드 수집 – 커뮤니티, 컨퍼런스
  • 23.
  • 24. • Android Developer 사이트에 다 나와있어!! 안드로이드 입문
  • 25. • Android Developer 사이트에 다 나와있어!! • 어디에?? 안드로이드 입문
  • 26. • Android Developer • Android Developer Medium • Android Developer Blog • Google Sample, Code Lab • CodePath Android Cliffnotes 안드로이드 입문
  • 27. • Android Developer • ENGLISH! • 처음 보이는 상단 화면 (2019.07 기준) 안드로이드 - Android Developer
  • 28. • Android Developer • ENGLISH! • 처음 보이는 상단 화면 (2019.07 기준) 안드로이드 - Android Developer
  • 29. • Android Studio – USER GUIDE • 주로 IDE사용법 • 빌드, 디버깅, 테스트, 프로파일, 배포 • Gradle 관련 내용은 대부분 여기 있음 안드로이드 - Android Developer – Android Studio
  • 30. • Jetpack 안드로이드 - Android Developer - Jetpack
  • 31. • Kotlin • 안드로이드에서는 코틀린을 어떻게 사용하는지… 안드로이드 - Android Developer - Kotlin
  • 32. • Android Developer • Docs – GUDIES Android Developer – Docs - GUDIES, REFRENCES
  • 33. • Android Developer • Docs – GUDIES, REFRENCES Android Developer – Docs - GUDIES, REFRENCES
  • 34. • Android Developer • Docs – SAMPLES • https://github.com/googlesamples Android Developer – Docs - SAMPLES
  • 35. • Android Training Course, Codelabs • 코드 베이스로 하나씩 익혀나가고 싶다면… Android Developer - Android Training Course, Codelabs
  • 36. • Summary, Advanced, Troubleshooting, Best Practice • 간혹 공식 문서에 빠진 내용이 나오기도 한다. Android Developer – Medium, Blog
  • 37. CodePath Android Cliffnotes • OPEN SOURCE • 사용법부터 각종 꿀팁, 관련 오픈소스까지 소개
  • 38. 1. Android Developer 검색 • DOCS – GUIDE, REFERENCES, SAMPLES 2. Android Developer Medium, Blog 검색 3. CodePath Android Cliffnotes 검색 4. 구글링 안드로이드 - API 사용법 익히기
  • 39. • Android Developer 사이트에 다 나와있어!! • 진리 • 정말 전부 다 있다. • 구글링 하기 전에 Android Developer 부터 보는 습관을 기르자 안드로이드 – Android Developer
  • 40. • 4대 컴포넌트 • Activities, Services, Broadcast receivers, Content providers • Jetpack • Fragment • ConstraintLayout, ViewPager, RecyclerView… 안드로이드
  • 41. • 4대 컴포넌트 • Activities, Services, Broadcast receivers, Content providers • Jetpack • Fragment • ConstraintLayout, ViewPager, RecyclerView… • Inflater • View 안드로이드
  • 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); }
  • 43. • Inflate? “부풀게 하다” 안드로이드 - Inflate 제대로 이해하기
  • 44. • Inflate? “부풀게 하다” 안드로이드 – Inflate 제대로 이해하기 <!--view_tech_concert.xml--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="2019" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="테크콘서트" /> </LinearLayout>
  • 45. • Inflate? “부풀게 하다” 안드로이드 – Inflate 제대로 이해하기 <!--view_tech_concert.xml--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="2019" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="테크콘서트" /> </LinearLayout> LinearLayout linearLayout = new LinearLayout(getContext()); linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); linearLayout.setOrientation(LinearLayout.VERTICAL); TextView yearTextView = new TextView(getContext()); LinearLayout.LayoutParams yearParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); yearParams.gravity = Gravity.CENTER; yearTextView.setLayoutParams(yearParams); yearTextView.setText("2019"); linearLayout.addView(yearTextView); TextView techConcertTextView = new TextView(getContext()); LinearLayout.LayoutParams techConcertParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); techConcertParams.gravity = Gravity.CENTER; techConcertTextView.setLayoutParams(techConcertParams); techConcertTextView.setText("테크콘서트"); linearLayout.addView(techConcertTextView); inflate
  • 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
  • 53. • View 트리를 전위 순회하면서 처리해 나가는 구조 • 깊이 우선 탐색 (DFS) • View 계층을 최소화하는 이유 • 렌더링 – measure 안드로이드 – View Root ViewGroup - measure └ 1depth ViewGroup - measure └ └ 2depth View - measure └ └ 2depth Veiw - measure └ └ 2depth View - measure └ 1depth View - measure └ 1depth View - measure 1 2 3 4 5 6 7
  • 54. • View 트리를 전위 순회하면서 처리해 나가는 구조 • 깊이 우선 탐색 (DFS) • View 계층을 최소화하는 이유 • 렌더링 – measure – layout 안드로이드 – View Root ViewGroup - layout └ 1depth ViewGroup - layout └ └ 2depth View - layout └ └ 2depth Veiw - layout └ └ 2depth View - layout └ 1depth View - layout └ 1depth View - layout Root ViewGroup - measure └ 1depth ViewGroup - measure └ └ 2depth View - measure └ └ 2depth Veiw - measure └ └ 2depth View - measure └ 1depth View - measure └ 1depth View - measure 1 2 3 4 5 6 7
  • 55. • View 트리를 전위 순회하면서 처리해 나가는 구조 • 깊이 우선 탐색 (DFS) • View 계층을 최소화하는 이유 • 렌더링 – measure – layout - draw 안드로이드 – View Root ViewGroup - draw └ 1depth ViewGroup - draw └ └ 2depth View - draw └ └ 2depth Veiw - draw └ └ 2depth View - draw └ 1depth View - draw └ 1depth View - draw Root ViewGroup - layout └ 1depth ViewGroup - layout └ └ 2depth View - layout └ └ 2depth Veiw - layout └ └ 2depth View - layout └ 1depth View - layout └ 1depth View - layout Root ViewGroup - measure └ 1depth ViewGroup - measure └ └ 2depth View - measure └ └ 2depth Veiw - measure └ └ 2depth View - measure └ 1depth View - measure └ 1depth View - measure 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()));
  • 59.
  • 60. • Thread • Executor • CompletableFuture (java 8, sdk>=24) • AsyncTask • Loader • WorkManager • Rx • Coroutine 비동기
  • 61. • Thread • Executor • CompletableFuture (java 8, sdk>=24) • AsyncTask • Loader • WorkManager • Rx • Coroutine 비동기
  • 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… 비동기
  • 66. 비동기 – Thread, MessageQueue, Handler, Looper https://academy.realm.io/kr/posts/android-thread-looper-handler/ • 이 그림을 이해하면 끝! • #Consumer–ProducerPattern #MainThread #UiThread #MessageQueue #Handler #MainLooper #Looper #HandlerThread
  • 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분 정도의 동영상으로 안드로이드 전반적인 지식을 비약적으로 올려준다. • 한글 자막도 있다.
  • 81.
  • 84. • 필요할까? • NDK 개발 시에는 필수 • 코드 레벨까지 보는 건 비추 • 성능 최적화시에도 알아야할 내용들이 많기 때문에 어느 정도는 알아야 한다.. 안드로이드 프레임워크
  • 85. 안드로이드 프레임워크 – AOSP • Android Open Source Project
  • 86. • Configure – RUNTIME • #.class #.dex #Dalvik #ART #D8 #R8 #AOT #JIT • 컴파일러 관련 내용 • Develop – GRAPHICS • #SurfaceView #TextureView #BufferQueue, #SurfaceFlinger, #Surface, #Canvas, #SurfaceHolder • 화면 렌더링 관련 내용 • Develop - ARCHITECTURE • #HAL #Context #Parcel # BinderIPC #SystemServices #MediaServer #SystemServer • IPC 관련 내용 안드로이드 프레임워크 - AOSP
  • 88.
  • 89. • Java vs Kotlin 언어 - 무엇을 해야할까?
  • 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
  • 94. 언어 – Kotlin - 추천 서적 Coming Soon
  • 95. • 2017년부터 해마다 열리는 코틀린 컨퍼런스 언어 – Kotlin - Kotlinconf
  • 96. 언어 – JAVA – 추천 서적
  • 97. • wiki) 프로그래밍 패러다임은 기능에 따라 프로그래밍 언어를 분류하는 방법. 언어는 여러 패러다임으로 분류 할 수 있다. • 유행 • 프로그래밍 관점을 갖게 해 주고, 결정하는 역할 • 서로 다른 프로그래밍 언어는 서로 다른 프로그래밍 패러다임을 지원 • 새로운 것을 가능하게도 하지만 어떤 기법을 금지 함 • 구조적 프로그래밍에서는 goto 문을 금지 • #StructuredProgramming #Object-OrientedProgramming #FunctionalProgramming #ReactiveProgramming #FunctionalReactiveProgramming #Modular Programming… 프로그래밍 패러다임
  • 98. • Kotlin, Java 는 • 객체지향프로그래밍(Object-Oriented Programming) • 함수형프로그래밍(Functional Programming) 패러다임
  • 99. 객체지향프로그래밍 – 추천 서적 • #OOP #클래스 #객체 #메시지 #추상화 #캡슐화 #상속 #구성 #다형성 #S.O.L.I.D
  • 100. 객체지향프로그래밍 - 5대 원칙 • OOP의 5대 원칙 1. 단일 책임 원칙(Single responsibility principle) - SRP 2. 개방 폐쇄 원칙(Open/closed principle) - OCP 3. 리스코프 치환 원칙(Liskov substitution principle) - LSP 4. 인터페이스 분리 원칙(Interface segregation principle) - ISP 5. 의존관계 역전 원칙(Dependency inversion principle) – DIP
  • 101. 객체지향프로그래밍 – 디자인 패턴 • SOURCE MAKING • 디자인 패턴 의도가 잘 나와있음
  • 102. • 클래스가 아닌 함수가 재활용 단위 • 함수는 1급 객체 • #람다 #클로저 #순수함수 #고차함수 #lazy #커링 #재귀 #메모이제이션 #모나드 함수형프로그래밍 – 추천 서적
  • 103.
  • 104. • Best Practice • 좋은 코드를 짜는 방법을 훈련 잘 변하지 않는 것들…
  • 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 • 책임? "어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 함“ • 코드가 많다면? 해당 클래스가 여러 책임을 가졌을 가능성이 높음 • 나눌 수 있는 책임을 분배하여 각각 클래스로…
  • 116. Best Practice - SRP • Fragment – 영화 1분 미리보기 화면
  • 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 - 우선 이것부터 해보자
  • 131.
  • 132. 고인 물 • 키워드 수집 • 좋은 코드를 짜기 위한 훈련
  • 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