들어가기 전에 참고할만한 참조 타입 (Reference Type)에 대한 기본 지식
- 참조 타입은 생성 시에 객체로 만들어지며 데이터(객체)가 있는 곳의 위치를 저장한다.
- 데이터는 분리된 메모리 영역에 저장된다.
- 이 말인즉, 데이터 자체가 아닌 데이터가 저장된 곳의 위치 값을 저장한다는 의미.
Integer integerValue1 = 1000;
Integer integerValue2 = integerValue1;
Integer 타입의 객체 integerValue1을 선언하고 값을 1000으로 초기화했다.
Integer 타입의 객체 integerValue2를 선언하고 integerValue1의 값을 참조하도록 했다.

Equality comparison (integer, ==): true
Equality comparison (integer, equals): true
동등성 비교를 했을 때 결과이다. 현재 값과 주소가 같으니 모두 참이 출력된다.
객체의 동등성 비교를 할 때 주의해야 할 점은, == 연산자와 equals 메소드의 비교 대상이 다르다는 점이다.
💡 == (!=) 연산자: 두 참조 타입 변수가 동일한 객체를 참조하는지 주소를 비교한다.
equals 메소드: The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object. 👉 인수가 null이 아니고 객체와 동일한 int 값을 포함하는 Integer 객체인 경우에 true를 반환한다. 즉, 값을 비교한다.
integerValue1++;
intergerValue1 객체의 값을 증가시켰다.

intergerValue1의 주소값이 변경된 것을 볼 수 있다.
💡Integer, String, Float, Double, Byte, Long, Short, Boolean, Character -> 참조 타입은 불변 객체이다.
한번 객체가 생성된 이후에 객체의 값을 변경할 수 없다.
객체의 값을 변경했을 때 객체의 주소 값이 바뀌는 것을 볼 수 있다. 이는 객체의 값이 수정되는 것이 아니라, 새로운 값을 가진 새로운 객체가 생성이 됨을 의미한다.
만약 integerValue2의 값도 수정된다면 참조가 사라진 Integer@688은 Garbage Collector (GC)가 수거해 간다.
Equality comparison (integer, ==): false
Equality comparison (integer, equals): false
값, 주소 전부 달라졌으니 false가 출력된다.
Integer integerValue3 = 1001;
equals는 값을 비교한다고 했으니 주소가 달라도 값만 같으면 true가 나오는지 확인해보자!

결과는 참입니다~
다음으로는 StringBuilder 객체를 비교해 보자
StringBuilder sb1 = new StringBuilder("123");
StringBuilder sb2 = sb1;
StringBuilder 객체 sb1를 생성하여 값을 "123"으로 초기화했다.
동일하게 StringBuilder 타입의 객체 sb2를 생성하여 sb1의 주소를 참조하게 했다.

sb2의 주소값이 sb1이 동일한 것을 볼 수 있다.
Equality comparison (StringBuilder, == ): true
Equality comparison (StringBuilder, equals): true
주소, 값 모두 동등하니 결과 역시 참이 나온다.
sb1.append("4");
방금 전에 wrapper 클래스인 Integer의 값을 변경했을 때는 객체의 주소 값이 바뀐 것을 확인할 수 있었다.
만약에 여기서 append()를 하게 되면 어떻게 될까?

StringBuilder 타입의 객체의 값이 변경되어도 객체가 새로 생성되지 않는다. 그러므로 주소값에도 변경이 없다.
💡 기본적으로 불변 객체인 스트링을 수정할 수 있도록 지원하는 클래스가 바로 스트링 버퍼와 스트링 빌더이다.
스트링 버퍼와 스트링 빌더는 한번 생성 후 수정이 되지 않아 많은 garbage를 만들게 되는 스트링의 특성을 보완한다.
append()는 해당 시퀀스에 새로운 값을 더해주는 메소드이다. 마치 사슬을 연결하는 것처럼 뒤에 다른 값을 더할 수 있다.
StringBuilder(Buffer)에 속한 메서드지만, String 뿐만 아니라 다른 참조 타입들을 모두 지원한다.
append() 메서드를 사용한 이후에는 StringBuilder(Buffer) 타입으로 변환되어 저장이 된다.
Equality comparison (StringBuilder, == ): true
Equality comparison (StringBuilder, equals): true
두 객체가 동일한 주소 값을 참조하고 있으니 값도 동일하다.
결과는 모두 참이 나온다.
참조한 사설
What is Append In Java? & its Implementation in StringBuilder and StringBuffer Classes | upGrad blog
Append in Java concatenates an object, character, and integer to a string argument making an immutable string mutable. Learn this interesting Java concept here.
www.upgrad.com