archive
[이것이 자바다] 05 참조 타입 본문
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)이라고 한다.
++ 얘는 교수님 설명하시는 거 보고 정리하기
'Java > Java 개념 정리' 카테고리의 다른 글
[이것이 자바다] 06 클래스 - 2 (0) | 2023.04.13 |
---|---|
[이것이 자바다] 06 클래스 - 1 (0) | 2023.04.07 |
[이것이 자바다] 04 조건문과 반복문 (0) | 2023.03.19 |
[이것이 자바다] 03 연산자 (0) | 2023.03.19 |
[이것이 자바다] 02 변수와 타입 (0) | 2023.03.19 |