Back-End/Java

자바의 정석 2장: 변수(variable)

챔🐻 2024. 1. 23. 17:32
2⃣

[ 출처 ]
자바의 정석:
https://product.kyobobook.co.kr/detail/S000001550352
자바의 정석 유튜람:
https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp

1. 변수(variable)

1-1 변수(variable)란?

하나의 값을 저장할 수 있는 메몚늬 공간(RAM)

1-2 변수의 선얞곌 쎈Ʞ화

1-3 변수의 명명규칙

명명규칙

  1. 대소묞자가 구분되며 Ꞟ읎에 제한읎 없닀.

    True와 true는 서로 닀륞 것윌로 간죌된닀.

  1. 예앜얎(Reserved word)륌 사용핎서는 안 된닀.

    true는 예앜얎띌 사용할 수 없지만, True는 가능하닀.

  1. 숫자로 시작핎서는 안 된닀.

    top10은 허용하지만, 7up은 허용되지 않는닀.

  1. 특수묞자는 ‘_’와 ‘$’만을 허용한닀.

    $harp은 허용되지만 S#arp는 허용되지 않는닀.

명명규칙 - 권장사항

  1. 큎래슀 읎늄의 첫 Ꞁ자는 항상 대묞자로 한닀.

    변수와 메서드 읎늄의 첫 Ꞁ자는 항상 소묞자로 한닀.

  1. 여러 닚얎 읎늄은 닚얎의 첫 Ꞁ자륌 대묞자로 한닀.

    lastIndexOf, StringBuffer

  1. 상수의 읎늄은 대묞자로 한닀. 닚얎는 ‘_’로 구분한닀.

    PI, MAX_NUMBER

2. 변수의 타입

값의 타입

Ʞ볞형곌 찞조형

Ʞ볞형(primitive type)

  • 8개 : 녌늬형(boolean), 묞자형(char), 정수형(byte, short, int, long), 싀수형(float, double)

찞조형(reference type)

  • 객첎의 죌소륌 저장한닀. 8개의 Ʞ볞형을 제왞한 나뚞지 타입.

2-1 Ʞ볞형(primitive type)

분류타입
녌늬형boolean

true와 false쀑 하나륌 값윌로 갖윌며, 조걎식곌 녌늬적 계산에 사용된닀.
묞자형char
묞자륌 저장하는데 사용되며, 변수에 하나의 묞자만 저장할 수 있닀.
정수형byte, short, int, long
정수륌 저장하는데 사용되며, 죌로 int가 사용된닀. byte는 읎진 데읎터륌 닀룰 때 사용되며, short는 C얞얎와의 혞환을 위핎서 추가되었닀.
싀수형float, double

싀수륌 저장하는데 사용되며, 죌로 double읎 사용된닀.
종류/크Ʞ1248
녌늬형boolean
묞자형char
정수형byteshortintlong
싀수형floatdouble
  • Ʞ볞 자료형 종류/크Ʞ 암Ʞ 팁!
    1. boolean은 true와 false 두 가지 값만 표현할 수 있윌멎 되므로 가장 작은 크Ʞ읞 1byte.
    1. char는 자바에서 유니윔드(2 byte 묞자첎계)륌 사용하므로 2 byte.
    1. byte는 크Ʞ가 1 byte띌서 byte.
    1. int(4 byte)륌 Ʞ쀀윌로 짧아서 short(2 byte), Ꞟ얎서 long(8byte). (short ↔ long)
    1. float는 싀수값을 부동소수점(floating-point) 방식윌로 저장하Ʞ 때묞에 float.
    1. double은 float볎닀 두 배의 크Ʞ(8 byte)륌 ê°–êž° 때묞에 double.

💡Tips

  1. int 타입은 대략 10자늬 륌 저장할 수 있는데. 7~9자늬의 수륌 계산할 때는 넉넉하게 long 타입(앜 19자늬)윌로 선얞하는 것읎 좋닀.
  1. float 정밀도 7자늬 / double 정밀도 15자늬 / float도 큰 값을 저장할 수 있지만 높은 정밀도가 필요한 겜우에는 변수의 타입윌로 double을 선택핎알 한닀.

2-2 상수와 늬터럎(constant & literal)

12, 123, 3.14, ‘A’와 같은 값듀읎 ‘상수’읞데 프로귞래밍에서는 상수륌 값을 한 번 저장하멎 변겜할 수 없는 저장공간윌로 정의하였Ʞ 때묞에 읎와 구별하Ʞ 위핎 상수륌 닀륞 읎늄윌로 불러알만 했닀. 귞래서 상수 대신 늬터럎읎띌는 용얎륌 사용한닀.

변수(variable) : 하나의 값을 저장하Ʞ 위한 공간
상수(constant) : 한 번만 값을 저장 가능한 변수
늬터럎(literal) : ê·ž 자첎로 값을 의믞하는 것

상수 == 늬터럎 읎띌고 볎멎 됚

늬터럎의 타입곌 접믞사

정수형곌 싀수형에는 여러 타입읎 졎재하므로, 늬터럎에 접믞사륌 붙여서 타입을 구분한닀.

종류늬터럎접믞사
녌늬형false, true없음
정수형123, 0b0101, 077, 0xFF, 100LL
싀수형3.14, 3.0e8, 1.4f, 0x1.0p-1f, d
묞자형‘A’, ‘1’, ‘\n’없음
묞자엎“ABC”, “123”, “A”, “true”없음

int octNum = 010;  // 8진수 10, 10진수로 8
int hexNum = 0x10; // 16진수 10, 10진수로 16
int binNum = 0b10; // 2진수 10, 10진수로 2

long big = 100_000_000_000L; // JDK1.7부터 정수형 늬터럎 쀑간에 구분자('_')륌 넣을 수 있게됚!
long hex = 0XFFFF_FFFF_FFFF_FFFFL;

float pi = 3.14f;    // 접믞사 f 대신 F륌 사용핎도 된닀. / 생략 불가
float rate = 1.618d; // 접믞사 d 대신 D륌 사용핎도 된닀. / double읎 Ʞ볞 자료형읎띌 d 생략가능

변수와 늬터럎의 타입 불음치

  1. 범위가 ‘변수(귞늇) > 늬터럎(묌걎)’읞 겜우 OK
    int i = 'A';      // int > char
    long l = 123;     // long > int 
    double d = 3.14f; // double > float
  1. 범위가 ‘변수 < 늬터럎’읞 겜우, 에러
    int i = 30_0000_0000; // int의 범위(20억) 벗얎낚
    long l = 3.14f;       // long < float (싀수형은 정수형볎닀 저장범위가 훚씬 ë„“êž° 때묞에 에러발생)
    float f = 3.14;       // float < double
  1. byte, short 변수에 int 늬터럎 저장가능(당, 변수의 타입의 범위 읎낎얎알 핹)
    byte b = 100; // OK. byte의 범위(-128~127)에 속핚
    byte b = 128; // 에러. byte의 범위륌 벗얎낚

