아무래도 코테 전에 형변환을 확실히 하고 가는 게 좋을 것 같아 정리하려고 한다.
자료형
우선 자료형부터 집고 넘어가자.
| 구분 | 타입 | 크기 | 범위 | 기본값 | 설명 |
|---|---|---|---|---|---|
| 정수형 | byte |
1 byte | -27 ~ 27 - 1 | 0 |
- |
short |
2 bytes | -215 ~ 215 - 1 | 0 |
- | |
int |
4 bytes | -231 ~ 231 - 1 | 0 |
정수 연산의 기본 단위 | |
long |
8 bytes | -263 ~ 263 - 1 | 0L |
int 범위를 넘는 큰 정수 (값 뒤에 L 붙임) |
|
| 실수형 | float |
4 bytes | (IEEE 754 표준) | 0.0f |
소수점 (값 뒤에 f 붙임) |
double |
8 bytes | (IEEE 754 표준) | 0.0 |
실수 연산의 기본 단위, 더 정밀함 | |
| 문자형 | char |
2 bytes | 0 ~ 216 - 1 | \u0000 |
문자 하나 (작은따옴표 '' 사용) |
| 논리형 | boolean |
1 byte | true, false |
false |
참 또는 거짓 |
우선 기본 자료형의 범위 형태는 위와 같다.
참고로 String 문자열은 클래스다. 객체이다.
자동 형변환
크기가 작은 타입에서 큰 타입으로 넘어갈 때는 자동형 변환이 일어난다.
int numInt = 10;
long numLong = numInt; // int(4) -> long(8), 자동 변환
double numDouble = numInt; // int(4) -> double(8), 자동 변환
// numDouble은 이제 10.0 이라는 값을 가집니다.
char charA = 'A';
char char_a = 'a';
int intA = charA; // 'A'의 유니코드(이자 ASCII) 값인 65가 저장됨
int int_a = char_a; // 'a'의 유니코드(이자 ASCII) 값인 97이 저장됨
강제 형변환
자동 형변환과는 반대로 크기가 큰 타입에서 작은 타입으로 넘어갈 때 발생한다. 데이터 손실이 발생한다.
double numDouble = 10.5;
// int numInt = numDouble; // 컴파일 에러! 자동으로 안 해줌
int numInt = (int) numDouble; // (int)를 붙여 강제로 변환
// numInt는 이제 10 이라는 값을 가집니다. (소수점 0.5가 손실됨)
long bigNumLong = 3000000000L; // 30억 (int 범위 초과)
int numInt2 = (int) bigNumLong;
// numInt2는 30억이 아닌, 전혀 다른 이상한 값을 가집니다. (데이터 손실)
파싱 parse
문자열을 다른 타입으로 변환하는 것을 말한다.
숫자형으로 파싱
String strNum = "123";
String strDouble = "3.14";
// String "123"을 int 123으로 변환
int num1 = Integer.parseInt(strNum);
// String "123"을 long 123으로 변환
long num2 = Long.parseLong(strNum);
// String "3.14"를 double 3.14로 변환
double num3 = Double.parseDouble(strDouble);
// num1과 100을 더하는 계산이 가능해짐
System.out.println(num1 + 100); // 출력: 223
Boolean 파싱
// --- true가 되는 경우 ---
String strTrue1 = "true";
String strTrue2 = "True"; // 대소문자 구분 없음
String strTrue3 = "TRUE";
boolean bool1 = Boolean.parseBoolean(strTrue1); // true
boolean bool2 = Boolean.parseBoolean(strTrue2); // true
boolean bool3 = Boolean.parseBoolean(strTrue3); // true
// --- false가 되는 경우 ( "true"가 아닌 모든 것 ) ---
String strFalse1 = "false"; // "false"라는 문자열도 false가 됩니다.
String strFalse2 = "1"; // 숫자 1도 false 입니다. (C언어 등과 다름)
String strFalse3 = "hello"; // 아무 문자열
String strFalse4 = ""; // 빈 문자열
String strFalse5 = null; // null 값 (에러가 나지 않고 false가 됨)
boolean bool4 = Boolean.parseBoolean(strFalse1); // false
boolean bool5 = Boolean.parseBoolean(strFalse2); // false
boolean bool6 = Boolean.parseBoolean(strFalse3); // false
boolean bool7 = Boolean.parseBoolean(strFalse4); // false
boolean bool8 = Boolean.parseBoolean(strFalse5); // false
System.out.println("strTrue1 -> " + bool1);
System.out.println("strFalse1 -> " + bool4);
System.out.println("strFalse2 -> " + bool5);
Char 파싱
String str = "Hello";
// H e l l o
// 0 1 2 3 4 <- 인덱스 번호
// 0번째 문자 'H'를 추출
char ch1 = str.charAt(0);
// 2번째 문자 'l'를 추출
char ch2 = str.charAt(2);
System.out.println("0번째 문자: " + ch1); // 출력: 0번째 문자: H
System.out.println("2번째 문자: " + ch2); // 출력: 2번째 문자: l
// char 배열과 다르다
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
char firstCharFromArray = charArray[0]; // 'H'
charArray[0] = 'J'; // 배열의 내용을 직접 수정 가능 ('Jello')
이건 진짜 많이 쓰니까 중요하게 보자!!
정리
| 구분 | 형변환 (Type Casting) | 파싱 (Parsing) |
|---|---|---|
| 목적 | 숫자 타입 간의 범위 변경 | 문자열(String)을 실제 숫자/다른 타입으로 변환 |
| 원본 데이터 | int, long, double 등 숫자 타입 |
오직 String |
| 문법 | (바꿀타입) 변수명; |
래퍼클래스.parse타입(문자열); |
| 예시 | int i = (int) 3.14; |
int i = Integer.parseInt("3"); |
| 사용 상황 | 정수/실수 계산 시 타입을 일치시킬 때 | 콘솔/파일 입력을 계산 가능한 숫자로 바꿀 때 |
댓글