가변/불변 객체는 무엇이며 용도는 무엇입니까?  - 1

"안녕, 아미고!"

"안녕, 빌라보!"

"오늘 Bilaabo는 가변 객체불변 객체 에 대해 알려줄 것입니다 .

"만든 후에 변경할 수 있는 객체를 가변 이라고 합니다 ."

"생성된 후에 변경할 수 없는 개체를 불변 이라고 합니다 ."

"개체를 변경할 수 있는지 여부를 결정하는 것은 무엇입니까?"

"새 클래스의 작성자는 해당 클래스의 객체를 불변으로 만들 수 있습니다. 예를 들어 모든 세터를 비공개로 만들면 객체에는 생성자와 게터만 있습니다. 즉, 생성된 후에는 변경할 수 없습니다. ."

"그게 무슨 소용이 있겠습니까?"

"불변 객체에는 많은 유용한 속성이 있지만 거의 모든 불변 객체에 공통적인 두 가지 속성을 강조하겠습니다."

1) 변경 불가능한 객체는 변경 가능한 객체보다 구현하기가 훨씬 쉽습니다.

2) 불변 객체는 여러 스레드에서 동시에 자유롭게 사용할 수 있습니다.

"개발자가 변경 불가능한 클래스를 작성하기로 결정하면 일반적으로 클래스의 변경 가능한 버전과 변경 불가능한 버전을 모두 만듭니다."

"하지만 하나가 아닌 두 개의 클래스를 작성하는 이유는 무엇입니까?"

"때때로 객체의 불변 버전이 가변 버전보다 훨씬 간단하고 빠를 때 가치가 있습니다. 그래서 그들은 두 가지 버전을 만듭니다. 일종의 ArrayList 및 LinkedList와 비슷합니다. 둘 다 목록이지만 하나는 특정 목적에 최적화되어 있습니다. 그리고 두 번째는 다른 사람들을 위한 것입니다."

"이미 더 말이 되는군요."

"변경 가능한 버전이 없는 순전히 변경 불가능한 클래스도 있습니다."

"하지만 그 객체 중 하나에서 무언가를 변경해야 한다면 어떻게 해야 할까요? 불변 객체로 실제로 무엇을 할 수 있습니까?"

"일반적으로 불변 클래스에는 개체를 변경하는 것처럼 작동하는 다양한 메서드가 포함되어 있지만 이러한 메서드는 개체 자체를 변경하는 대신 단순히 새 개체를 만들고 반환합니다."

"여기 몇 가지 예가 있어요:"

자바 코드 설명
String s = "london";
String s2 = s.toUpperCase();
결과적으로 s에는 «london» 문자열이 포함되고 s2에는 «LONDON» 문자열이 포함됩니다.
Integer i = 1;
Integer j = i;
j++;
실제로 일어나는 일은 다음과 같습니다.
Integer i = new Integer(1);
정수 j = i;
j = new Integer(i.getInt()+1);

"String 클래스는 변경할 수 없는 클래스입니다. 모든 String 객체는 변경할 수 없지만 그렇다고 해서 작업을 중단할 수는 없습니다. 예를 들어 String 클래스의 toUpperCase() 메서드는 문자열을 대문자로 변환합니다(예: 모든 소문자를 대체 합니다 ) . 그러나 이 메서드는 문자열 자체를 변경하지 않고 대신 새 문자열을 반환합니다. 이 새 문자열은 모든 문자가 대문자(대문자)라는 점을 제외하면 첫 번째 문자열과 동일합니다."

"Integer 클래스도 변경할 수 없는 클래스입니다. 모든 Integer 개체는 변경할 수 없습니다. Integer 개체를 변경할 때마다 실제로 새 개체를 만드는 것입니다."

"흥미롭다! 만세, 빌라보."

"만세! 빌라보 만세!"