참조타입(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객체가 참조 값을 잃으면 쓰레기 수집기(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);
}
}
열거 타입(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 |
댓글