Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

archive

[이것이 자바다] 05 참조 타입 본문

Java/Java 개념 정리

[이것이 자바다] 05 참조 타입

안정민 2023. 3. 19. 13:30

1. null과 NullPointerException

- 참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻으로 null(널) 값을 가질 수 있음, null도 초기값으로 사용될 수 있기 때문에 null로 초기화된 참조변수는 스택 영역에 생성된다

-자바 프로그램 실행 도중에 참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나는 NullPointerException이다. 변수가 null인 상태에서 객체의 데이터나 메소드를 사용하려고 할 때 이 예외가 발생.

int[] array = null;
array[0] = 10;   //NullPointerException

-배열 변수 array에 null을 대입한 상태에서 배열 객체의 0 인덱스 항목에 10을 대입하는 코드를 실행하면 NullPointerException이 발생한다. 이유는 array가 참조하는 배열 객체가 없으므로 10을 저장할 수 없기 때문이다

*** 참조하는 주소값에 저장된 값이 null 값이 아니라, 선언 부분에서 null값을 대입하였기 때문에 참조하는 객체 자체가 없다는 뜻이 된다는 것에 유의

-앞으로 NullPointerException이 발생하면 예외가 발생한 곳에서 null인 상태의 참조 변수가 사용되고 있음을 알아야 한다.

-이것을 해결하려면 참조 변수가 객체를 정확히 참조하도록 번지를 대입해야한다.

-경우에 따라서는 참조 타입 변수에 일부러 null을 대입하기도, 프로그램에서 객체를 사용하려면 해당 객체를 참조하는 변수를 이용해야 하는데, 변수에 null을 대입하면 번지를 잃어버리게 되므로 더이상 객체를 사용할 수 없게 된다.

String hobby = "여행";
hobby = null;

- 어떤 변수에서도 객체를 참조하지 않으면 해당 객체는 프로그램에서 사용할 수 없는 객체가 됨, 즉 힙 메모리에는 있지만 위치 정보를 모르기 때문에 사용할 수 없게 되는 것.

-자바는 이러한 객체를 쓰레기로 취급하고, 쓰레기 수집기(Garbage Collector)을 실행시켜 자동으로 제거한다.

-사실 자바는 코드를 이용해서 객체를 직접 제거하는 방법을 지원하지 않음, 객체를 제거하는 유일한 방법은 객체의 모든 참조를 끊어내는 것.

 

 

 

2. 문자열 (String) 타입

-변수에 문자열 리터럴이 대입되면 문자열은 String 객체가 생성되고, 객체의 번지가 각각 대입된다.

**문자열 비교

-자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 설계하고 있음.

++ 얘는 진짜 몰랐지만 진짜 중요한 개념인 거 같음 반드시 기억하자 (*ˊᵕˋ*)ノ

String name1 = "홍길동";
String name2 = "홍길동";
String name3 = new String("홍길동");

-String 변수에 문자열 리터럴을 대입하는 것이 일반적이지만 new 연산자로 직접 String 객체를 생성하고 대입할 수도 있음, 이 경우 name 3은 name1, name2와는 서로 다른 String 객체의 번지를 가지게 된다.

-그렇기 때문에 문자열 리터럴로 생성하느냐, new 연산자로 생성하느냐에 따라 비교 연산자의 연산 결과가 달라질 수 있음

name1 == name2;  //true
name1 == name3;  //false

-동일한 String 객체이든, 다른 String 객체이든 상관 없이 내부 문자열만 비교하고 싶은 경우에는 String 객체의 equals() 메소드를 사용한다.

boolean result = name1.equals(name3)    //true

 

 

3. 문자열 관련 메소드

**문자 추출

- 문자열에서 특정 위치의 문자를 얻고 싶다면 charAt() 메소드를 이용할 수 있다

- charAt() 메소드는 매개값으로 주어진 인덱스의 문자를 리턴

String str = "자바 프로그래밍";
char charValue = str.charAt(3);  // result: '프'

 

**문자열 대체

-문자열에서 특정 문자열을 다른 문자열로 대체하고 싶다면 replace() 메소드를 사용

-replace() 메소드는 기존 문자열은 그대로 두고, 대체한 새로운 문자열을 리턴

String oldstr = "자바 프로그래밍";
String newstr = oldstr.replace("자바", "JAVA");
// newstr의 저장값 : "JAVA 프로그래밍"

- String 객체의 문자열은 변경이 불가한 특성을 갖기 때문에 replace 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아니라 완전히 새로운 문자열이다.

 

**문자열 잘라내기

-문자열에서 특정 위치의 문자열을 잘라내어 가지고 오고 싶다면 substring() 메소드를 사용한다.

메소드 설명
substring(int beginindex) beginindex에서 끝까지 잘라내기
substring(int beginindex, int endindex) beginindex에서 endindex 까지 잘라내기

 

** 문자열 찾기

- 문자열에서 특정 문자열의 위치를 찾고자 할 때에는 indexOf() 메소드를 사용, 주어진 문자열이 시작되는 인덱스를 리턴

-만약 주어진 검사 문자열이 해당 문자열에 포함되어있지 않은 경우 메소드는 -1을 리턴

-주어진 문자열이 단순히 포함되어있는지만 조사하고 싶다면 contains() 메소드를 사용, 검사문자열이 포함되어있으면 true를 리턴,  문자열이 포함되어있지 않으면 false 리턴

 

**문자열 분리

-문자열이 구분자를 사용하여 여러 개의 문자열로 구성되어있을 경우, 이를 따로 분리해서 얻고 싶다면 split() 메소드를 사용한다.

String board = "번호, 제목, 내용, 성명";
String[] arr = board.split(", ");

-board 문자열은 쉼포를 구분자로 가지고 있으며 split() 메소드를 호출할 때 쉼표를 구분자이자 매개변수로 제공하면 분리된 문자열로 구성된 배열을 실행 결과로서 얻을 수 있다.

 

 

4. 배열 (Array)

- 배열의 길이란 배열에 저장할 수 있는 항목 수를 이야기함, 코드에서 배열의 길이를 얻으려면 도트(.) 연산자를 사용해서 참조하는 배열의 length필드를 읽으면 된다.

- 배열의 length 필드는 읽기만 가능하므로 값을 변경하는 대입 연산은 실행이 불가능하다.

int[] arr = {1, 2, 3, 4, 5};
int arr.length = 10; // 컴파일 에러 발생

 

 

5. 배열 복사

- 배열의 가장 기본적인 복사 방법은 for문을 이용하여 항목을 하나씩 읽고 새로운 배열에 저장하는 것

- 배열 복사를 위한 더 간단한 방법은 System의 arraycopy() 메소드를 이용하는 것 → System.arraycopy(...)

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

* 매개변수는 차례대로 원본 배열, 원본 배열 복사 시작 인덱스, 새 배열, 새 배열 붙여넣기 시작 인덱스, 복사 항목 수이다.

 

 

6. 열거(Enum) 타입

** 얘는 진짜 처음 보는데... 이것이 자바다 책이 진짜 세세하고 좋긴 하군

 

- 데이터 중에서는 몇 가지로 한정된 값을 갖는 경우가 있음, 이와 같이 한정된 값을 갖는 타입을 열거타입(enumeration type)이라고 한다.

++ 얘는 교수님 설명하시는 거 보고 정리하기