예제

boolean power = true;
byte b = 127;
int oct = 010;  // 8진수, 10진수로 8
int hex = 0x10; // 16진수, 10진수로 16
long l = 10_000_000_000L; 
// long l = 10_000_000_000; // 에러
float f = 3.14f;
double d = 3.14; // d는 생략 가능핎서 지워도 에러가 발생하지 않는닀.
double d2 = 3.14; // float < double 읎Ʞ 때묞에 에러 발생 X

System.out.println(oct); // println은 값을 10진수로만 출력할 수 있닀. 접두사와 접믞사는 출력되지 않음
System.out.println(hex);

System.out.println(10.); // 10.0
System.out.println(.10); // 0.1
System.out.println(10f); // 10.0
System.out.println(1e3); // 1000.0

2-3 형식화된 출력 - printf()

printf()는 ‘지시자(specifier)’륌 통핎 변수의 값을 여러 가지 형식윌로 지정핎죌는 역할을 한닀.

자죌 사용되는 지시자

지시자섀명
%b불늬얞(boolean) 형식윌로 출력
%d10진(decimal) 정수의 형식윌로 출력
%o8진(octal)정수의 형식윌로 출력
%x, %X16진(hexa-decimal) 정수의 형식윌로 출력
%f부동 소수점(floating-point)의 형식윌로 출력
%e, %E지수(exponent) 표현식의 형식윌로 출력
%c묞자(character)로 출력
%s묞자엎(string)로 출력
  • 예제 ch2 - PrintfEx1.java
    byte b = 1;
    short s = 2;
    char c = 'A';
    
    int finger = 10;
    long big = 100_000_000_000L;
    
    System.out.printf("b = %d\n", b);
    System.out.printf("s = %d\n", s);
    System.out.printf("c = %c\n", c);
    System.out.printf("finger = [%5d]\n", finger);  // finger = [   10]
    System.out.printf("finger = [%-5d]\n", finger); // finger = [10   ]
    System.out.printf("finger = [%05d]\n", finger); // finger = [00010] / 필드가 5자늬볎닀 짧윌멎 왌쪜에 0윌로 채우띌는 뜻
    System.out.printf("big = %d\n", big);

지시자 '%x'와 '%o'에 '#'륌 사용하멎 접두사 '0x(16진수)'와 '0(8진수)'읎 각각 붙는닀. 귞늬고 '%X'는 16진수에 사용되는 접두사와 영묞자륌 대묞자로 출력한닀.

long hex = 0xFFFF_FFFF_FFFF_FFFFL; // long hex = 0xFFFFFFFFFFFFFFFFL;

System.out.printf("hex = %x\n", hex);  // hex = ffffffffffffffff
System.out.printf("hex = %#x\n", hex); // hex = 0xffffffffffffffff
System.out.printf("hex = %#X\n", hex); // hex = 0XFFFFFFFFFFFFFFFF

10진수륌 2진수로 출력핎죌는 지시자는 없Ʞ 때묞에 Integer.toBinaryString(int i)륌 사용핎알 한닀.

int octNum = 010;       //  8진수 10, 10진수로는 8
int hexNum = 0x10;      // 16진수 10, 10진수로는 16
int binNum = 0b10;      //  2진수 10, 10진수로는 2

System.out.printf("octNum = %o, %d\n", octNum, octNum);
System.out.printf("hexNum = %x, %d\n", hexNum, hexNum);
System.out.printf("binNum = %s, %d\n", Integer.toBinaryString(binNum), binNum);

싀수형 값의 출력에 사용되는 지시자는 ‘%f’, ‘%e’, ‘%g’가 있는데, ‘%f’가 죌로 쓰읎고 ‘%e’는 지수 형태로 출력할 때, ‘%g’는 값을 간략하게 표현할 때 사용한닀.

‘%f’는 Ʞ볞적윌로 소수점 아래 6자늬까지만 출력하Ʞ 때묞에 소수점 아래 7자늬에서 반올늌한닀. 귞래서 1.23456789가 1.234568로 출력되었닀.

String url = "www.codechobo.com";

float f1 = .10f; // 0.10. 1.0e-1
float f2 = 1e1f; // 10.0, 1.0e1, 1.0e+1
float f3 = 3.14e3f;
double d = 1.23456789;

System.out.printf("f1=%f, %e, %g%n", f1, f1, f1); 
System.out.printf("f2=%f, %e, %g%n", f2, f2, f2); 
System.out.printf("f3=%f, %e, %g%n", f3, f3, f3);

System.out.printf("d = %f\n", d);
System.out.printf("d = %14.3f\n", d); // 전첎 14자늬 쀑 소수점 10자늬

System.out.printf("[12345678901234567890]%n");
System.out.printf("[%s]\n", url);    // 묞자엎의 Ꞟ읎만큌 출력공간을 확볎
System.out.printf("[%20s]\n", url);  // 최소 20Ꞁ자 출력 공간 확볎.(ìš°ìž¡ 정렬)
System.out.printf("[%-20s]\n", url); // 최소 20Ꞁ자 출력 공간 확볎.(좌잡 정렬)
System.out.printf("[%.8s]\n", url);  // 왌쪜에서 8Ꞁ자만 출력
f1=0.100000, 1.000000e-01, 0.100000
f2=10.000000, 1.000000e+01, 10.0000
f3=3140.000000, 3.140000e+03, 3140.00
d = 1.234568 // 마지막 자늬 반올늌됚
d =          1.235
[12345678901234567890]
[www.codechobo.com]
[   www.codechobo.com]
[www.codechobo.com   ]
[www.code]

2-4 화멎에서 입력받Ʞ - Scanner

3. 진법

3-1 10진법곌 2진법

우늬는 음상생활에서 죌로 사용하는 것은 10진법읎닀. 아마도 사람읎 10개의 손가띜을 가 지고 있Ʞ 때묞읎 아닐까. 1816년에 개발된 컎퓚터읞 에니악(ENIAC)을 사람에게 익숙한 10법을 사용하도록 섀계되었윌나 전Ʞ회로는 전압읎 불안정핎서 전압을 10닚계로 나누얎 처늬하는데 한계가 있었닀. 귞래서 1950년에 개발된 에드박(ENIAC)은 당 두 가지 닚계, ì „êž°ê°€ 흐륎멎 1, 흐륎지 않윌멎 0만윌로 동작하도록 섀계되었고 맀우 성공적읎었닀.

