Dico

[Java] 변수의 타입

자료형 Data Type

값의 종류에 따라 값이 저장될 공간의 크기와 저장형식을 정의한 것.

변수에 저장되는 데이터의 타입.

크게 기본형과 참조형이 있다.

기본형 Primitive Type

실제 값을 저장한다.

  • 종류

     정수형(byte, short, int, long), 실수형(float, double), 문자형(char), 논리형(boolean)

1 byte2 byte4 byte8 byte
정수형byteshortintlong
실수형floatdouble
문자형char
논리형boolean

정수형

0을 포함한 음수와 양수의 정수 값을 저장한다.

2진수에서 왼쪽 첫 번째 자리를 부호 자리로 사용한다.

저장할 수 있는 값의 범위를 넘어서면 최소값으로 돌아가며 연산한다. → 오버플로우 Overflow

byte범위사용기본값
byte1-128 ~ 127이진 데이터0
short2-32768 ~ 32767C언어와 호환0
int4-2147483648 ~ 2147483647CPU에 빠른 접근0
long8-9223372036854775808 ~ 9223372036854775807값이 큰 정수0L(l)

실수형

실수값을 부동소수점(floating-point)방식으로 저장.

값의 범위나 정밀도에 따라 오차가 발생한다.

부호, 지수, 가수로 이루어져 있다.

  • 부호 Sign bit :  1 bit. 양수는 0, 음수는 1.
  • 지수 Exponent :  8 bit. 부호 있는 정수.
  • 가수 Mantissa :  23 bit. 실제 값을 저장하는 부분. 정밀도.
byte부호지수가수기본값
float40 / 1-127 ~ 12810진수 7자리0.0f(F)
double80 / 1-1023 ~ 102410진수 15자리0.0d(D) 또는 0.0

저장 범위를 넘으면 무한대(오버플로우), 적으면 0(언더플로우 Underflow)이 된다.

double a = 1.0e100;
float b = (float) a;   // b = infinity
double c = 1.0e-100;
float d = (float) c;   // d = 0.0

값이 소수점/10의 제곱을 나타내는 기호(e/E)/접미사 f(F) 또는 d(D)를 포함하고 있으면 실수형으로 간주된다.

double a = 1.;       // a = 1.0
double b = .1;       // b = 0.1
double c = 1e1;      // c = 10.0
double d = 1e-1;     // d = 0.1
float e = 1f;        // e = 1.0
float f = 1.e1f;     // f = 10.0

문자형 char

단 하나의 문자만 저장할 수 있다.

작은 따옴표를 사용하여 값을 저장한다.

빈 문자('')는 안되지만 공백(' ')은 저장할 수 있다.

default :  '\u0000'

char a = 'a';
char b = '강';
char c = '멍멍';            // error

문자를 유니코드(Unicode. 문자를 숫자화한 것. 2byte 문자체계)로 저장하기 때문에 문자가 아닌 유니코드를 넣을 수 있다.

char a = 'A';
char b = 65;

문자를 int로 형변환시키면 유니코드를 알 수 있다.

char ch = 'A';
int unicode = (int) ch;

논리형 boolean

true(같다)와 false(다르다) 중 하나의 값만 가진다.

조건식과 논리적 계산에 사용된다.

default :  false

int a = 3;
boolean b = a > 0;   // true

참조형 Reference Type

값이 저장되어 있는 공간의 주소(메모리 주소) 또는 null을 저장한다.

String, 클래스 이름 등 기본형을 제외한 나머지 타입. 참조변수.

  • null :  어떠한 객체도 가리키고 있지 않다는 뜻. 참조변수의 기본값.
  • 메모리 주소 Memory Address :  메모리에 붙는 1byte단위의 일련번호. 4byte의 정수값(0x0~0xffffffff).

참조형의 초기화

new 연산자(객체 생성 연산자)로 객체(and 객체의 주소)를 생성한다.

String str = new String();
MyActivity myActivity = new MyActivity();

문자열

String 클래스 (char 배열에 여러 가지 기능을 추가하여 확장한 것).

큰 따옴표를 사용하며, 빈 문자열("")을 저장할 수 있다.

초기화할 때 new 연산자를 사용해야 하지만 기본형처럼 할 수도 있다.

String str = new String("love");
String love = "love";

