본문 바로가기
Programming

[Java의 정석] 제 2장 변수 - 2.변수의 타입

by SyWORLD 2017. 6. 21.
반응형

** 단순히 공부를 위한 참고자료일 뿐입니다. **

** 현재 버전과 상이한 부분은 검색해주시길 바랍니다. **




2. 변수의 타입(Type)


모든 변수에는 타입(Type 또는 형)이 있으며, 변수의 타입 따라 변수에 저장할 수 있는 값의 종류와 범위가 달라집니다. 변수를 선언할 때 저장하고자 하는 값을 고려하여 가장 알맞은 타입 을 선택하면 됩니다.
변수의 타입은 크게 기본형과 참조형, 2가지로 나눌 수 있는데, 기본형 변수는 실제 값(Data) 을 저장하는 반면에, 참조형 변수는 어떤 값이 저장되어 있는 주소를 값으로 갖습니다.

자바는 C언어와는 달리 String을 제외한 참조형 변수간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수입니다.

  

  기본형(Primitive Type)
   - boolean, char, byte, short, int, long, float, double 계산을 위한 실제 값을 저장한

     다.

  참조형(Reference Type)
   - 8개의 기본형을 제외한 나머지 타입, 객체의 주소를 저장한다.


[참고]참조형 변수는 null 또는 객체의 주소(4 byte, 0x0~0xffffffff)를 값으로 갖습니다. null은 어떤 값도 갖고 있지 않음, 즉 어떠한 객체도 참조하고 있지 않다는 것을 뜻합니다.

기본형의 개수는 모두 8개이고, 참조형은 프로그래머가 직접 만들어 추가할 수 있으므로 그 수 가 정해져 있지 않습니다.

참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 변 수의 타입이 된다. 그러므로 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈입니다.

다음은 참조변수를 선언하는 방법입니다.


  클래스이름 변수명; Date today;


Date클래스 타입의 참조변수 today를 선언한 것입니다. 참조형 변수는 null 또는 객체의 주소를 값으로 갖으며 참조변수의 초기화는 다음과 같이 합니다.


  Date today = null; 또는

  Date today = new Date();


객체를 생성하는 연산자 new의 연산결과는 생성된 객체의 주소입니다. 이 주소가 대입연산자 (=)에 의해서 참조변수 today에 저장되는 것입니다.
이제 참조변수 today를 이용해서 생성된 객체를 사용할 수 있게 됩니다.

[참고]기본형은 저장할 값(Data)의 종류에 따라 구분되므로 기본형 변수의 종류를 얘기할 때 는 자료형(Data Type)이라는 용어를 쓰고, 모든 참조형은 종류에 관계없이 4 byte의 주소 (0x0 ~ 0xffffffff 또는 null)을 저장하기 때문에, 참조형 변수들은 값(Data)이 아닌, 어떤 객 체의 주소를 담을 것인가에 따른 객체의 종류에 의해서 구분되므로, 참조형 변수의 종류를 구 분할 때는 자료형(Data Type)대신 타입(Type)이라는 용어를 사용합니다. 타입이 자료형을 포함 하는 보다 넓은 의미의 용어이므로 반드시 구분해서 사용할 필요는 없습니다.


2.1 기본형(Primitive Types)

기본형에는 모두 8개의 타입이 있으며, 크게 논리형, 문자형, 정수형, 실수형, 4가지로 구분됩니다.


  논리형 - true와 false 중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용된다. 문자형 - 문자를 저장하는데 사용되며, 변수 당 하나의 문자만                을 저장할 수 있다. 

  정수형 - 정수 값을 저장하는 데 사용된다. 주로 사용되는 것은 int와 long이며, byte는 이진데이터를 다루는데 주로 사용되며, short은 C언어와                   의 호환을 위해서 추가하였다.

  실수형 - 실수 값을 저장하는데 사용된다. float와 double밖에 없다.



[표2-2]기본형의 종류와 크기

[참고] 4개의 정수형(byte, short, int, long)중에서 int형이 기본(default) 자료형이며, 실수 형(float, double)중에서는 double형이 기본 자료형입니다.

논리형인 boolean은 나머지 7개의 자료형과 연산이 가능하지 않지만, char는 문자를 내부적 으로 정수값 코드로 저장하고 있기 때문에 정수형과 밀접한 관계가 입니다.
정수형과 실수형의 경우에는 여러 개의 변수형이 있지만, 특별히 큰 값을 다루어야 하지 않는 한 int 와 float를 주로 사용합니다.


[표2-3] 8가지 기본형(Primitive Type)과 저장 가능한 값의 범위

[참고] float와 double의 음의 최대값과 최소값은 양의 최대값과 최소값에 각각 음수 부호를 붙이면 됩니다. 실수형은 소수점이하의 자리수, 즉 정밀도가 중요하기 때문에, 얼마나 0에 가까 운 값을 표현할 수 있는지도 큰 의미를 갖습니다.

