Home 문자열은 어떤 언어에서도 불변할까?
Post
Cancel
Preview Image

문자열은 어떤 언어에서도 불변할까?

내가 최근 자주 사용하는 언어는 JVM based 언어이거나, Python 인데, 최근 이펙티브 자바를 다시 한 번 읽으면서, JVM based 언어에 대해서는 String을 불변으로 관리하는 것을 알게 되었으나, 문득 알고리즘 문제를 풀던 도중, Python에서의 String은 불변인지, 그럼 다른 언어들에 대해서는 String에 대해서 어떻게 처리하는지 궁금해졌다.

아래 내용은 Are your strings immutable? 글을 참고해서 적어보았다.


불변성의 개념과 상수와의 차이점

불변성(immutability)상수(Constants)와 다른 개념이다. 상수는 변경할 수 없다는 점에서 불변이지만, 불변성은 값의 할당이 아니라, 값을 나타낸다.

불변 클래스란…?

불변 클래스란…? 아래는 이펙티브 자바를 공부하면서 정리한 내용이다.

(현재… 정리를 진행 중이기에, 조만간 블로그에도 남기지 않을까 싶다…)

클래스를 불변으로 만들려면 다음 다섯 가지 규칙을 따르면 된다.

  1. 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다.
  2. 클래스를 확장할 수 없도록 한다.
    1. 하위 클래스에서 객체의 상태를 변하게 만드는 사태를 방지하기 위함
    2. 상속을 막는 대표적인 방법은 final 로 선언하는 것이지만, 다른 방법도 뒤에 살펴볼 것
  3. 모든 필드를 final 로 선언한다.
    1. 시스템이 강제하는 수단을 이용해 설계자의 의도를 명확히 드러내는 방법
    2. 새로 생성된 인스턴스를 동기화 없이 다른 스레드로 건네도 문제없이 동작하게끔 보장하는데도 필요
      • https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.5
      • final fields also allow programmers to implement thread-safe immutable objects without synchronization. A thread-safe immutable object is seen as immutable by all threads, even if a data race is used to pass references to the immutable object between threads. This can provide safety guarantees against misuse of an immutable class by incorrect or malicious code. final fields must be used correctly to provide a guarantee of immutability.
  4. 모든 필드를 private 으로 선언한다.
    1. 필드가 참조하는 가변 객체를 클라이언트에서 직접 접근해 수정하는 일을 막아준다.
    2. 기술적으로는 기본 타입 필드나 불변 객체를 참조하는 필드를 public final 로만 선언해도 불변 객체가 되지만, 이렇게 하면 다음 릴리스에서 내부 표현을 바꾸지 못하므로, 권하지는 않는다.
  5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
    1. 클래스에 가변 객체를 참조하는 필드가 하나라도 있다면 클라이언트에서 그 객체의 참조를 얻을 수 없도록 한다.
    2. 이런 필드는 절대 클라이언트가 제공한 객체 참조를 가리키게 해서는 안되며,
    3. 접근자 메서드가 그 필드를 그대로 반환해서도 안된다.
    4. 생성자, 접근자, readObject 메서드 모두에서 방어적 복사를 해야한다.

이제 다른 언어들은 어떨까?

그러면 이제, 다른 언어들에서는 문자열에 대해서 어떻게 처리하는지 요약해보았다.

모든 언어를 찾기는 힘들었고, 제대로 파악하지 못한 언어는 남기지 않았다. (C, C++, Swift 등)

확인하는대로 추가 및 정리하지 않을까…?

  • Java, C#, JavaScript, Python, Go , Kotlin, Rust
    • 문자열은 변경할 수 없다.
  • Ruby, PHP
    • 문자열은 변경 가능하다.

References

This post is licensed under CC BY 4.0 by the author.

어쩌면 참이라고 믿고 싶었던 명제에 대해 거짓이라는 증명을 알게 되었을 때 현명한 대처 방법에 대해서.

jekyll serve 실행 시 in require': cannot load such file -- webrick (LoadError)가 발생하는 경우 해결 방법