덧셈 연산자(+)를 사용할 때 한 쪽에 문자열이 있으면 다른 한쪽을 String으로 변환하여 결합시킨다.

int a = 1 + 1;                   // 2
int b = a + "love";              // error
String str = "love" + "field";   // lovefield
String love = 2 + str;           // 2lovefield

문자열(String객체)은 내용을 변경할 수 없다.

String str = "love"; 
str = str + "field";             // "lovefield" 라는 새로운 문자열이 str에 저장된다.

상수 Constant

변경할 수 없는 값.

한 번 값을 저장하면 변경할 수 없다.

변수 선언할 때 변수 타입 앞에 final을 붙이면 된다.

변수를 사용하기 전에 반드시 초기화해야 한다.

값에 의미 있는 이름을 붙여 가독성을 높이고, 코드의 이해와 수정을 쉽게 만든다.

대문자로 표현하며, 하나 이상의 단어를 사용할 경우 밑줄 문자(_)로 구분한다.

final int LOVE_FIELD = 0;
LOVE_FIELD = 2;                  // error

리터럴 Literal

값.

리터럴에 타입이 있기 때문에 변수에도 타입이 생겼다.

리터럴의 타입은 값에 접미사를 붙여서 구분한다.

형변환 Casting

(타입) 피연산자

변수나 리터럴의 타입을 다른 타입으로 변환하는 것.

형변환 연산자(괄호(). Casting 연산자)를 사용하여 원하는 타입으로 변환시킨다.

피연산자의 값은 영향을 받지 않는다.

기본형에서 논리형을 제외한 나머지는 서로 형변환이 가능하다.

기본형은 기본형끼리, 참조형은 참조형끼리 가능하다.

  • 자동 형변환 (확대 변환, 암시적 형변환)

     범위 큰 타입  = 범위 작은 타입;

     값의 범위가 작은 타입에서 큰 타입으로의 형변환

     연산자를 생략할 수 있다.

     - 값의 범위 :  byte(1byte) < short(2byte) < int(4byte) < long(8byte) < float(4byte) < double(8byte)

                            char(2byte) < int(4byte)

int a = 2;
double d = a;    // 2.0
  • 강제 형변환 (축소 변환, 명시적 형변환)

     범위 작은 타입 = (작은 타입) 범위 큰 타입;

     값의 범위가 큰 타입에서 작은 타입으로 형변환하기 때문에 값 손실이 발생할 수 있다.

long l = 9_999_999_999L;
int a = (int) l;      // 1410065407

     명시적으로 형변환하는 것을 캐스팅(Casting)이라고 한다.

  • 산술 변환

     서로 다른 타입간의 연산을 할 경우 값의 범위가 더 넓은 타입으로 일치시킨 후 연산을 수행한다.

int a = 3;
double b = 4.0;
double d = a + b;
      // = (double) a + b
      // = 3.0 + 4.0
      // = 0.7

     값의 범위가 int 보다 작은 타입끼리의 연산은 int로 형변환된 후 수행된다.

short a = 1;
byte b = 2;
int c = a + b;
   // = (int) a + (int) b
   // = 3

정수형 간의 형변환

큰 타입에서 작은 타입으로 변환할 경우 값의 범위 차이로 인해 값 손실이 발생할 수 있다.

작은 타입에서 큰 타입으로 변환할 경우 2진수의 빈 자리를 0 또는 1로 채운다.

int a = 5;
byte b = (byte) a;       // b = 5
int c = 500;
byte d = (byte) c;       // d = -12;

실수형 간의 형변환

float에서 double로 변환할 경우 빈자리를 0으로 채운다.

double에서 float로 변환할 때 값의 범위를 넘으면 무한대, 적으면 0이 되며,

값의 범위를 넘지 않으면 double의 가수 52자리 중 앞의 23자리만 저장되고 나머지는 버려진다.

만일 24번째 자리의 값이 1(2진수)이면 반올림이 발생한다.

정수형과 실수형 간의 형변환

정수형을 실수형으로 변환할 때 정밀도에 따른 오차가 발생할 수 있다.

int의 경우 정밀도가 float와 double 사이에 있어서 오차를 피하려면 double로 변환해야 한다.

실수형을 정수형으로 변환할 때 실수형의 소수점 이하 값은 버려진다.

참고 서적: 자바의 정석 3판