각 자료형이 가질 수 있는 값의 범위를 정확히 외울 필요는 없고, 정수형(byte, short, int, long)의 경우 -2n-1~ 2n-1-1(n: bit수)이라는 정도만 기억하고 있으면 됩니다.
예를 들어 int형의 경우 32bit(4byte)이므로 -2
31~ 231-1의 범위를 갖습니다.

210=1024≒103이므로 231=210*210*210*2 = 1024 * 1024 * 1024 * 2 ≒ 2 * 109

따 라서, int형은 대략 9자리수(약 2,000,000,000)의 값을 저장할 수 있다는 것을 알 수 있습니다. 9자릿수에 가까운 자리수(7자리나 8자리)의 수를 계산할 때는 넉넉하게 long형(약 19자리)을 사용하는 것이 좋다. 연산 중에 저장범위를 넘어서게 되면 원하지 않는 값을 결과로 얻게 될 것 이기 때문입니다.

정수형에서 int를 실수형에서는 float를 주로 사용하므로, int와 float의 범위를 기억해서, int 와 float의 범위를 넘는 값을 다뤄야 할 때 long과 double을 사용하면 됩니다.

기본 자료형의 크기를 쉽게 외우는 방법은 다음과 같습니다.


  - boolean은 true와 false 두 가지 값만 표현할 수 있으면 되므로 가장 작은 크기인 1 byte. - char은 자바에서 유니코드(2 byte 문자체계)를 사       용하므로 2 byte.
  - byte는 크기가 1 byte라서 byte.
  - int(4 byte)를 기준으로 짧아서 short(2 byte), 길어서 long( 8byte). (short <-> long)

  - float는 실수값을 부동소수점(floating-point)방식으로 저장하기 때문에 float.
  - double은 float보다 두 배의 크기(8 byte)와 두 배의 정밀도(double-precision)를 갖기 때문에 double.



2.2 논리형 - boolean

논리형에는 boolean, 한가지 밖에 없습니다. boolean형 변수에는 true와 false 중 하나를 저장할 수 있으며 기본값(default)은 false입니다.
boolean 형 변수는, 대답(yes/no), 스위치(on/off) 등의 논리구현에 주로 사용됩니다. 그리고, boolean형은 true와 false, 두 가지의 값만을 표현하면 되므로 기본형 중에서 가장 크기가 작 은 1 byte입니다.

[참고] 1 byte는 8 bit이므로 2의 8제곱, 256가지의 값을 표현할 수 있습니다. 따라서 boolean형 은 크기가 1byte이므로 256가지의 값을 표현할 수 있으나, true와 false, 2가지의 값만을 표현하는데 사용되고 있습니다.
아래 문장은 power라는 boolean형 변수를 선언하고 true로 변수를 초기화 했습니다.

[주의] Java에서는 대소문자를 구별하기 때문에 TRUE와 true는 다른 것으로 간주하므로 주의 하도록 합니다.


  boolean power = true;

  


2.3 문자형 - char

문자형 역시 char 한가지 밖에 없습니다. 기존의 많은 프로그래밍의 언어에서 문자형의 경우 1 byte(ASCII코드)의 크기를 갖지만, Java에서는 유니코드(Unicode)문자 체계를 사용하기 때문에 크기가 2byte입니다.

[참고] Unicode는 세계 각 국의 언어를 통일된 방법으로 표현할 수 있게 제안된 국제적인 코드 규약입니다.
미 국에서 개발되어진 컴퓨터는 그 구조가 영어를 바탕으로 정의되어 있기에 26자의 영문 알 파벳과 몇 가지 특수 문자를 표현하기에는 1바이트로 충분하였기 때문에 모든 정보(문자)가 1 바이트를 단위로 표현되고 있었으나 동양3국의 언어 표현인 한글, 한자 또는 일어 등과 같은 문자는 그 구조가 영어와 달라서 1 바이트로는 표현이 불가능하기에 2바이트로 조합하여 하나 의 문자를 표현하는 컴퓨터의 구조적 문제점을 바탕으로 유니코드가 만들어 졌다. 유니코드에 대한 보다 자세한 내용은 원한다면,
http://www.unicode.org/standard/translations/ korean.html을 방문해보도록 합시다.

[참고]아스키는 128개의 가능한 문자조합을 제공하는 7비트(bit) 부호로, 처음 32개의 부호 는 인쇄와 전송 제어용으로 사용됩니다. 보통 기억장치는 8비트(1바이트, 256조합)이고, 아스키 는 단지 128개의 문자만 사용하기 때문에 나머지 비트는 특수문자에 사용됩니다.

