Java

[Java] 5. 참조 타입

Empty_Bottle 2022. 5. 26. 14:55

5-1) 참조 타입과 참조 변수

1. 기본 타입과 참조 타입

  • 기본타입
    • 실제 값이 변수에 저장됨
    • 기본 타입인 byte, char, short, int, long, float, double, boolean 변수가 해당
  • 참조타입
    • 메모리의 번지를 변수 안에 저장한다.
    • 번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다.

2. 메모리 사용 영역

  • 메소드 영역
    • JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역.
    • 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 코드 등을 분류해서 저장.
  • 힙 영역
    • 객체와 배열이 생성되는 영역
    • JVM 스택 영역의 변수나 다른 객체의 필드에서 참조.
    • 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 JVM에서 이를 쓰레기로 취급하고 쓰레기 수집기를 실행시켜 자동으로 제거.
  • JMV 스택 영역
    • 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행한다.
    • 프레임 내부에는 로컬 변수 스택이 있는데 기본 타입 변수와 참조 타입 변수가 추가되거나 제거된다.
    • 스택 영역에 변수가 생성되는 시점은 초기화가 될 때, 즉 최초로 변수에 값이 저장될 때.
    • 변수는 선언된 블록 안에서만 스택이 존재하고 블록을 벗어나 면 스택에서 제거된다.
    • 기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만 참조 타입 변수는 스택 영역에 힙 영역의 객체 주소를 갖는다.

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

  • 참조 타입 변수들 간의 ==, !=연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용.
  • 참조 타입 변수의 값은 힙 영역의 객체주소이므로 결국 번지 값을 비교하는 것이 된다.
  • 동일한 번지 값을 갖고 있다는 것은 동일한 객체를 참조한다는 의미.

 

4. null과 NullPointerException

  • null
    • 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있다.
    • null값도 초기값으로 사용할 수 있기 때문에 null로 초기화된 참조 변수는 스택 영역에 생성된다.
  • NullPointerException
    • 참조 타입 변수를 잘못 사용하면 발생하는 예외(오류)
    • 참조 변수가 null을 가지고 있을 경우에는 참조 객체가 없으므로 변수를 통해 객체를 사용할 수 없음.
    • null상태에서 존재하지 않는 객체의 데이터(필드)나 메소드를 사용하는 코드를 실행하면 NullPointerException이 발생.

5. String 타입

  • 자바는 문자열을 String 변수에 저장하기 때문에 String 변수를 우선 선언해야한다.
  • String은 문자열이 직접 변수에 저장되는 것이 아닌 String 객체로 생성되고 변수는 String 객체를 참조하기 때문에 String 변수라는 말은 엄밀히 말한다면 틀린 표현.
  • 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어있으나 new 연산자를 사용하여 직접 String 객체를 생성시키는 경우 new 연산자는 힙 영역에 새로운 객체를 만들 때 사용하는 연산자이기 때문에 new 연산자로 String 객체를 생성한 경우에는 다른 객체를 참조하게 된다.
  • 동일한 객체를 참조하는지의 여부가 아닌 내부 문자열을 비교하고자 하는 경우에는 'equals()'메소드를 사용하여  true 혹은 false를 반환받는다.

 

5-2) 배열

1. 배열이란

  • 배열은 같은 타입의 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스를 부여한 자료구조.
  • 인덱스는 0부터 시작한다.
  • 배열의 특징
  • 배열은 같은 타입의 데이터만 저장할 수 있다.
  • 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없다.

2. 배열 선언

타입 [ ] 변수; 타입 변수[ ];

3. 배열 생성

  • 값 목록으로 배열 생성
    • 타입 [ ] 변수 = {값0, 값1, 값2, 값3, …};
    • 중괄호{}는 주어진 값들을 항목으로 가지는 배열 객체를 힙에 생성하고, 배열 객체의 번지를 리턴한다.
    • 생성된 배열에서 내용을 바꾸고자 할 때에는 '배열명 [바꾸고자 하는 배열의 인덱스번호] = 바꿀 값'
    • 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않음.
    • 배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황
      →    변수 = new 타입[ ] {값0, 값1, 값2, 값3, …};
    • 메소드의 매개값이 배열일 경우에도 new 연산자를 사용
      →    ex)   int add(int [ ] scores){…}
                   int result = add(new int [ ] {95, 85, 90});
  •  new 연산자로 배열 생성
    • 값의 목록을 가지고 있지 않지만 향후 값들을 저장할 배열을 미리 만들고자 할 때에 사용.
    • 타입 [ ] 변수 = new 타입 [길이];
    • 길이는 배열이 저장할 수 있는 값의 개수

4. 배열의 길이

  • 배열에 저장할 수 있는 전체 항목의 개수를 의미
  • 코드에서 배열의 길이를 얻을 때에는 '.length'사용

 

5.다차원 배열

  • 값들이 행과 열로서 구성된 배열을 2차원 배열이라고 한다.
  • 타입 [ ] [ ] 변수 = { {값1, 값2,…}, {값1, 값2}…};
  • * 배열 안의 배열이 있는 것이라고 이해하고 있음...ㅜ [n번째 행][m번째 열]이렇게...

6.배열 복사

  • 배열은 한 번 생성한 후에는 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야한다.
  • for문을 사용하여 새로운 배열에 기존 배열의 길이(length)번 동안 대입할 수 있다.
  • System.arraycopy() 메소드 이용하는 방법
    ≫   System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
    • Object src=원본 배열
    • int srcPos= 원본 배열에서 복사할 항목의 시작 인덱스
    • Object dest=새 배열
    • int destPos=새 배열에서 붙여 넣을 시작 인덱스
    • int length=복사할 개수
      * 복사되지 않은 항목은 배열의 초기값이 유지된다.
      * 참조 타입 배열을 복사하는 경우 복사되는 값이 객체의 번지이므로 새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일함.

7.향상된 for문

for (타입 변수 : 배열){
       실행문;
}

① 배열에서 가져올 첫 번째 값이 존재하는지 평가

② 가져온 값을 타입 변수에 저장

③ 실행문 실행

④ 실행문을 모두 실행하고 나면 다시 배열에 돌아와 앞의 과정을 반복한다. 만약 가져올 다음 값이 없다면 for문은 종료.

 

5-3) 열거 타입

  • 한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입.

 

따흐흑 근데 열거타입이랑 배열타입이랑 다를 게 뭐람 따흐흑