๊พธ์ค€ํ•จ์ด ์ง„๋ฆฌ๋‹ค!!

์–ด์ œ๋ณด๋‹ค ๋ฐœ์ „ํ•œ ์˜ค๋Š˜์ด ๋˜๊ณ ํ”ˆ ๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ์˜ ๋ธ”๋กœ๊ทธ

java 7

[Java][Kotlin][Android] ์•ˆ๋“œ๋กœ์ด๋“œ ์ž๋ฐ”์™€ ์ฝ”ํ‹€๋ฆฐ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ - ์•ˆ๋“œ๋กœ์ด๋“œ Legacy ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜ ํ•˜๊ธฐ (1)

์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ‘‹ ๊ฑฐ์˜ ํ•œ ๋‹ฌ ๋งŒ์— ํฌ์ŠคํŒ…์œผ๋กœ ์ฐพ์•„๋ต™๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋“ค์„ ๊ฒฝํ—˜ํ•˜๋‹ค ๋ณด๋ฉด ์ž๋ฐ”๋กœ ๋˜์–ด์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋“ค์„ ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๋ฉด์„œ ์ฝ”ํ‹€๋ฆฐ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋”๋Ÿฌ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‚ด์šฉ๋“ค์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์ด 2ํŽธ์œผ๋กœ ๊ธฐํš์ด ๋  ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ 1ํŽธ(๋ณธ ํฌ์ŠคํŒ…)์€ ์ž๋ฐ”์™€ ์ฝ”ํ‹€๋ฆฐ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 2ํŽธ์€ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ… ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿผ ๋ฐ”๋กœ ์‹œ์ž‘ํ•ด๋ณด๋„๋ก ํ• ๊นŒ์š”? ๐Ÿ˜Ž 1. ์„ค์ • ์ž๋ฐ” ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด build.gradle์„ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค. // Project gradle plugins { ... // ์ƒ๋žต id 'org.jetbrai..

Android 2023.05.19

[Android] ์•ˆ๋“œ๋กœ์ด๋“œ Clean Architecture์— ๋Œ€ํ•ด์„œ ( 1 ) - Clean Architecture์˜ ๊ฐœ๋…

์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ‘‹ ์˜ค๋Š˜์€ Clean Architecture์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ํฌ์ŠคํŒ…ํ•˜๊ธฐ์—” ๋‚ด์šฉ์ด ๊ธธ์–ด์งˆ ๊ฒƒ ๊ฐ™์•„ ์˜ค๋Š˜์€ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ„๋žตํ•˜๊ฒŒ ํฌ์ŠคํŒ… ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ €, Clean Architecture๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”? Clean Architecture๋ž€? ํด๋ฆฐ ์ฝ”๋“œ(Clean Code)๋ฅผ ์ €์ˆ ํ•œ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด(Robert C. Martin)์ด ์ œ์•ˆํ•œ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜๋กœ, ๊ธฐ์กด์˜ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ฐ€์ง€๋˜ ์˜์กด์„ฑ์—์„œ ๋ฒ—์–ด๋‚˜๋„๋ก ํ•˜๋Š” ์„ค๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Clean Architecture๋Š” ์™œ ์“ฐ๋Š”๋ฐ? Clean Architecture๋ฅผ ํ†ตํ•œ ์„ค๊ณ„๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ํ™•์žฅ์„ฑ์ด ์ข‹์•„์ง€๊ณ  ์‰ฝ๊ฒŒ ํŒจํ‚ค์ง€ ๋ฐ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—..

Android 2023.02.20

