Java는 8종류의 기본 자료형(이하 자료형)을 가지고 있습니다.
우리가 가장 많이 쓰는 int 가 가장 대표적인 데이터 타입 중 하나라고도 할 수 있겠네요.
그런데, Java를 처음 배우다보면 String이라는 것을 많이 쓰는데, 이 String은 자료형이 아니라고 합니다.
이 부분에 대해서 교재 혹은 수업(이하 교재) 중에 질문을 하면, 나중에 설명을 해준다고 하며 넘어가기 일쑤입니다.
그러나, 우리는 교재 중에 빈번하게 String 을 사용하게 되며 추가적으로 다른 종류의 대문자로 이루어진 낯선 친구들을 만나게 됩니다.
이렇듯 8종의 자료형은 이와 대치되는 8종의 무언가를 가지고 있으며, 대치되지 않는 String 이라는 것들도 있습니다.
그 무언가를 우리는 Wrapper Class, 객체 참조라고 부르기로 약속을 하였습니다.
구분 | 분류 | |
기본 자료형 (primitive) | 객체 참조 (Wrapper Class) | |
1 | byte | Byte |
2 | short | Short |
3 | int | Integer |
4 | long | Long |
5 | float | Float |
6 | double | Double |
7 | char | Character |
8 | boolean | Boolean |
9 | - | String |
저도 공부 중에 많은 궁금증이 있었던 부분이고,
정확하다고는 할 수 없겠으나 나름 정리가 된 부분이라고 생각하여 이렇게 포스트를 남겨보겠습니다.
아래의 부분에는 다음과 같은 중점사항들이 있습니다.
참고하여 읽으시면 큰 도움이 될 것이라고 생각합니다.
구분 | 관점 |
1 | 자료형이 무엇인가? |
2 | 객체 참조는 무엇인가? |
3 | 자료형과 객체 참조 간의 변환은 어떻게 이루어진가? |
- 자료형이 무엇인가?
구글에 자료형에 대해서 검색을 하면 다음과 같은 결과를 얻을 수 있습니다.
자료형(資料形) 또는 데이터 타입(영어: data type)은 컴퓨터 과학과 프로그래밍 언어에서 실수치, 정수, 불린 자료형 따위의 여러 종류의 데이터를 식별하는 분류로서, 더 나아가 해당 자료형에 대한 가능한 값, 해당 자료형에서 수행을 마칠 수 있는 명령들, 데이터의 의미, 해당 자료형의 값을 저장하는 방식을 결정한다 |
쉽게 설명을 하면, 자료형은 종류라고 할 수 있을 것입니다.
고양이과 개, 사자와 호랑이 등 우리는 무언가를 구분하기 위한 기준점이 되는 단어를 정의하고 있습니다.
그렇듯 자료형은 우리가 아직 정확하게 배우지 못한 어떠한 정보들을 컴퓨터가 구분을 하기 위해서 약속한 단어입니다.
그 자료형을 Java에서는 기본 자료형 8 종류로 구분을 하고 있는 것입니다.
- 객체참조는 무엇인가?
그렇다면 객체 참조는 무엇일까요? 역시나 구글링을 해보았습니다.
명확하게 사전적으로 정의된 결과물(나무위키와 같은)이 나오지 않습니다.
사실 지금도 정확하게 이것을 뭐라고 불러야할지 모르겠습니다.
제 생각에는, 객체 참조는 기본 자료형과 근본적인 목적성에서 동일합니다.
그 목적성은 구분입니다.
자료형이 마치 동물의 종류를 위미하듯, 객체 참조도 결국 무언가를 구분하기 위한 종류에 불과합니다.
객체 참조에 대한 개념 설명을 위해 잠시 클래스에 대해서 간략하게 언급을 해보겠습니다.
아래는 실제로는 어떤 기능도 하지 않는 추상 클래스인 Player 에 대한 코드입니다.
class Player {
//Properties
String name;
String job;
int level;
//Function
attack(){}
deffence(){}
}
위 클래스는 Player가 누구인지에 대한 속성(Properties)를 가지고 있습니다.
이 Player라는 친구가 가질 수 있는 값이 name, job, level 이라는 것을 알 수 있네요.
그리고 이 친구가 가지고 있는 기능이 attack()과 deffence()라는 것도 알 수 있네요.
이렇듯 클래스는 어떠한 □ 가 가질 수 있는 것과 할 수 있는 것이 무엇인지를 구분하기 위해서 사전적으로 만들어놓은 구분 수단입니다. 마치 고양이과의 고양이가 있듯 Player가 고양이과를 의미하는 것이라고 해석해도 좋을 것 같습니다.
이렇듯 클래스라고하는 것은 무언가를 구분하기 위해서 사전적으로 정의해놓은 수단입니다.
그렇다면 객체 참조도 이와 같은 관점에서 해석할 수 있을 것입니다.
객체 참조, Wrapper Class 도 결국 Class 라는 관점에서 다가가 보면,
결국 어떠한 Wrapper Class 도 속성(Properties)과 기능(Method)을 가지고 있을 것이라 예상할 수 있겠네요.
한 마디로, 단수한 값들을 모아서 새로운 무언가를 구분하기 위한 약속이라고 해석할 수 있을 것입니다.
- 자료형과 객체 참조 간의 변환은 어떻게 이루어지는가?
아직 그 필요성을 모를 수도 있고, 필요성을 알고 있을 수도 있지만,
단언할 수 있는 것은 우리는 두 사이를 오가며 변환을 할 필요가 있습니다.
일반적으로 우리는 자료형을 객체 참조로 바꾸는 것을 Boxing(포장을 하다)라고 하며, 객체 참조를 자료형으로 바꾸는 것을 Unboxing(포장을 뜯다)로 부릅니다.
모든 내용을 이 안에 담기에는 너무 많기 때문에 가장 대표적으로 쓰이는 int 에 대해서 집중적으로 알아보겠습니다.
final int NUM=10;
Integer numberInteger1=new Integer(NUM);
Integer numberInteger2=NUM;
프로그램이 언어란 결국 언어에 불과합니다.
그 말은 위의 간단한 문장도 결국 언어처럼 해석할 수 있다는 의미가 아닐까요?
Integer(고양이과)라는 종류의 numberInteger1(이름:홍길동)을 초기화(=)하고 새로운(new) Integer(NUM)을 할당한다. |
Integer(고양이과)라는 종류의 nubmerInteger2(이름:홍길동)을 초기화(=)하고 NUM을 할당한다. |
위 두 개의 문장은 정상적으로 작동을 할까요?
그리고 작동을 한다면 무슨 차이가 있는 걸까요?
정답은,
정상적으로 작동을 한다.
그리고 new Integer(NUM) 은 박싱(Boxing) 이라고 부르며, NUM 부분은 오토박싱(auto-Boxing) 이라고 부른다.
Integer 에 들어가는 속성(Properties)도 결국 int 타입이며, NUM 도 int 타입이기 때문에 오토박싱이 지원된다.
자 이제 박싱을 배웠네요?
그렇다면 언박싱이 남았습니다.
Integer numberInteger=new Integer(10);
int numberInt1=numberInteger.intValue;
int numberInt2=numberInteger;
이번에는 문장처럼 해석하지 않고 바로 생각을 해보겠습니다.
위 두 개의 문장은 정상적으로 작동을 할까요?
그리고 작동을 한다면 무슨 차이가 있는 걸까요?
정답은,
정상적으로 작동을 한다.
numberInteger.intValue 는 Integer 라는 클래스가 가지고 있는 메서드를 사용하여 언박싱(Unboxing)이 진행되었다. 그리고 nubmerInteger 가 가진 하나의 Properties 도 int 타입이고 numberInt2 도 int 타입이기 때문에 오토언박싱(auto-Unboxing)이 지원이 되었다.
자 이제 아주 기본적인 개념을 이해하였다면,
앞으로 코딩을 진행하며 발생하는 언박싱 혹은 박싱 관련된 문제는
Integer int 박싱 , 언박싱, 형변환 같은 키워드로 검색하여 읽어보면 바로 이해할 수 있을 것이라고 생각합니다.
'Programming Languages > java' 카테고리의 다른 글
[Java 이론] 클래스 (1) | 2021.08.04 |
---|