안녕하세요, 여행벌입니다.

 오늘은 JAVA의 자동 형 변환(Implicit Conversion) 과 명시적 형 변환(Explicit Conversion) 에 대해서 다뤄보겠습니다.


자료형의 변환


 연산을 진행할 때, 컴파일러는 변수가 자료형이 동일할 것을 기대합니다. 하지만, 다음과 같이 서로 다른 자료형에 대해서 덧셈 연산을 진행한다면 어떻게 될까요?

int num = 5;
long num2 = 10L;
// num + num2 ??

 int 형 변수 num과 long 형 변수 num2 에 대해서 덧셈 연산을 진행한다면 데이터를 다루는 범위가 더 큰 long 형으로 자료형을 통일해줘야 데이터의 손실 없이 연산이 가능할 것입니다.

- num에 저장된 값을 long 형으로 변환하여 메모리에 임시 저장한다.

- 변환된 값과 num2에 저장된 값을 대상으로 덧셈을 진행한다.

따라서, 위의 두 과정이 진행되야만 우리가 원하는 결과를 얻을 수 있을 것입니다.

이러한 과정을 '자료형 변환' 또는 '형 변환' 이라고 합니다.


자동 형 변환(Implicit Conversion)


 프로그래머가 명시한 형 변환이 아니고 필요한 상황에서 규칙에 근거하여 자동으로 일어나는 형 변환을 '자동 형 변환' 이라고 합니다.

- 자료형의 크기가 큰 방향으로 형 변환이 일어난다.

- 자료형의 크기에 상관없이 정수 자료형보다 실수 자료형을 우선시한다.

 위의 두 규칙에 근거하여 자바에서는 자동 형 변환이 발생합니다.

 

 예시를 통해서 조금만 익혀보겠습니다.

int num1 = 50;
long num2 = 9999999999L;
System.out.println(num1 + num2); // num1을 long 형으로 자동 형 변환 후 연산 진행

 자동 형 변환에 의해 에러 없이 다음과 같이 결과가 나옵니다.

[console]
10000000049

 이번에는 정수형과 실수형을 같이 연산해보겠습니다.

package Hello;

public class HelloWorld {
	public static void main(String args[]) {
		int num1 = 50;
		float num2 = 3.04f;
		System.out.println(num1 + num2); // num1을 long 형으로 자동 형 변환 후 연산 진행
	}
}
[console]
53.04

 에러 없이 결과가 나오는 것을 확인할 수 있습니다.


명시적 형 변환(Explicit Conversion)


 자동 형 변환이 진행되지 않는 상황에서도 필요하다면 프로그래머가 '명시적 형 변환' 을 통해서 강제로 형 변환이 이뤄지도록 할 수 있습니다.

double num1 = 3.1415;
int num2 = (int)num1; // num1을 강제로 형 변환 -> num2 = 3

 다음과 같이 변수 앞에 (우리가 원하는 자료형) 을 통해 강제로 형 변환을 진행할 수 있습니다. 위의 예시는 double 형을 int 형으로 강제로 형 변환했으므로 소수점 이하의 값들은 날아가고 num2 에는 3만 저장됩니다.

short num1 = 3;
short num2 = 5;
short result = num1 + num2;

 short 형 num1과 num2를 연산해서 같은 자료형 result에 저장했습니다. 위의 코드는 문제가 없을까요??

 문제가 있습니다!! '자바에서 정수형 연산은 int 형으로 진행한다.' 때문에 num1 + num2의 결과는 int 형입니다. 따라서 다음과 같이 강제로 형 변환을 해야만 에러가 발생하지 않습니다.

package Hello;

public class HelloWorld {
	public static void main(String args[]) {
		short num1 = 3;
		short num2 = 5;
		short result = (short)(num1 + num2);
	}
}

 

 안녕하세요, 여행벌입니다.

 이번 포스팅에서는 리터럴(Literals)이 무엇이고 자바에서는 숫자를 어떻게 보기로 약속했는지, 그에 따라 앞에서 다룬 double, float, long 같은 자료형을 어떻게 활용할 수 있는지에 대해 다뤄보겠습니다.


리터럴(Literals)


int num = 157;

위의 코드에서 대입 연산자의 오른편에 위치한 숫자 157을 가리켜 '리터럴' 또는 '리터럴 상수'라고 합니다.

 

자바의 정수 표현에는 byte, short, int, long 네 가지 표현 방법이 있는데 그러면 정수형 리터럴 상수를 컴파일러는 어떻게 인식할까요?? 또, 실수 표현에도 float, double 두 가지 표현 방법이 있는데 실수형 리터럴 상수를 어떻게 인식할까요? 이렇듯 숫자를 접했을 때 이를 '무엇으로 인식할지에 대한 일종의 약속'이 필요하고, 이 약속에 근거하여 표현된 숫자를 '리터럴' 또는 '리터럴 상수'라고 합니다.