ê·ž 읎후부터 지ꞈ까지 대부분의 컎퓚터는 2진 첎계로 섀계되었Ʞ 때묞에, 2진법을 알지 못하멎 컎퓚터의 동작원늬나 데읎터 처늬방식을 옚전히 읎핎할 수 없닀.

3-2 비튞(bit)와 바읎튞(byte)

한 자늬의 2진수륌 ‘비튞(bit, binary digit)’띌고 하며, 1비튞는 컎퓚터가 값을 저장할 수 있는 최소닚위읎닀.

귞러나 1비튞는 너묎 작은 닚위읎Ʞ 때묞에 1비튞 8개륌 묶얎서 ‘바읎튞(byte)’띌는 닚위로 정의핎서 데읎터의 Ʞ볞 닚위로 사용한닀.

워드(word) : CPU가 한 번에 처늬할 수 있는 데읎터의 크Ʞ

워드의 크Ʞ는 CPU의 성능에 따띌 달띌진닀. 예륌 듀얎 32비튞 CPU에서 1워드는 32비튞(4바읎튞)읎고, 64비튞 CPU에서는 64비튞(8바읎튞)읎닀.

💡
n비튞로 표현할 수 있는 10진수
값의 개수 :
2n2^n
값의 범위 : 0~
2n2^n-1

10진수 n자늬로 표현할 수 있는 값의 범위가 ‘0~10n10^n-1’띌는 것곌 비교핎볎멎 읎핎가 더 쉜닀. 10진수 2자늬로 표현할 수 있는 값의 범위는 ‘0~10210^2-1’ 슉 0~99가 된닀.

3-3 8진법곌 16진법

2진법은 였직 0곌 1, 두 개의 Ʞ혞만윌로 값을 표현하Ʞ 때묞에, 2진법윌로 값을 표현하멎 자늬수가 상당히 Ꞟ얎진닀는 닚점읎 있닀. 읎러한 닚점을 볎완하Ʞ 위핎 2진법 대시 8진법읎나 16진법을 사용한닀.

8진수는 2진수 3자늬륌, 16진수는 2진수 4자늬륌 각각 한자늬로 표현할 수 있Ʞ 때묞에 자늬수가 짧아젞서 알아볎Ʞ 쉜고 서로 간의 변환방법도 맀우 간닚하닀.

<2, 8, 10, 16진법에 사용되는 Ʞ혞>

2진수륌 8진수, 16진수로 변환

2진수륌 8진수로 변환하렀멎, 2진수륌 뒀에서부터 3자늬씩 끊얎서 귞에 핎당하는 8진수로 바꟞멎 된닀. 8은 232^3읎Ʞ 때묞에, 8진수 한 자늬가 2진수 3자늬륌 대신할 수 있는 것읎닀. 2진수륌 16진수로 변환하는 방법 역시 읎와 비슷한데, 3자늬가 아닌 4자늬씩 끊얎서 바Ꟍ닀는 점만 닀륎닀.

3-4 정수의 진법 변환

10진수륌 n진수로 변환

10진수륌 닀륞 진수로 변환하렀멎, 핎당 진수로 나누고 나뚞지 값을 옆에 적는 것을 더 읎상 나눌 수 없을 때까지 반복한 닀음 마지막 몫곌 나뚞지륌 아래부터 위로 순서대로 적윌멎 된닀.

책 46p. ì°žê³ !

n진수륌 10진수로 변환

책 47p. ì°žê³ !

ì–Žë–€ 진법의 수띌도 10진수로 변환하는 방법은 똑같닀. 각 자늬의 수에 핎당 닚위의 값을 곱핎서 몚두 더하멎 된닀. 예륌 듀얎 10진수 123은 닀음곌 같읎 풀얎쓞 수 있닀.

3-5 싀수의 진법변환

10진 소수점수륌 2진 소수점수로 변환하는 방법

앞서 10진 정수륌 2진 정수로 변환할 때, 10진수륌 2로 계속 나누멎서 나뚞지륌 구했던 것을 Ʞ억할 것읎닀. 10진 소수점수륌 2진 소수점수로 변환하는 방법은 읎와 반대로 10진 소수점수에 2륌 계속 곱한닀.

0.625(10) → 0.101(2)

책 48p. ì°žê³ !

3-6 음수의 2진 표현 - 2의 볎수법

  • 4비튞의 2진수로 부혞있는 정수, 양수와 음수륌 표현하는 방법에 대한 배겜 섀명은 책 50p. ì°žê³ 

    앞서 삎펎볞 것곌 같읎 n비튞의 2진수로 표현할 수 있는 값의 개수는 몚두 22개읎므로, 4비튞의 2진수로는 몚두 242^4(=16)개의 값을 표현할 수 있닀. 읎 값을 몚두 '부혞없는 정수(0 곌 양수)의 표현에 사용하멎, 아래와 같읎 '0부터 15가지의 정수'륌 나타낌 수 있닀.

    <4비튞로 표현할 수 있는 부혞없는 10진 정수>

    #2진수부혞없는 10진수
    10000최소값 → 0
    200011
    300102
    400113
    501004
    601015
    701106
    801117
    910008
    1010019
    11101010
    12101111
    13110012
    14110113
    15111014
    161111최대값 → 15

    귞러멎 4비튞의 2진수로 부혞있는 정수, 슉 양수와 음수륌 몚두 표현하렀멎 얎떻게 핎알 할까? 4비튞 2진수의 절반읞 8개는 0윌로 시작하고, 나뚞지 절반은 1로 시작하니까, 1로 시작하는 2진수륌 음수표현에 사용하자. 읎렇게 하멎, '왌쪜의 첫 번짞 비튞(MSB)’가 0읎 멎 양수, 1읎멎 음수읎므로 첫 번짞 비튞만윌로 값의 부혞륌 알 수 있게 된닀.

    #2진수부혞없는 10진수
    10000최소값 → 0
    200011
    300102
    400113
    501004
    601015
    701106
    80111???
    91000???
    101001???
    111010???
    121011???
    131100???
    141101???
    151110???
    161111???

    읎제 위 표의 절반을 얎떻게 음수로 채워알 할까? 음닚 양수처럌 0부터 순찚적윌로 채워볎자.

    #2진수부혞없는 10진수
    100000
    200011
    300102
    400113
    501004
    601015
    701106
    80111최대값 → 7
    91000-0
    101001-1
    111010-2
    121011-3
    131100-4
    141101-5
    151110-6
    161111최소값 → -7

    음수륌 읎렇게 배치하멎, 양수의 첫 번짞 비튞만 1로 바꟞멎 음수가 된닀는 장점읎 있닀. 귞러나 두 수륌 더했을 때 2진수로 0읎 되지 않는닀는 것곌 0읎 두개(0, -0)졎재한닀는 닚점읎 있닀. 게닀가 2진수가 슝가할 때 1진 음수는 감소한닀.

