[Java] 타입

박은지·2022년 2월 26일
0

1. 변수 ( Variable )

변수(Variable)란 데이터(data)저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간

변수 이름 생성 규칙

  • 영문자(대소문자), 숫자, 언더스코어(_), 달러($)로만 구성할 수 있다.
  • 숫자로 시작할 수 없다.
  • 변수의 이름 사이에는 공백을 포함할 수 없다.
  • 변수의 이름으로 자바에서 미리 정의된 키워드(keyword)는 사용할 수 없다.

💡 변수의 이름은 해당 변수에 저장될 데이터를 나타내도록 짓는 것이 좋다.

변수의 종류

[1] 기본형 ( Primitive Type ) 변수

기본형(Primitive Type) 변수는 실제 연산에서 사용되는 변수이다.
Java에서는 다음 8가지 종류의 기본형 변수를 제공한다.

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

[2] 참조형 ( Reference Type ) 변수

참조형(Reference Type) 변수는 8가지의 기본형 변수를 사용하여 사용자가 직접 만들어 사용하는 변수를 말한다.

변수의 선언

1) 변수의 선언과 초기화를 "따로"

이 방법은 먼저 변수를 선언하여 메모리 공간을 할당받고, 나중에 변수를 초기화 하는 방법이다.
선언만 된 변수는 초기화되지 않았기 때문에 해당 메모리 공간에는 알 수 없는 쓰레깃값만 들어가 있다.
따라서 선언만 된 변수는 반드시 초기화를 완료한 후에 사용해야 한다.

int n; // 변수 선언
n = 24; // 변수 초기화

변수의 선언

타입 변수이름 ;

변수의 초기화'

변수이름 = 초깃값;

2) 변수의 선언과 초기화를 "동시에"

변수의 선언과 초기화를 동시에 처리할 수 있다.
또한 선언하려는 변수들의 타입이 같다면 이를 동시에 선언할 수 있다.

int n, m; // 같은 타입의 변수를 동시에 선언

double x = 90.99; // 변수의 선언과 초기화를 동시에

