05_참조 타입

Tasker_Jang·2024년 2월 26일
0

05. 참조 타입

1. 자바의 데이터 타입은 크게 기본 타입과 참조 타입으로 분류된다.

int primitiveType = 10;
String referenceType = "Hello";

2. 참조 타입이란 객체의 번지를 참조하는 타입이다. (배열, 열거, 클래스, 인터페이스)

int[] array = {1, 2, 3};
enum Example { VALUE1, VALUE2 }
class MyClass {}
interface MyInterface {}

3. 참조 타입으로 선언된 변수는 객체가 생성된 메모리 번지를 저장한다.

MyClass obj = new MyClass();

4. 변수들은 모두 스택이라는 메모리 영역에 생성된다.

int stackVariable = 5;

5. 참조 타입 변수는 힙 메모리 영역에 번지를 저장한다.

MyClass obj = new MyClass();

6. 메모리 영역은 크게 메소드 영역과 힙 영역 스택 영역으로 나뉜다.

  • 메모리 영역은 코드와 클래스 정보가 저장되는 메소드 영역, 객체 인스턴스가 저장되는 힙 영역, 메소드 호출 시 생성되는 프레임이 저장되는 스택 영역으로 나뉜다.

7. 메소드 영역: 바이트코드 파일의 내용이 저장되는 영역

  • 바이트코드 파일의 내용이 메소드 영역에 저장된다.

8. 힙 영역: 객체가 생성되는 영역

  • 객체는 힙 영역에 생성된다.

9. 스택 영역: 메소드를 호출할 때마다 생성되는 프레임이 저장되는 영역. 메소드 호출이 끝나면 프레임은 자동 제거

  • 메소드 호출 시 스택 영역에 프레임이 생성되고, 메소드 실행이 종료되면 해당 프레임이 자동으로 제거된다.

10. 참조 타입은 동일한 객체를 참조할 때 ==의 연산 결과가 참이된다. 하지만 다른 객체를 참조할 때는 false이다.

MyClass obj1 = new MyClass();
MyClass obj2 = obj1;
System.out.println(obj1 == obj2); // 참 (true)

11. 값이 같다고 해서 ==이 true가 되는 것이 아니다. 참조 변수는 번지가 같은 지를 비교하는 것이다.

  • == 연산자는 메모리 번지를 비교하므로, 값이 같더라도 참조 변수의 번지가 다르면 false가 된다.

12. null도 초기값으로 사용할 수 있다. null로 초기화된 참조 변수는 스택 영역에 생성된다.

MyClass obj = null;

13. 예외란 실행 도중에 발생하는 오류를 뜻한다.

try {
    // 예외 발생 가능한 코드
} catch (Exception e) {
    // 예외 처리
}

14. 객체를 사용하려면 해당 객체를 참조하는 변수를 이용해야하는데 변수에 null을 대입하여 번지를 잃게 만들어 객체를 사용못하게 할 수 있다.

MyClass obj = new MyClass();
obj = null; // 객체 참조 끊기

15. 어떤 변수에서도 객체를 참조하지 않으면 해당 객체는 프로그램에서 사용할 수 없는 객체가 된다.

  • 객체가 더 이상 참조되지 않으면 가비지 컬렉터에 의해 자동으로 제거된다.

16. 객체를 제거하는 유일한 방법은 객체의 모든 참조를 없애는 것이다.

  • 객체를 참조하는 모든 변수에 null을 할당하여 참조를 제거해야 한다.

17. 변수에 다른 값을 대입하면 다른 번지가 대입되어 이전 번지를 잃어 버린다.

int oldVariable = 10;
oldVariable = 20; // 이전 값 잃어버림

18. 다른 변수가 참조하고 있을 경우 null을 대입한다고 쓰레기가 되지는 않는다.

MyClass obj1 = new MyClass();
MyClass obj2 = obj1;
obj1 = null; // obj2는 여전히 참조하고 있음

19. String 타입은 객체로 생성된다. 값을 대입하면 객체의 번지가 각각 대입되는 것이다.

String str1 = "Hello";
String str2 = "World";

20. 문자열 리터럴이 동일하다면 동일한 String 객체의 번지가 저장된다.

String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // 참 (true)

21. new 연산자로 직접 String 객체를 생성하고 대입할 수도 있다. 이 경우 값이 같더라도 서로 다른 번지를 갖게된다.

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2); // 거짓 (false)

22. 따라서 문자열이 같은지를 확인할 때는 equals를 사용한다.

String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1.equals(str2)); // 참 (true)

23. String 변수에 빈 문자열도 대입 가능

String emptyString = "";

24. 문자와 관련된

다양한 메소드들이 존재한다.

String text = "example";
int length = text.length();
char firstChar = text.charAt(0);

25. replace 메소드를 사용하는 경우 수정본이 아닌 완전히 새로운 문자열을 참조하는 것이다.

String original = "Hello";
String modified = original.replace('H', 'J');

26. 수많은 변수를 간소화 시켜주는 배열 타입이 존재한다.

int[] numbers = {1, 2, 3, 4, 5};

27. 배열의 선언: 타입 [] 변수 = {값1, 값2, ...};

String[] fruits = {"Apple", "Banana", "Orange"};

28. 배열 변수를 선언한 시점과 값 목록이 대입되는 시점이 다르다면 new 타입 []을 중괄호 앞에 붙여줘야 한다. 메소드를 호출하는 경우 매개값으로 사용할 때도 마찬가지이다.

int[] numbers;
numbers = new int[]{1, 2, 3, 4, 5};

29. 타입 [] 변수 = new 타입[길이]; 의 방식으로 배열을 생성할 수도 있다.

int[] numbers = new int[5];

30. 타입[] 변수 = null; 변수 = new 타입[길이];

int[] numbers = null;
numbers = new int[5];

31. new 연산자로 배열을 처음 생성하면 배열 항목은 기본값으로 초기화 된다. 즉 타입별 배열의 초기값이 존재.

int[] defaultValues = new int[3]; // 초기값: 0

32. 배열의 길이는 변경할 수 없다.

  • 배열의 길이는 생성 시 지정되며, 변경할 수 없다.

33. 다차원 배열도 존재한다.

int[][] twoDimensionalArray = {{1, 2, 3}, {4, 5, 6}};

34. 배열의 항목 대입 방식에 따라 ==의 결과가 달라진다. (동일한 번지를 사용할 수도, 아닐 수도 있다.) 단순히 값을 비교하는 것이 아니기 때문.

int[] array1 = {1, 2, 3};
int[] array2 = array1; // 동일한 번지 참조

35. 개선된 for문의 존재

int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
    System.out.println(number);
}

36. 열거 (Enum) 타입: 한정된 값을 갖는 타입을 뜻한다.

enum Direction { NORTH, SOUTH, EAST, WEST }
profile
터널을 지나고 있을 뿐, 길은 여전히 열려 있다.

0개의 댓글