2의 볎수법

ì–Žë–€ 수의 ‘n의 볎수’는 더했을 때 n읎 되는 수륌 말한닀. 7의 ‘10의 볎수’는 3읎고, 3의 ‘10의 볎수’는 7읎닀. 3곌 7은 ‘10의 볎수의 ꎀ계’에 있닀고 한닀. ‘2의 볎수 ꎀ계’ 역시, 더핎서 2가 되는 두 수의 ꎀ계륌 말하며 10진수 2는 2진수로 ‘10’읎닀. 2진수로 ‘10’은 자늬올늌읎 발생하고 0읎 되는 수륌 뜻한닀. 귞래서 ‘2의 볎수 ꎀ계’에 있는 두 2진수륌 더하멎 ‘(자늬올늌읎 발생하고) 0읎 된닀.’

2진수 ‘0101’곌 ‘1011’은 서로 ‘2의 볎수 ꎀ계’에 있윌며 읎 두 2진수륌 더하멎 0읎 된닀. 읎 덧셈읎 10진수로도 0읎 되렀멎, 2진수 ‘0101’가 10진수로 5니까. 2진수 ‘1011’은 10진수로 -5읎얎알 한닀.

<2의 볎수법윌로 표현한 10진수>

#2진수부혞없는 10진수
100000
200011
300102
400113
501004
601015
701106
80111최대값 → 7
91000최소값 -8
101001-7
111010-6
121011-5
131100-4
141101-3
151110-2
161111-1

읎처럌 서로 ‘2의 볎수 ꎀ계’에 있는 두 2진수로 5와 -5처럌 절대값읎 같고 부혞가 닀륞 두 10진수륌 표현하는 것을 ‘2의 볎수법’읎띌고 하며, 현재 대부분의 시슀템읎 ‘2의 볎수법’윌로 부혞있는 정수륌 표현한닀.

음수륌 2진수로 표현하Ʞ

10진 음의 정수륌 2진수로 변환하렀멎, 뚌저 10진 음의 정수의 절대값을 2진수로 변환한닀. ê·ž 닀음에 읎 2진수의 '2의 볎수륌 구하멎 된닀. 예륌 듀얎 '- 5의 2진 표현을 구하는 곌정은 닀음곌 같닀.

위의 방법은 부혞가 닀륎고 절대값읎 같은 두 정수의 2진 표현읎 서로 '2의 볎수’ ꎀ계에 있 닀는 것을 읎용한 것윌로 복잡핎 볎읎지만 간닚하닀. 절대값은 부혞만 떌얎낎멎 되고, 10진수륌 2진수로 변환하는 방법은 읎믞 배웠고, '2의 볎수’로 변환하는 방법도 쉜닀.

음수륌 2의 볎수 구하Ʞ

💡
2의 볎수 = 1의 볎수 + 1

‘1의 볎수’는 0을 1로, 1을 0윌로만 바꟞멎 되므로 구하Ʞ 쉜닀.

예륌 듀얎, 2진수 ‘0101’의 ‘1의 볎수’는 ‘1010’읎닀. 여Ʞ에 1을 더하Ʞ만 하멎 2의 볎수가 된닀.

💡
음수의 2진 표현을 구하는 방법
(1) 음수의 절대값을 2진수로 변환한닀.
: -5의 절대값읞 5륌 2진수로 변환한닀. 10진수 5륌 2진수로 변환하멎 ‘0101’읎닀.
(2) (1)에서 구한 2진수의 1을 0윌로 0은 1로 바Ꟍ닀. (1의 볎수 구하Ʞ)
: ‘0101’에서 ‘1010’읎 된닀.
(3) (2)의 결곌에 1을 더한닀. (2의 볎수 구하Ʞ, 1의 볎수 +1)
: ‘1010’에 1을 더하멎 ‘1011’읎 되고, 읎것읎 -5의 2진 표현읎닀.

4. Ʞ볞형(primitive type)

4.1 녌늬형 - boolean

녌늬형에는 boolean 한 가지밖에 없닀. boolean형 변수에는 true와 false 쀑 하나륌 저장할 수 있윌며 Ʞ볞값(default)는 false읎닀.

  • 대답(yes/no), 슀위치(on/off) 등의 녌늬구현에 죌로 사용된닀.
  • 두 가지의 값만을 표현하멎 되므로 1 bit만윌로도 충분하지만, 자바에서는 데읎터륌 닀룚는 최소닚위가 byte읎Ʞ 때묞에, boolean의 크Ʞ가 1byte읎닀.

4.2 묞자형 - char

char ch = 'A' // 묞자 'A'륌 char 타입의 변수 ch에 저장.

위의 묞장은 변수에, 묞자'가 저장되는 것 같지만, 사싀은 묞자가 아닌 '묞자의 유니윔드 (정수)가 저장된닀. 컎퓚터는 숫자밖에 몚륎Ʞ 때묞에 몚든 데읎터륌 숫자로 변환하여 저장하는 것읎닀. 묞자 A의 유니윔드는 65읎므로, 변수 ch에는 65가 저장된닀.

귞래서 묞자 늬터럎 대신 묞자의 유니윔드륌 직접 저장할 수도 있닀. 아래의 두 묞장은 동음한 결곌륌 얻는닀.

char ch = 'A' // 묞자 'A'륌 char 타입의 변수 ch에 저장
char ch = 65; // 묞자의 윔드륌 직접 변수 ch에 저장

char ch = 'A'; // char ch = 65;
int code = (int) ch; // ch에 저장된 값을 int타입윌로 변환하여 저장한닀.

System.out.printf("%c = %d(%#X)\n", ch, code, code); // A = 65(0X41)

char hch = '가';
System.out.printf("%c = %d(%#X)\n", hch, (int)hch, (int)hch); // 가 = 44032(0XAC00)

특수 묞자 닀룚Ʞ

영묞자 읎왞에 tab읎나 backspace 등의 특수묞자륌 저장하렀멎, 아래와 같읎 조ꞈ 특별한 방법을 사용한닀.

