-
[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' 카테고리의 다른 글
[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 -