언어/JAVA

chapter3. 상수와 형변환(Type Casting)

고구마광팬 2017. 4. 6. 21:17

<1.> 자료형을 기반으로 표현이 되는 상수

1. 상수

1) 메모리공간에 저장이 된다.

2) 이름이 없다

3) 이름이 없으므로 메모리에 저장된 상수의 값을 변경시킬 수 없다.

* 연산의 대상이 되기 위해서는 메모리 공간 어딘가에 저장이 되어있어야 한다.

 

2. 상수의 저장

1) 상수는 기본자료형에 따라 데이터를 표현한다.

2) 기본적으로 모든 정수는 int(4byte) 형으로 저장된다

3) 기본적으로 모든 실수는 double(8byte)형으로 저장된다.

 

* literal(= 문자 그대로의 )(=상수) : 상수는 자료형을 기반으로 메모리공간에 저장이 되기 때문에 그 자체로 데이터로 인정한다. 그래서 나온 표현방법  

 

 

3. 접미사(-> 명시적 형변환의 일종* 실수상수를 f , 정수상수를 l로 변환할때 사용한다.  ) : ~형으로 표현해달라고 명시적 선언.

1) java는 상수의 자료형 검사에 엄격함.

-long a=10000000000; : 에러 발생. 10000000000가 int의 범위를 넘어가기 때문에. -> long a=10000000000L;

2) 변수의 자료형 크기 >= 상수의 자료형 크기 이지 않으면 compile error 가 발생한다

- float a=4.5;  : 4.5의 자료형이 double으로 8byte인데 a의 자료형은 float으로 4byte이다 -> float a=4.5f;

3) 상수의 뒤에 L/l 이나 f/F을 붙여 자료형을 바꿀 수 있다.

4) 예제 >

 

 

 

-e1 : double상수 double변수에 저장

-e2 : float상수 double변수에 저장 ( double이 8byte로 더 크기 때문에 변수와 상수의 자료형이 다르지만 에러가 나지 않는다.)

-n1 : int 범위 넘어가는 수 long상수 지정 -> long에 저장.

-n2 : int상수 long에 저장( double이 8byte로 더 크기 때문에 변수와 상수의 자료형이 다르지만 에러가 나지 않는다.)

 

 

** byte와 short형 상수 표현을 위한 접미사는 존재 x : 산술연산은 int형에서 발생하고, byte/short형 변수에 대해서는 int형상수 기반의 초기화 허용.

byte num=20;

short num=50; 가능.

 

 

 

 

<2> 자료형 변환

: 인간이 인식하기에 같은 수도 컴퓨터에서의 표현방식이 다르면 다른수로 인식된다.

1. 자료형변환의 의미 : 값의 표현방식을 바꾸는 것.

*예시 ) short형의 수를 연산할때 int 로 형변환 후 연산 하는것, 또 다시 short로 형변환 하는것

1) 종류 : 자동형변환, 명시적형변환

 

2. cpu에서의 연산

데이터는 2진수로 저장이 되는데 자료형마다 표현방식이 다르기 때문에 각 데이터들의 표현된 모습 그대로 연산을 하면 옳지 않는 값이 나온다.

따라서 자료형을 하나로 통일해 줘야 한다. (자동형변환) 

 

3. 자동형변환(implicit Conversion) : 연산의 대상이 되는 두 피연산자의 자료형이 일치하지 않아서 자동으로 발생하는 형변환

ex) double num2=3.5f+12

1) 연산에서의 자동 형변환 3.5f + 12 -> 3.5f + 12.0f

2) 데이터저장에서의 자동 형변환 12.0f -> 12.0(double)

2) 자동형변환 규칙 ( 데이터의 손실이 발생하지 않거나, 발생하더라도 손실이 제한적인 경우에만 자동형변환을 한다.)

byte -> short/char -> int -> long -> float -> double  

: 자료형의 바이트 크기가 아닌 값의 표현번위를 기준으로 정의하였다.

 

 

4. 명시적형변환(Explicit Conversion) : 명시적형변환 연산자 이용

1) 실수형상수 -> 정수형상수

int num=(int)3.15 : 소수점 이하의 데이터 손실

2) 실수형상수 -> 실수형상수 / 정수형상수 -> 정수형상수

long num1=2147483648L;

int num2=(int)num1; : 상위 바이트가 잘려나간다

.

int num3=150L;

long num4=(long)num3; : 상위 바이트가 생겨난다.

 

 

* 형변환 : 하나의 연산으로 이미 저장되어있는 값이 변하는 것이 아니라 저장된 값을 참조하여 형변환된 새로운 값을 만드는것.

 

 

 

num1 : ch1은 char형이고 num1은 int 형이다. char형은 int형으로 자동형변환이 가능하므로 ch1에 저장된 값이 형변환되어 num1에 저장된다

num2: ch2는 char형이고 num2는 int형이라서 자동형변환이 일어나는데 명시적으로 형변환 연산으로 진행하고 있다. 하지만 형변환 된다는 사실이 코드에 명시되어 있으므로 더 권장되는 코드구현이다.