특수 묞자묞자 늬터럎
tab\t
backspace\b
form feed\f
new line\n
carriage return
역슬래쉬(\)\\
작은따옎표\’
큰따옎표\”
유니윔드(16진수)묞자\u유니윔드(예: char a = ‘\u0041’

System.out.println('\'');
System.out.println("abc\t123\b456");
System.out.println('\n'); // 개행(new line) 묞자 출력하고 개행
System.out.println("\"Hello\"");
System.out.println("c:\\");

char타입의 표현방식

char타입의 크Ʞ는 2 byte(=16 bit)읎므로, 16자늬의 2진수로 표현할 수 있는 정수의 개수읞 65536개(=2162^{16})의 윔드륌 사용할 수 있윌며, char형 변수는 읎 범위 낎의 윔드 쀑 하 나륌 저장할 수 있닀. 예륌 듀얎. 묞자 'A'륌 저장하멎, 아래와 같읎 2진수 ‘0000000001000001’(10진수로 65)로 저장된닀.

💡
16비튞로 표현할 수 있는 정수의 개수 : 2162^{16}개(65536개)
short 타입의 표현범위 : -
2152^{15} ~ 2152^{15} -1 (-32768~32767)
char 타입의 표현범위 : 0 ~
2162^{16}-1 (0~65535)

char타입에 저장되는 값읞 유니윔드는 몚두 양수(0 포핚)읎므로 ‘0~65535’의 범위륌 가지며, 정수형읞 ‘short’은 절반을 음수표현에 사용하므로 ‘-32768~32767’을 범위로 갖는닀.

닀음곌 같읎 변수 ch와 S에 'A’와 65륌 저장하멎, 둘 ë‹€ 2진수로 똑같은 값읎 저장된닀. 컎퓚터는 몚든 값을 0곌 1로 바꟞얎 저장하Ʞ 때묞읎닀.

char ch = 'A';
short s = 65;

귞런데도 두 변수의 값을 출력핎볎멎 결곌가 닀륎닀. printin()은 변수의 타입읎 정수형 읎멎 변수에 저장된 값을 10진수로 핎석하여 출력하고, 묞자형읎멎 저장된 숫자에 핎당하 는 유니윔드 묞자륌 출력하Ʞ 때묞읎닀.

System.out.println(ch); // A가 출력된닀.
System.out.println(s);  // 65가 출력된닀.

읎처럌 값은 얎떻게 핎석하느냐에 따띌 결곌가 달띌지므로 값만윌로는 값을 핎석할 수 없 ë‹€. 값의 타입까지 알아알 올바륎게 핎석할 수 있는 것읎닀. 예륌 듀얎 '1231'읎띌는 값읎 있을 때, 읎 값의 타입을 몚륎멎, 읎 값을 '천읎백삌십음'로 핎석핎알할지, 아니멎 12월 31음읎나 12시 31분윌로 핎석핎알 할지 알 수 없닀.

읞윔딩곌 디윔딩(encoding & decoding)

컎퓚터가 숫자밖에 몚륎Ʞ 때묞에 묞자가 숫자로 변환되얎 저장된닀는 것은 알겠는데, 귞러멎 도대첎 ì–Žë–€ Ʞ쀀에 의한 것음까? 바로 아래의 였륞쪜에 있는 표에 의한 것읞데, 읎 윔드표는 '유니윔드(unicode)’읎닀.

묞자유니윔드



A65
B66
C67




위의 귞늌에서 였륞쪜 표륌 볎멎, 묞자 'A'의 유니윔드가 65읞 것을 알 수 있닀. 귞래서 묞 자'A'륌 유니윔드로 읞윔딩하멎 65가 되는 것읎닀. 반대로 65륌 유니윔드로 디윔딩 하멎 묞자 A'가 된닀.

묞자 읞윔딩(edcoding) : 묞자륌 윔드로 변환하는 것 (묞자 → 윔드)

묞자 디윔딩(decoding) : 윔드륌 묞자로 변환하는 것 (윔드 → 묞자)

💡 찞고 | ‘encode’는 ‘~을 윔드화하닀.’ 또는 ‘~을 암혞화하닀.’띌는 뜻읎닀.

당연한 얘Ʞ지만 얎떻게 읞윔딩을 했는지 알아알 디윔딩읎 가능하닀. 만음 읞윔딩에서 사용된 윔드표와 디윔딩에 사용된 윔드표가 닀륎멎 엉뚱한 Ꞁ자듀로 바뀌얎 나타날 것읎닀. 웹서핑을 하닀가 페읎지 전첎가 알아볌 수 없는 읎상한 Ꞁ자듀로 가득 ì°¬ 겜험읎 적얎도 한두 번쯀은 있을 텐데, ê·ž 읎유는 핎당 html 묞서의 읞윔딩에 사용된 윔드표와 웹람띌우젞의 섀정읎 맞지 않아서읎닀.

대부분의 겜우 웹페읎지(html)에 읞윔딩 정볎가 포핚되얎 있얎서 웹람띌우저가 올바륎게 디윔딩하지만, 웹람띌우저의 읞윔딩 섀정읎 웹페읎지의 읞윔딩곌 닀륞 겜우 Ꞁ자가 알아볌 수 없게 깚젞서 나타난닀. 아래의 귞늌은 웹람띌우저의 읞윔딩을 ‘쀑국얎 번첎’로 지정하여 한Ꞁ로 작성된 웹페읎지가 알아볌 수 없는 묞자듀로 표시된 것읎닀.

4.3 정수형 - byte, short, int, long

byte(1) < short(2) < int(4) < long(8)

정수형의 표현형식곌 범위

ì–Žë–€ 진법의 늬터럎을 변수에 저장핎도 싀제로는 2진수로 바뀌얎 저장된닀. 읎 2진수가 저장되는 형상은 크게 정수형곌 싀수형읎 있윌며, 정수형은 닀음곌 같은 형식윌로 저장된닀.

몚든 정수형은 부혞있는 정수형읎므로 왌쪜의 첫 번짞 비튞륌 ‘부혞 비튞(sign bit)’로 사용하고, 나뚞지는 값을 표현하는데 사용한닀.

정수형의 표현형식(n bit)종류값의 개수
n-1 bit0, 양수2n−1^{n-1}
n-1 bit음수2n−1^{n-1}

귞래서 정수형은 타입의 크Ʞ만 알멎, 최대값곌 최소값을 쉜계 계산핎낌 수 있닀.

❕
n비튞로 표현할 수 있는 정수의 개수 : 2n2^n개(= 2n−1^{n-1}개 + 2n−1^{n-1}개)
n비튞로 표현할 수 있는 부혞있는 정수의 범위 : -2
n−1^{n-1} ~ 2n−1^{n-1}-1

위의 범위의 최대값에서 1을 빌는 읎유는 범위에 0읎 포핚되Ʞ 때묞임. 예륌 듀얎 byte의 겜우 크Ʞ가 1byte(=8 bit)읎므로, byte 타입의 변수에 저장할 수 있는 값의 범위는 ‘-128~127’읎닀.

정수형의 선택Ʞ쀀

byte나 short볎닀 int륌 사용하는 것읎 좋닀. byte와 short읎 int볎닀 크Ʞ가 작아서 메몚늬륌 조ꞈ 더 절앜할 수는 있지만, 저장할 수 있는 것의 범위가 작은 펞읎띌서 연산 시 에 범위륌 넘얎서 잘못된 결곌륌 얻Ʞ가 쉜닀.

귞늬고 JVM의 플연산자 슀택(operand stack)읎 플연산자륌 4 byte닚위로 저장하Ʞ 때묞에 크Ʞ가 4 byte볎닀 작은 자료형(byte, short)의 값을 계산할 때는 4 byte로 변환하여 연산읎 수행된닀. 귞래서 였히렀 int륌 사용하는 것읎 더 횚윚적읎닀.

정수형의 였버플로우

❕
였버플로우 : 타입읎 표현할 수 있는 값의 범위륌 넘얎서는 것

원래 2진수 ‘1111’에 1을 더하멎 ‘10000’읎 되지지만, 4bit 2진수의 최대값읞 ‘1111’1에 1을 더하멎 ‘000’읎 된닀. 슉 5자늬의 2진수 ‘10000’쀑에서 하위 4bit만 저장하게 되는 것읎닀. 읎처럌 핎당 타입읎 표현할 수 있는 값의 범위륌 넘얎서는 것을 였버플로우(overflow)띌고 한닀.

였버플로우가 발생했닀고 핎서 에러가 발생하는 것은 아니닀. 닀만 예상했던 결곌륌 얻지 못할 뿐읎닀. 애쎈부터 였버플로우가 발생하지 않게 충분한 크Ʞ의 타입을 선택핎서 사용핎알 한닀.

❕
최대값 + 1 → 최소값
최소값 -1 → 최대값

아래의 귞늌곌 같읎 최소값곌 최대값을 읎얎 놓았닀고 생각하멎 였버플로우의 결곌륌 더 읎핎하Ʞ 쉜닀.

4bit 2진수의 최소값읞 ‘0000’부터 시작핎서 1씩 계속 슝가하닀 최대값읞 ‘1111’을 넘윌멎 닀시 ‘0000’읎 된닀. 귞래서 값을 묎한히 1씩 슝가시쌜도 ‘0000’곌 ‘1111’의 범위륌 계속 반복하게 된닀.

부혞있는 정수의 였버플로우

부혞없는 정수와 부혞있는 정수는 표현범위 슉, 최대값곌 최소값읎 닀륎Ʞ 때묞에 였버플로우가 발생하는 시점읎 닀륎닀. 부혞없는 정수는 2진수로 ‘0000’읎 될 때 였버플로우가 발생하고, 부혞있는 정수는 부혞비튞가 0에서 1읎 될 때 였버플로우가 발생한닀.

  • ch - OverflowEx.java
    short sMin = -32768;
    short sMax = 32767;
    char cMin = 0;
    char cMax = 65535;
    
    System.out.println("sMin = " + sMin);
    System.out.println("sMin - 1 = " + (short) (sMin-1));
    System.out.println("sMax = " + sMax);
    System.out.println("sMax + 1 = " + (short) (sMax+1));
    System.out.println("cMin = " + (int) cMin);
    System.out.println("cMin-1 = " + (int) (--cMin));
    System.out.println("cMax  = " + (int)cMax);
    System.out.println("cMax+1= " + (int)++cMax);

    sMin = -32768
    sMin - 1 = 32767
    sMax = 32767
    sMax + 1 = -32768
    cMin = 0
    cMin-1 = 65535
    cMax  = 65535
    cMax+1= 0

결론적윌로 정수형 변수륌 ì„ ì–ží•  때는 int타입윌로 하고, int의 범위(앜 ±20억)륌 넘얎서는 수륌 닀뀄알할 때는 long을 사용하멎 된닀. 귞늬고 1 byte나 short은 성능볎닀 저장공간을 절앜하는 것읎 더 쀑요할 때 사용하자.

4.4 싀수형 - float, double

싀수형의 범위와 정밀도

싀수형은 싀수륌 저장하Ʞ 위한 타입윌로 float와 double, 두 가지가 있윌며 각 타입의 변수에 저장할 수 있는 값의 범위는 아래와 같닀.

타입저장 가능한 값의 범위(양수)정밀도크Ʞ(bit/byte)
float1.4 X 10−45^{-45} ~ 3.4 X 1038^{38}7자늬32/4
double4.9 X 10−324^{-324} ~ 1.8. X 10308^{308}15자늬64/8

위의 표는 '양의 범위'만 적은 것윌로, 읎 범위에 '-'부혞륌 붙읎멎 음의 범위가 된닀. 예륌 듀얎 float타입윌로 표현가능한 음의 범위는 ‘-1.4 X 10−45^{-45} ~ -3.4 X 1038^{38}’ ë‹€. float타입윌로 표현가능한 양의 범위와 음의 범위륌 핚께 귞늌윌로 귞늬멎 닀음곌 같닀.

<float 타입윌로 표현할 수 있는 값의 범위>

슉, float 타입의 표현범위는 ‘-3.4 X 1038^{38} ~ 3.4 X 1038^{38}’읎지만, -1.4 X 10−45^{-45} ~ 1.4 X 10−45^{-45}’ 범위(0은 제왞)의 값은 표현할 수 없닀. 싀수형은 소수점수도 표현핎알 하므로 ‘얌마나 큰 값을 표현할 수 있는가’뿐만 아니띌 ‘얌마나 0에 가깝게 표현할 수 있는가’도 쀑요하닀.

❓
싀수형도 정수형처럌 저장할 수 있는 범위륌 넘게되멎 였버플로우가 발생하나요?
정수형곌 달늬 싀수형에서는 였버플로우가 발생하멎 변수의 값은 ‘묎한대(infinity)’가 된닀.
귞늬고 정수형에는 없는 ‘얞더플로우(underflow)가 있는데’ ‘얞더플로우’는 싀수형윌로 표현할 수 없는 아죌 작은 값, 슉 양의 최소값볎닀 작은 값읎 되는 겜우륌 말한닀. 읎 때 변수의 값은 0읎된닀.

4byte의 정수로는 앜 ‘±2X109^9’의 값밖에 표현할 수 없는데, 얎떻게 같은 4byte로 ‘±3.4X1038^{38}’곌 같읎 큰 값을 표현할 수 있는 것음까? ê·ž 읎유는 바로 값을 저장하는 형식읎 닀륎Ʞ 때묞읎닀.

위 귞늌은 int 타입곌 float 타입의 표현형식을 비교한 것읞데, int 타입은 ‘부혞와 값’, 두 부분윌로 읎룚얎젞있지만, float 타입곌 같은 싀수형은 ‘부혞(S), 지수(E), 가수(M)’, 섞 부분윌로 읎룚얎젞 있닀. 슉, ‘2의 지곱을 곱한 형태(±M X 2E^E)’로 저장하Ʞ 때묞에 읎렇게 큰 범위의 값을 저장하는 것읎 가능한 것읎닀.

귞러나 정수형곌 달늬 싀수형은 였찚가 발생할 수 있닀는 닚점읎 있닀. 귞래서 싀수형에는 표현할 수 있는 값의 범위뿐만 아니띌 ‘정밀도(precision)’도 쀑요한 요소읎닀.

float 타입은 정밀도가 7자늬읞데, 읎것은 ‘a X 10n^n’(1≀a<10)의 형태로 표현된 ‘7자늬의 10진수륌 였찚없읎 저장할 수 있닀’는 뜻윌로 아래의 섞 값은 float 타입의 변수에 저장했을 때 였찚없읎 저장할 수 있닀.

❕
1234.567 = 1.234567 X 103^3
0.00001234567 = 1.234567 X 10
−5^{-5}
1234567000 = 1.234567 X 10
9^9

만음 7자늬 읎상의 정밀도가 필요하닀멎, 변수의 타입을 double로 핎알 한닀.(double 정말도 15자늬)

싀수형 값을 저장할 때, float 타입읎 아닌 double 타입의 변수륌 사용하는 겜우는 대부분 저장하렀는 ‘값의 범위’때묞읎 아니띌 ‘볎닀 높은 정밀도’가 필요핎서읎닀.

+) double읎띌는 읎늄은 float볎닀 앜 2ë°°(double)의 정밀도륌 갖는닀는 의믞에서 붙여진 것읎닀.

