대학교

자바 - (5) 참조 타입

매 석 2023. 10. 6. 19:35
반응형

참조 타입

출처 : 혼자 공부하는 자바

참조 타입에는 객체, 배열, 클래스 등이 존재한다.

기본 타입 변수와 참조 타입 변수의 차이점은

메모리 사용 영역에 있다.

출처 : 혼자 공부하는 자바

참조 타입 변수의 경우 기본적으로 힙 영역에 주소를 가지며 참조하는 형태로 저장된다.

출처 : 혼자 공부하는 자바

메소드 영역은 클래스 별로 정적 필드, 상수, 생성자 등을 분류해 저장한다.

힙 영역은 객체와 배열이 생성되는 영역이다.

JVM 스택 영역은 메소드가 호출되면 프레임이 추가되고, 종료되면 프레임이 제거된다.

출처 : 혼자 공부하는 자바

JVM 스택 영역의 사진이다. 메소드를 호출할 때 스택 영역에 변화를 알 수 있다.

참조 타입 변수의 경우 스택 영역에 힙 영역에 생성된 객체의 주소를 가진다.

참조 타입 변수의 비교는 번지 값의 비교를 의미한다.

즉 같은 객체를 참조하면 true, 그렇지 않으면 false를 반환한다.

참조 타입 변수가 null값을 가진다면 객체를 참조하지 않는다는 뜻이다.

추가적으로 참조 타입 변수가 null인데 데이터나 메소드를 사용할 경우

NullPointerException이라는 오류가 발생하게 된다.

출처 : 혼자 공부하는 자바

String 타입을 보면 다른 문자열을 가지는 경우 다른 주소를 참조하지만,

같은 문자열을 가지는 경우 동일한 주소를 참조한다.

만약 이를 새로운 힙 영역에 생성하기 위해서는 new String("신용권")와 같이 저장하면 된다.

참조 타입은 "=="이 번지를 비교하기에 문자열을 비교하기 위해서는 equals()를 사용한다.

 

배열

데이터를 연속된 공간에 나열하고 각 데이터에 인덱스를 부여한 자료구조이다.

같은 타입의 데이터만 저장할 수 있으며, 길이를 늘리거나 줄일 수 없다.

출처 : 혼자 공부하는 자바

기본적으로 위와 같이 배열을 생성할 수 있다.

선언 후 다른 실행문에서 값 목록으로 배열 생성하는 것은 불가능하다.

이를 위해서는 아래와 같이 선언해야 한다.ㅍ

출처 : 혼자 공부하는 자바

기본적으로 배열의 길이는 배열.length를 사용해 길이를 확인할 수 있다.

추가적으로 다차원 배열도 구현할 수 있다.

참조 타입 배열의 경우 각자 객체의 번지를 가지고 있다.

배열의 복사는 System.arraycopy()를 이용해 복사한다.

 

출처 : 혼자 공부하는 자바

배열을 이용해서 for문을 진행하면 루프 카운터 변수나 증감식을

사용하지 않고 구현할 수 있다.

 

열거 타입

출처 : 혼자 공부하는 자바

열거타입은 우선 소스파일로 생성하고 이후에 위와 같은 형식으로 선언해준다.

열거 상수는 열거 객체로 생성되어 힙 영역에 저장된다.

 

출처 : 혼자 공부하는 자바

 

활용 문제

Calendar를 사용해서 일요일이면 "일요일에는 축구를 합니다."를 출력하고,

그렇지 않으면 "열심히 자바 공부를 합니다"를 출력한다.

이는 Week.java 파일에 열거 타입을 사용하여 열거상수로 월요일~일요일을 저장한다.

정답 코드 :

Week.java

package myprac;

public class Week {
	public enum Week{
		MONDAY,
		TUESDAY,
		WEDNESDAY,
		THURSDAY,
		FRIDAY,
		SATURDAY,
		SUNDAY
	}
}

EunmWeekExample.java

package myprac;
import java.util.Calendar;

import sec03.exam01.Week;
public class EnumWeekExample {
	public static void main(String[] args) {
		Week today=null;
		Calendar cal = Calendar.getInstance();
		int week= cal.get(Calendar.DAY_OF_WEEK);
		
		switch(week) {
		case 1:
			today=Week.SUNDAY; break;
		case 2:
			today=Week.MONDAY; break;
		case 3:
			today=Week.TUESDAY; break;
		case 4:
			today=Week.WEDNESDAY; break;
		case 5:
			today=Week.THURSDAY; break;
		case 6:
			today=Week.FRIDAY; break;
		case 7:
			today=Week.SATURDAY; break;
		}
		if(today==Week.SUNDAY) {
			System.out.println("일요일에는 축구를 합니다.");
		}
		else {
			System.out.println("열심히 자바 공부합니다.");
		}
	}

}