ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java의 ==, equals 연산자를 통한 문자열 비교
    Programming/Java 2022. 2. 27. 10:39

    JVM의 런타임 데이터 영역 구조

    Stack 영역

    - 함수 호출 시 각각이 Call stack에 쌓이며 함수 내에서의 변수와 포인터 등이 저장되는 영역으로, 함수 종료 시 다같이 해제되며 사라진다.

     

    Heap 영역

    - 할당되어 사용되는 것들이 메모리에 쌓이는 영역으로, 프로그래머가 할당/해제 관리한다.

    - C계열에서는 잘 관리하는 것이 필요하고, Java에서는 참조가 끊어진 할당 객체들이 쌓이면 Garbage Collector가 동작하여 수거하고 메모리 해제를 해준다.

     

    Constant Pool

    - Method Area(클래스 파일 정보 저장 위치)에 속하고, 상수 자료형을 저장해두고, 동일한 값의 중복을 막아 메모리 낭비를 방지한다. 

    - 즉, 이미 있는 값이 들어오면 새로 만들지 않고 먼저 들어있던 같은 값의 주소를 같이 참조하게 한다.

     

    Java에서의 String 생성과 비교 방식

    # String 생성

    String ex1 = "hello"; // A
    String ex2 = new String("hello"); // B

    위 코드에서처럼 문자열의 생성 방식에 따라 할당되는 위치가 다르다.

    A의 경우, 런타임 데이터 영역의 Constant Pool에 저장되어 == 연산자로 비교 가능하다.

    B의 경우, 런타임 데이터 영역의 Heap에 저장되어 equals 함수로 비교한다.

     

    # String 비교

    == 연산자 : 주소 값을 비교

    equals 함수 : 값 자체를 비교

    String ex1 = "hello"; // A
    String ex2 = new String("hello"); // B
    
    System.out.println(ex1 == "hello"); // true
    System.out.println(ex2.equals("hello")); // true

    == 연산자는 주소 값을 비교하므로, 위의 예제에서처럼 Constant Pool에 할당된 리터럴 방식의 문자열 비교 시 같은 값의 주소를 참조하기 때문에 == 연산자로 비교가 가능하다.

    equals 함수는 값 자체를 비교하므로, 위의 예제에서처럼 Heap에 할당된 문자열 객체의 문자열 값이 같은지 확인한다.

     

     

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

    JVM 구조  (0) 2022.02.19
    Java 활용 포켓몬 게임  (0) 2022.01.30
    [Java] 예외(Exception)  (0) 2021.05.19

    댓글

Designed by Tistory.