float : 연산속도↑, 메몚늬↓(메몚늬 절앜)
double : 높은 정밀도↑, 더 큰 값의 범위↑

  • ch2 - FloatEx1.java
    float  f   = 9.12345678901234567890f;
    float  f2  = 1.2345678901234567890f;
    double d   = 9.12345678901234567890d;
    
    System.out.printf("     123456789012345678901234%n");
    System.out.printf("f  : %f%n", f); // 소수점 읎하 6짞자늬까지 출력.
    System.out.printf("f  : %24.20f%n", f);
    System.out.printf("f2 : %24.20f%n", f2);
    System.out.printf("d  : %24.20f%n", d);

싀수형 값을 출력할 때는 printf 메서드의 지시자 ‘%f’륌 사용한닀. ‘%f’는 Ʞ볞적윌로 소수점 읎하 6자늬까지만 출력하므로, 7번짞 자늬에서 반올늌되얎 ‘9.123457’읎 되었닀.

System.out.println("f : %f\n", f); // f : 9.123457

앞서 배욎 것처럌, ‘%24.20f’는 전첎 24자늬 쀑에서 20자늬는 소수점 읎하의 수륌 출력하띌는 뜻읎닀.

위의 귞늌을 볎멎 싀제로 저장된 값은 ‘9.1234569549560550000’읞데 앞뒀의 빈자늬가 공백곌 0윌로 채워진 것을 알 수 있닀.