정수형 리터럴(Literals)


 자바에서는 정수형 숫자들은 모두 int 형으로 인식합니다. 저번 포스팅에서 다룬 '자바는 정수형 연산을 기본적으로 int형으로 진행한다' 와 같은 맥락입니다. 따라서, 다음과 같은 상황은 오류가 발생합니다.

long num = 999999999999; // int 형 범위를 넘어가는 리터럴상수

 위의 리터럴 상수는 int 형 범위를 벗어나지만, long 형 범위를 넘어가지는 않는 상수입니다. C언어나 C++ 에서는 다음과 같이 선언하면 전혀 문제가 되지 않지만, 자바에서는 기본적으로 int 형으로 인식하기 때문에 에러가 발생합니다. 따라서, int 형 범위를 벗어나는 숫자를 다루고 싶다면 다음과 같이 숫자 끝에 'L' 또는 'l' 을 붙여서 long 형 정수로 봐달라고 표현해줘야 컴파일러가 제대로 인식을 할 수 있습니다.

long num = 99999999999L;

 자바는 byte형과 short형 정수의 표현 방법을 제공하지 않기 때문에 byte형과 short 형은 아래와 같이 그냥 int 형으로 초기화를 할 수 있습니다. 또, 연산을 byte 형이나 short형으로 진행하는 방법은 없습니다.

byte num = 2;
short num = 5;

 자바는 int 형 정수를 2진수, 8진수, 16진수로 표현할 수 있습니다. 숫자 앞에 2진수는 '0B' 또는 '0b'  , 8진수는 '0', 16진수는 '0x' 또는 '0X' 를 붙여서 표현할 수 있습니다.

int num = 0B11; // 2진수 11 -> 3
int num = 011; // 8진수 11 -> 9
int num2 = 0X11; // 16진수 11 -> 17

 또, 자바는 단위가 큰 수의 표현 및 인식에 도움을 주기 위해서 숫자 중간에 언더바를 넣는 것도 허용합니다.

int num = 999_999_999; // 999999999를 의미

실수형 리터럴(Literals)


 자바에서 실수형 숫자들은 모두 double 형으로 인식합니다. 따라서, float 형으로 표현하고 싶다면 숫자 뒤에 'f' 또는 'F'를 붙여서 표현해줘야 합니다.

float num = 3.005F; // float형
double num = 3.005; // double형

 따라서, 다음과 같은 표현은 에러가 발생합니다.

float num = 3.005; // 실수는 기본적으로 double 형으로 인식한다.

 

 

안녕하세요, 여행벌입니다.

이번 포스팅에서는 상수란 무엇인지 알아보겠습니다.


상수


■ 상수는 '값이 변하지 않는 수' 를 의미합니다. 자바에서는 한번 그 값이 정해지면 이후로는 변경이 불가능한 변수를 상수라고 얘기합니다.

■ 자바에서는 변수를 선언할 때 앞에 final 이라는 선언을 추가하면 그 변수는 '상수'가 됩니다.

package example1;

public class example1_1 {
	public static void main(String args[]) {
		final int SIZE =100;
		final char NAME = '홍';
		final int MAX_SIZE;
		MAX_SIZE = 150;
		System.out.println(MAX_SIZE);
	}
}

 같이 final 을 추가해 변수를 선언하면 '상수' 가 됩니다. 선언하면서 값을 초기화 해도 되고 아니면 선언하고 후에 값을 초기화해도됩니다. 하지만 한 번 값을 선언하면 바꿀 수 없습니다.ㅁㄴ

package example1;

public class example1_1 {
	public static void main(String args[]) {
		final int SIZE =100;
		SIZE = 150;
		System.out.println(SIZE);
	}
}

 

위의 코드는 한 번 값을 선언한 상수의 값을 바꾸려고 하기 때문에 에러가 발생합니다.


상수 이름 규칙


■ 상수의 이름은 모두 대문자로 짓습니다.

■ 이름이 둘 이상의 단어로 이루어진 경우 단어 사이에 언더바를 넣습니다.


이번 포스팅에서는 final 키워드를 이용해 상수를 선언하는 법에 대해서 다뤄보았습니다.

final 키워드는 다른 용도로도 많이 사용되는 키워드입니다.

그 부분에 대해서는 다른 포스팅에서 다뤄보겠습니다.

안녕하세요, 여행벌입니다.

이번 포스팅에서는 변수란 무엇이고, 자바에는 어떤 자료형이 있는지 알아보겠습니다.