[Kotlin] ์ฝ”ํ‹€๋ฆฐ Coroutine(์ฝ”๋ฃจํ‹ด)์— ๋Œ€ํ•˜์—ฌ (1) - CoroutineScope์™€ CoroutineContext ๋ฐ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š” ์˜ค๋Š˜์€ ์ฝ”ํ‹€๋ฆฐ์˜ Coroutine์— ๋Œ€ํ•˜์—ฌ ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. Coroutine์ด๋ž€? ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„๋ฅผ Routine์ด๋ผ ํ•˜๋Š”๋ฐ ๊ฐ Routine์ด ํ˜‘์—…(Co)ํ•˜์—ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ํ•ฉ์น˜๊ฒŒ ๋˜์–ด Co + Roitine์ด๋ผ ๋ช…๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Coroutine์€ Thread์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์€ Thread๋ผ ํ˜ธ์นญํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ Thread์™€ ๊ฐ™์ด ์ž์‹ ์„ ์‚ฌ์šฉํ•  ์Šคํƒ์„ ๋”ฐ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ๋‹จ์œ„๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Thread๋Œ€์‹  Coroutine์„ ๊ตณ์ด ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?? ๐Ÿค” Thread๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ Thread๊ฐ„ Context Switching์‹œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Thread๊ฐ€ Task ์‹คํ–‰๋„์ค‘ Block์ด ๋ฐ˜๋ณต ๋œ๋‹ค๋ฉด Threa..

Tutorial/tutorial 2022.10.10

[Kotlin] Kotlin Property ๋’ท๋ฐ›์นจ ํ•„๋“œ(Backing Field)์˜ ์‚ฌ์šฉ๋ฒ•

