참조형과 래퍼클래스
참조형
: 값이 저장되어 있는 곳의 메모리 주소를 저장하는 타입
- 해당 타입의 변수(참조형 변수)는 참조값의 주소를 저장
특징
- null 개념 존재
- 변경 시 동기화
예시
- 객체, 배열, 문자열 등
메모리 구조
- 힙 영역에 참조값 저장 후 참조
파라미터: 참조형변수
- 출력값: 클래스명@해시코드 // 객체 식별자o 실제 메모리 주소x
파라미터: 참조형변수.속성
- 출력값: 값
Person p = new Person("Stever");
System.out.println(p.name); //p는 Person 객체의 주소를 저장, 그 주소의 name 필드의 값을 출력
System.out.println(p); //Person 객체의 주소를 출력(물리적 메모리 주소는 아니고 객체 식별 정보)
기본 자료형 | 래퍼 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
래퍼클래스
: 기본 자료형을 객체로 감싸는 클래스
래퍼클래스 변수(참조형 변수)
- 출력값: 값
- 이유: toString() 오버라이딩해서 객체가 가진 값을 그대로 출력하도록 함
// 변수는 주소를 저장
선언 및 할당
1) 래퍼클래스 변수명 = 값; // 오토박싱 덕분에 2)의 방식 필수x
2) 래퍼클래스 변수명 = new 래퍼클래스(값); // 오토박싱: 위 코드를 내부적으로 수행
필요성
: 기본형과 달리 속성, 기능을 제공해 데이터 처리 용이
커스텀 래퍼클래스(Integer)
class customInteger{
int value;
CustomInteger(int value){
this.value = value; //this.value는 customInteger의 value, value는 파라미터
}
int getValue(){
return value;
}
void setValue(int value){
this.value = value;
}
@Override
public String toString(){
return String.valueOf(value);
}
}
오토박싱: 기본형 -> 래퍼 클래스
int i = 10;
Integer j = i; // Integer j = new Integer(n) 또는 Integer.valueOf(n)과정이 컴파일러에 의해 내부적으로 수행
오토언박싱: 래퍼 클래스 -> 기본형
Integer i = 10;
int j = i; //int j = i.intValue()과정이 컴파일러에 의해 내부적으로 실행됨
NullPointerException
: 객체가 null인 상태인데 메서드 호출을 시도할 때 발생하는 문제
Integer i = null;
//intValue()메서드 호출 => NullPointerException 발생
int j = i;
- 해결책
1) null 체크 후 null이 아닌 경우에만 사용
2) Optional 사용(null )
- Optional<Integer>: 정수형이 있을 수도 없을 수도 있음을 의미
Integer i = null;
Optional<Integer> opt = Optional.ofNullable(i);
int j = opt.orElse(0); // null이면 0으로 처리
기본형
: 자바에서 미리 형식을 정의하여 제공하는 타입
- 기본값 존재(null x)
필요성
: 빠른 작업, 연산에 용이(래퍼 클래스는 연산 시 추가작업 발생하므로 느림)