본문 바로가기
  • 시 쓰는 개발자
프로그래밍 문법/Java

자료형 long (Long과 long 차이)

by poetDeveloper 2024. 1. 6.

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)

김영한님의 java-start강의 中

 

주의!!) 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