목차
2.1 변수(1)
2.1 변수(2)
2.2 데이터 타입(1)
2.2 데이터 타입(2)
2.3 타입 변환(1)
2.3 타입 변환(2)
참고자료
2.1 변수(1)
- =은 ‘같다’의 뜻이 아닌, value 변수에 30을 저장한다는 뜻
2.1 변수(2)
- 변수는 자신이 선언된 블록 내에서만 사용이 가능
- 블록이란? {}로 감싸진 구역
- 메소드 블록: 메소드를 선언할 때 작성하는 {} 내 구역
- if문에 대한 실행 블록, for문에 대한 실행 블록 등
- var1은 main, if, for문 내에서 사용이 가능하지만, var2는 if 블록에서만, var3는 for 블록에서만 사용 가능
2.2 데이터 타입(1)
- 변수가 한 번 선언되면, 타입을 바꿀 수 없음
- s: 최상위 비트에 양수/음수를 구분짓는 MSB가 위치
- float, double: MSB, 가수, 지수로 구성
- 여기서 최상위 비트는 양수(0)/음수(1)를 구분지음
- 변수 자체에 초과값을 저장하면 컴파일 에러가 나지만, b++, b—와 같이 실행 중에 값의 범위를 초과한 경우 순회하여 초기값으로 돌아감
- 유니코드를 알고 싶을 경우: 선언된 char 타입 변수를 int에 선언해 줌
- char 타입에는 하나의 ‘문자’만 저장 가능, ‘문자열’을 저장하지 못함
- 공백은 유니코드 32에 존재하는 값이므로 char 타입에 저장 가능
2.2 데이터 타입(2)
- short, int 등 어떤 정수든 메모리 바이트에 저장될 때는 2진수로 저장됨
- 밑 그림 예시는 int 타입이며, 10을 표현할 때는 맨 끝 1byte 만큼의 메모리만 사용함(00001010(2) = 10(10))
-
정수가 4바이트냐, 8바이트냐를 구분짓기 위해 (L)을 붙임.
⇒ 컴파일러는 기본적으로 정수를 int 타입으로 해석함, 그래서 컴파일러에게 알려주기 위한 기호임.
- 부동 소수점: 지수와 가수 부분으로 나누어 표현하는 방식
- 0.12345 * 10^1에서, 12345부분이 가수, ^1(승) 부분이 지수
- 가수 부분은 0.xxxx로, 앞에 0. 부분이 항상 있다고 가정함
- 이런 방식으로 보다 큰 수를 저장할 수 있음
-
100000 = 0.1 * 10^7 이므로, 1을 가수, 7을 지수 부분에 저장함
⇒ 즉, 이렇게 하면 100000이라는 숫자를 그대로 저장하는 것 보다 더 경제적으로 저장 가능(1, 7만 저장하면 되니까)
- 자바는 기본적으로 실수 리터럴을 double 타입으로 간주함
- 그러므로, 실수를 double이 아닌 float으로 저장하려면 f를 추가해야 함
- e를 사용하면 곧 지수, 가수로 저장하는 방식이므로 double에 저장하거나, f를 붙여 float에 저장해야 함
- 2e-3 = 0.2 * 10^-3 = 0.002
2.3 타입 변환(1)
- Casting: 강제적으로 코드에 의해 타입 변환이 되는 것
-
예외: byte 변수에 음수 값이 있으면, char 타입으로 변환되지 않음
⇒ char 타입은 음수를 저장할 수 없기 때문에
⇒ byte 값이 65라 할지라도, byte는 음수값을 포함할 수 있기 때문에 char로 변환되지 않음. byte → char는 강제 타입 변환만 가능.
- 큰 타입을 작은 타입으로 변화할 때, 큰 타입을 쪼개 끝 한 부분만 작은 크기 타입으로 변환함
- 예시) 4바이트(int)를 1바이트(byte)로 변환할 수 없으니, int 정수를 쪼개 끝 1바이트만 byte에 강제로 저장
- 캐스팅은 값이 보존되지 않기 때문에 엉뚱한 값이 저장될 수 있음
- 예시2) int value = 10이라는 값은 작기 때문에 마지막 1바이트만 쪼개 byte에 대입해도 값이 보존됨
- 예시3) long(4)를 int(4)로 캐스팅할 경우, 바이트 수가 같기 때문에 의미있는 캐스팅 가능
- 예시4) int(4)를 char(2)로 캐스팅할 경우, int가 2바이트씩 쪼개져, 끝 2바이트만 char로 변환됨(위 예시엔 A=65므로, 값이 보존됨)
- 예시5) double(7) → int(4) 일 경우, 정수 부분만 저장됨
- 캐스팅, 즉 강제 타입 변환은 원래 값이 보존되어야 의미가 있음
- 강제 타입 전환시, 값 보존 여부를 검사하는 코드를 넣는 것이 좋음
2.3 타입 변환(2)
- 강제 타입 변환을 해도 값이 보존되도록 하기
- int(4) → float(4) → int(4) ⇒ 엉뚱한 값이 나옴(-4). 지수, 가수와 쪼개지는 과정을 거치기 때문에 값이 손실됨.
- int(4) → double(8) → int ⇒ 정확한 결과가 나옴. double의 가수 부분이 52비트라 int의 32비트를 소화할 수 있음. float은 23비트라 소화할 수 없음.
- 다른 타입의 연산식에서, 결과는 크기가 큰 타입으로 자동 변환됨
- 작은 타입으로 결과를 내고 싶다면, 큰 타입을 캐스팅하기
- 자바는 기본적으로 정수는 int 타입으로 해석하므로, byte + byte도 int 타입으로 자동 연산됨
- char ai(4) + 1(4, int) 이므로, 결과는 int 타입 result로 계산됨
- 자바에서 정수 타입은 자동으로 double로 해석하기 때문에, byte + 실수 = double 타입으로 결과가 나옴
- 예외) float + 정수 = float이 산출됨