앞전에 살펴 보았던 기본 자료형과 참조 자료형의 차이를 메모리 측면 말고 다른 차이점이 무엇이 있을까 알아보자
[기본값]
기본 자료형은 초기화하지 않으면 각 타입의 기본값이 설정 된다. 하지만 참조 자료형은 초기화 하지 않으면 null 값이 기본 값이고 참조가 없는 상태로 남게 된다.
* 기본 자료형 *
int a; // 오류 : 기본 값 설정 필수
int a = 0;
boolean b; // 오류 : 기본 값 설정 필수
boolean b = fasle;
* 참조 자료형 *
String name; // 기본 값 null
[값 전달 방식]
- 기본 자료형은 함수에 인자로 전달될 때 값 자체가 전달 된다. 따라서 함수 내부에서 값이 변경 되어도 외부에는 영향을 주지 않는다.
- 참조 자료형은 객체의 참조 주소가 전달 된다. 따라서 함수 내부에서 객체의 속성을 수정하면 외부에서도 그 변경 사항이 반영된다. 그러나 새로운 객체를 할당하면 원래 참조와는 독립적으로 동작한다 .
public class Test {
public static void main(String[] args) {
int a = 5;
changeValue(a); // a의 값은 변경되지 않음
IntegerWrapper obj = new IntegerWrapper(5);
changeObject(obj); // obj의 값은 변경됨
}
public static void changeValue(int x) {
x = 10; // x는 10으로 변경되지만, a에는 영향을 미치지 않음
}
public static void changeObject(IntegerWrapper y) {
y.value = 10; // obj의 내부 값이 10으로 변경됨
}
}
class IntegerWrapper {
int value;
IntegerWrapper(int value) { this.value = value; }
}
[유틸리티 메서드]
- 기본 자료형은 단순히 데이터를 저장하는 역할만 하며, 메서드가 없다.
- 참조 자료형은 다양한 유틸리티 메서드를 제공한다
String str = "Hello, World";
int length = str.length(); //문자열의 길이를 반환하는 유틸리리티 메서드
String upperCaseStr = str.toUpperCase(); //문자열을 모두 대문자로 변환하는 유틸리리티 메서드
[Null 처리 가능 여부]
- 기본 자료형은 null을 허용하지 않고 null 로 초기화 할 수도 없다.
- 참조 자료형은 null 값을 할당하여 변수가 아직 값이 설정 되지 않았거단 참조가 없는 상태임을 나타낼 수 있다.
[상속 및 다형성]
- 기본 자료형은 상속을 지원하지 않으며, 객체 지향적인 특징을 가질 수 없다.
- 참조 자료형은 클래스이기 떄문에 상속, 다형성, 인터페이스 구현 등의 객체 지향적 특징을 가질 수 있다.
[제네릭(Generic) 사용 가능 여부]
- 기본 자료형은 제네릭 타입에서 사용 할 수 없다. List<int> 같은 표현이 불가능하다.
- 참조 자료형은 제네릭에서 사용할 수 있다. 따라서 기본 자료형을 사용해야 할 경우, Integer, Double 등 래퍼 클래스가 필요하다 .
[정리]
특징 | 기본 타입 (Primitive Type) | 참조 타입 (Reference Type) |
기본값 | 타입별 기본값 (ex: 0, false) | null |
값 전달 방식 | 값 복사 (call by value) | 참조 전달 (객체의 속성은 수정됨) |
유틸리티 메서드 지원 | 없음 | 다양한 메서드 제공 (예: compareTo, parseInt) |
null 허용 여부 | 허용하지 않음 | 허용함 |
상속 및 다형성 지원 여부 | 불가능 | 가능 |
제네릭 사용 여부 | 불가능 | 가능 |
'JAVA' 카테고리의 다른 글
Java 문자열 뒤집기 - reverse() (0) | 2024.11.19 |
---|---|
Java 참조 타입 (Reference Type) 왜 쓰나요? (0) | 2024.11.17 |
Java 기본 자료형(Primitive Type)과 참조 자료형(Reference Type)의 차이 - 메모리 (1) | 2024.11.15 |
Scanner를 그만 쓰고 BufferReader/BufferedWriter를 사용하자 (0) | 2024.11.14 |
Java 에서 큰따옴표(" ")와 작은따옴표(' ') 의 차이 (1) | 2024.11.10 |