char형의 크기는 2 byte이므로 16진수로 0000부터 ffff까지, 문자를 표현하는데 65536개(2 의 16제곱)의 코드값을 사용할 수 있으며, char형 변수는 이 범위 내의 코드값 하나를 저장할 수 있습니다.
예를 들어 알파벳 A의 유니코드값은 0041입니다. char형 변수에 문자 A를 저장하려면 아래와 같이 합니다.

 

  char firstLetter = 'A' ; 또는

  char firstLetter = '\u0041' ; // 16진수 41은 10진수로 65


char형 변수 firstLetter를 선언하고, 문자 A를 저장했습니다. char형 변수에 문자를 저장할 때는 "(홑따옴표)로 문자를 둘러쌉니다. 두 번째는 문자의 코드를 이용해서 문자형 변수 firstLetter에 값을 저장했습니다.
문자형 변수에 값을 저장하는 데는 위의 두 가지 모두 가능하지만, 주로 첫 번째 방식으로 문자
를 저장합니다.

다음은 char형이 저장되는 방식을 short형과 함께 비교해 보았습니다.


[표2-4]char형과 short형의 값 비교

char형이나 short형은 크기가 모두 2 byte(16 bit)지만, 범위가 다릅니다. char형은 0~65535 이고 short형은 -32768~32767입니다.

하지만, 둘 다 2 byte이기 때문에 표현할 수 있는 수는 65536개로 같습니다. char 형은 문자의 코 드값을 저장하므로 음수를 필요로 하지 않기 때문에 2진수로 표현했을 때의 첫 번째 자리를 부 호에 사용하지 않습니다. 반면에 short형은 첫 번째 자리를 부호를 표현하는데 사용하기 때문에 서로 다른 범위를 갖게 되는 것입니다. 이처럼 char형은 정수형과 표현방식이 같기 때문에 정수 형과 깊은 관계가 있습니다.

만 일 어떤 문자의 코드값을 알고 싶으면, char형 변수를 정수형(int)으로 변환하면 됩니다. 어떤 타입(Type, 형)을 다른 타입으로 변환하는 것을 형변환(캐스팅, casting)이라고 하는데, 형변 환에 대해서는 후에 자세히 설명하도록 하겠습니다. 지금은 문자의 코드값을 알아내는 방법과, 어 떤 코드가 어떤 문자를 나타내는가를 알아내는 방법이 있다는 정도만 알면 됩니다.

[예제2-1] CharToCode.java

  class CharToCode {
    public static void main(String[] args) {

      char ch = 'A'; // char ch = '\u0041';로 바꿔 써도 같다. int code = (int)ch;
      System.out.println(ch);
      System.out.println(code);

     }

  }



[실행결과]

A 65




위의 예제를 실행하면 65가 화면에 출력되는데, 문자 A의 코드가 10진수로 65임을 뜻합니다.(16진수로는 41)

[예제2-2] CodeToChar.java

  class CodeToChar {
    public static void main(String[] args) {

      int code = 65; // 또는 int code = 0x0041; char ch = (char)code;

      System.out.println(code);

      System.out.println(ch); 

    }

 }

[실행결과]

65 A


이 예제는 코드값 65(16진수로 41)가 어떤 문자를 뜻하는지를 알아낼 수 있는 방법을 알려 줍니다.
[참고] char형은 크기가 2byte이고, 2byte는 16bit이므로 2의 16제곱(65536)개의 값을 저 장할 수 있다. 0을 포함하므로 범위는 0~65535, 16진수로는 0x0000~0xffff가 됩니다.

두 예제에서 볼 수 있듯이 char형의 변수를 정수형(int) 으로 변환(casting)하면, 변수에 저장 되어 있는 문자의 코드값을 10진수로 얻을수 있습니다(CharToCode.java). 반대로 한 코드가 어떤 문자를 나타내는지 알고 싶으면, 코드를 정수형 변수에 저장한 다음, char형으로 변환하여 출력하면 됩니다(CodeToChar.java).

임의로 0~65535사이의 값을 하나 선택한 다음, CodeToChar.java를 이용해서 선택한 코드 가 어떤 문자를 뜻하는지를 알아보거나 반복문을 이용해서 유니코드 전체를 출력해 보는 것도 흥미로울 것입니다.

10진수로 66(16진수로 42)을 문자형으로 변환하여 출력하면 어떤 문자가 출력될까요?

[참고]유니코드(Unicode)는 ASCII코드와의 호환을 위해서, 유니코드 코드번호 1부터 128까 지의 문자를 ASCII코드의 1부터 128까지의 문자와 동일하게 지정하였습니다.

영문자 이외에 Tab이나 space 등의 특수문자를 저장하려면 아래와 같이 하도록 합니다.

  

  char tab = '\t';

 

\t는 실제로는 두 문자로 이루어져 있지만, 단 한 문자 Tab을 의미합니다. 아래의 표는 Tab과 같이 특수한 문자를 어떻게 표현할 수 있는지 알게 해줍니다.











반응형

댓글