ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java-7] 자바 타입의 종류 & 리터럴
    Java 2020. 11. 17. 14:21

     

     

    프리미티브 타입과 레퍼런스 타입에 대해서 알아보고, 저번에 컴파일 과정에서 나왔던 리터럴에 대해서 알아보도록 하자. 글이 뭔가 중구난방한 것 같은 느낌은 들지만 최대한 정리하도록 하겠다. 

     

    1. Primitive Type VS Refrence Type

     

    잠시 책에서 정확히 프리미티브 타입과 레퍼런스 타입에 대해서 설명하였다. 

     

    레퍼런스 타입 & 객체는 기본적으로 프리미티브한 값에서 데이터를 가져오게 된다. 

     

    • 여덟개의 원시 타입은 ‘자바언어’에 의해 정의 되어있다. 절대 ‘개발자’가 새로운 원시타입을 정의할 수 없다. 레퍼런스 타입은, 개발자가 타입을 ‘정의’할 수 있으며, 그러므로 수없이 레퍼런스 타입이 많다.

    출처 : *Java in a Nutshell

     

    먼저, 기본적으로 저번에 말했던 JVM 안에서 어떻게 이 두가지의 변수가 저장되는지 알아보도록 하자 

     

     

    만약 int 와 integer에 동일한 값(value)를 넣는 변수를 선언했다 면 실제 메모리 구조에서 어떻게 저장이 될까?

     

     

     

     

    이렇게 저장이 되게 된다. 이렇게 스택영역에서 프리미티브 타입에서는 값을 바로 저장하는 반면에, 레퍼런스 타입에서는 그 값을 가지고있는 힙 영역의 주소 값을 가지고 온다. 

     

     

    이게 무슨얘기냐면, 

     

     

    다음 그림을 보면 이해하기 쉬울 수 있다. 레퍼런스 타입은 대표적인 것들도 많은데, 근데 타입은 사용자가 정의할 수 있다고 한다면, 예를들어 User 클래스를 만들었다면 User 를 타입으로 지정할 수 있다. 이게 자바가 말하는 레퍼런스 타입인데, 나중에 더 자세히 알아보도록 하자 

     

    또 재밌는건 == 비교는 일반 프리미티브 타입에서는 값을 비교하게 되고, 레퍼런스 타입은 참조주소를 비교하게 된다. 

     

    근데 만약에 int == Integer 를 비교하면 어떻게 될까? 이는 참조주소가 아니라, 데이터 값을 비교하게 된다. 

     

     

     

     

    이런식으로 비교하게 된다. 이는 나중에 연산자에 대해 설명할 때 자세히 알아보도록 하고, 그냥 원시타입은 값 비교, 참조타입은 주솟값 비교로만 생각하면 될것 같다. 

     

    리터럴에 대해서 설명을 하도록 하자. 리터럴은 무엇일까? 분명 자바 컴파일 과정에서 코드의 어휘소를 모아서 어휘분석을 하는데, 어휘소의 종류한가지로 리터럴이 있다고 말한적이 있다. [Java-1] 자바 컴파일&과정 에 들어가면 자세히 알 수 있다. 

     

    다시,

    2. 리터럴?

     

    원래 이런 용어에 대해서 위키피디아의 글을 인용하는걸 좋아하지 않지만,< “컴퓨터 과학 분야에서 리터럴이란 소스 코드의 고정된 값을 대표하는 용어다.” > 출처 : 위키

     

    무슨 얘기 일까 고정된 값? 그럼 상수 아니야? 라고 생각 할 수 있다.

     

    정확히 상수랑 리터럴이란 완전히 다른 관점이다. 상수라 하면 무조건적으로 변하지 않는 1개의 어플리케이션 단위(프로젝트)에서 사용하는 ‘변수’ 라고 하면 누구나 이해할 수 있다.

     

    그치만 ‘리터럴’은 변하지 않는 변수가 아니라 ‘데이터’ 라는 걸 알아줬으면 한다. 즉, 데이터라고 하면

     

     

     

    여기서는 i와 j의 리터럴은 각 2000과 1004는 리터럴 데이터 이다. 

     

    그럼 여기서 착각 할 수 있다. 

    오! 알겠다. 그럼 변수에 들어가는 데이터를 리터럴 이라고 하는구나?

     

     

     

    결론먼저 말하면 절대 아니다. 

    앞에 위키의 정의에서 보면, 소스 코드의 고정된 값 이라고 하지 않았는가, 이게 무슨말이냐면

     

    i의 리터럴 2000은 2000이다. 2000이란 숫자 자체가 고유한 값이라는 거다. i++ 가 되어서 2001이 되면 2001 은 2001 숫자 자체로 고유한 값이라는 거다. 

     

    좀 헷갈릴 수 있는데, 변수에 들어가는 고정적인 데이터가 리터럴이라고 했는데, 그럼 class 변수인 인스턴스는 어떨가?

     

     

     

     

    만약에 멤버라는 객체가 있다고 가정해보자, 이 클래스의 필드는 memberId, memberName 두가지가 있다. 필드는 신경 쓰지말고, 만약에 Member 객체를 생성하고 인스턴스에 값을 집어넣을 때 

    new Member(); 를 사용을 하는데, 이는 리터럴이 아니게된다. 

     

     

     

     

    왜냐면 이 new Member()의 값은 언제든지 변경이 될 수 있기 때문이다. 

     

    다음은 변수 선언 및 초기화 과정에 대해서 알아보도록 하자

    > [Java-8] 자바 변수 선언과 초기화  

    'Java' 카테고리의 다른 글

    [Java-9] 타입변환, 형변환  (0) 2020.11.18
    [Java-8] 자바 변수 선언과 초기화  (0) 2020.11.18
    [Java-6] Java 기본 타입 (primitive)  (0) 2020.11.16
    [Java-5] JDK& JRE, 자바 실행  (2) 2020.11.11
    [Java-4] JVM의 구조  (1) 2020.11.11

    댓글

Designed by Tistory.