참조 타입 & 배열 타입

Bummy·2023년 6월 28일
0

JAVA

목록 보기
3/11

참조 타입

데이터 타입 분류

  • 자바의 데이터 타입에는 크게 기본 타입과 참조 타입으로 분류된다.
  • 기본 타입은 정수, 실수, 문자, 논리 리터럴을 저장
  • 참조 타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 의미
💡 참조 타입인 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리의 번지를 값으로 갖는다.
  • 변수는 스택 영역에 생성되고 객체는 힙 영역에 생성된다.

힙(Heap) 영역

  • 힙 영역은 객체와 배열이 생성되는 영역
  • 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조

JVM 스택(Stack) 영역

  • JVM 스택 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
  • 자바 프로그램에서 추가적으로 스레드를 추가하지 않았다면 존재하는 스레드는 main 스레드 한가지만 존재하게 된다.

null과 NullPointerException

  • 참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다.
  • 참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나로 NullPointerException이 있다.
  • NullPointerException이 발생하면, 예외가 발생된 곳에서 객체를 참조하지 않은 상태로 참조 타입 변수를 사용하고 있음을 알아야한다.

String

  • 자바에서 문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
  • 즉, String 변수에는 String 객체의 주소 값이 저장된다.
💡 동일한 String 객체이건 다른 String 객체이건 상관없이 문자열만을 비교할 때에는 String 객체의 equals() 메소드를 사용해야한다.

배열 타입

배열

  • 배열은 같은 타입의 데이터만 저장할 수 있다. int 배열은 int 값만 저장 가능하고, String은 문자열만 저장 가능하다.

배열 선언

  • 참조할 배열 객체가 없다면 배열 변수는 null 값으로 초기화될 수 있다.
  • 배열 변수를 미리 선언한 후, 값 목록들이 나중에 결정되는 상황이라면 new 연산자를 사용해서 값 목록을 지정해주면 된다.
💡 타입 [] 변수 = new 타입[길이];

객체를 참조하는 배열

  • 기본 타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 직접 값을 갖고 있지만, 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있다.
  • String[] 배열은 각 항목에 문자열이 아니라, String 객체의 주소를 가지고 있다. 즉 String 객체를 참조하게 된다. → 따라서 String[] 배열의 항목도 결국 String 변수와 동일하게 취급되어야 한다. 문자열을 비교하기 위해서는 == 연산자 대신 equals() 메소드를 사용해야한다.

배열 복사

  • 배열 간의 항목 값들을 복사하려면 for문을 사용하거나 System.arraycopy() 메소드를 사용하면 된다.
💡 System.arraycopy(Object src, int srcPos, Object dest, int desPos, int length); → src 매개값은 원본 배열이고, srcPos는 원본 배열에서 복사할 항목의 시작 인덱스 → dest 매개값은 새 배열이고, destPos는 새 배열에서 붙여넣을 시작 인덱스이다. → length는 복사할 개수이다.

향상된 for문

for(타입 변수 : 배열){
	//실행문
}
  1. for문이 처음 실행될 때 배열에서 가져올 첫 번째 값이 존재하는지 평가한다.
  2. 가져올 값이 존재하면 해당 값을 변수에 저장한다.
  3. 실행문을 실행한다.
  4. 실행문이 모두 실행되면 다시 루프를 돌아 배열에서 가져올 값이 존재하는지 평가한다.
  5. 만약 다음 가져올 항목이 없으면 for문이 종료된다.

→ for문의 반복 횟수는 배열의 항목 수가 된다.

0개의 댓글