ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java 자바] 5. 참조 타입 ① 데이터 타입 분류, 메모리 사용 영역, String
    Programming/Java 2022. 7. 30. 15:11
    반응형

    5-1. 데이터 타입 분류

    - 기본 타입(Primitive type): 정수, 실수, 논리 데이터 타입 (byte, char, short, int, long, float, double, boolean)
    - 참조 타입(Reference type): 이외의 모든 데이터 타입(String, 배열, 열거, 클래스, 인터페이스 등)

    => 둘은 메모리에 저장되는 방식이 다르다!

    // [기본 타입 변수]
    int age = 25;
    double price = 100.5;
    
    // [참조 타입 변수]
    String name = "에린";
    String hobby = "코딩";

    - 기본 타입 변수들은 변수와 값이 스택 영역에 직접 저장
    - 참조 타입 변수들은 변수와 힙 영역에 저장되어 있는 객체의 주소값이 스택 영역에 저장
     => 주소를 따라 객체를 참조한다는 뜻에서 참조 타입 변수라고 함

    5-2. 메모리 사용 영역

    5-2-1. 메소드(Method) 영역

    - 코드에서 사용되는 클래스(~.class)를 클래스로더로 읽어
       클래스별 상수풀, 필드, 메소드 생성자 코드 등을 분류하여 저장
    - JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
    - static 으로 정의된 클래스, 변수 등이 저장

    5-2-2. 힙(Heap) 영역

    - 객체와 배열이 생성되는 영역으로, 스택 영역의 변수나 다른 객체의 필드에서 참조함
    - 참조하는 변수나 필드가 없다면 의미 없는 객체가 되므로 GC에서 자동으로 제거

    5-2-3. 스택(Stack) 영역

    - 기본자료형, 지역변수, 파라미터, 리턴값, 연산에 사용되는 임시 값 등이 저장되는 영역
    - 생성 시점: 변수가 초기화될 때
    - 소멸 시점: 변수가 선언된 블록을 벗어날 때 제거

    5-3. 참조 변수의 ==, != 연산

    - 기본 타입 변수의 동등 비교 연산은 변수의 값이 같은지, 아닌지를 비교
    - 참조 타입 변수는 동일 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용

      (동일한 주소 값을 갖고 있다는 것은 동일한 객체를 참조한다는 의미)

    5-4. null 과 NullPointerException

    - 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 의미로 null 값을 가질 수 있음(초기화 하지 않으면 null 값을 가짐)
    - null로 초기화된 참조 변수는 스택 영역에 생성됨

    - 참조 타입 변수가 null을 가지고 있을 경우, 해당 변수는 사용이 불가
      => 이를 사용하려고 하면 NullPointerException 예외가 발생

    5-5. String 타입

    - String은 대표적인 참조 타입 변수이며, ( " " ) 을 사용하여 변수 값 초기화

    String name = "에린";
    String hobby = "코딩";
    [❗️Syntax Alert] String 변수의 값이 같을 경우, 같은 참조값을 가지지만
    새로운 String객체를 생성하여 동일 값을 넣으면 같은 참조값 주소를 가지게 된다.
    String name1 = "에린";
    String name2 = "에린";
    String name3 = new String("에린");
    
    System.out.println(name1 == name2);	// true
    System.out.println(name1 == name3);	// false

    - name1, name2 => 동일 참조값을 가짐
    - name3 => 생성자를 통해 새로운 String 객체 생성, 다른 참조값 가짐
    - 동등비교시 참조값 주소를 기준으로 비교하므로,
       name3는 name1, name2와 같지 않음

     

     

     

     

    // String 의 힙 영역에 저장되어 있는 실제 값을 비교하고 싶을 경우엔 equlas() 메소드 사용
    
    System.out.println(name1.equlas(name3));	// true 반환

     

    반응형

    댓글

Designed by Tistory.