KB IT's Your Life/Java

Java [05] 참조 타입

지식보부상님 2025. 4. 22. 11:43

[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