๐ฑ Today I Learned (์ง์ค ์๊ฐ : 11์๊ฐ 35๋ถ)
- (10:00 ~ 11:00 / 1์๊ฐ) ๋ฐ์ผ๋ฆฌ ํ์คํฌ๋ผ ๋ฐ ํ๋ก์ ํธ ํ์
- (11:00 ~ 13:10 / 2์๊ฐ 10๋ถ) MyActivity ๊ธฐ๋ฅ ๊ตฌํ ๋ฐ ๋ฆฌํฉํ ๋ง, GitHub PR
- (13:00 ~ 13:25 / 25๋ถ) TIL ์์ฑ
- (14:10 ~ 18:00 / 3์๊ฐ 50๋ถ) ํํ๋ก์ ํธ ๊ตฌํ (MyActivity ๋ฆฌํฉํ ๋ง ๋ฐ
- (19:30 ~ 22:00 / 2์๊ฐ 30๋ถ) ํํ๋ก์ ํธ ๊ตฌํ ๋ฐ ํ์, Develop ๋ธ๋์น์ ํฉ์น๊ณ ๊ณตํต์ฌํญ ์ ์ฉ
- (22:00 ~ 23:30 / 1์๊ฐ 30๋ถ) TIL ์์ฑ์ค
- (์ธ์ ํ๋) ์คํ ๋ค๋๋ฐ ์ฌํ ๊ตฌํ, ์ ๋ฌธ ๊ณผ์ ๋ฆฌ๋ทฐ, ์ ์ฐฝ๊ฒฝ ๋ฆฌ๋ทฐ
*** ์ ์ฌ 13:00 ~ 14:00 / ์ ๋ 18:00 ~ 19:00 ์ ์ธ
โ
1. ํ ํ๋ก์ ํธ (MyActivity ๊ธฐ๋ฅ ๊ตฌํ ๋ฐ ๋ฆฌํฉํ ๋ง, GitHub PR)
- ๊ฐ์ธ์ ์ผ๋ก ๋ค์ํ ํํ์ ์ด์๋ฅผ ์ ํ๊ณ ์์ ํ๋ ์๊ฐ์ ๊ฐ์ก๋ค.
- ์ ์ฉํ ๋จ์ถํค๋ก shift + F6์ด ์์๋ค. ํ์ผ/ํด๋์ค/๋ณ์ ๋ฑ์์ ์ ๋ ฅ ์ ํ ๋ฒ์ ๋ ํผ๋ฐ์ค ์ด๋ฆ๋ค์ด ๋์ค๋ฉฐ, ์ด๋ฆ์ ์์ ํ๋ฉด ๋ค๋ฅธ ์์น์์ ์ฌ์ฉ๋ ํ์ผ/ํด๋์ค/๋ณ์๋ช ์ด ์์ ๋ ์ด๋ฆ์ ์๋ง๊ฒ ํ ๋ฒ์ ์์ ๋๋ค.
โ ์ด์ 1. AVD ๊ตฌ๋ ์ ํ์ ํ๋ฉด์ด ๋จ๋ ์ค๋ฅ ์์ธ ์ฐพ๊ธฐ
๊ธฐ์กด ์ฝ๋
val user: User by lazy {
MemoryStorage.getUser()
}
์์ ์๋ ์ฝ๋
val user: User by lazy {
MemoryStorage.setUser(PreviewProvider.users[0])
MemoryStorage.getUser()
}
- ๊ธฐ๋ณธ์ ์ธ ์ฝ๋๋ฅผ ๋ค ์์ฑํ๊ณ ๋์, ๋น๋๋ ๋๋๋ฐ ํ์ ํ๋ฉด์์ ๋๊ฐ์ง๋ ์ค๋ฅ๊ฐ ์์๋ค.
- ์์ง ๋ค๋ฅธ ํ์๋ถ์ด ์์ฑํ ์กํฐ๋นํฐ๊ฐ ์์ด MemoryStorage์ User๊ฐ์ ๋ถ๋ฌ์ค์ง ๋ชปํ์ฌ ๋ฐ์ํ ์ค๋ฅ์๋ค.
- ์์๋ก setUser๋ฅผ ์ด์ฉํด PreviewProvider์ ๋ฃ์ด๋์ ์์์ user๊ฐ์ ์ธํ ํด์คฌ๋๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋ค.
โ ์ด์ 2. ๋งค๋ํ์คํธ ๊ถํ ๋ถ์ฌ ์ฌ๋ถ
//deprecated๋ ์ฝ๋, ์ง๊ธ์ ์์ ๋จ
fun changeProfilePhoto(view: View) {
val changePictureIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI)
startActivityForResult(changePictureIntent, REQUEST_IMAGE_PICK)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == REQUEST_IMAGE_PICK && resultCode == Activity.RESULT_OK && data != null){
val selectedImageURI = data.data
binding.imgProfile.setImageURI(selectedImageURI)
}
}
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
- deprecated ๋ ์ฝ๋๋ฅผ ์ ์ฉํ๋ ๋น์์ ์ด์๋ค.
- INTERNAL_CONTENT_URI๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ ๋งค๋ํ์คํธ์ ์คํ ๋ฆฌ์ง ๊ถํ์ ๋ถ์ฌํ์ง ์์๋ ์ ์๋ํ๋ค.
โ ์ด์3. displayUserInfo() ์ค์ ๋ฐฉ์
๋ฌธ์ ์ ์ฝ๋
private fun displayUserInfo() {
currentUser?.let { user ->
binding.etName.setText(user.name)
binding.etId.setText(user.id)
binding.etBio.setText(user.bio)
binding.etEmail.setText(user.email)
binding.etPhone.setText(user.phoneNumber)
}
์์ ์ฝ๋ (1์ฐจ)
private fun displayUserInfo() {
user.run {
binding.etName.setText(name)
binding.etId.setText(id)
binding.etBio.setText(bio ?: " ")
binding.etEmail.setText(email ?: " ")
binding.etPhone.setText(phoneNumber ?: " ")
}
}
- ์ฒ์์ ์ค์ ํ๋ ์ฝ๋๋ User๊ฐ null์ด ์๋ ๊ฒฝ์ฐ ์ ๋ ฅ๊ฐ์ User์ ๋ฃ์ด์ค๋ค๊ณ ์๊ฐํ๊ณ ๊ตฌํํ ์ฝ๋๋ค.
- ์ผ๋จ user์ ์ผ๋ถ ๊ฐ์ด ๋น์ด์๋ ๊ฒ์ด์ง, user ์์ฒด๊ฐ null์ด ๋ ์ ์์ผ๋ฏ๋ก ์๋ชป๋ ์ฝ๋๋ค.
๊ฐ๊ฐ์ ์ ๋ ฅ ๊ฐ์ด null์ธ์ง ํ์ธํ๊ณ , null ์ธ ๊ฒฝ์ฐ elvis ์ฐ์ฐ์(?:)๋ฅผ ์ด์ฉํ์ฌ ๊ณต๋ฐฑ์ ๋ฃ์ด์ค๋ค. - ์ฐธ๊ณ ๋ก user.run์ ์ด์ฉํ๋ฉด this๊ฐ user๊ฐ ๋์ด ๋ฐ๋ก user.name์ ์ ์ง ์๊ณ name๋ง ์ ์ด๋ user์ name์ ๋ฐ๋๋ค.
- ์ด ๊ณผ์ ์์ run๊ณผ apply์ ์ฐจ์ด์ ๋ํ ์๊ธฐ๊ฐ ์ข ์ค๊ณ ๊ฐ๋ค. ๋๊ฐ run์ธ ๊ฒฝ์ฐ ๋ง์ง๋ง ๋ผ์ธ์ returnํ๋ ์ฐจ์ด๊ฐ ์๋ค๊ณ ํ๋๋ฐ, ์ด ๋ถ๋ถ์์ ์ด๋ค ๊ฒ์ ์ ์ฉํ๋ ๊ฒ ์ข์์ง๋ ํํ๋ก์ ํธ ๋๋ ๋๊น์ง ๋... ์ฐพ์๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
์์ ์ฝ๋(2์ฐจ)
private fun displayUserInfo() {
with(binding) {
user.run {
etName.setText(name)
etId.setText(id)
etBio.setText(bio ?: "")
etEmail.setText(email ?: "")
etPhone.setText(phoneNumber ?: "")
}
}
}
- with(binding)์ผ๋ก ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ก๋ค.
โ ์ด์4. onCreate() ๋ธ๋ก ๋ด์ ๊ฐ๋ ์ฑ
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMyBinding.inflate(layoutInflater)
setContentView(binding.root)
displayUserInfo()
clickDone()
clickProfileChange()
clickCancel()
clickSwitchtoLogin()
}
- ์๋๋ setOnClickListener๋ถํฐ ์จ๊ฐ ๋ค์ํ ์ฝ๋๋ฅผ onCreate()์์ ๋ฃ์์๋๋ฐ, PR๋ก ์ฝ๋๋ฅผ ์์ ํ๊ฒ ๋์๋ค.
- ์ฅ์ ์ ์๋์ ๊ฐ๋ค.
1) ๋์ค์ ์ฝ๋๊ฐ ์ปค์ง ์๋ก ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ข์
2) ์ฃผ์์ ์ผ์ผํ ๋ฌ ํ์ ์์ด, ํจ์ ๊ทธ ์์ฒด์ ์ด๋ฆ์ด ์ฃผ์์ ๊ธฐ๋ฅ์ ์ํ (๊ฐ๋ ์ฑ ์ธก๋ฉด)
โ ์ด์5. Edittext ํฌ์ปค์ค ์ด๋ : ์ํฐ๋ฅผ ๋๋ฅด๊ฒ ๋๋ฉด ๋ค์ ๋ฒํผ์ผ๋ก ๊ฐ๊ฒ๋ ์ค์
- ํ์ฌ ์ํ์์ Edittext์์ ์ํฐ๋ฅผ ๋๋ฅด๋ฉด ๋ ์ค๋ก ๋ณํ๋ฉด์ ์ ๋ ฅํ ์ ์๋ ๊ณต๊ฐ์ด ๋์ด๋๋ค.
- ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ํฐ๋ฅผ ํด๋ฆญํ์ ๋ ๋ฐ๋ก ๋ค์ Edittext๋ก ํฌ์ปค์ค ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ค.
binding.etId.requestFocus() ๋ก ํฌ์ปค์ค๋ฅผ ์ฃผ๊ณ ๋์, ์๋์ผ๋ก ํคํจ๋๊ฐ ์ถ๋ ฅ๋์ง ์์ผ๋ฏ๋ก ๋ฐ๋กval inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManagerinputMethodManager.showSoftInput(etId, InputMethodManager.SHOW_IMPLICIT)์ฒ๋ผ ํค๋ณด๋๋ฅผ ๋์ฐ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์คํ์์ผ์ฃผ์ด์ผ ํ๋ค.
→ ์๋ ํฌ์ปค์ค, ์๋ ํคํจ๋ ๊ธฐ๋ฅ์ด ์์๋ค!
์๋ ํฌ์ปค์ค, ์๋ ํคํจ๋ ๊ธฐ๋ฅ ์์ (nextFocusDown ์์ฑ ์ด์ฉ)
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/search_editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nextFocusDown="@+id/๋ค์ ํฌ์ปค์ค๋ฅผ ์ค ๋์์ id"
android:inputType="text"/>
</LinearLayout>
AndroidManifest.xml์ ํด๋น ์กํฐ๋นํฐ์ windowSoftInputMode="stateVisible" ์ค์
<activity android:name=".@@@Activity"
android:windowSoftInputMode="stateVisible"
android:theme="@style/AppTheme"/>
- ๊ทธ๋ฌ๋ ๋งค๋ํ์คํธ ํ์ผ ์ถฉ๋ ๋ฑ ํ์ฌ๋ก์๋ ์ ์ฉ์ด ์ ๋งคํ ๋ถ๋ถ์ด ์์ด ๋์ค์ ๊ฐ์ธ์ ์ผ๋ก ๋ค์ ์๋ํด ๋ณผ ์์ ์ด๋ค.
โ ์ด์6. buildString์ผ๋ก ๊ฐ๋ ์ฑ ๋ฐ ํจ์จ ๊ฐ์
// ๊ธฐ์กด ์ฝ๋
if (daysDiff > 0) {
if (daysDiff > 30) timeText = "${daysDiff / 30} months"
else timeText = "${daysDiff} days "
} else if (hourDiff > 0) {
timeText = "${hourDiff} hours "
} else if (minDiff > 0) {
timeText = "${minDiff} minutes "
// ๋ณ๊ฒฝ ์ฝ๋
val timeText = buildString {
if (daysDiff > 0) append("$daysDiff days ")
if (hourDiff > 0) append("$hourDiff hours ")
if (minDiff > 0) append("$minDiff minutes ")
}
- ๋ค๋ฅธ ํ์ ๋ถ์ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ๋ฉฐ ๊ฐ๋ ์ฑ ์ธก๋ฉด์์ ์ด๋ ๋ฐฉ๋ฒ์ด ์ข์๊น ์๊ฐํ๋ค๊ฐ ์ฐพ์ ๋ฐฉ์์ด๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌธ์์ด ๋ค์ ๋ฌธ์์ด์ ์ถ๊ฐํ๋ ๊ฐ๋จํ ์์ ์์ ์ ๊ฒฝ์ฐ StringBuilder๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ๊ด๋ฆฌ ๋ฐ ํจ์จ ์ธก๋ฉด์์ ์ข๋ค๊ณ ํ๋ค. (์ถ์ฒ: https://notepad96.tistory.com/96)
- ๋ํ๊ธฐ ์ฐ์ฐ ๊ฐ์ ๊ฒฝ์ฐ ๋ฌธ์์ด ๋ํ๊ธฐ์ธ append๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํ์๋ค.
โ ์ด์7. deprecated๋ ์ฝ๋ ์์
fun changeProfilePhoto(view: View) {
pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
}
private val pickMedia = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
uri?.let {
binding.imgProfile.setImageURI(it)
}
}
- ์ด ๋ถ๋ถ์ ์์ง ์ ๋ฆฌ์ค์ด๋ผ ๋ด์ผ TIL์ ๋ ์์ธํ ์ ๋ฆฌ๋ฅผ ํ๊ฒ ๋ ๊ฒ ๊ฐ๋ค.
- startActivityForResult(changePictureIntent, REQUEST_IMAGE_PICK) ์ผ๋ก ๊ตฌํํ๋ ๊ฒ deprecated๋ ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์ ์ด์ ๊ฐ ์๋ค๊ณ ํ๋ค. ๊ฒฐ๊ณผ๋ฅผ ์ป๋ Activity๋ฅผ ์คํํ๋ ๋ก์ง์ ์ฌ์ฉํ ๋, ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์ธํด ํ๋ก์ธ์ค์ Activity๊ฐ ์ฌ๋ผ์ง ์ ์๋ค. (ํนํ ์นด๋ฉ๋ผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์์
์ ์๋ฉธ ํ๋ฅ ์ด ๊ต์ฅํ ๋๋ค.)
์ถ์ฒ: https://kimyunseok.tistory.com/40 - URI๋ฅผ ๊ฐ์ ธ์์ ๋ฐ์ดํฐ ํด๋์ค user์ ๋ฃ์ด์ค ๊ฑด๋ฐ ์ด ๋ถ๋ถ์ ์ด์8๋ก ์ด์ด์ง๋ค.
โ ์ด์8. ์ด๋ฏธ ๋ค์ํ ์กํฐ๋นํฐ์์ ์์ฑํ User๋ฅผ ์์ ํ๊ธฐ
- ์ด๊ธฐ์ ํ๋ก์ ํธ๋ฅผ ์ธํ ํ ๋ ๊ณ ๋ คํ์ง ๋ชปํ๋ ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
- ํ๋กํ ์ด๋ฏธ์ง๋ฅผ Uri๋ drawableResourceID ๋ ์ค ํ๋์ ํ์ ์ผ๋ก ์ ํ ํ ์ ์๊ฒ ์ธํ ํด๋์ง ๋ชปํด์ ์ฝ๋๋ฅผ ์ ์ฒด์ ์ผ๋ก ์์ ํด์ผ ํ๋ ์ผ๋ค์ด ์๊ฒผ๋ค. ์ด๋ฏธ user์ image๋ฅผ ํ์๋ค์ด ๋ชจ๋ ์ฌ์ฉํ์ ์, ๊ธฐ์กด์ ์์ฑํ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ ๋ ธ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์ด ๊ฐ ์ฝ๋์ ๋ณ๊ฒฝ์ฌํญ ์์ด ํ๋๋ฒ์ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅ ์ค์ด์๋ค
- image๋ฅผ any ํ์ ์ผ๋ก ํ ๋นํ๋๋ก ๋ณ๊ฒฝํ๋ฉด ์ด๋จ๊น, ์ ๋ฌ๋ฉด ์ด๋จ๊น ํ์๋ค์ ์๊ฒฌ์ด ์์๋ค.
- ํํฐ๋๊ป ์ฌ์ญค๋ณด๋ ์๋์ ๊ฐ์ ๋ต๋ณ์ ์ป์๋ค.
- ์๊ฐ1) any ํ์
์ผ๋ก ๋ฐ๊พธ๋ฉด ์ด๋จ๊น?
- any ํ์ ์ ์ ์ฐ๋๊ฒ ์ข์
- ํ์ ์์ฒด์ ์ค๋ฅ๊ฐ ๊ต์ฅํ ๋ง์ด ๋๊ณ , ๋๋ฒ๊น ๋น์ฉ(๊ฐ๋ฐ์ ๋น์ฉ)์ด ๋ง์ด ๋ฆ
- Null๋ก ์ค์ ํ๋ฉด ์ ์ด๋ Null ์ธ์ง ์๋์ง์ ๋ฐ๋ผ์ ํ๋จ์ด๋ผ๋ ๊ฐ๋ฅํ๋ฐ, any๋ฉด ๊ฐ๋ฐ์๋ค๋ ๋ฌธ์ ์ ์ ์๊ฐ ์์ - ์๊ฐ2) ์ง์ ๋ฐ๊ฟ์ผ ํ๋?
- ํ์ ์์๋ ์ฒ์๋ถํฐ ์๋ฒฝํ๊ฒ ์ค๊ณํ์ง ๋ชปํ๋ค. ์์ ํด์ผ ํ ๋๋ ์์ ํ๋ ํธ์ด๋ค. - ์๊ฐ3) ์ฌ์ง๊ณผ ๊ฐ์ด ํ์ฅ์ฑ์ด ์ข์ sealed interface๋ฅผ ๋ง์ด ์ด๋ค๊ณ ํ๋ค.
โ ์ด์9. ๋งค๋ํ์คํธ ํ์ผ์ ์์ ํ์ง ์๊ณ ํน์ ์กํฐ๋นํฐ AVD ์๋ํ๊ธฐ
- edit configuration - module - launch specified Activity ์ค์ ํ apply ํ๊ณ Run
2. Git Troble Shooting
โ์ด์1. ๊นํ๋ธ ์์ฒด ํด๋ ์ถ๊ฐ
- ๋งค์ฐ ๊ฐ๋จํ๊ฒ GitHub์์ ํด๊ฒฐํ ์ ์์๋ค.
โ์ด์2. Develop ๋ธ๋์น ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋์ง ์์ ์ํ์์ ๊ฐ๋ฐ ์ค Pull ํ๋ ์ํฉ (์ถฉ๋ ๊ด๋ฆฌ)
1. git branch (ํ์ฌ ๋ธ๋์น ํ์ธ)
2. git status (ํ์ฌ add๊ฐ ํ์ํ ๋ณ๊ฒฝ ํ์ผ ํ์ธ)
3. git add, git status (ํ์ํ ํ์ผ์ addํ๊ณ status๋ก ์ ์ถ๊ฐ๋๋ ํ์ธ)
4. git commit -m "" (ํ์ฌ ๋ธ๋์น์์ add๋ ์ง๊ธ๊น์ง์ ๋ด์ฉ์ ์ปค๋ฐ)
5. git pull origin ๊ฐ์ ธ์ฌ๋ธ๋์น๋ช
(๊ฐ์ ธ์ฌ ๋ธ๋์น์์ pull)
5.1) ์ด ๊ณผ์ ์์ ๋ด ๋ธ๋์น์ ๋ณ๊ฒฝ์ฌํญ๊ณผ CONFLICT๊ฐ ์กด์ฌํ ๊ฒ์
6. CONFLICT๋ ํ์ผ์ ๋ชจ๋ ํ์ธํ๊ณ , <<<HEAD ๋ก์ปฌ์ฒด์ธ์ง == ๋ฆฌ๋ชจํธ์ฒด์ธ์ง>>> ๋ถ๋ถ ๋ชจ๋ ์์
7. git add, git commit
7.1) (์) git commit -m "Merge branch 'develop' of https://github.com/Chapter-3-2-Android/SNS-APP"
7.2) pullํ ๋ค ์๊ธด CONFLICT๋ฅผ ์์ ํ ํ์ผ๋ค์ ๋ค์ add ํ commit
8.git push (ํ์ฌ ๋ธ๋์น์ ๋ฐ์ ์๋ฃ)
- conflict๋ฅผ ํด๊ฒฐํ๊ณ ๋ค์ ํฉ์น๋ ๊ณผ์ ์์ ๋ง์ด ํท๊ฐ๋ ธ๋๋ฐ, ์ด์ ์์ผ ์ ๋ฆฝ์ด ๋๋ค.
๐ญ Retrospect
๊ณต๋ถ๋ ๊ฐ์ธ ํ๋ก์ ํธ๋ ํผ์ ์ด๊ฒ์ ๊ฒ ์ฝ์งํ๋ ๊ฒ์ ๊ทธ ์์ฒด๋ก ๋งค์ฐ ์ฆ๊ธฐ๋ ํธ์ธ๋ฐ, ์ฒซ ํํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ๋ ๊ฐ์ ์ ์กฐ๊ธ ๋ค๋ฅธ ๊ฒ ๊ฐ๋ค. '์. ํผ์์ ์ฝ์งํ๋ ๊ฒ๋ณด๋จ ๋จ์ฒด๋ก ์ฝ์งํ๊ณ ์๊ฒฌ์ ์กฐ์จํ๋ฉฐ ํด๊ฒฐํด ๋๊ฐ๋ ๊ฒ ๋ช ๋ฐฐ๋ ๋ ์ฝ์ง ์์ ๋ฌธ์ ๊ตฌ๋' ๋๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋ง์ ๊ฒ์ ๋ฐฐ์ฐ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์๋ค. ์ฝ๋ ๋ฆฌ๋ทฐ๋ ๊ตฌํ ๋ฐฉ๋ฒ์ ์์ด์ ๋ด๊ฐ ์๊ฐํด๋ณด์ง ๋ชปํ๋ ์๊ฐ๊ณผ ์ ๋ณด๋ฅผ ๊ณต์ ๋ฐ๋ ๊ฒ ์ข๋ค.
ํด๋ฆฐ ์ฝ๋์ ์์ญ์ ๋ํด์๋ ๊ณ ๋ฏผ์ด ๊น๋ค. '๋ด๊ฐ ๋ดค์ ๋ ์ดํด๋๋ ์ฝ๋'๊ฐ ์๋๋ผ '๋จ๋ค์ด ๋ดค์ ๋๋ ์ฝ๊ฒ ์ดํด๋๋ ์ฝ๋'๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ๊ฒ์ ํํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ๋์์ผ ๋น๋ก์ ์ฒด๊ฐํ๋ค. ๋ด๊ฐ ์ง ์ฝ๋๋ฅผ ๋ด๊ฐ ๋ณด๋ฉด ๋น์ฐํ ์ดํด๊ฐ ์ ๋ ์๋ฐ์ ์๋ค. ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ ์ ์ฅ์์ ์๊ฐํด๋ณด์. ๊ฐ๋ ์ฑ ์ธก๋ฉด, depth์ ๋ํด์๋ ๋ง์ด ์๊ฐํ๊ฒ ๋ ํ๋ฃจ๋ค.