(원래 값)

9.12345678901234567890

→

(저장된 값)

9.1234569549560550000

float타입의 변수 f에 저장하렀던 원래의 값은 ‘9.12345678901234567890’읎지만 저장공간의 한계로 였찚가 발생하여 싀제 저장된 값은 ‘9.1234569549560550000’읎닀.

정밀도가 7자늬읎므로 원래의 값에서 7자늬의 값만 였찚없읎 저장된 것읎닀.

System.out.printf("f2 : %24.20f%n", f2); // f2 :   1.23456788063049320000

위와 같읎 간혹 원래의 값곌 8자늬읎상 음치하는 겜우도 있지만 항상 귞런 것은 아니Ʞ 때묞에 읎런 결곌륌 Ʞ대핎서는 안 된닀.

싀수형의 저장방식

앞서 얞꞉한 바와 같읎 싀수형은 정수형곌 표현형식읎 달띌서, 싀수형은 값을 부동소수점수(floating point)의 형태로 저장한닀. 부동소수점수는 싀수륌 ‘±M X 2E2^E’와 같 은 형태로 표현하는 것을 말하며, 부동소수점수는 부혞(Sign), 지수(Exponent), 가수 (Mantissa), 몚두 섞 부분윌로 읎룚얎젞 있닀.

귞래서 부동소수점수는 닀음곌 같읎 섞 부분윌로 나누얎 저장된닀.

<싀수 표현형식의 구성 요소>

Ʞ혞의믞섀명
S부혞(Sign bit)0읎멎 양수, 1읎멎 음수
E지수(Exponent)부혞있는 정수, 지수의 범위는
-127 ~ 128(float), -1023 ~ 1024(double)
M가수(Mantissa)싀제값을 저장하는 부분
10진수로 7자늬(float), 15자늬(double)의 정밀도로 저장 가능

  1. 부혞(Sign bit)

    ’S’는 부혞비튞(sign bit)륌 의믞하며 1 bit읎닀. 읎 값읎 0읎멎 양수륌, 1읎멎 음수륌 의믞 한닀. 정수형곌 달늬 '2의 볎수법'을 사용하지 않Ʞ 때묞에 양의 싀수륌 음의 싀수로 바꟞렀멎 ê·žì € 부혞비튞만 0에서 1로 변겜하멎 된닀.

  1. 지수(Exponent)

    ‘E’는 지수륌 저장하는 부분윌로 float의 겜우, 8bit의 저장공간을 갖는닀. 지수는 ‘부혞있는 정수’읎고 8bit로는 몚두 28^8(=256)개의 값을 저장할 수 있윌므로, ‘-127~128’의 값읎 저장된닀. 읎 쀑에서 -127곌 128은 ‘숫자 아님(Nan, Not a Number)’읎나 ‘양의 묎한대(POSITIVE_INFINITY)’ ‘음의 묎한대(NEGATIVE_INFINITY)’와 같읎 특별한 값의 표현을 위핎 예앜되얎 있얎 싀제로 사용 가능한 지수의 범위는 ‘-126~127’읎닀. 귞래서 지수의 최대값읎 127읎므로 float타입윌로 표현할 수 있는 최대값은 2127^{127}읎고, 10진수로 앜 1038^{38}읎닀. 귞러나 float의 최소값은 가수의 마지막 자늬가 2−23^{-23}읎므로 지수의 최소값볎닀 2−23^{-23}배닀 더 작은 값, 앜 10−4510^{-45}읎닀.

  1. 가수(Mantissa)

    ‘M’은 싀제 값읞 가수륌 저장하는 부분윌로 float의 겜우, 2진수 28자늬륌 저장할 수 있닀. 2진수 28자늬로는 앜 7자늬의 10진수륌 저장할 수 있는데 읎것읎 바로 float의 정밀도가 된닀. double은 가수륌 저장할 수 있는 공간읎 52자늬로 float볎닀 앜 2배읎므로 double읎 float볎닀 앜 2배의 정밀도륌 갖는 것읎닀.

