Kotlin/Kotlin Language

[Kotlin] StringBuilder

chattymin 2023. 8. 4. 15:17
728x90
반응형

StringBuilder가 뭘까?

StringBuilder 는 코틀린에서 동적으로 문자열을 조작할 수 있는 객체다.

그럼 다른건 동적이지 않나?

 

String의 경우 연산 방식이 다르다.

var text = "abc"
text += "def"

println(text) //abcdef

이게 우리가 아는 일반적인 방식일거다. 

봐라 "abc"에 "def"가 추가돼서 동적으로 "abcdef"가 되지 않았나! 라고 생각할 수도 있다.

하지만 실상은 다르다

 

text -> "abc"

 

위와 같은 모양으로 text라는 변수가 "abc"라는 값을 가리키고(담고) 있었다고 가정하자.

"def"를 더할 경우 아래와 같은 모양이 된다.

 

        "abc"
text -> "abcdef"

이게 뭘 의미할까.

text라는 변수에 "def"를 더해 "abcdef"를 만드는 것이 아닌, text와 "def"를 더해서 text에 저장한다는 뜻이다.

그렇기 때문에 새로운 string을 하나 생성하여 재할당해주는 것이다.

 

그럼 이게 왜 문제된다는걸까?

 

메모리 낭비

기존의 값에 더하는 것이 아니라 새로운 string을 하나 만드는 것이기 때문에 새로 할당하는 칸 만큼의 공간이 낭비된다.

더해서 붙인다고 해도 어차피 할당되는게 아닌가? 라고 생각한다면 틀린 말은 아니다.

그런데 새로 생기는 것은 "def"의 공간이 아닌, "abcdef"의 공간이 생기는 것이다. 즉, 원래 text가 가지고 있던 값인 "abc"만큼의 공간이 낭비된다.

 

Garbage 생성

앞서 말했듯, 새로운 string을 생성하여 변수에 할당하는 방식이다. 그렇다면 이전에 만들었던 "abc"는 어디로 가는걸까?

어디로가긴. 쓰레기 되는거지.

그렇기 때문에 쓰레기가 생기는 단점이 있다.

 

또 어떤사람들은 JVM에는 Garbage Collection가 있으니까 좀 생겨도 되지않냐. 할수도 있다.

뭐... 틀린말은 아니다. 근데 Garbage Collection의 작동 방식을 본다면 성능상의 단점이 있다. 그렇기 때문에 가능한 Garbage가 발생하지 않도록 해야한다. 

조금 더 깊게 설명하면 "Stop The World" -> "Mark And Sweep"이라는 과정을 통해서 Garbage Collection이 작동된다. 그렇기때문에 기능이 정지하고, 탐색 후 삭제하는 과정을 거치기때문에 시간이 소요된다.

 

더 자세한 내용은 나중에 글 한번 써봐야겠다.

여튼 String은 저렇게 동작한다.

 

 

그래서 StringBuilder는 어떻게 동작하냐

뭐 별거 없다.

그냥 위에 말한것과 다르게 하나를 쭉 사용하는 친구다.

 

근데 StringBuilder는 String이 아니기때문에 특정 함수들을 사용해줘야한다.

var stringBuilder = StringBuilder()

stringBuilder.append("Hello ")
stringBuilder.append("World")
println(stringBuilder.toString()) //Hello World
	
stringBuilder.insert(0,"!!")
println(stringBuilder.toString()) //Hello World!!
	
stringBuilder.delete(0,6)
println(stringBuilder.toString()) //World!!

append : 맨 뒤에 원하는 값을 추가해준다

insert : 내가 지정한 index에 원하는 값을 추가해준다

delete : 지정한 범위의 값을 없애준다.

 

이거말고도 많다. 필요하면 찾아보면서 공부하길.

 

println함수를 보면 알겠지만, StringBuilder를 출력하려면 toString으로 바꿔줘야한다.

 

 

사실 개발할때는 귀찮아서 그냥 String으로 한다 ㅎ...

코테용으로 앞으로 써보려고 공부해봤다. 물론 아직 습관이 안붙어서 String으로 쓰고있긴 한데 연습해봐야지

728x90
반응형