[자바의 정석] ch2. 변수
1~2. 화면에 글자 출력하기, 덧셈 뺄셈 계산하기
System.out.println(”Hello”); 에서
ln: 텍스트 입력 후 다음 줄로 바뀜
alt+shift+a (컬럼 편집 모드)에서 println을 다 잡아서 ln을 지우고 실행시키면
“HelloHelloHello” (이어서 바로 출력)
print() : 출력 후에 줄바꿈 안함
println() : 출력 후에 줄바꿈
3. 변수란? 변수의 선언과 저장
3-1. 변수란?
하나의 값을 저장할 수 있는 메모리 공간(RAM)
전체 메모리의 저장공간을 1byte 단위로 나누고 각각의 저장공간에 0,1,2,3, 등의 연속적인 번호를 붙인 것을 메모리 주소라고 함. 원래는 메모리의 값을 저장하거나 읽을 때 메모리 주소를 이용해야 하는데, 메모리 주소는 숫자라서 기억하기 힘듦. 그래서 특정 메모리 영역에 이름을 붙이고 주소대신 이름을 이용해서 메모리의 값을 저장하고 읽을 수 있도록 한 것이 변수.
3-2. 변수의 선언
1) 변수의 선언 이유
- 값(data)을 저장할 공간을 마련하기 위해
2) 변수의 선언 방법
-변수타입 변수이름;
ex) int age; → 정수(int) 타입의 변수 age를 선언 자바의 모든 문장은 ; 으로 끝나야 함
3-3. 변수에 값 저장하기
1) 변수에 값 저장하기
int age ; → 정수(int) 타입의 변수 age를 선언
age = 25 ; → 변수 age에 25를 저장 ( = : 대입연산자)
int age = 25 ; → 위의 두 줄을 한 줄로
2) 변수의 초기화 - 변수에 처음으로 값을 저장하는 것
int x = 0; → 변수 x를 선언 후, 0으로 초기화
int y = 5; → 변수 y를 선언 후, 5로 초기화
int x = 0, y = 5; → 위의 두 줄을 한 줄로
(메모리는 여러 프로그램이 함께 공유하는 자원이기 때문에 사용하기 전에 새로운 값을 저장함으로써 기존에 저장되어 있는 알 수 없는 값을 지우는 것이 초기화)
*주의: 클래스 변수, 인스턴스 변수, 지역 변수 중 지역 변수는 읽기 전에 반드시 초기화해야 함.
3-4. 변수의 값 읽어오기
1) 변수의 값이 필요한 곳에 변수의 이름을 적는다.
int year = 0, age = 14; (int 타입의 year와 age를 선언하고 각각 0과 14 값으로 초기화)
year = age + 2000;
→ year = 14 + 2000;
→ year = 2014;
age = age + 1;
→ age = 14 + 1;
→ age = 15;
( 변수의 값을 1 증가시키는 방법)
* 덧셈, 뺄셈, 곱셈, 나눗셈 등을 할 때 매번 숫자를 바꾸면 번거로움
int x = 4, y = 2; 로 설정
3-5. 변수의 명명규칙
* 식별자 규칙
1. 대소문자가 구분되며 길이에 제한이 없다.
- True와 true는 서로 다른 것
2. 예약어를 사용해서는 안 된다.
- true는 예약어라서 사용할 수 없지만, True는 가능
3. 숫자로 시작하면 안 된다.
- top10은 허용하지만, 7up은 허용하지 않음
4. 특수문자는 '_'와 '$'만 허용
- $harp은 허용하지만, S#arp은 허용하지 않음
그 외 규칙
1. 클래스 이름의 첫 글자는 항상 대문자
- 변수와 메서드의 이름의 첫 글자는 항상 소문자
2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
- lastIndexOf, StringBuffer
3. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
- PI, MAX_NUMBER
4. 변수의 타입
4-1. 변수의 타입
1) 변수의 타입은 저장할 값의 타입에 의해 결정된다.
int age = 25 ; (정수 = 정수)
int age =/= 3.14 ; (정수 =/= 실수)
2) 저장할 값의 타입과 일치하는 타입으로 변수 선언
char ch = ‘가’ ; → char 는 문자 타입
double pi = 3.14 ; → double은 실수 타입
3) 값의 타입
값 ( 8개, 기본형)
- 문자 : char
- 숫자 : 정수 - byte, short, int, long
실수 - float, double - 논리 : bloolean - true, false
5. 상수와 리터럴
변수(variable) - 하나의 값을 저장하기 위한 공간 (변경O)
상수(constant) - 값을 한 번만 저장 가능한 변수 (변경X)
리터럴(literal) - 그 자체로 값을 의미하는 것 = 기존의 우리가 원래 알던 상수
<변수>
int score = 100;
score = 200; ⇒ score의 값을 100→ 200으로 변경해도 됨 (변수)
<상수>
final int MAX = 100; → MAX는 상수
MAX = 200; → 에러 (값 변경 X)
char ch = ‘A’;
String str = “abc”;
public class VarEx1 {
public static void main(String[] args) {
final int score = 100;
// score = 200;
System.out.println(score);
}
}
* 상수 선언할 때
키워드 'final'을 붙임
ex1) final int score = 100;
score = 200;
은 오류 ( 상수는 다시 저장할 수 없음 )
ex2) final int score; // =100; (변수 선언. 선언과 초기화를 따로 해도 됨)
// score = 200; (얘 주석처리를 없애야 함 → 변수 초기화)
System.out.println(score); 에 오류 (변수를 초기화하지 않고 변수의 값을 읽으려고 했기 때문)
ex3) final int score = 100; (선언과 초기화를 한번에 하는 게 좋음)
6. 리터럴의 접두사와 접미사
종류 | 리터럴 | 접미사(대소문자 구별 X) |
논리형 | false, true | 없음 |
정수형 | 123, 0b0101, 077, 0xFF, 100L | L |
실수형 | 3.14, 3.0e8, 1.4f, 0x1.0p-1 | f, d |
문자형 | ‘A’, ‘1’, ‘\n’ | 없음 |
문자열 | “ABC”, “123”, “A”, “true” | 없음 |
- 정수형
100L 처럼 정수형 리터럴에 접미사 L이 붙어있으면 long타입
나머지 L이 안붙은 정수형 리터럴은 접미사가 안붙었으니 int 타입
byte, short 타입의 리터럴은 없고, 얘네 변수에 값을 저장할 때는 int 리터럴 사용
byte b = 127; (int타입) → * byte 타입의 범위: -128~ 127
byte b = 128; //에러
int(값) : 값을 10진수로 변환해주는 함수
bin(10진수) : 10진수를 2진수으로 변환해주는 함수
oct(10진수) : 10진수를 8진수로 변환해주는 함수
hex(10진수) : 10진수를 16진수로 변환해주는 함수(16진수에서는 10은 a, 11은 b, ... , 15는 f로 사용)
그 외의 진법들은 직접 구현해서 써야 함
15 → 10진수 리터럴 15
0b0101 → 0b로 시작하면 2진수, 십진수값으로 5 출력
015 → 0으로 시작하면 8진수, 십진수값으로 13 출력
0x15 → 0x로 시작하면 16진수, 십진수값으로 21 출력
int i = 100; //10진수
int bin = 0b10; //10진수로 2 (접두사 0b = 2진수), 2진수로 10
int bin = 0b0101; //10진수로 5 (0+2²+0+1)
int oct = 010; //10진수로 8 (접두사 0 = 8진수), 8진수로 10
int oct = 0100; //10진수로 64 (8²+0+0)
int hex = 0x10; //10진수로 16 (접두사 0x = 16진수), 16진수로 10
int hex = 0x100; //10진수로 256 (16²+0+0)
long l = 10_000_000_000L; (=100억. 정수형 타입의 최대값은 대략 20억이기 때문에 20억이 넘는 값은 long타입. 이 때 20억을 넘을때는 L을 꼭 붙여야 함 )
- 실수형
f: float 타입
d: double 타입 (실수형은 f/d 두 종류이기 때문에 d는 거의 생략)
e: 실수형에 사용되는 10의 n제곱 (뒤의 소수점 .0 생략 x)
float f = 3.14f; (생략불가)
3.14e3f = 3140.0f (3.14 x 10의 3제곱)
1e1 = 10.0 (1 x 10의 1제곱)
1e-3 = 0.001 (1 x 10의 -3제곱)
- 논리형
boolean power = true;
- 문자형
char ch = ‘A’;
- 문자열
String str = “ABC”;
Quiz.
10. ——> 10.0 (실수형인데 접미사가 생략됐으니까 double 형)
.10 ——> 0.10 (실수형인데 접미사가 생략됐으니까 double 형)
10f ——> 10.0f (실수형 접미사 f가 붙었으니까 실수형 리터럴)
1e3 ——> 1000.0 (e는 실수형에 사용되는 10의 n제곱(그냥 1000아님), 접미사 없으니까 double형)
7. 변수와 리터럴의 타입 불일치
7-1. 범위가 ‘변수 > 리터럴’ 인 경우, OK
int i = ‘A’; //OK. int > char
(int 타입의 변수 i에 문자형 타입의 A가 저장되는 것이 아니라, 문자 A의 문자코드인 65가 변수 i에 저장되는 것 )
long l = 123; //OK. long > int
double d = 3.14f //OK. double > float
7-2. 범위가 ‘변수 < 리터럴’ 인 경우, 에러
int i = 30_0000_000; //에러. int의 범위(+-20억) 벗어남
long l = 3.14f; //에러. long (8byte, 정수형) < float (4byte, 실수형)
float f = 3.14; //에러. float (4byte) < double (8byte)
7-3. byte, short 변수에 int 리터럴 저장 가능
byte b = 100; // OK. byte의 범위(-128 ~ 127)에 속함
byte b = 128; // 에러. byte의 범위 벗어남
8. 문자와 문자열 리터럴
char ch = ‘A’; // 문자
char ch = ‘AB’; // 에러
String s = “ABC”; // 문자열 = 연속된 여러 문자
String s = “A”; // 문자열에는 문자 하나만 와도 됨
String s = “”; // OK. 빈 문자열도 됨
char ch = ‘’; // 에러. 반드시 하나의 문자 필요
char ch = ' '; // OK. 공백 문자(한칸 띄기)는 가능
문자열 + any type -> 문자열 + 문자열 -> 문자열
any type + 문자열 -> 문자열 + 문자열 -> 문자열
“” + 7 ⇒ “” + “7” ⇒ “7” (빈 문자열 + 숫자 = 숫자가 문자열로 변환됨)
“” + 7 + 7 ⇒ “7” + 7 ⇒ “7” + “7” ⇒ “77”
7 + 7 + “” ⇒ 14 + “” ⇒ “14” + “” ⇒ “14"
true + "" ⇒ "true" + "" ⇒ "true"
9. 두 변수의 값 바꾸기
만약 x, y에 있는 값을 서로 교환하고 싶을 때
int x = 10, y = 20;
x = y; // y의 값을 x에 저장
y =x; // x의 값을 y에 저장
이렇게 하면, 먼저 x에 y값이 저장되어서 x = 20
그 다음 y에 x값이 저장되어서 y = 20 이 되어버림
따라서, 서로 교환하고 싶을 때는 빈 저장소가 하나 더 필요함!
int x = 10, y = 20;
int tmp ; //빈 컵
tmp = x; // x의 값을 tmp에 저장
x = y; // y의 값을 x에 저장
y = tmp; // tmp의 값을 y에 저장
(x → tmp → y → x)
public class VarEx1 {
public static void main(String[] args) {
int x = 4, y = 2;
int tmp ;
tmp = x;
x = y;
y= tmp;
System.out.println("x = " + x);
System.out.println("y = " + y);
}
}
10. 기본형과 참조형
- 기본형(Primitive type)
- 실제 값(date)을 저장
- 오직 8개 ( 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double))
- 참조형(Reference type)
- 기본형을 제외한 나머지(String, System 등)
- 어떤 값이 저장되어 있는 메모리 주소를 값으로 저장(4 byte 또는 8byte)
- Date today; // Date클래스 타입의 참조변수 today를 선언 (클래스의 이름(Date)이 참조변수의 타입(type))
- Date today = new Date(); // Date 객체를 생성, today에 객체의 주소를 저장
11. 기본형의 종류와 범위
11-1. 기본형 - 종류와 크기
- 논리형 : true, false 중 하나를 값으로 가지며, 조건식과 논리적 계산에 사용 (boolean)
- 문자형 : 문자를 저장하는 데 사용되며, 변수 당 하나의 문자만을 저장 (char, String)
- 정수형 : 정수 값을 저장하는 데 사용. 주로 사용하는 것은 int와 long(아주 큰 정수)이며, byte는 이진 데이터를 다룰 때 사용, short는 c언어와의 호환을 위해 추가(잘 안쓰임)
- 실수형 : 실수 값을 저장하는 데 사용 (float, double)
종류 / 크기 (byte) | 1 | 2 | 4 | 8 |
논리형 | boolean ( true, false 만 있음) |
|||
문자형 | char ( 2byte 문자체계인 유니코드 사용) |
|||
정수형 | byte | short | int (기준, dafault) |
long |
실수형 | float (부(浮)동 소수점 floting point 형식으로 저장하기 때문) |
double (float 크기의 두배) |
11-2. 기본형 - 표현범위 1 (정수형)
( 1 bit = 2진수 1자리 ( 0 ,1 중 하나만 입력 가능 ) / 1byte = 8 bit )
byte b ;
b = 3; // 3을 저장하면 10진수 3이 2진수로 변환되어 저장
3⑽ = 11⑵ (10진수 3 = 2진수 11)
⇒ b = 00000011
1 bit로 표현할 수 있는 값 : 2개 (0, 1) = 2¹
n 비트로 표현할 수 있는 값의 개수 : 2ⁿ 개 (= 2ⁿ-¹개(양수,0) + 2ⁿ-¹개(음수))
2 bit로 표현할 수 있는 값 : 4개 (00, 01, 10, 11) = 2²
n 비트로 표현할 수 있는 부호없는 정수(양수)의 범위 : 0~2ⁿ-1 ( 0포함 2ⁿ개니까 )
n 비트로 표현할 수 있는 부호있는 정수의 범위 : -2ⁿ-¹ ~ 2ⁿ-¹-1 ( 2ⁿ개 중 절반은 음수, 절반은 양수 )
8비트(1byte)로 표현할 수 있는 값의 개수 : 256개 ( 2ⁿ 개 )
8비트(1byte)로 표현할 수 있는 부호없는 정수의 범위 : 0~255 ( 2ⁿ 개 )
8비트(1byte)로 표현할 수 있는 부호있는 정수의 범위 : -128 ~ 127 ( 2ⁿ 개 중 절반은 음수, 절반은 양수)
11-3. 기본형 - 표현범위 2 (정수형)
각 정수형 타입의 변수에 저장할 수 있는 값의 범위
- byte 저장형식 ( 1byte = 8bit )
전체 8비트 중에서 맨 왼쪽의 1비트를 값의 부호를 나타내는 데에 사용
이 비트를 부호비트 (Sign bit) 라고 함 ( S |나머지 7비트 )
부호비트의 값이 0 → 양수 ( 0|7비트 )
1 → 음수 ( 1|7비트 )
부호비트를 제외한 나머지 7비트로는 2의 7제곱 = 128 개 표현 가능
→ 양수 128개 ( 0 ~ 127개 ) + 음수 128개 ( -1 ~ -128개 ) = 총 256개 = 2의 8제곱의 값 표현 가능
따라서,
* byte 타입의 범위 : -128 ~ 127 (2byte = 16bit => -2의 15제곱 ~ 2의 15-1제곱)
* short 타입의 범위 : -32,768 ~ 32,767 ( ± 3만 )
* int 타입의 범위 : -2,147,483,648 ~ 2,147,483,647 (4byte = 32bit = -2^31 ~ 2^31-1 ≒ ± 2 * 10의 9제곱 ≒ ±20억 )
* long타입의 범위: -9223372036854775808 ~ 9223372036854775807 ( ± 9 * 10의 18제곱 )
12~13. printf를 이용한 출력
12-1. 형식화된 출력 - printf()
1) println()의 단점: 출력형식 지정 불가
- 실수의 자리수 조절 불가 - 소수점 n자리만 출력하려면?
System.out.println(10.0/3); // 3.3333333.... - 10진수로만 출력 - 8 진수, 16진수로 출력하려면?
System.out.println(0x1A); // 26
2) printf()로 출력형식 지정 가능
- System.out.printf(”%.2f”, 10.0/3); // 3.33 —> 소수점 둘째자리
- System.out.printf(”%d”, 10.0/3); // 26 —> 10진수
- System.out.printf(”%x”, 10.0/3); // 1A —> 16진수
12-2. printf()의 지시자 ①
지시자 | 설명 |
%b | 불리언(boolean) 형식으로 출력 |
%d | 10진(decimal) 정수의 형식으로 출력 |
%o | 8진(octal) 정수의 형식으로 출력 |
%x, %X | 16진(hexa-decimal) 정수의 형식으로 출력 |
%f | 부동 소수점(floating-point)의 형식으로 출력 |
%e, %E | 지수(exponent) 표현식의 형식으로 출력 |
%c | 문자(character)로 출력 |
%s | 문자열(string)로 출력 |
int age=14;
int year=2022; 라고 설정한 뒤,
System.out.printf( ” age: %d %n year: %d ”, age , year );
⇒ “age: 14
year: 2017” 출력
* println 은 자동으로 줄바꿈 O, printf 는 줄바꿈 X. 개행문자를 붙여줘야 함
System.out.printf(”age: %d”, age); // 출력 후 줄바꿈 X
System.out.printf(”age: %d%n”, age); // 출력 후 줄바꿈 O
\n = %n 똑같이 개행문자(줄바꿈 문자)이지만 %n이 os에 관계없이 적용되므로 더 추천
12-3. printf()의 지시자 ②
1) 정수를 10진수, 8진수, 16진수로 출력
- System.out.printf(”%d”, 15); // 15 (15를 10진수로)
- System.out.printf(”%o”, 15); // 17 (15를 8진수로, 15를 8로 나누면 몫이1, 나머지가 7 -> 17)
- System.out.printf(”%x”, 15); // f (10진수 15= 16진수 f)
- System.out.printf(”%s”, Integer.toBinaryString(15)); // 1111
(10진수를 2진수로 출력하는 지시자는 없기 때문에, 정수를 2진 문자열로 변환하는 Integer.toBinaryString(int i) 사용. 정수를 2진수로 변환해서 문자열로 반환하므로 지시자 %s 사용)
2) 8진수와 16진수에 접두사 붙이기 (#)
원래는 출력된 값에 접두사가 붙어야함
8진수 → 017
16진수 → 0xf
'%x', '%o'에 '#'를 사용하면 접두사 '0x'와 '0'이 각각 붙는다.
그리고 '%X'는 16진수에 사용되는 접두사와 영문자를 대문자로 출력한다.
- System.out.printf(”%#o”, 15); // 017
- System.out.printf(”%#x”, 15); // 0xf
- System.out.printf(”%#X”, 15); // 0XF
3) 실수 출력을 위한 지시자(%f), 지수형식(%e), 간략한 형식(%g)
float f = 123.4567890f ;
- System.out.printf(”%f”, f) ; // 123.456787
(float는 소수점 아래 6자리까지만 출력, 소수점 아래 7자리에서 반올림.
f의 정밀도는 7이므로 123.4567까지만 정확하고 나머지 2자리는 의미없는 숫자.
정밀도가 16인 double을 쓰면 정확도 올라감)
(정밀도: 7자리의 10진수를 오차없이 저장할 수 있다) - System.out.printf(”%e”, f) ; // 1.234568e+02 (지수형식 +02 ⇒ 10²) 반올림. 실제 저장된 값은 위와 같지만 지수형식에서 반올림 한 값 출력
- System.out.printf(”%g”, 123.456789) ; // 123.457 (7자리에서 반올림한 %f와 같은 간략한 형식)
- System.out.printf(”%g”, 0.00000001) ; // 1.00000e-8 (지수형식 %g와 같은 간략한 형식)
* 실수 출력할 때는 기본적으로 %f , 0이 많을 때는 %e 지시자 사용
12-4. printf()의 지시자 ③
1) 지시자에 숫자를 붙이면 값이 출력되는 자리수를 조절할 수 있음
- System.out.printf( ” [%5d] %n ”, 10) ; // [ 10] (총 5자리인데 출력할 값이 2자리라서 앞 3자리는 공백)
- System.out.printf( ” [%-5d] %n ”, 10) ; // [10 ] (왼쪽정렬로 바꾸려면 지시자 앞에 - )
- System.out.printf( ” [%05d] %n ”, 10) ; // [00010] (공백을 0으로 채우려면 지시자 앞에 0 )
2) 실수형 지시자 f는 전체 자리수 뿐만 아니라 소수점 아래자리도 조절할 수 있음
- % 전체자리(소수점포함) . 소수점아래자리 f
- System.out.printf( ” d= %14.10f %n ”, d) ; // 전체 14자리 중 소수점 아래 10자리
( 전체 14자리 중 앞의 빈자리는 공백, 뒤의 빈자리는 0으로 채움)
( 지시자를 '%014.10'으로 지정했다면, 양쪽 빈자리를 모두 0으로 채움 )
3) 문자열의 경우 (지시자 d와 거의 같음)
- System.out.printf( ” [%s] %n ”, url ) ; // [www.codechobo.com]
- System.out.printf( ” [%20s] %n ”, url ) ; // [www.codechobo.com] (전체20자리 중 빈자리는 공백)
- System.out.printf( ” [%-20s] %n ”, url ) ; // [www.codechobo.com] (왼쪽 정렬)
- System.out.printf( ” [%.8s] %n ”, url ) ; // [www.code] (왼쪽에서 8자리만 출력)
- float f = 123.456789f;
System.out.printf("%f%n", f); // 123.456787 (f의 정밀도는 7. 뒤의 2자리는 부정확함) - double f = 123.456789;
System.out.printf("%f%n", f); // 123.456789 (d의 정밀도는 16. 다 정확함) - double d = 1.23456789;
System.out.printf("%f", d); // 1.234568 (8에서 반올림(소수점 7자리에서 반올림))
(%f는 자리수를 적어주지 않으면 전부 다 보여주지 않음)
public class PrintfEx1 {
public static void main(String[] args) {
TODO Auto-generated method stub
System.out.println(10.0/3);
System.out.printf("%d%n", 15);
System.out.printf("%#o%n", 15);
System.out.printf("%#x%n", 15);
System.out.printf("%s", Integer.toBinaryString(15));
float f = 123.456789f;
System.out.printf("%f%n", f);
System.out.printf("%e%n", f);
System.out.printf("%g%n", f);
double f = 123.456789;
System.out.printf("%f%n", f);
System.out.printf("[%5d]%n", 10);
System.out.printf("[%-5d]%n", 10);
System.out.printf("[%05d]%n", 10);
double d = 1.23456789;
System.out.printf("%.6f%n", d);
System.out.printf("[%s]%n", "www.codechobo.com");
System.out.printf("[%20s]%n", "www.codechobo.com");
System.out.printf("[%-20s]%n", "www.codechobo.com");
System.out.printf("[%.10s]%n", "www.codechobo.com");
14. 화면으로부터 입력받기 (Scanner)
- Scanner란
: 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스 - Scanner를 사용하려면
1) import문 추가
import java.util.*;
2) Scanner 객체의 생성
Scanner scanner = new Scanner(System.in); //System.in : 화면입력
3) Scanner 객체를 사용
int num = scanner.nextInt (); // 화면에서 입력받은 정수를 num이라는 변수에 저장
실수를 저장하려면 → nextFloat ()
String input = scanner.nextLine (); // 화면에서 입력받은 내용(한 행)을 input에 저장, 문자열로 반환
int num = Integer.parseInt(input); // 입력받은 문자열(input)을 숫자(num)로 변환
이 두 문장 = 이 한 문장
* 숫자 → 문자열 : 숫자 + “”
문자열 → 숫자 : Integer.parseInt()
import java.util.*; // 1. import문 추가
public class ScanfEx1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 2. scanner클래스의 객체 생성
int num = scanner.nextInt(); // 이 한줄은
int num2 = scanner.nextInt();
System.out.println(num);
System.out.println(num2);
String input = scanner.nextLine(); //이 위아래 2줄이랑 같음
int num = Integer.parseInt(input);
System.out.println(num);
}
}
15~16. 정수형의 오버플로우
: 표현 가능한 범위를 넘어서면 다시 처음으로
- 최대값 + 1 → 최소값
- 최소값 - 1 → 최대값
- n비트로 표현할 수 있는 값의 범위 : 0 ~ 2ⁿ-1
- 10진수: 9999 → 0000
- 2진수 : 1111 → 0000
- 10진수로 표현하는 범위
한자리 : 0~9 = 0~(10-1)
두자리 : 0~99 = 0~(100-1) = 0~(10²-1)
세자리 : 0~999 = 0~(10³-1)
네자리 : 0~9999 = 0~(10⁴-1) - 2진수로 표현하는 범위
한자리 : 0~1 = 0~(2-1)
두자리 : 0~3 = 0~(2²-1)
세자리 : 0~7 = 0~(2³-1)
네자리 : 0~15 = 0~(2⁴-1) - 부호없는 정수(4bit) : 표현범위가 “0~15” 이므로 이 값이 반복 ( 0 ~ 2⁴ - 1 )
- 부호있는 정수(4bit) : 표현범위가 “-8~7” 이므로 이 값이 반복 ( -2⁴-¹ ~ 2⁴-¹-1 )
- short : 부호 있는 정수 ( 2byte = 16bit = 2^16개 표현가능, 절반을 음수표현에 사용하므로 표현 범위 -2^15 ~ 2^15-1, )
- char : 부호 없는 정수 ( 2byte = 16bit = 2^16개 표현가능, 유니코드는 모두 양수이므로 0 ~ 2^16-1)
17. 타입간의 변환방법
1. 숫자를 문자로 변환 : 숫자에 '0'을 더한다
(char) (3 +‘0’) → '3'
(유니코드에서 문자 '0'은 코드번호 48이고 '3'은 51이다. 그러므로 '0'을 더한다.)
2. 문자를 숫자로 변환 : 문자에서 '0'을 뺀다
'3' - '0' → 3
(유니코드에서 문자 '0'은 코드번호 48이고 '3'은 51이다. 그러므로 '0'을 뺀다.)
3. 문자열로의 변환 : "" (빈 문자열)을 더한다
3 + “” → “3”
‘3’ + “” → “3”
4. 문자열을 숫자로 변환
Integer.parseInt(”3”); → 3
Double.parseDouble(”3.4”); → 3.4
5. 문자열을 문자로 변환
“3”.charAt(0) → ‘3’
6. 문자열
“3” + 1 = “31”