1. 어떤 종류의 숫자가 있나요?
프로그래밍에서는 숫자와 끊임없이 작업합니다 — 사용자 나이부터 은하의 별 개수, 은행 계좌의 잔액까지. 하지만 과제에 따라 필요한 숫자 타입이 다릅니다: 어떤 때는 정수만 저장하면 되고, 어떤 때는 매우 정확한 소수가 필요하며, 또 어떤 때는 “음수가 없는” 숫자가 필요합니다.
정수 (int 등)
정수는 소수 부분이 없는 수입니다.
Java에서는 가장 자주 int 타입을 사용하지만, 이외에도 크기와 범위가 다른 여러 가지 대안이 있습니다.
- int — 정수를 위한 기본 “작업용” 타입입니다. 매우 큰(또는 작은) 값도 담을 수 있으면서 메모리도 많이 차지하지 않습니다. 예를 들어 좋아요 수, 나이, 1년의 일수 등을 셀 때는 거의 항상 int를 사용합니다.
- long — 값이 매우 클 수 있을 때 사용합니다(예: 수십억이나 수조 단위). 예: YouTube의 전체 기간 누적 조회수 저장.
- short — 메모리를 아끼지만 드물게 사용하는 타입입니다. 작은 값이 반복적으로 매우 많이 나타나는 곳에 적합합니다(예: 오디오 데이터, 색상 구성 요소).
- byte — 더 작은 값용으로, 특히 메모리 절약이 중요한 그래픽 처리나 파일 작업에서 유용합니다.
실수 (double, float)
때로는 소수 부분이 있는 수를 다뤄야 합니다. 예를 들어 기온, 학생의 평균 점수, 소수점이 있는 상품 가격 등입니다.
- double — 실수를 저장하기 위한 기본 타입입니다. 대부분의 계산에 충분할 정도로 정확합니다(예: 3.1415926535…).
- float — 더 가볍고 덜 정확한 타입으로, 메모리 절약이 중요한 컴퓨터 그래픽이나 대규모 데이터 배열 처리에서 자주 사용됩니다.
특수 숫자 타입
- BigInteger — 표준 범위를 초과하는 거대한 수를 다뤄야 할 때(예: 암호학, 천문 계산).
- BigDecimal — 소수 계산을 정확하게 하기 위한 클래스(금융, 이자 계산). double과 float에 내재된 부정확성을 피하는 데 도움이 됩니다.
2. 값의 범위
정수 타입은 양수와 음수를 모두 저장할 수 있습니다. 값이 “0보다 클 수도, 작을 수도” 있을 때 유용합니다. 예: 기온, 계좌 잔액, 해수면 대비 높이.
예:
- int : -10, 0, 50
- long : 0, 10, -1000_000_000_000_000_000L
정수 타입
| 타입 | 크기 | 값의 범위 | 사용 예 |
|---|---|---|---|
|
1 바이트 | -128 ~ 127 | -128, 0, 127 |
|
2 바이트 | -32 768 ~ 32 767 | -1000, 0, 32000 |
|
4 바이트 | -2 147 483 648 ~ 2 147 483 647 | -1000000, 0, 2000000 |
|
8 바이트 | -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 |
-10_000_000_000, 1 |
실수 타입
| 타입 | 크기 | 값의 예 | 설명 |
|---|---|---|---|
|
4 바이트 | 3.14f, -0.001f | 단정밀도(약 7자리) |
|
8 바이트 | 3.1415, -1.7E+308 | 배정밀도(약 15~16자리) |
3. 숫자 리터럴의 접미사
어떤 상황에서는 숫자에 사용할 타입을 명시해야 합니다. 이때 접미사를 사용합니다:
- L 또는 l — long 타입용(예: 10000000000L)
- F 또는 f — float 타입용(예: 3.14f)
- D 또는 d — double 타입용(일반적으로 필요 없음. 접미사가 없는 실수 리터럴은 double)
접미사를 쓰지 않으면 기본적으로 정수는 int, 실수는 double로 간주됩니다. 예를 들어 42는 int, 3.14는 double입니다.
왜 필요할까요? 예를 들어 큰 수를 long 타입 변수에 대입할 때 오류를 피하려면 이렇게 합니다:
long bigNumber = 9000000000L; // L을 빼면 컴파일 오류가 발생합니다
밑줄 _ 구분자
숫자가 길면 0에서 쉽게 헷갈립니다. 보기 좋고 읽기 편하도록 Java에서는 숫자 리터럴 내부에 밑줄을 사용할 수 있습니다.
int population = 146_700_000;
long stars = 100_000_000_000L;
전적으로 합법적입니다. 컴파일러는 밑줄을 무시하고, 여러분은 한눈에 자리수를 볼 수 있습니다. 단, 시작이나 끝, 소수점 뒤, 접미사 앞에는 밑줄을 둘 수 없습니다.
4. 문자형 char: 무엇이며 왜 필요할까요?
char 타입은 하나의 문자를 저장하는 데 사용됩니다. 글자, 숫자, 구두점, 공백, 특수문자, 심지어 스마일리까지 포함합니다.
예시:
char letter = 'A';
char digit = '7';
char symbol = '?';
char cyrillic = '\u0416';
char euro = '€';
char smile = '☺'; // 네, 이것도 됩니다!
중요한 규칙:
- char 값은 작은따옴표로 표기합니다: 'A', '7', '#'.
- 정확히 하나의 문자입니다! 'AB'처럼 쓰면 컴파일러가 불평합니다.
- 각 문자에는 고유한 숫자 코드(Unicode)가 있습니다.
Unicode: 전 세계의 문자
Java는 Unicode 표준을 사용하므로 라틴 문자뿐 아니라 키릴 문자, 한자, 이모지, 심지어 고대 이집트 상형문자까지 저장할 수 있습니다(필요하다면).
흥미로운 사실:
char는 본질적으로 16비트 숫자(0부터 65535까지)이며, 각 값에는 해당 문자가 연결되어 있습니다.
5. 문자와 숫자: Unicode로 연결
각 문자는 내부적으로 숫자이므로 char를 int로, 그 반대로도 쉽게 변환할 수 있습니다.
예: 문자의 Unicode 코드 알아보기
public class CharToInt {
public static void main(String[] args) {
char ch = 'A';
int code = ch; // char → int의 묵시적 변환
System.out.println("문자 '" + ch + "': " + code);
}
}
결과:
문자 'A': 65
이제 반대로 — 코드에서 문자를 얻어 봅시다:
public class IntToChar {
public static void main(String[] args) {
int code = 1040; // 유니코드 U+0410(키릴 문자 A)의 코드
char ch = (char) code; // int → char의 명시적 변환
System.out.println("코드 " + code + "에 해당하는 문자: " + ch);
}
}
결과:
코드 1040에 해당하는 문자: \u0410
6. Java의 기본(primitive) 타입
| 타입 | 크기 (비트) | 값의 범위 | 값의 예 | 비고 |
|---|---|---|---|---|
|
8 | -128 ... 127 | 42 | 매우 드물게 사용 |
|
16 | -32,768 ... 32,767 | 12345 | 메모리 절약용 |
|
32 | -2,147,483,648 ... 2,147,483,647 | 1000000 | 정수의 기본형 |
|
64 | ≈ −9.22 × 1018 ... ≈ 9.22 × 1018 | 5000000000L | 아주 큰 정수용 |
|
32 | ~±3.4 × 10-38 ... ±3.4 × 1038 | 3.14f | 실수, 낮은 정밀도 |
|
64 | ~±1.7 × 10-308 ... ±1.7 × 10308 | 2.718 | 실수, 높은 정밀도 |
|
16 | 0 ... 65 535 (Unicode) | '\u0416', 'A', '?' | 단일 문자 |
|
1 | true, false | true | 논리값 |
GO TO FULL VERSION