programing tip

불변이란 무엇을 의미합니까?

itbloger 2020. 8. 16. 19:55
반응형

불변이란 무엇을 의미합니까?


문자열이 불변이라면 그 의미는 .... (자바 스크립트를 가정하자)

var str = 'foo';

alert(str.substr(1)); // oo

alert(str); // foo

문자열에 대해 메서드를 호출 할 때 수정 된 문자열을 반환하지만 초기 문자열은 변경하지 않는다는 의미입니까?

문자열이 변경 가능하다면 두 번째 alert()도 반환 oo될까요?


개체를 인스턴스화하면 속성을 변경할 수 없음을 의미합니다. 첫 번째 경고에서 foo를 변경하지 않습니다. 새 문자열을 만들고 있습니다. 이것이 두 번째 경고에서 oo 대신 "foo"를 표시하는 이유입니다.

문자열에 대해 메서드를 호출 할 때 수정 된 문자열을 반환하지만 초기 문자열은 변경하지 않는다는 의미입니까?

예. 문자열이 생성되면 아무것도 변경할 수 없습니다. 이제 이것이 str변수에 새 문자열 객체를 할당 할 수 없다는 의미는 아닙니다 . str이 참조하는 현재 객체를 변경할 수 없습니다.

문자열이 변경 가능하다면 두 번째 alert ()도 oo를 반환한다는 의미입니까?

기술적으로는 아니요, 하위 문자열 메서드가 새 문자열을 반환하기 때문입니다. 객체를 변경 가능하게 만들어도 메서드가 변경되지 않습니다. 변경 가능하게 만드는 것은 기술적으로 하위 문자열이 새 문자열을 만드는 대신 원래 문자열을 변경하도록 만들 수 있음을 의미합니다.


낮은 수준에서 불변성은 문자열이 저장된 메모리가 수정되지 않음을 의미합니다. 문자열을 생성 "foo"하면 값을 저장하기 위해 일부 메모리가 할당됩니다 "foo". 이 메모리는 변경되지 않습니다. 예를 들어를 사용하여 문자열을 수정하면 substr(1)새 문자열이 생성되고을 저장할 메모리의 다른 부분이 할당됩니다 "oo". 이제 메모리에 두 개의 문자열이 "foo"있고 "oo". "foo"더 이상 사용하지 않더라도 쓰레기가 수거 될 때까지 계속 붙어 있습니다.

문자열 연산이 상대적으로 비용이 많이 드는 이유 중 하나입니다.


불변이란 변경하거나 수정할 수 없음을 의미합니다.

따라서 문자열에 값을 할당 할 때이 값은 대체되는 것이 아니라 처음부터 만들어집니다. 따라서 동일한 문자열에 새 값이 할당 될 때마다 복사본이 생성됩니다. 따라서 실제로는 원래 값을 변경하지 않습니다.


JavaScript에 대해 확신 할 수는 없지만 Java에서 문자열은 "문자열 상수 풀"을 사용하여 불변성에 대한 추가 단계를 수행합니다. 문자열은 문자열 리터럴 ( "foo") 또는 String클래스 생성자를 사용하여 생성 할 수 있습니다 . 문자열 리터럴로 구성된 문자열은 문자열 상수 풀의 일부이며 동일한 문자열 리터럴은 항상 풀의 동일한 메모리 주소가됩니다.

예:

    String lit1 = "foo";
    String lit2 = "foo";
    String cons = new String("foo");

    System.out.println(lit1 == lit2);      // true
    System.out.println(lit1 == cons);      // false

    System.out.println(lit1.equals(cons)); // true

위의 경우 lit1둘 다 lit2동일한 문자열 리터럴을 사용하여 구성되므로 동일한 메모리 주소를 가리키고 있습니다. lit1 == lit2결과 true는 정확히 동일한 객체이기 때문입니다.

그러나 cons클래스 생성자를 사용하여 생성됩니다. 파라미터가 동일한 문자열 상수이지만, 새로운 메모리의 생성자 할당은 cons의미가 cons같은 오브젝트가 아닌 lit1lit2동일한 데이터를 포함 불구.

물론 세 문자열은 모두 동일한 문자 데이터를 포함하므로 equals메서드를 사용하면 true가 반환됩니다.

(물론 두 가지 유형의 문자열 구성은 변경할 수 없습니다.)


불변은 값을 변경할 수 없음을 의미합니다. 일단 생성 된 문자열 객체는 불변으로 수정할 수 없습니다. 문자열의 하위 문자열을 요청하면 요청 된 부분이있는 새 문자열이 생성됩니다.

대신 문자열을 조작하는 동안 StringBuffer를 사용하면 StringBuffer가 문자열을 문자 배열의 용량과 배열의 길이를 보유하는 변수가있는 문자 배열에 저장하므로 작업이 더 효율적입니다 (문자 배열 형식의 문자열).


변경 가능성의 교과서 정의는 책임이 있거나 변경 또는 변경 될 수 있습니다. 프로그래밍에서 우리는 시간이 지남에 따라 상태가 변경 될 수있는 객체를 의미하는 단어를 사용합니다. 변경 불가능한 값은 정반대입니다. 생성 된 후에는 변경할 수 없습니다.

이것이 이상하게 느껴진다면, 우리가 항상 사용하는 많은 값들은 사실상 불변이라는 것을 상기시켜 드리겠습니다.

var statement = "I am an immutable value";
var otherStr = statement.slice(8, 17);

I think no one will be surprised to learn that the second line in no way changes the string in statement. In fact, no string methods change the string they operate on, they all return new strings. The reason is that strings are immutable – they cannot change, we can only ever make new strings.

Strings are not the only immutable values built into JavaScript. Numbers are immutable too. Can you even imagine an environment where evaluating the expression 2 + 3 changes the meaning of the number 2? It sounds absurd, yet we do this with our objects and arrays all the time.


From strings to stacks... a simple to understand example taken from Eric Lippert's blog:

Path Finding Using A* in C# 3.0, Part Two...

A mutable stack like System.Collections.Generic.Stack is clearly not suitable. We want to be able to take an existing path and create new paths from it for all of the neighbours of its last element, but pushing a new node onto the standard stack modifies the stack. We’d have to make copies of the stack before pushing it, which is silly because then we’d be duplicating all of its contents unnecessarily.

Immutable stacks do not have this problem. Pushing onto an immutable stack merely creates a brand-new stack which links to the old one as its tail. Since the stack is immutable, there is no danger of some other code coming along and messing with the tail contents. You can keep on using the old stack to your heart’s content.

To go deep on understaning immutability, read Eric's posts starting with this one:

Immutability in C# Part One: Kinds of Immutability


One way to get a grasp of this concept is to look at how javascript treats all objects, which is by reference. Meaning that all objects are mutable after being instantiated, this means that you can add an object with new methods and properties. This matters because if you want an object to be immutable the object can not change after being instantiated.

참고URL : https://stackoverflow.com/questions/3200211/what-does-immutable-mean

반응형