본문 바로가기
Java

자바 #005_참조

by haheehee 2022. 12. 12.

참조타입(Reference Type) - 객체(object)의 번지를 참조하는 타입


메모리 사용 영역

!! 자바에서만 해당되는 내용 !!

메모리 사용영역은 메소드 영역, 힙 영역, JVM 스택 영역이 있다.

메소드 영역에는 클래서별 static field, constant, constructor, method 코드 등을 분류하여 저장하고,

힙 영역은 객체와 배열이 생성되는 영역이며,

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

 

참조 타입 변수는 스택영역에 힙 영역에 생성된 객체의 주소를 갖는다. 

** 자바에서 char 타입은 2byte이다!!!

 

참조타입에서 동일 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때에는 == 혹은 != 연산자를 사용

 

참조타입 변수는 null값을 가질 수 있다.(객체를 참조하지 않음)

하지만, null값을 갖는 것은 보안에 매우 좋지 않기 때문에 비추천

 

예외(Exception)

프로그램 실행 도중 발생하는 오류

NullPointException : 참조타입변수가 null 상태에서 존재하지 않는 객체의 데이터나 메소드를 사용할 때 발생

 


String 타입

String 변수에 문자열 리터럴을 대입하면, String 객체가 생성되고 변수가 String 객체를 참조한다.

String title1 = "하히의 티스토리";

 

new 연산자(객체 생성 연산자)를 사용하여 

힙 영역에 새로운 String 객체를 생성.

String title2 = new String("하히의 티스토리");

 

==은 번지비교

equals()함수를 사용하여 문자열을 비교

public class StringEqualsEx {
	public static void main(String[] args) {
		String strVar1 = "하히의 티스토리";
		String strVar2 = "하히의 티스토리";
		
		if(strVar1 == strVar2) {
			System.out.println("strVar1과 strVar2는 참조가 같음");
		} else {
			System.out.println("strVar1과 strVar2는 참조가 다름");			
		}
		
		if(strVar1.equals(strVar2)) {
			System.out.println("strVar1과 strVar2는 문자열이 같음");
		}
		
		System.out.println();
		
		String strVar3 = new String("하히의 티스토리");
		String strVar4 = new String("하히의 티스토리");
		
		if(strVar3 == strVar4) {
			System.out.println("strVar3과 strVar4는 참조가 같음");
		} else {
			System.out.println("strVar3과 strVar4는 참조가 다름");			
		}
		
		if(strVar3.equals(strVar4)) {
			System.out.println("strVar3과 strVar4는 문자열이 같음");
		}
	}
}

string타입 비교 결과

 

String객체가 참조 값을 잃으면 쓰레기 수집기(Garbage Collector)가 메모리에서 자동으로 제거.


배열

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

같은 타입의 데이터만 저장 가능

한번 생성된 배열의 길이는 고정.(후에 배열의 길이는 수정할 수 없음)

ublic class ArrayEx {
	public static void main(String[] args) {
		int[] scores = {80, 90, 97};
		
		System.out.println("scores[0] : " + scores[0]);
		System.out.println("scores[1] : " + scores[1]);
		System.out.println("scores[2] : " + scores[2]);
		
		System.out.println();
		
		int sum = 0;
		for(int i=0; i<3; i++) {
			sum += scores[i];
		}
		System.out.println("총합 : " + sum);
		double avg = (double) sum / 3;
		System.out.println("평균 : " + avg);
	}
}

배열 결과

배열 변수를 선언한 후에는 다른 실행문에서 값 목록으로 배열 생성이 불가능하다. 

 

배열 변수를 미리 선언한 후 값 목록이 나중에 결정된다면,

new 연산자를 통해 값 목록을 지정해주어야 한다.

 

new 연산자로 배열을 처음 생성할 때, 배열은 자동적으로 기본값으로 초기화된다. (0(숫자) 혹은 null값(문자열))

특정 인덱스 위치에 새로운 값을 저장 가능해진다. (arrayA[2] = 2;)

 

배열의 길이는 .length로 파악할 수 있다.

public class ArrayEx {

