컴퓨터 & 코딩/Java

[혼공학습단 10기][혼공자] 참조 타입과 참조 변수, 배열, 열거타입

구로그 2023. 6. 30. 14:52
728x90

✓ 기본타입과 참조타입 

Primitive type 기본 타입:  실제 값이 변수 안에 저장 됨 (정수, 실수, 문자, 논리 리터럴)

⇨ Reference Type (Non-Primitive Type) 참조 타입: 객체의 번지를 참조하는 타입. 메모리의 번지를 변수 안에 저장함 (배열, 열거, 클래스, 인터페이스, String) 

 

 

 

✏️ 메모리 사용 영역 Runtime Data Area

① 메소드 영역 Method Area: JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역. 클래스가 분류되어 저장된다.

힙 영역 Heap Area: 객체와 배열이 생성되는 영역. 만약 참조하는 변수나 필드가 없는 객체라면 Garbage Collector가 실행되어 자동으로 제거 된다. (코드로 직접 개체를 제거할 수 없음) 

String hobby = "여행"
hobby = null; 
// Garbage Collector가 구동되어 해당 객체가 힙 영역(메모리)에서 제거됨

JVM 스택 영역: 메소드 호출시 프레임이 추가되고(push) 메소드 종료시 프레임 제거된다(pop). 

 

 

❗️ 참조 타입 변수는 스택 영역에 힙 영역의 객체 주소를 갖는다. 따라서 참조 변수의 ==, != 연산은 "번지 값"을 비교하는 것이다. 

❗️ String의 경우 문자열 리터럴이 동일하다면 객체를 공유한다. 

 

같은 문자열 리터럴로 다른 객체를 생성하고 싶다면 new 연산자(객체 생성 연산자)를 사용한다.  

// name1 == name2 
String name1 = "Apple";
String name2 = "Apple";


// name1 != name2
String name1 = new String("Apple");
String name2 = new String("Apple");

 

+ NullPointerException: 변수가 null이라서 객체가 없는데 데이터나 메소드를 사용하는 코드를 실행할 때 발생하는 예외 

 

 

✓ 배열

- 배열 선언하는 두 가지 방법 

int[] intArray; 
String strArray[];

 

❗️ 같은 타입의 데이터만 저장 가능 (다른 타입을 저장하면 Type mismatch 컴파일 에러 발생)

❗️ 한 번 생성된 배열의 길이를 늘리거나 줄일 수 없다 

 

한 번 생성된 배열의 길이를 늘리고 싶다면 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다

for문 또는 System.arraycopy() 메소드

✏️ System.arraycopy()의 매개변수 
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
(원본 배열, 복사할 항목의 시작 인덱스, 새 배열, 새 배열에서 붙여넣을 시작 인덱스, 복사할 개수)
// for문 사용하기 
int[] oldIntArray = {1, 2, 3};
int[] newIntArray = new int[5];

for(int i=0; i<oldIntArray.length; i++) {
    newIntArray[i] = oldIntArray[i];
}

// System.arraycopy() 메소드 사용하기
String[] oldStrArray = {"java", "array", "copy"}; 
String[] newStrArray = new String[5];

System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);

 

 

- 배열 생성하기: 중괄호 사용 

String[] fruits = {"apple", "banana", "orange"};

//이미 선언한 뒤에는 중괄호를 사용한 배열 생성 허용 안 됨
String[] obst;
obst = {"apfel", "banana", "orange"}; // 컴파일 에러 

// 배열을 미리 선언한 후 나중에 값이 결정되는 상황이라면 new 연산자 사용하기
String[] obst;
obst = new String[] {"apfel", "banana", "orange"}; 

// default 값으로 채워진 특정 길이 배열 생성하기 
int[] intArray = new int[5];

+ 배열의 길이를 알아내는 방법: 배열 변수.length 

+ 다차원 배열 생성 방법  (예시: 2행 3열 행렬을 만드는 코드) 

int[][] scores = new int[2][3];

 


 

향상된 for문 

루프 카운터 변수, 증감식을 사용하지 않고 배열 및 컬렉션 항목의 개수만큼 반복할 수 있음 

int[] scores = {95, 70, 85, 95};

int sum = 0;
for (int score : scores) { // 타입 변수 : 배열
    sum = sum + scores;
}

 


✓ 열거타입

한정된 값만을 갖는 참조 타입 (예: 요일, 계절 등)

 

- 열거 타입 선언 

열거 타입의 이름을 정한 후 해당 이름으로 소스파일(.java)을 생성 

(이때 첫 글자는 대문자로 하고 나머지는 소문자, 여러 단어로 구성됐을 때는 카멜)

열거 상수를 선언 할 때는 모두 대문자로 작성, 여러 단어로 구성됐을 때는 스네이크 

이때 열거 상수는 열거 객체로 생성됨 (열거 타입은 참조 타입, 열거 상수는 객체) 

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

 

 

더보기

Why and when to use Enums? 

Use enums when you have values that you know aren't going to change, like month, days, colors, deck of cards, etc. 

 

(https://www.w3schools.com/java/java_enums.asp

반응형