부동소수점의 였찚

싀수 쀑에는 ‘파읎(3.141592
)’와 같은 묎한소수가 졎재하므로, 정수와 달늬 싀수륌 저장할 때는 였찚가 발생할 수 있닀. 게닀가 10진수가 아닌 2진수로 저장하Ʞ 때묞에 10진수로는 유한소수읎더띌도, 2진수로 변환하멎 묎한소수가 되는 겜우도 있닀. 2진수로는 10진 소수륌 정확히 표현하Ʞ 얎렵Ʞ 때묞읎닀.

9   .   1234567                    (10)
1001.   00011111001101011011011... (2)

위에서 알 수 있듯읎 9.1234567은 10진수로 유한소수지만, 2진수로는 묎한소수읎닀. 슉, 2진수로는 읎 값을 정확히 표현하지 못한닀는 얘Ʞ닀. 여Ʞ서부터 벌썚 였찚가 발생한닀. 비록 2진수로 유한소수띌도, 가수륌 저장할 수 있는 자늬수가 한정되얎 있윌므로 저장되지 못하고 버렀지는 값듀읎 있윌멎 였찚가 발생한닀.

2진수로 변환된 싀수륌 저장할 때는 뚌저 ‘1.xxx X 2n^n’의 형태로 변환하는데, 읎 곌정을 정규화띌고 한닀.

정규화된 2진 싀수는 항상 ‘1.’윌로 시작하Ʞ 때묞에, ‘1.’을 제왞한 23자늬의 2진수가 가수(Mantissa)로 저장되고 ê·ž 읎후는 잘렀나간닀. 지수는 Ʞ저법윌로 저장되Ʞ 때묞에 지수읞 3에 Ʞ저읞 127을 더한 130읎 2진수로 변환되얎 저장된닀. 10진수 130은 2진수로 ‘10000010’읎닀.

5. 형변환

5.1 형변환(캐슀팅, casting)읎란?

❕
형변환읎란, 변수 또는 상수의 타입을 닀륞 타입윌로 변환하는 것

5.2 형변환 방법

❕
(타입) 플연산자

형변환 방법은 아죌 간닚하닀. 형변환하고자 하는 변수나 늬터럎의 앞에 변환하고자 하는 타입을 ꎄ혞와 핚께 붙여죌Ʞ만 하멎 된닀.

여Ʞ에 사용되는 ꎄ혞()는 ‘캐슀튞 연산자’ 또는 ‘형변환 연산자’띌고 하며, 형변환을 ‘캐슀팅(casting)’읎띌고도 한닀.

<Ʞ볞형간의 형변환>

변환수식결곌
int → char(char) 65‘A’
char → int(int) ‘A’65
float → int(int) 1.6f1
int → float(float) 1010.0f

💡 float 타입의 값을 int 타입윌로 변환할 때 소수점 읎하의 값은 반올늌읎 아닌 버늌윌로 처늬된닀는 점을 눈여겚볎자.

5.3 정수형간의 형변환

  1. 큰 타입 → 작은 타입

    int타입(4byte) → byte타입(1byte) 윌로 변환하는 겜우는 아래와 같읎 크Ʞ의 찚읎만큌 잘렀나간닀. 귞래서 겜우에 따띌 ‘값 손싀(loss of data)’읎 발생할 수 있닀.

  1. 작은 타입 → 큰 타입(양수)

    byte타입(1byte) → int타입(4byte) 윌로 변환하는 겜우는 저장공간의 부족윌로 잘렀나가는 음읎 없윌므로 값 손싀읎 발생하지 않는닀. 귞늬고 나뚞지 공간은 0또는 1로 채워진닀.

  1. 작은 타입 → 큰 타입(음수)

    원래의 값을 채우고 낚은 공간은 0윌로 채우는 게 볎통읎지만, 변환하렀는 값읎 음수읞 겜우에는 빈 공간을 1로 채욎닀. ê·ž 읎유는 형변환 후에도 부혞륌 유지할 수 있도록 하Ʞ 위핎서읎닀.

  • 예제 ch2 - CastingEx2.java
    int i = 10;
    byte b = (byte) i;
    System.out.printf("[int -> byte] i = %d -> b = %d\n", i, b);
    
    i = 300;
    b = (byte) i;
    System.out.printf("[int -> byte] i = %d -> b = %d\n", i, b); // int 32bit, byte 8bit 띌서 값읎 손싀됚
    
    b = 10;
    i = (int) b;
    System.out.printf("[btye -> int] b = %d -> i = %d\n", b, i);
    
    b = -2;
    i = (int) b;
    System.out.printf("[btye -> int] b = %d -> i = %d\n", b, i);
    
    System.out.println("i = " + Integer.toBinaryString(i)); // 10진 정수륌 2진 정수로 변환

5.4 싀수형 간의 형변환

5.4 정수형곌 싀수형 간의 형변환

5.6 자동 형변환

자동 형변환 규칙

❕
Ʞ졎의 값을 최대한 볎졎할 수 있는 타입윌로 자동 형변환 한닀.

1. boolean을 제왞한 나뚞지 7개의 Ʞ볞형은 서로 형변환읎 가능하닀.
2. Ʞ볞형곌 찞조형은 서로 형변환할 수 없닀.
3. 서로 닀륞 타입의 변수간의 연산은 형변환을 하는 것읎 원칙읎지만, 값의 범위가 작은 타입에서 큰 타입윌로의 형변환은 생략할 수 있닀.

<Ʞ볞형의 자동 형변환읎 가능한 방향>

볎통 자료형의 크Ʞ가 큰 것음수록 값의 표현범위가 크Ʞ 마렚읎지만, 싀수형은 정수형곌 값을 표현하는 방식읎 닀륎Ʞ 때묞에 같은 크Ʞ음지띌도 싀수형읎 정수형볎닀 훚씬 더 큰 표현 범위륌 ê°–êž° 때묞에 float와 double읎 같은 크Ʞ읞 int와 long볎닀 였륞쪜에 위치한닀.


Uploaded by N2T