jnk1m
Foliage IT
jnk1m
전체 방문자
오늘
어제
  • 분류 전체보기 (209)
    • Today I Learned (34)
    • Java (47)
    • Database (15)
    • [NHN Academy] (27)
    • Spring (47)
    • HTML + CSS + JavaScript (11)
    • JSP (3)
    • Node.js (10)
    • React Native (2)
    • 기타 (8)
    • 스크랩 (5)

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
글쓰기 / 관리자
jnk1m

Foliage IT

Integer, StringBuilder 객체 생성 및 동등성 비교, append 메소드
Java

Integer, StringBuilder 객체 생성 및 동등성 비교, append 메소드

2023. 1. 26. 01:11

들어가기 전에 참고할만한 참조 타입 (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

 

    'Java' 카테고리의 다른 글
    • [LeetCode] #14 Longest Common Prefix
    • [LeetCode] #1 Two Sum
    • [On To Java 2] Chapter 3: How to declare variables
    • [On To Java 2] Chapter 2: How to compile and execute a simple program

    티스토리툴바