long의 특징
- long은 8byte로, 매우 큰 수를 저장할 수 있다. 그렇기 때문에, 일반적으로 int보다 큰 수를 다뤄야할 때 long을 사용한다고 보면 된다.
- 변수 뒤에 L을 붙여줘야한다.(소문자도 되지만 대문자 L을 권장.) ex) long abc = 1L;
- Long(참조타입)과 long(원시타입)은 다르다... 진짜 주의 !!
참고) 타입별 메모리 공간 크기
- byte : 1byte (8bit)
- short : 2byte (16bit)
- int : 4byte (32bit)
- long : 8byte (64bit)
주의!!) Long과 long 차이 비교
Long과 long은 다르다. 예를 들어 다음과 같은 spring 코드가 있다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long postId;
postId를 long으로 했는데 뒤에 L이 없다? 심지어 초기화도 없다? 이렇게 생각하면 안된다. long이 아니라 Long으로 해놨기 때문에 L을 붙이지 않았고, 이렇게 Long으로 하게 되면 참조타입으로써 사용하게 된다. 이 상황에선 DB와 상호작용을 하고 있고 값이 누락될 수도 있는 상황이기 때문에 Long을 사용한 것으로 보인다.
Long (참조타입) | long (원시타입) | |
null 여부 | null값을 가질 수 있다. | null값을 가질 수 없다. |
class인가 ? | Wrapper class이다. | 단순 자료형이다. |
메모리 접근방식 | 메모리 주소값을 통해 "객체를 참조"한다. | 실제 메모리에 데이터 값을 "직접 저장"한다. |
성능 | stack에 참조 주소가 있고, 실제 값은 Heap에 있어서 원시타입보단 느릴 수 있다. | stack에 값이 존재해서 바로 가져올 수 있어서 빠르다. 또한, Heap이 따로 없기에 메모리 측면에서도 참조 타입보다 좋다. |
Q. 그렇다면 위에 스프링 코드에서는 왜 빠른 long을 쓰지 않고 느린 Long을 쓴 것일까? 참조타입을 사용해야 해서인?
A. 어느정도는 맞겠지만, 위에선 @Id로 auto increment를 하려고 한다. 즉, 게시글을 만들 때 마다 게시글 고유 번호를 순서대로 부여하고자 하는 건데 이 고유 id라는게 게시글을 만들기 전엔 없기에 id 자체가 있을 수도 있고, 없을 수도 있다. 그래서 null을 가질 수 있는 대문자 Long을 사용하는 것이고, 만약에 not null이 보장되는 상황(그렇게 코드를 짰다면)이라면 속도나 메모리나 전부 long이 좋기에 long을 사용하는 것이 좋다고 한다.
'프로그래밍 문법 > Java' 카테고리의 다른 글
6장 객체지향 (1) 객체 , 클래스 (0) | 2024.03.10 |
---|---|
Java 연산자 (0) | 2024.01.07 |
리터럴이란 ? (0) | 2024.01.06 |
인텔리제이에서 컴파일 결과(ByteCode) 확인하기 (0) | 2024.01.06 |
5장 배열 (0) | 2022.10.28 |