▩목 차▩
1. 나의 의문점 및 해결
1. 나의 의문점 및 해결
val people = "사람"
val people2 = "사람"
println("${people == people2}") // true 결과 반환, String 타입인 경우(기본자료형도 마찬가지) 값만 같으면 주소값과 값도 같다고 나온다.
println("${people === people2}") // true 결과 반환, String 타입인 경우(기본자료형도 마찬가지) 값만 같으면 주소값과 값도 같다고 나온다.
println("${people === null}") // null과 비교했을 시 false 반환
val name = buildString { append("이름") }
val name2 = buildString { append("이름") }
println("${name == name2}") //true 결과 반환, stringBuilder의 값 비교시에는 안에 들어있는 값에 대해 비교하기 때문에 true를 반환했다.
println("${name === name2}") //false 결과 반환, stringBuilder를 생성시에 heap 영역에 각각의 주소에 저장되기 때문에 false의 값이 반환되었다.?? String Pool 이용을 안하는건가..?
[의문점]
StringBuilder의 경우는 주소값을 비교(===)했을때는 false를 안에 들어있는 값에 대해서 비교(==)를 할때는 정상적인 값을 비교하여 true를 출력하게 되는데.. 이점을 보게되면 StringBuilder 클래스만 조금 특이한 케이스 인 것 일까?
만약 String 객체와 같이 String pool에 저장한다고 치면 객체 주소 비교(===)의 경우 String과 같이 true가 나와야 하지 않을까? [ 일반적인 클래스의 값 비교(==)와 주소값 비교(==)는 오버라이딩을 하지 않는 이상 힙 메모리 영역에 있는 주소값을 비교하게 되는데.. StringBuilder 클래스 경우, 값 비교(==)를 오버라이딩 해주지 않아도 정상적으로 값을 비교하고 주소 값 비교(===)는 String pool을 이용하지 않는 것 때문에 이런 생각을 했다. ]
[해결]
==> 정답 StringBuilder를 내부적으로 찾아보면 되었다.
StringBuilder는 String과 같이 StringPool에서 생성되는것이 아니라 객체가 계속해서 생성되기 때문에 주소값 부분에서는 False를 반환하였고, 값은 동일했기 때문에 True를 반환하였던 것이다...
즉, StringBuilder는 항상 new String으로 String 객체를 만들기 때문이다.
'Kotlin > 궁금한 점 의문 해결' 카테고리의 다른 글
data class의 얕은복사, 깊은복사 의문점 해결 (0) | 2023.03.13 |
---|---|
얕은 복사를 이용해 문제를 풀었을때의 의문점 해결 (0) | 2023.03.13 |