본문 바로가기

Language/Java

자바 == 연산자

반응형

자바에서 == 연산자 역할.

1. 자료가 원시타입일 때는 원시타입의 value를 비교하여 같으면 true, 다르다면 false를 리턴해준다.

2. 자료가 참조타입일 때는 참조하고 있는 객체가 같은지 비교하여 같으면 true, 다르다면 false를 리턴해준다.

 

public class ExampleJavaTest
{
    static class TestData
    {
        int index;
        String name;

        public TestData(int index, String name)
        {
            this.index = index;
            this.name = name;
        }
    }

    @Test
    public void myTest()
    {

        int nData1 = 1;
        int nData2 = 1;

        System.out.println(nData1 == nData2);

        TestData data1 = new TestData(1, "1");
        TestData data2 = new TestData(1, "1");

        System.out.println(data1 == data2);

        String strData1 = "ab";
        String strData2 = "ab";

        System.out.println(strData1 == strData2);
    }
}

위 코드에서 int는 원시타입이기 때문에 == 연산으로 비교했을 때 true가 출력된다.

TestData는 참조 타입이기 때문에 멤버 변수들의 값이 같아도 false가 출력된다.

하지만 String은 참조 타입임에도 true가 출력된다.

String은 StringPool에서 관리하기 때문에 똑같은 문자열이 존재한다면 그 문자열을 재활용하는 특징을 가지고 있다.

 

그렇다면 String을 new 키워드를 사용하여 직접 인스턴스화를 하면 어떻게 될까?

public class ExampleJavaTest
{
    @Test
    public void myTest()
    {
    	String strIData1 = new String("ab");
        String strIData2 = new String("ab");

        System.out.println(strIData1 == strIData2);
    }
}

일반 참조타입과 마찬가지로 false가 리턴되는 것을 알 수 있다.

new 키워드를 통해 문자열을 Heap 영역에 직접 생성하기 때문에 일반 참조타입과 똑같이 false가 출력되는 것이다. 

반응형

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

합집합, 교집합, 차집합 ArrayList로 구현해보기  (0) 2021.04.29
Java로 자료구조(LinkedList, Stack, Queue) 구현해보기  (0) 2021.04.26
제네릭(Generic)  (0) 2021.04.02
Interface Comparable  (0) 2020.11.29
Java Cipher  (0) 2019.10.24