[Java] 기본타입과 참조타입의 메모리 사용 영역과, == 와 equlas() 차이

    자바는 크게 기본타입, 참조타입으로 분류 기본타입은 정수, 실수, 문자, 논리, 리터럴를 저장하는 타입이다.
    참조타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스를 말한다. 

    기본타입은 변수에 실제 값을 저장하지만 참조타입은 변수안에 메모리의 번지수를 저장한다. 번지를 통해 객체를 참조한다는 뜻에서 참조타입이라고 부른다. String은 클래스이기 때문에 문자열은 참조타입니다.

     

    기본타입과 참조타입을 알아야 하는건 데이터가 자바에서 메모리 사용영역에 어떻게 할당되는지 알기 위해서이다.

    자바에서 메모리 사용영역은 크게 아래 3가지로 나뉜다.

    [JAVA 메모리 3가지 사용영역]

    1. 메서드 영역 : 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다. 클래스로더로 클래스파일을 일겅서 정적 필드와 메서드를 저장하는데 중요한건 생성자는 여기에 디폴트로 들어간다. 

     

    2. 힙 영역 : 객체와 배열이 생성되는 영역이고 참조하는 변수나 필드가 없으면 의미 없는 객체가 된다. 중요한건 가비지 컬렉션(Garbage Collector) 으로 정리가 된다. 메서드 영역은 정리되지 않는다.

     

    3. JVM 스택 영역 : 메소드를 호출할때마다 프레임을 추가(push)하고 메소드가 종료되면 해당 프레임을 제거(pop) 한다. 추가 되고 제거되는 아래 이미지을 보면 왜 스택으로 할 수 밖에 없는지 알 수 있다. if블럭을 만나면 프레임을 추가하고 if블럭이 종료 되면 프레임이 제거(pop) 되어야 하는데 스택이여야 마지막에 들어온 프레임을 먼저 제거가 가능하다

     

    스택영역에서 v1의 주소값에 'A' 데이터가 그대로 들어간것을 볼 수있다.  'A' 는 문자타입으로 기본 타입이기 때문이다.

     

    [== 와 equlas() 차이 equls() 쓰는이유]

    문자열을 만들때 생성 방식에 따라 Heap 영역에 생성되는 결과가 다르다. 만약에 문자열 리터럴만으로 변수에 담았다면 

    힙 영역에 있는 String Pool에 저장된다. 하지만 new String() 생성자 함수로 문자열을 만들었다면 String pool에 저장되지 않는다.

    String 객체 생성 방식에 따른 힙 영역에 메모리 할당

     

     

    위에서 s1 == s2 를 비교 하면 같지만 s1 == s3 가 틀린이유는  == 의 비교 연산자는 단순히 스택영역의 값으로 비교 하기 때문이다. s1과 s2의 스택영역의 값이 같은 이유는 s2가 만들어질때 이미 "Cat"이 String Pool에 있어서 String pool 영역에 있는 "Cat"을 참조했기 때문이다.

     

    하지만 s3는 new String() 생성자 합수로 힙영역에 따로 추가를 시켰기 때문에 다른 주소값이므로 s2 == s3는 틀리다. 그래서 객체 안의 String 문자열을 비교 하기 위해서 equls() 함수를 쓰는것이다.

     

    참고 : 혼자 공부하는 자바 / 신용권  https://www.yes24.com/Product/Goods/74269939  

    참고 : https://starkying.tistory.com/entry/what-is-java-string-pool

    댓글

    Designed by JB FACTORY