ch. 5 참조타입

2021. 3. 17. 19:23Java

728x90

5.1 데이터 타입 분류

  • 기본타입
  • 참조타입
    • 배열
    • 열거타입
    • 클래스
    • 인터페이스
  • 기본 타입은 변수에 실제 값을 저장
  • 참조 타입은 배열, 열거, 클래스, 인터페이스를 이용
  • 선언된 변수는 메모리의 주소를 값으로 저장

5.2 메모리 사용영역

  • 메소드 영역
  • 메소드 영역에서는 코드에서 사용되는 클래스들을 클래스 로더를 통하여 읽어들인다.
  • 클래스별 런타임 상수풀, 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드 등을 분류하여 저장.
  • 메소드 영역은 JVM이 시작할 때 생성되며, 모든 스레드가 공유한다.

  • 힙 영역
  • 힙 영역은 객체, 배열이 생성되는 부분
  • 힙 영역에 객체와 배열이 생성되면, JVM 스택 영역의 변수나 다른 객체의 필드에서 참조할 수 있다.
  • 참조하지 않으면, garbage collector를 실행시켜 자동으로 힙 영역에서 제거

  • JVM 스택(Stack) 영역
  • JVM 스택 영역은 각 스레드마다 하나씩 존재.
  • 스레드가 시작될 때 할당됨.
  • JVM 스택은 메소드를 호출할 때마다 프레임을 추가한다
  • 메소드가 종료되면 해당 프레임을 제거한다.
  • 프레임 내부의 로컬 변수 스택 : 기본 타입 변수, 참조 타입 변수가 추가 되거나 제거
  • 이 영역에서 변수가 생성되는 시점은 초기화 될 때
  • 변수는 선언된 블록 안에서만 스택에 존재, 블록을 벗어나면 스택에서 제거

5.3 참조 변수의 ==, !=연산

  • 기본 타입 변수의 ==, !=연산은 변수의 값을 비교
  • 참조변수는 변수가 동일한 객체를 참조하는지 비교
  • 참조변수의 값은 힙 영역의 객체 주소
  • 따라서 참조변수는 주소 값을 비교
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private static void sample() {
        String s1 = "홍길동";  
        String s2 = "홍길동";
        String s3= new String("홍길동");
        String s4= new String("홍길동");
        System.out.println(s1==s2);//주소가 같다
        System.out.println(s3==s4);//주소가 다르다
        System.out.println(s1.equals(s4)? "true":"false");
        
        
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
        
        
        s1= s1+"님"// 문자열 변경불가 새문자 생성 - 기존문자 dangling
        s2= s2+"님"// 문자열 변경불가 새문자 생성 - 기존문자 dangling
        System.out.println(s1==s2);//false //주소가 다르다
        
        
        
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
        System.out.println(System.identityHashCode(s3));
        System.out.println(System.identityHashCode(s4));
        //문자저장 방식
    }
cs

5.4 null과 NullPointerException

  • 참조변수는 힙 영역의 객체를 참조하지 않는 뜻으로 null로 초기화 할 수 있음
  • null 값도 초기값으로 사용할 수 있음
  • null로 초기화된 참조 변수는 스택 영역에 생성
  • 참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나인 NullPointerException
  • 참조 변수가 null 값을 가지고 있을 경우, 참조 변수의 객체를 사용할 수 없음
1
2
3
4
5
6
7
8
9
10
private static void sample3() {
        // 참조형은 일반적으로 null로 초기화
        String s =null;
        System.out.println(s);
        System.out.println(s == null);
        s="asdf";
        System.out.println(s.length()); //참조형에는 기능툴
        
        
    }
cs

5.5 String타입

  • 문자열은 참조 타입
  • 참조타입으로 선언한 변수는 스택에 쌓이고 실제 값은 힙에 쌓임
  • 변수의 값으로는 힙에 쌓인 실제 값의 주소를 가짐.
  • 즉 문자열은 String의 객체로 생성되고 변수는 String의 객체를 참조
  • 각기 다른 개체에 같은 값을 선언하면 같은 주소를 받아 == 비교시 일치함
  • 다른 개체에 다른 값을 선언 하면 다른 주소를 할당 받아 비교시 일치 하지 않음5.1 데이터 타입 분류
  • 기본타입
  • 참조타입
  • 배열
  • 열거타입
  • 클래스
  • 인터페이스
  • 기본 타입은 변수에 실제 값을 저장
  • 참조 타입은 배열, 열거, 클래스, 인터페이스를 이용
  • 선언된 변수는 메모리의 주소를 값으로 저장

 

728x90

'Java' 카테고리의 다른 글

프로그래머스 코딩테스트 연습 level1 크레인 인형뽑기게임  (0) 2021.04.02
ch. 5 참조타입 - 배열 타입  (0) 2021.03.17
ch. 4 조건문과 반복문  (0) 2021.03.11
Ch.2 변수와 타입  (0) 2021.03.08
Ch.1 java 시작하기  (0) 2021.03.08