[Java] Java의 정석 (2) 변수 2
문자와 문자열
문자와 문자열의 선언
char ch = 'A'; // 문자의 선언
String s1 = "ABC"; // 문자열의 선언
String s2 = new String("ABC");
String s = "A"; // OK.
String s = ""; // OK.
char ch = ''; // 에러.
- 문자는 char형 변수에, 문자열은 String이라는 클래스에 저장한다.
- 문자열은 연속된 여러 문자를 의미하나, 하나의 문자나 빈 문자열을 저장할 수 있다.
- 하지만, char형 변수엔 빈 문자열을 저장할 수 없다.
문자열의 결합과 문자열 변환
String s1 = "A" + "B"; // "AB"
String s2 = "" + 7 // "7" : 다른 형태의 데이터를 문자열로 변환.
- 숫자와 같은 다른 데이터를 문자열로 변환하려면, 빈 문자열과 + 연산을 해주면 된다.
* 단, 문자열 결합은 앞에서부터 순서대로 진행된다
String s1 = "" + 7 + 7 // "77"
String s2 = 7 + 7 + "" // "14"
기본형과 참조형
기본형 변수와 참조형 변수
1. 기본형 변수
- 자바에서 기본적으로 제공되는 8개(boolean, char, byte, short, int, long, float, double)의 변수 타입을 말하며, 실제 값을 저장한다.
2. 참조형 변수
- 기본형을 제외한 나머지(String, System 등)을 말하며, 실제 값이 아닌 객체의 메모리 주소를 저장한다.
Date today; // 참조형 변수 today를 선언
today = new Date(); // today에 객체의 주소를 저장
기본형 변수의 종류
1. 논리형 (boolean) - 1byte
- true와 false 중 하나를 값으로 가지며, 조건식과 논리적 계산에 사용된다.
2. 문자형 (char) - 2byte
- 문자를 저장하는 데 사용되며, 변수 당 단 하나의 문자만 저장할 수 있다.
3. 정수형 (byte, short, int, long) - 1,2,4,8byte
- 정수 값을 저장하는 데 사용되며, int와 long을 주로 사용한다.
- byte는 이진데이터를 다루는 데 사용되며, short는 C언어와의 호환을 위해 추가되었다.
4. 실수형 (float, double) - 4,8byte
- 실수 값을 저장하는 데 사용된다.
기본형 변수의 표현범위
- 1비트는 0과 1, 2개의 값을 저장할 수 있으므로 n비트는 2^n개의 값을 저장할 수 있다.
- 부호비트(sign bit) : 부호를 표현하는 데 쓰는 비트 (0이면 양수, 1이면 음수)
byte | -128 ~ 127 |
int (32비트) | -2^31 ~ (2^31) - 1 -> 약 -20억~20억 |
long (64비트) | -2^63 ~ (2^63) -1 |
float (32비트) | -3.4 * 10^38 ~ 3.4 * 10^38 -> 소수점 아래 7자리까지 정확함. |
실수형 변수의 표현방식 (부동소수점)
- 실수형 변수는 실수 데이터를 세 부분(부호, 지수, 가수)로 나누는 방식으로 저장한다.
ex) -2.1 * 10^3 -> 부호(-1), 가수(2.1), 지수(3)
- 하지만 이 방식때문에 오차가 발생할 수 있고, double형은 정밀도가 float형의 두 배이므로, 더 정밀한 실수의 계산이 필요한 경우에는 double을 사용해야한다.
오버플로우
- 변수형에 표현할 수 있는 값의 범위를 넘어선 값을 저장하려고 할 때, 오버플로우가 발생한다.
short sMin = -32768; // short형 변수가 표현할 수 있는 가장 작은 수
sMin = (short)(sMin - 1);
결과 : sMin = 32767
char cMax = 65535; // char형 변수가 표현할 수 있는 가장 큰 수
cMax = (int)(cMax + 1);
결과 : cMax = 0
- 최소값 - 1 연산을 진행하거나 최대값 + 1 연산을 진행하면, 오버플로우가 발생해 각각 최대값, 최소값을 결과로 반환하게 된다.
타입 간의 변환
1. 문자와 숫자 간의 변환
char c = 3 + '0';
int i = '3' - '0';
// 문자 '0'을 더하고 뺌으로써 문자를 숫자로, 혹은 역으로 변환할 수 있다.
2. 문자열로의 변환
String s1 = 3 + "";
String s2 = '3' + "";
// 숫자나 문자 데이터를 문자열로 변환하려면, 빈 문자열을 더해주면 된다.
3. 문자열을 숫자로 변환
int i = Integer.parseInt("3");
double d = Double.parseDouble("3.4");
// 문자열을 숫자 데이터로 바꾸는 데엔 해당 변수형 클래스의 메소드를 이용한다.
char c = "3".charAt(0);
// 문자열을 문자 데이터로 바꾸는 데엔 charAt(0)을 이용한다.
출력과 입력
printf() 를 이용한 출력
- printf()를 이용해 출력하면 지시자를 통해서 출력 형식을 지정할 수 있다.
printf() 의 지시자
%b | boolean 형식으로 출력 |
%d | 10진 정수의 형식으로 출력 |
%o | 8진 정수의 형식으로 출력 |
%x | 16진 정수의 형식으로 출력 |
%f | 부동 소수점 형식으로 출력 |
%e | 지수 표현식의 형식으로 출력 |
%c | 문자의 형식으로 출력 |
%s | 문자열로 출력 |
System.out.printf("age : %d year : %d", 14, 2017);
결과 : age : 14 year : 2017
Scanner를 통해 화면에서 입력받기
- Scanner는 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스이다.
import java.util.*; // Scanner를 사용하기 위해 필요한 import문
Scanner sc = new Scanner(System.in);
// Scanner 객체 생성. 인스턴스 생성의 인수를 System.in으로 하면 화면으로부터 입력받고,
// 다른 것으로 하면 파일로부터 입력받는 것도 가능하다.
int i = sc.nextInt(); // 화면에서 입력받은 정수를 i에 저장
String s = sc.nextLine(); // 화면에서 입력받은 한 행의 문자열을 s에 저장
i = Integer.parseInt(s); // 문자열을 숫자로 변환