double y = 24.315, z = 33.615; // 같은 타입의 변수의 선언과 초기화를 동시에
  • 선언하고자 하는 변수들의 타입이 같은 경우
    타입 변수이름 [ , 변수이름 ] ;
  • 변수의 선언과 초기화를 동시에
    `타입 변수이름 = 초깃값 [ , 변수이름 = 초깃값 ];

💡 선언하고자 하는 변수의 타입이 서로 다르면 동시에 선언할 수 없다.
또한, 타입이 같은 변수를 동시에 선언하는 것은 가능하지만 동시에 초기화하는 것은 불가하다.

int x, y;  // 타입이 같은 변수를 동시에 선언하는 것은 가능
x = 24, y = 33; // 동시에 초기화하는 것은 불가능

2. 상수 ( Constant )

상수 ( Constant )

상수(Constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간이다.
여기 기억해야할 점은 상수는 선언과 동시에 반드시 초기화해 주어야 한다는 점이다.
또한 변수와 달리 프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없다는 점이다.

// 상수
final int YEAR = 2022;

final 타입 상수명 = ;
💡 Java에서 상수의 이름은 일반적으로 모두 대문자를 사용하여 선언한다.
또한, 여러 단어로 이루어진 이름의 경우 언더스코어( _ )를 사용하여 구분한다.

리터럴 ( Literal )

리터럴(Literal)이란 그 자체로 값을 의미하는 것이다.
즉, 변수(Variable)와 상수(Constant)와는 다르게 데이터가 저장된 메모리의 공간을 가리키는 이름을 가지고 있지 않다.

int x = 33; // 33이 리터럴

final int YEAR = 2022; // 2022가 리터럴

타입에 따른 리터럴

Java에서 리터럴(Literal)은 타입에 따라 다음과 같이 구분할 수 있다.

  • 정수형 리터럴 ( Literal )

    정수형 리터럴은 111, -333와 같이 아라비아 숫자부호로 직접 표현한다.
  • 실수형 리터럴 ( Literal )

    실수형 리터럴은 1.11, -9.99와 같이 소수 부분을 가지는 아라비아 숫자부호로 표현한다.
  • 논리형 리터럴 ( Literal )

    논리형 리터럴은 true 혹은 false로 표현한다.
  • 문자형 리터럴 ( Literal )

    문자형 리터럴은 'A', 'z'와 같이 작은따옴표( ' ' )로 감싸진 문자로 표현한다.
  • 문자열 리터럴 ( Literal )

    문자열 리터럴은 "AAA", "ZZZZ"와 같이 큰따옴표( " " )로 감싸진 문자열로 표현한다.
  • null 리터럴 ( Literal )

    null 리터럴은 단 하나의 값인 null로 표현한다.

리터럴 타입에 따른 접미사 ( Literal type suffix )

Example

Java에서 3.14와 같은 실수형 리터럴을 그대로 사용하면 해당 리터럴은 실수형 타입 중에서도 double형으로 인식할 것이다.
하지만 실수형 리터럴 맨 뒤에 Ff를 붙이면, Java에서는 해당 실수형 리터럴을 float형으로 인식할 것이다.

이처럼 리터럴 뒤에 추가되어 해당 리터럴의 타입을 명시해주는 접미사리터럴 타입에 따른 접미사(Literal type suffix)라고 한다.

  • L 또는 : long
  • F 또는 f : float
  • D 또는 d (생략 가능) : double

3. 기본타입 ( Primitive Type )

[1] 정수형 타입

Java에서 정수는 부호를 가지고 있고, 소수 부분이 없는 수를 의미한다. 정수형의 종류는 다음과 같다.

  • byte
  • short
  • int
  • long
정수형 타입할당되는 메모리의 크기데이터 표현 범위
byte1 바이트-2^7 ~ (2^7 - 1)
short2 바이트-2^15 ~ (2^15 - 1)
int4 바이트-2^31 ~ (2^31 - 1)
long8 바이트 -2^63 ~ (2^63 - 1)

정수형 데이터의 타입을 결정할 때에는 반드시 자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 한다.
해당 타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면, 오버플로우(overflow)가 발생하여 전혀 다른 값이 저장될 수 있다.

  • 오버플로우 ( Overflow )
    해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상
    오버플로우가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 인접 비트를 덮어쓰기 때문에 잘못된 결과를 얻을 수 있다.
  • 언더플로우 ( Underflow )
    해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상

[2] 실수형 타입

Java에서 실수는 소수부나 지수부가 있는 수를 의미하며, 정수보다 더 넓은 범위의 표현 범위를 가진다.
실수형의 종류는 다음과 같다.

  • float
  • double
실수형 타입지수의 길이가수의 길이유효 자릿수할당되는 메모리의 크기데이터 표현 범위리터럴 타입 접미사
float8 비트23 비트소수 부분 6자리까지 오차없이 표현 가능4 바이트(3.4 X 10^-38) ~ (3.4 X 10^38)F 또는 f
double11 비트52 비트소수 부분 15자리까지 오차없이 표현 가능8 바이트(1.7 X 10^-308) ~ (1.7 X 10^308)D 또는 d (생략 가능)

[3] 논리형 타입

Java에서 논리형 타입은 true거짓 false 중 한 가지 값만을 가질 수 있는 불린 ( Boolean ) 타입을 의미한다.

논리형 타입할당되는 메모리의 크기데이터 표현 범위
boolean1 바이트true 혹은 false

[4] 문자형 타입

Java에서 문자형 데이터란 작은 정수나 문자 하나를 표현할 수 있는 타입을 의미한다.

논리형 타입할당되는 메모리의 크기데이터 표현 범위
char2 바이트 0 ~ 2^16

컴퓨터는 2진수밖에 인식하지 못하므로 문자도 숫자로 표현해야 인식할 수 있다.
따라서 어떤 문자를 어떤 숫자에 대응시킬 것인가에 대한 약속이 필요하다.

Java에서는 유니코드(unicode)를 사용하여 문자를 표현한다.
아스키코드는 영문자와 숫자밖에 표현 못 하지만, 유니코드는 각 나라의 모든 언어를 표현할 수 있다.
유니코드는 문자 하나를 16비트로 표현하므로, 총 65,536개의 문자를 표현할 수 있다.


4. 실수의 표현

[1] 고정 소수점 ( Fixed point ) 방식

실수는 보통 정수부소수부로 나눌 수 있다.
따라서 실수흫 표현하는 가장 간단한 방식은 소수부의 자릿수를 미지 정하고, 고정된 자릿수의 소수를 표현하는 것이다.

32비트의 실수를 고정 소수점 방식으로 표현하면 다음과 같다.

하지만 이런 방법은 정수부와 소수부의 자릿수가 크지 않으므로, 표현할 수 있는 범위가 매우 적다는 단점이 있다.

[2] 부동 소수점 ( Floating point ) 방식

실수는 가수부지수부로도 나눌 수 있다.
부동 소수점 방식이 바로 하나의 실수를 가수부와 지수부로 나누어 표현하는 방식이다.

수식
+- ( 1. 가수부 ) x 2^( 지수부 - 127 )

현재 대부분의 시스템에서는 부동 소수점 방식으로 실수를 표현하고 있다.

IEEE 부동 소수점 방식

현재 사용되고 있는 부동 소수점 방식은 대부분 IEEE 754 표준을 따르고 있다.

[ 32 비트의 float형 실수 ]


[ 64 비트의 double형 실수 ]


5. 타입 변환 ( Type Conversion )

하나의 타입을 다른 타입으로 바꾸는 것을 타입 변환 ( Type Conversion )이라고 한다.
Java에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행할 수 있다.

종류

[1] 묵시적 타입 변환 (자동 타입 변환, Implicit Conversion)

묵시적 타입 변환이란 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환을 의미한다.
Java에서는 데이터의 손실이 발생하지 않거나, 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환을 진행한다.
또한, 데이터의 손실이 발생하는 대입 연산은 허용하지 않는다.

int x = 10; 
// int y = 3.14;  
int z = 7.0f + 3.14; // 묵시적 타입 변환

System.out.println(x);  // 10.0 : double형 변수에 int형 데이터를 대입하므로, int형 데이터가 double형으로 자동 타입 변환
System.out.println(y);  // Error : int형 변수가 표현할 수 있는 범위보다 더 큰 double형 데이터를 대입하므로, 데이터의 손실이 발생
System.out.println(z);  //  10.14 :  float형 데이터와 double형 데이터의 산술 연산을 수행, 데이터의 손실이 최소화되도록 float형 데이터가 double형으로 자동 타입 변환

[2] 명시적 타입 변환 (강제 타입 변환, Explicit Conversion)

명시적 타입 변환은 사용자가 타입 캐스트 연산자(())를 사용하여 강제적으로 수행하는 타입 변환을 의미한다.

문법
( 변환할타입 ) 변환할데이터

변환시키고자 하는 데이터의 앞에 괄호( ( ) ) 를 넣고, 그 괄호 안에 변환할 타입을 적으면 된다.
Java에서는 이 괄호( ( ) )를 타입 캐스트(type cast) 연산자라고 한다.

int x = 1, y = 4;

double z1 = x / y;
double z2 = (double) x / y; // 명시적 타입 변환

System.out.println(z1);  // 0.0
System.out.println(z2);  //  0.25

0개의 댓글