์•ˆ๋…•ํ•˜์„ธ์š” Backing Filed(๋’ท๋ฐ›์นจ ํ•„๋“œ)์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  Java์—์„œ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์„ Kotlin์—์„œ๋Š” Property(์†์„ฑ)์ด๋ผ๊ณ  ์นญํ•ฉ๋‹ˆ๋‹ค. Kotlin์—์„œ๋Š” ์„ ์–ธ ํ‚ค์›Œ๋“œ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ฒŒ ๋˜๋Š”๋ฐ, - val ์˜ ๊ฒฝ์šฐ : getter ๋งŒ ์กด์žฌ - var ์˜ ๊ฒฝ์šฐ : setter / getter ๋‘˜ ๋‹ค ์กด์žฌ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹์€ ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. Backing Field๋Š” ์œ„ setter / getter๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์†์„ฑ๊ฐ’์„ ์ˆ˜์ • , ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์„ค๋ช… ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. class Person{ val name = "DEV yo" get() = field.uppercase(Locale.getDefaul..

Tutorial/tutorial 2022.09.21

[Kotlin] Random ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ถœ๋ ฅํ•˜๊ธฐ

์•ˆ๋…•ํ•˜์„ธ์š” ์˜ค๋Š˜์€ ๋ถ€ํŠธ์บ ํ”„ ์ฒซ๋‚  ๊ณผ์ œ๋กœ ๋ฐ›์€ ๋‚ด์šฉ์„ ๋ฆฌ๋ทฐํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ๋‚ ์€ Kotlin์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•๋“ค์„ ๊ฐ„๋‹จํžˆ ๋ฐฐ์šฐ๋Š”๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜์˜€๋Š”๋ฐ ๊ทธ ์ค‘ ๋ฐ˜๋ณต๋ฌธ์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ์œผ๋ฉฐ ํ•ด๋‹น ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ณผ์ œ๋ฅผ ์ œ์ถœ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์šฉ์€ ๋ฐ”๋กœ . . ์ฝ”ํ‹€๋ฆฐ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝ˜์†”๋กœ 1~5 ์‚ฌ์ด์˜ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„ ๋กœ๋˜๊ฒŒ์ž„์„ ์ฝ˜์†”๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•˜์„ธ์š” ๋น„์ง€๋‹ˆ์Šค์กฐ๊ฑด: ๋กœ๋˜ ํ•œ๊ฒŒ์ž„์˜ ์กฐ๊ฑด -> 1๋ถ€ํ„ฐ 45์‚ฌ์ด์˜ ๊ฐ’์„ ๋žœ๋คํ•˜๊ฒŒ 6๊ฐœ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด 1๊ฒŒ์ž„์œผ๋กœ ์ธ์ •(์ˆซ์ž๋Š” ํ•œ๊ฒŒ์ž„์—์„œ ์ค‘๋ณต๋˜๋ฉด ์•ˆ๋จ) ex)) 1์„ ์ž…๋ ฅ์‹œ ๋กœ๋˜ํ•œ ๊ฒŒ์ž„์ถœ๋ ฅ(๊ฒน์น˜์ง€ ์•Š๋Š” ์ˆซ์ž 6๊ฐœ์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅ) ๊ตฌํ˜„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. import java.util.Random import java.util.Scanner fun main() {..

Tutorial/tutorial 2022.09.16

[Java][Android] Android ViewTreeObserVer onGlobalLayoutListener ํ™œ์šฉํ•˜๊ธฐ

์˜ค๋Š˜๋„ ํšŒ์‚ฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌ ์ค‘ ์•ฑ์ด destory ๋˜์—ˆ์Œ์—๋„ porifler์—์„œ ์ธ์Šคํ„ด์Šค๋“ค์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ํ™•์ธ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. GC๋ฅผ ์•„๋ฌด๋ฆฌ ๋Œ๋ ค๋„ ์ฐธ์กฐ๊ฐ€ ํ•ด์ œ ๋˜์ง€ ์•Š์•„ ํ•ด๋‹น ๋ถ€๋ถ„์„ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ MainView์—์„œ ViewTressObeserver์— onGlobalLayoutListener๋ฅผ ๋“ฑ๋กํ•œ ๊ฒƒ์ด ํ•ด์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏธ๋กœ ์˜ค๋Š˜์€ ViewTreeObserver๊ฐ€ ๋ญ”์ง€ ๋˜ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ์™œ ViewTreeObserver์—์„œ ์ฐธ์กฐ๊ฐ€ ํ•ด์ œ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋Š”์ง€์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜Ž ViewTreeObserver๋ž€ ๋ฌด์—‡์ธ๊ฐ€? A view tree observer is used to register listeners that can be notified of..

Android/Java 2022.08.24

[Java][Android] ์•ˆ๋“œ๋กœ์ด๋“œ InputMethodManager ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(leak) ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์˜ค๋Š˜์€ ํšŒ์‚ฌ์—์„œ ๊ทผ๋ฌด์ค‘์— ๋ฐœ๊ฒฌํ•œ InputMethodManager์— ๊ด€๋ จํ•œ Memory Leak์— ๋Œ€ํ•ด ํฌ์ŠคํŒ… ํ•˜๋ คํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด์ ์œผ๋กœ ์•ฑ์— ๋Œ€ํ•ด ๋ฉ”๋ชจ๋ฆฌ Leak๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ํ™•์ธ์ค‘ dumpsys ํ™•์ธ๊ฒฐ๊ณผ GC๊ฐ€ ๋Œ์•„๋„ Activites์™€ View๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ๊ฒฌ๋˜์–ด ์•ฝ 1๋‹ฌ ๋™์•ˆ ํ•ด๋งธ์Šต๋‹ˆ๋‹ค.. ํ˜„์žฌ ์ œ๊ฐ€ ๊ทผ๋ฌดํ•˜๋Š” ํšŒ์‚ฌ์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„์ „์€ Android4.4(KitKat)๋กœ ๋งค์šฐ ์˜›๋‚  ๋ฒ„์ „์ด๋‹ค๋ณด๋‹ˆ Profiler๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ด ๋” ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋˜๊ฒƒ์ด๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค. (๋ณ€๋ช… ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.) Profiler๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์—์„œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ดํ›„ ์ถ”๊ฐ€์ ์œผ๋กœ ํฌ์ŠคํŒ… ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Profiler ํ™•์ธ ๊ฒฐ๊ณผ ๋ฉ”๋ชจ๋ฆฌ Leak์ด 2๊ฑด ๋ฐœ์ƒ ํ•˜์˜€๊ณ ..

Android/Java 2022.07.13