이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Java] "" vs new String("")

  • 2023.03.19 00:58
  • Language/Java
글 작성자: SeoArc

String

Java에는 문자열을 쉽게 다룰 수 있는 String Class가 존재한다.

아마 객체 중에서 제일 많이 사용한 것이 무엇일까 생각해보면 거의 당연히 String 일거라 생각한다.

이렇게 많이 사용하는 만큼 사용법도 잘 알고 사용하면 금상첨화가 될 것이다.

 

먼저, String은 다음과 같은 방식들로 선언할 수 있다.

public class Main {
    public static void main(String[] args) {
        String s1 = "";
        String s2 = new String("");
    }
}

분명 딱 봐도 선언하는 방식이 다르다. 그런데 둘에게 차이가 없을까? 분명 어떠한 차이라도 있지 않을까?

그럼 이제부터 그 차이를 한 번 살펴보자

 

"" vs new String("")

위 코드를 보고 어떤 생각이 떠올랐는가?

아마 대표적으로 참조 타입이 생각났을 것이다.

우리가 보통 객체를 생성하면 각각의 객체들은 모두 다 다르다는 것을 알고 있다. 그런데 String도 원시 타입(primitive type)이 아닌 참조 타입(reference type)이다.

 

그럼 두 객체를 == 연산자를 통해 비교하면 false가 떠야하는 것이 맞다. 한 번 확인해보자.

public class Main {
    public static void main(String[] args) {
        String s1 = "";
        String s2 = new String("");

        System.out.println(s1 == s2);
    }
}
false

당연히 우리가 예상한대로 false가 뜨는 것을 확인할 수 있다.

 

그런데, 다음과 같이 작성하면 true가 뜨게할 수 있다.

public class Main {
    public static void main(String[] args) {
        String s1 = "";
        String s2 = new String("").intern();

        System.out.println(s1 == s2);
    }
}
true

 

우리가 나오는대로 동작했지만 세부적으로 자세히 알진 못한다. 그럼 이런 결과가 나오게된 이유를 자세히 알아보자.

 

JVM

그 이유를 알기 전 먼저 간단하게 JVM에 대해 살펴보자.

JVM은 자바 가상 머신(Java Virtual Machine)으로 자바가 실행될 수 있도록 실행환경을 만들어주는 소프트웨어이다. 즉, 자바 바이트코드를 실행할 수 있는 주체이다.

 

JVM은 다음과 같이 구성되어 있다.

여기서 우리는 Heap Area(힙 영역)을 자세하게 살펴볼 것이다.

힙 영역은 new 명령어로 생성된 인스턴스와 객체가 저장되는 구역이다. 이 부분은 모든 Thread가 공유하며 GC(Garbage Collection)이슈는 이 영역에서 일어난다.

 

String도 객체이기 때문에 이 힙 영역에서 관리된다.

 

String Constant Pool

JVM의 힙 영역에는 String Constant Pool 이라는 것이 존재한다.

이는 말 그대로 String을 상수처럼 사용하도록 만든 Pool이다. 즉, 이미 전에 생성된 String이 있다면 해당 객체를 재사용하여 String 객체가 생성되어 차지하게 되는 메모리를 줄여주어 효율적으로 사용할 수 있도록 해준다.

이는 디자인 패턴에 Flyweight Pattern(플라이웨이트 패턴)을 참고하면 이해가 더 쉬울 것이다.

 

하지만 new String()를 통해 String을 생성하게 되면 String Constant Pool이 아닌 외부의 힙 영역에 객체가 생성된다. 이 때문에 참조 값이 달라 false가 뜨는 것이다.

 

여기서 위 코드에서 본 것과 같이 intern() 메서드를 쓰게 되면 new String()으로 생성된 문자열이 String Constant Pool에 등록되어 true 결과를 도출할 수 있던 것이다.

저작자표시 (새창열림)

'Language > Java' 카테고리의 다른 글

[Java] 바이트코드 조작  (0) 2023.03.22
[Java] JVM  (0) 2023.03.20
[Java] 아무 생각 없이 생성했는데 동일한 객체?  (0) 2023.03.09
[Java] abstract class vs interface  (0) 2023.01.20
[Java] stream vs for  (1) 2023.01.17

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Java] 바이트코드 조작

    [Java] 바이트코드 조작

    2023.03.22
  • [Java] JVM

    [Java] JVM

    2023.03.20
  • [Java] 아무 생각 없이 생성했는데 동일한 객체?

    [Java] 아무 생각 없이 생성했는데 동일한 객체?

    2023.03.09
  • [Java] abstract class vs interface

    [Java] abstract class vs interface

    2023.01.20
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (106)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (3)
      • Spring (1)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 네트워크
  • algorithm
  • 그래프
  • java
  • 알고리즘
  • 자바
  • graph
  • network

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바