	public static void main(String[] args) {
		int[] arr1 = new int[3];
		for(int i=0; i<3; i++) {
			System.out.println("arr1[" + i + "] : " + arr1[i]);
		}
		arr1[0] = 10;
		arr1[1] = 20;
		arr1[2] = 30;
		for(int i=0; i<3; i++) {
			System.out.println("arr1[" + i + "] : " + arr1[i]);
		}
		System.out.println();
		
		double[] arr2 = new double[3];
		for(int i=0; i<3; i++) {
			System.out.println("arr2[" + i + "] : " + arr2[i]);
		}
		arr2[0] = 0.1;
		arr2[1] = 0.2;
		arr2[2] = 0.3;
		for(int i=0; i<3; i++) {
			System.out.println("arr2[" + i + "] : " + arr2[i]);
		}
		System.out.println();
		
		String[] arr3 = new String[3];
		for(int i=0; i<3; i++) {
			System.out.println("arr3[" + i + "] : " + arr3[i]);
		}
		arr3[0] = "1월";
		arr3[1] = "2월";
		arr3[2] = "3월";
		for(int i=0; i<3; i++) {
			System.out.println("arr3[" + i + "] : " + arr3[i]);
		}
	}
}

배열 결과

다차원 배열 

2차원 배열의 경우, 1차원 배열이 다시 1차원 배열을 참조

 

참조 타입 배열

값 저장이 아닌, 객체의 번지를 가지고 있다.

public class ArrayReferenceEx {
	public static void main(String[] args) {
		String[] strArray = new String[3];
		strArray[0] = "Java";
		strArray[1] = "Java";
		strArray[2] = new String("Java");
		
		System.out.println( strArray[0] == strArray[1] );
		System.out.println( strArray[0] == strArray[2] );
		System.out.println( strArray[0].equals(strArray[2]) );
	}
}

참조타입 배열 결과

 

배열 복사 

1. for문을 사용하여 하나 하나를 복사

2. System.arraycopy()를 사용하여 복사

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 의 형태

public class ArrayCopyEx {
	public static void main(String[] args) {
		int[] oldIntArray = {1, 2, 3};
		int[] newIntArray = new int[5];
		
		for(int i=0; i < oldIntArray.length; i++) {
			newIntArray[i] = oldIntArray[i];
		}

		for(int i=0; i < newIntArray.length; i++) {
			System.out.print(newIntArray[i] + ", ");
		}
		
		String[] oldStrArray2 = { "java", "array", "copy" };
		String[] newStrArray2 = new String[5];
		
		System.arraycopy(oldStrArray2,  0, newStrArray2, 0, oldStrArray2.length);
		
		for(int i=0; i < newStrArray2.length; i++) {
			System.out.print(newStrArray2[i] + ", ");
		}
	}
}

배열 복사 결과


향상된 for문

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

public class AdvancedForEx {
	public static void main(String[] args) {
		int[] scores = { 95, 71, 84, 93, 87 };
		
		int sum = 0;
		for(int score : scores) {
			sum = sum + score;
		}
		System.out.println("점수 총합 = " + sum);
		
		double avg = (double) sum / scores.length;
		System.out.println("점수 평균 = " + avg);
	}
}

향상된 for문 결과


열거 타입(Enum)

몇 가지로 한정된 값만 갖는 타입.

열거 상수를 저장.

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

열거타입 변수를 선언하고,

import java.util.Calendar;

public class EnumWeekEx {
	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;
		}
		System.out.println("오늘의 요일은 : " + today);
		
		if(today == Week.SUNDAY) {
			System.out.println("일요일에는 휴식을 취한다. ");
		} else {
			System.out.println("자바 공부를 한다. ");
		}
	}
}

열거 상수를 저장한 후, 사용.

열거타입 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 혼자 공부하는 자바 (신용권)

'Java' 카테고리의 다른 글

자바 : 피라미드 * 만들어보기  (0) 2022.12.14
자바 #006_클래스  (0) 2022.12.12
자바 #004_조건문, 반복문  (0) 2022.12.12
자바 #003_연산자  (0) 2022.12.12
자바 #002_변수, 리터럴  (0) 2022.12.08

댓글