Java [05] 참조 타입
[1] 데이터 타입 분류
◈ 데이터 타입
- 기본 타입(primitive type): 정수형(byte, char, short, int, long), 실수형(float, double), 논리형(boolean)
- 참조 타입(reference type): 배열 타입(=, 열거 타입, 클래스, 인터페이스
◈ 기본 타입과 참조 타입의 차이
- 기본 타입: 변수가 값 자체를 스택(stack) 영역에 저장
- 참조 타입: 변수는 객체가 생성된 메모리의 번지수를 스택(stack)에 저장 실제 객체는 힙(Heap) 영역에
[2] 메모리 사용 영역
◈ 메소드, 힙, 스택 영역
- JVM 이 구동되면 OS에서 할당받은 메모리 영역을 메소드 / 힙 / 스택으로 구분하여 저장함
- 메소드 영역
- 바이트코드 파일 읽은 내용이 저장
- 클래스별로 상수, 정적 필드, 메소드 코드, 생성자 코드 저장됨
- 힙 영역
- 객체가 생성되는 영역
- 객체의 번지는 메소드 영역과 스택 영역의 상수 & 변수에서 참조 가능
- 스택 영역
- 메소드 호출할 때마다 생성되는 프레임 저장되는 여역
- 메소드 호출 끝나면 자동 제거됨
- 로컬 변수 스택이 존재하여 기본/참조 타입 변수 생성&제거됨
[3] 참조 타입 변수의 ==, != 연산
◈ ==, != 연산자
- 객체 번지 비교해 변수 값 같은지 아닌지 조사
=> 객체 번지 같으면 동일한 객체 참조, 다르면 다른 객체 참조하고 있음을 의미
int[] arr1 = {1, 2, 3, 4, 5};
int[] arr2 = {1, 2, 3, 4, 5};
int[] arr3 = arr2;
System.out.println(arr1 == arr2); // false 출력
System.out.println(arr2 == arr3); // true 출력
- 내부의 값이 같은지 비교하기 위해서는 .equals 이용
[4] null 과 NullPointerException
◈ null 값
- 참조 타입 변수를 힙 영역의 번지수에 저장하고 있지 않을 때
- null 로 초기화하면 스택 영역에 생성됨
- 기존에 값 가지던 변수에 null 대입하면 힙 영역과의 참조를 끊음 => 쓰레기(garbage) 가 됨
◈ NullPointerException
- 변수가 null 인 상황에서 메소드 사용하고자 할 때 발생 (참조가 유효하지 않은 경우)
◈ Garbage Collector
- garbage가 된 힙 영역의 객체를 JVM이 자동으로 탐색하여 메모리 회수
public class GarbageObjectExample {
public static void main(String[] args) {
String car1 = "자동차";
String car2 = car1;
car1 = null; // 힙 영역과의 연결을 끊는다.
System.out.println(car2); // 결과는 자동차
}
}
[5] 문자열(String) 타입
◈ String 타입
- 문자열은 String 객체로 생성
- 문자열 리터럴이 동일하면 String 객체 공유함 (아래 예시 참고)
public class StringCompare {
public static void main(String[] args) {
String str1 = "홍길동";
String str2 = "홍길동";
System.out.println(str1 == str2); // true
}
}
◈ 객체 생성 연산자
- new 연산자로 생성 가능 => 새로운 객체를 만듦 => 문자열 리터럴이 같더라도 다른 메모리 영역 가짐
public class EqualsExample {
public static void main(String[] args) {
String str1 = "홍길동";
String str2 = "홍길동";
String str3 = new String("홍길동");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
}
}
◈ 문자 추출
- .charAt(idx) : 해당 인덱스의 문자 값 추출
◈ 문자열 길이
- .length() : 문자열 길이
◈ 문자열 대체
- oldStr.replace(str1, str2) : [oldStr]에서 str1을 str2로 바꾼 새로운 문자열 생성 (자바는 문자열 변경 불가)
◈ 문자열 인덱싱
- .substring(idx1, idx2) : idx1에서 idx2 전까지 문자열 추출 / idx2 생략시 끝까지
◈ 문자열 찾기
- .indexOf(str) : str이 시작되는 인덱스 리턴 / 없으면 -1
- .contains(str) : str이 포함되어 있는지 여부 / true, false 를 리턴
◈ 문자열 분리
- .split(구분자) : 해당 구분자로 문자열 잘라서 배열로 제공
[6] 배열(Array) 타입
◈ 배열
- 같은 타입의 값만 저장 가능
- 배열 길이 수정 불가
◈ 배열 생성
타입[] 변수 = { el1, el2, el3, ... }
- 선언과 동시에 값 대입하여 생성하는 경우
타입[] 변수;
변수 = new 타입[] { el1, el2, ...}
- 선언과 값 대입 다른 시점에 하는 경우 반드시 new 타입[] 필요!
- 배열을 매개변수로 하는 함수 호출시에도 마찬가지로 new 타입[] { } 형식으로 호출해야 함
타입[] 변수 = new 타입[길이];
- 길이 지정하여 생성
◈ new 로 배열 생성시 초기화 값
◈ 배열 길이
- .length : 배열 길이 (읽기만 가능)
[7] 다차원 배열
◈ 다차원 배열
- 배열 항목에 또 다른 배열을 대입한 배열
타입[][] 변수 = {
{값1, 값2, ... }
{값3, 값4, ... },
....
};
[9] 배열 복사
◈ 배열 복사
- System.arraycopy(arr1, idx1, arr2, idx2, length): 배열 복사
- arr1: 복사할 배열 / idx1: 복사 시작 인덱스 /
- arr2: 저장할(붙여넣을) 배열 / idx2: 저장 시작 인덱스 / length: 복사할 길이
[10] 배열 항목 반복을 위한 향상된 for 문
◈ 향상된 for 문
[12] 열거(Enum) 타입
◈ Enum 타입
- 한정된 값만 갖는 타입 ex) 요일, 계절 등
- Enum 타입 이름으로 소스파일(.java) 생성 후 코드로 정의하면 됨
- Enum 타입 이름으로 일반적으로 첫문자 대문자, 캐멀 스타일로 이름 지음
- 대입은 열거타입 변수명 = 열거타입.상수
Week.java (Enum 타입)
public enum Week {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
실제 사용, 대입
Week today = Week.SUNDAY;
today == Week.SUNDAY; // true