seminar-2022
seminar-2022 copied to clipboard
Kotlin으로 풀어보는 20.5기 코테 3번 문항에 대한 질문
@Jhvictor4 님의 예시 답안 링크
class StudentTable(
private val students: LinkedList<String> // (1)
) {
private var cursor = 0 // (2)
private val cache = mutableListOf<Cached>() // (3)
private data class Cached(
val originalIndex: Int,
val studentName: String,
)
...
private fun moveDown(count: Int) {
val resultLoc = cursor + count // (2)
if (resultLoc >= students.size) { // (1)
println("Error 100")
return
}
cursor = resultLoc
}
...
private fun delete() {
val removed = this.students.removeAt(cursor) // (1)
this.cache.add(Cached(cursor, removed)) // (3)
// now current Index has moved to it's next one
// reallocate current index if no next exists
if (cursor == students.size) { // (1)
cursor -= 1
}
}
...
}
질문
-
(1) : LinkedList<String> 타입의 students 변수 (생성자)
- 제가 처음 코틀린을 접할 때 분명히 students의 element가 바뀔 것이라 생각하여 변수 정의 시 var를 예측하였으나 예시 답안은 val이었습니다. @dntjr8096 님과 구글의 검색 결과, LinkedList의 주소 자체는 바뀌지 않기 때문에 val을 써도 된다는 의견을 얻었습니다. 이때 (불변하는) 주소란, LinkedList 내부 element 각각의 주소가 아니라 LinkedList 자체의 주소를 지칭한다고 봐도 될까요?
- moveDown과 delete 함수에서 쓰이는 students 변수 쓰임이 다릅니다. moveDown에서는
students.size
를, delete에서는this.studetns.removeAt(cursor)
를 사용하여, this의 유무가 차이가 납니다. 일반적으로 생성자에 정의되었기 때문에 this를 붙임으로써 StudentTable 클래스 자체를 지칭한다고 하지만 굳이 this를 붙이지 않아도 상관 없는지, 붙이면 어떤 것이 좋은지 궁금합니다.
-
(2) : Int 타입의 cursor 변수 (클래스 내부 변수)
- cursor는 명확히 가변적인 Int이므로 students나 cache에서 들었던 "List의 element는 변할텐데 왜 val을 사용했지" 라는 질문은 들지 않았습니다. 다만 cursor와 더불에 StudentClass 내부에 나란히 정의된 cache 변수와 비교했을 때 cursor는 this가 붙지 않았다는 점에서 비교대상으로 삼았습니다.
-
(3) : mutableListOf< Cached > 타입의 cache 변수 (클래스 내부 변수)
- (2)의 맥락에 따라
this.cache.add(Cached(cursor, removed))
에서는 왜 this가 붙어서 굳이 StudentClass를 지칭하는지 궁금합니다. (cursor는 붙지 않았다는 것과 비교하여) - (1)에서의 질문과 마찬가지로 왜 val이 붙었는지 궁금합니다.
- (2)의 맥락에 따라
일단 val, var 차이는 말씀해주신 게 맞고, this 여부에 따른 차이는 없어요 (여기선 그냥 제 멋대로 짠거긴 합니다) 굳이 붙여서 쓰는 경우를 생각해보자면,, 이름이 똑같은 로컬 변수랑 구분해서 가독성이나 의미를 더 잘 살릴수도 있을 것 같습니다. @YeonghyeonKO