
들어가면서..
AWS에 배포 중인 요양기관 차량 배치 프로젝트에서 에러가 난다는 이야기를 듣게 되었고 리팩토링을 진행하려고 테스트 코드를 작성하다가 원시 타입 배열에서는 toString()이 작동하지 않고 String.valueOf()만 가능한 이유와 둘의 차이에 대한 궁금증이 생겨 글을 작성하게 되었다.
1. 왜 employeeCapacityLeft[i] (원시 타입 배열)은 toString()이 작동하지 않고 String.valueOf로 감싸주어야 할까?
toString()은 java.lang.Object 클래스에 정의된 인스턴스 메소드이고 객체 타입에만 동작한다. 따라서 employeeCapacityLeft는 원시 타입으로(int) 변수가 선언되었기 때문에 java.lang.Object 클래스의 인스턴스 메소드인 toString()을 동작시킬 수 없다.
2, String.valueOf와 toString()의 차이
1) String.valueOf는 null 값을 반환 가능하다.
toString()은 nullPointerException을 반환한다.
2) String.valueOf는 클래스 메소드, toString은 인스턴스 메소드이다.
3. 클래스 메소드와 인스턴스 메소드의 차이는 뭘까?
String.valueOf = java.lang.String 클래스에 static으로 정의된 클래스 메서드
public static String valueOf(int i) {
return Integer.toString(i);
}
toString() = java.lang.Object 클래스에 public으로 정의된 인스턴스 메서드
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
결국 원시 타입은 String.valueOf를 사용해야 하고 객체 형태인 참조 타입일 경우에는 toString이 사용 가능하다. 그럼 원시 타입과 참조 타입 중에 어떤 것을 쓰는 게 좋을까?
4. 참조 타입보다는 원시 타입이 더 빠르므로 원시 타입을 주로 쓰자 - effective java
- 성능 관점
- 원시 타입은 스택 영역에 존재한다. 반면 참조 타입은 스택 영역에는 참조 값만 있고, 실제 값은 힙 영역에 존재한다. 참조 타입은 최소 2번 메모리 접근을 해야 하고, 일부 타입의 경우 값을 필요로 할 때 언박싱 과정(ex. Double → double, Integer → int)을 거쳐야 하므로 원시 타입과 비교해서 접근 속도가 느린 편이다.
- 메모리 관점
- 원시 타입보다 참조 타입이 사용하는 메모리 양이 압도적으로 높다. 이외의 참조 타입은 최근 들어 64 비트의 JVM을 많이 사용하므로 일반적으로 64 bits를 차지한다고 한다.
- NULL 관점
- 원시 타입은 null을 담을 수 없지만, 참조 타입은 null을 담을 수 있다. 이것은 원시 타입의 경우, 값이 없으면 디폴트 값을 반환하기 때문이다. (ex. int은 0, boolean은 false)
- 제네릭 관점
- 원시 타입은 제네릭 타입에서 사용할 수 없지만, 참조 타입은 가능하다.
참고 - https://steady-coding.tistory.com/606
[Java] 원시 타입 vs 참조 타입
java-study에서 스터디를 진행하고 있습니다. 원시 타입 원시 타입은 정수, 실수, 문자, 논리 리터럴 등 실제 데이터 값을 저장하는 타입이다. int a = 10; 와 같이 코드를 작성했다면 정수 값이 할당될
steady-coding.tistory.com
마치면서..
리팩토링을 하면서 원시 타입에서는 왜 toString()을 사용할 수 없을까? 라는 궁금증을 따라가다 보니 원시 타입과 참조 타입의 차이, 그리고 참조 타입은 원시 타입에 비해 메모리 사용량이 월등하게 높다는 것, 그리고 클래스 메소드와 인스턴스 메소드의 차이, String.valueOf는 null 값 반환이 가능하고 toString()은 nullpointerexception을 발생시킨다는 것에 대해서 알게 되었다. 그동안은 이런 작은 궁금증이 생겨도 그냥 넘어가는 경우가 많았는데 한번 이렇게 깊이 있게 파고 내려가니 java에 대한 깊은 이해를 가지게 되어 좋았다. 실력 향상을 위해 앞으로도 이런 작은 궁금증에 대해서 넘어가지 않고 깊이 있게 파고드는 연습을 의식적으로 해야겠다.