변수란 무엇인가.


 "데이터의 저장과 참조를 위해 할당된 메모리 공간에 붙인 이름을 '변수'라 한다."

 즉, 변수는 메모리 공간에 붙여진 이름입니다. 메모리 공간의 할당과 접근 때문에 '변수' 라는 개념이 존재하고, 코드상에서 변수라는 것을 선언하면 메모리 공간이 할당되고 변수명을 이용해 메모리 공간에 접근할 수 있습니다.


자바 자료형의 종류


 변수에 저장할 데이터의 유형을 알리기 위해 앞으로 '자료형(Data Type)' 인 키워드를 변수를 선언할 때 같이 이용할 것입니다. 자바는 다음과 같은 다양한 자료형을 제공합니다.

자료형

데이터

크기

표현 가능 범위

boolean

참과 거짓

1바이트

true, false

char

문자

2바이트

유니코드 문자

byte

정수

1바이트

-128 ~ 127

short

정수

2바이트 

-32,768 ~ 32,767

int

정수

4바이트

-2,147,483,648 ~ 2,147,483,647

long

정수

8바이트

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

float

실수

4바이트

± (1.40 x 10^-45 ~ 3.40 x 10^38 )

double

실수

8바이트

± (4.94 x 10^-324 ~ 1.79 x 10^308 )

 정리하면 다음과 같습니다.

  • 정수 표현 byte, short, int, long

  • 실수 표현 float, double

  • 문자 표현 char

  • 참과 거짓의 표현 boolean

예를 들어, 2와 3을 저장한 다음 더해서 출력하고 싶다면 다음과 같이 코드를 구현해야 합니다.

package Hello;

public class HelloWorld {
	public static void main(String args[]) {
		int a = 2; //int(정수)를 담는 a라는 이름의 변수에다가 정수 2를 저장하겠다
		int b = 3;
		System.out.println(a + b);
	}
}

 


변수의 이름을 짓는 방법


■ 변수의 이름은 숫자로 시작할 수 없습니다.

■ $과 _ 이외의 특수 문자는 변수의 이름에 사용할 수 없습니다.

■ 키워드는 변수의 이름으로 사용할 수 없습니다.

     ( int, double 같은 키워드는 변수명으로 사용할 수 없습니다.)


자바의 기본 자료형


■ 정수 자료형 : byte, short, int, long

 자바는 총 4개의 정수 자료형을 제공합니다. 차이점은 이용하는 저장 공간의 크기로 저장 공간이 클수록 더 많은 값을 표현할 수 있습니다. 보통 프로그래밍을 하다보면 int, long 형을 많이 사용하게 되는데 그 이유는 다음과 같습니다.

 "자바는 정수형 연산을 기본적으로 int형으로 진행합니다."

 즉, short 형 변수 2개를 더하면 error가 발생합니다.

package Hello;

public class HelloWorld {
	public static void main(String args[]) {
		short a = 2;
		short b = 3;
		short result;
		result = a + b;
	}
}

 short 형 변수 result에 short 형 변수 a와 b를 더해서 저장했습니다. 하지만 자바는 정수형 연산을 int 형으로 진행하므로 a + b 한 결과값은 int 형이 됩니다. 따라서 위의 코드는 에러가 발생합니다.

( # long 형 변수는 이미 int 형 보다 더 많은 값을 저장하고 있으므로 long 형으로 연산이 진행됩니다. )

 

■ 실수 자료형 : float, double

 소수점 이하의 값을 지니는 실수의 저장 및 표현을 위한 자료형은 float 과 double로 저장 공간 크기에 따라 표현할 수 있는 범위가 다릅니다. 하지만, 이 둘 모두 정밀도를 포기하고 표현의 범위를 넓힌 자료형들이기 때문에 정확히 실수 값을 다룰 수 없습니다.

 쉽게 얘기하면 실수 자료형 연산은 우리가 생각하는 것과 다르게 오차가 발생할 수밖에 없습니다. 예를 들어, 0.1 을 2진법으로 표현하면 0.00010001⋯ 으로 무한한 공간이 필요합니다.

 즉, 컴퓨터는 실수를 제대로 저장할 수 없다.

 

■ 문자 자료형 : char

 문자 자료형 char는 유니코드를 이용해 문자를 저장합니다. 유니코드는 문자 하나를 2바이트로 표현하는 문자 체계로 대다수 언어의 기본 문자를 표현할 수 있는 문자 체계입니다. 자바의 char는 문자의 저장을 위한 자료형으로 변수 하나에 문자 하나만 저장하는 것이 가능합니다.

 

■ 논리 자료형 : boolean

 true : '참' 을 의미하는 값

 false : '거짓'을 의미하는 값으로 논리자료형 boolean 은 '참'과 '거짓'의 상황 또는 상태를 표현하는 자료형입니다.


 

+ Recent posts