STUDY/JAVA
[Java] 이것이 자바다 Ch.02
Eunjng
2023. 12. 26. 18:00
'이것이 자바다' 교재 및 강의를 참고하여 정리한 내용입니다.
Ch.02 변수와 타입
변수 선언
- 컴퓨터 메모리(RAM): 수많은 번지들로 구성된 데이터 저장 공간
- 변수: 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름
- 자바의 변수는 다양한 타입의 값을 저장할 수 없다.
- 변수 선언:
타입 이름
- 변수 이름: 첫 글자는 문자로 시작하고, 캐멀 스타일로 작성하는 것이 관례
- camel 스타일
- 자바 소스 파일명(클래스명)은 대문자로 시작: MemberGrade.java
- 변수명은 소문자로 시작: mathScore
- camel 스타일
- 변수에 최초로 값을 대입하는 행위: 변수 초기화. 이때의 값: 초기값
int score = 90;
- 초기화되지 않은 변수는 메모리에 할당되지 않았기 때문에 변수를 통해 메모리 값을 읽을 수 없다.
int value; int result = value + 10; // 컴파일 에러
타입
- 정수: byte, char, short, int, long
- 실수: float, double
- 논리: boolean
정수 타입
타입 | 메모리 크기 | 저장되는 값의 허용 범위 | |
byte | 1byte (=8bit) | -2^7 ~ (2^7 - 1) | -128 ~ 127 |
short | 2byte | -2^15 ~ (2^15 - 1) | -32,768 ~ 32,767 |
char | 2byte | 0 ~ (2^16 - 1) | 0 ~ 65535 |
int | 4byte | -2^31 ~ (2^31 - 1) | -2,147,483,648 ~ 2,147,483,647 |
long | 8byte | -2^63 ~ (2^63 - 1) |
- byte, short, int, long은 부호 있는 정수 타입이므로 최상위 bit는 부호 bit로 사용되고, 나머지 bit는 값의 범위를 결정
- 최상위 bit가 1인 음수의 경우 나머지 bit를 모두 1의 보수로 바꾸고 1을 더한 값에 -를 붙이면 10진수가 된다.
리터럴(liteal): 직접 입력한 값
- 2진수: 0b 또는 0B로 시작하고 0과 1로 작성
int x = 0b1011;
- 8진수: 0으로 시작하고 0~7 숫자로 작성
int x = 0206;
- 10진수: 소수점 없는 0~9 숫자로 작성
int x = 12;
- 16진수: 0x 또는 0X로 시작하고 0~9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 작성
int x = 0x2A0F;
- 허용 범위 초과 시 컴파일 에러
- l 또는 L을 붙여 long 타입 값임을 알려줘야 한다.
long var1 = 1000000000000L;
문자 타입
- 문자 리터럴: 하나의 문자를 작은따옴표(')로 감싼 것. 유니코드로 변환되어 저장된다.
char c1 = 'A'; // 문자 저장
char c2 = 65; // 유니코드 직접 저장
// char 초기화
char c = ''; // 컴파일 에러
char c = ' '; // 공백 포함해서 초기화
실수 타입
타입 | 메모리 크기 | 저장되는 값의 허용 범위(양수 기준) | 유효 자릿수 |
float | 4byte | 1.4 * 10^-45 ~ 3.4 * 10^38 | 7자리 |
double | 8byte | 4.9 * 10^-324 ~ 1.8 * 10^308 | 15자리 |
- 자바는 float과 double 타입의 값을 부동 소수점 방식으로 메모리에 저장
실수 리터럴
- 10진수 리터럴
double x = 0.25;
- e 또는 E가 포함된 10의 거듭제곱 리터럴
double x = 5e2; // 5.0 * 10^2 = 500.0
- 기본적으로 double 타입으로 해석하기 때문에 float 타입에 입력 시 f나 F를 붙여야 한다.
float var = 3.14f;
float var1 = 0.1234567890123456789f;
double var2 = 0.1234567890123456789;
System.out.println(var1); // 0.12345679
System.out.println(var2); // 0.12345678901234568
- double 타입이 float 타입보다 약 2배 정도의 유효 자릿수를 가진다.
논리 타입
- 논리 리터럴: true, false
int x = 10;
boolean result1 = (x == 20);
boolean result2 = (x != 20);
System.out.println(result1); // false
System.out.println(result2); // true
문자열 타입
- 문자열: 큰따옴표(")로 감싼 문자들
String var1 = "A";
- 이스케이프(escape) 문자: 문자열 내부에
\
가 붙은 문자\"
: "문자 포함\'
: '문자 포함\\
: \ 문자 포함\u16진수
: 16진수 유니코드에 해당하는 문자 포함\t
: 출력 시 탭만큼 띄움\n
: 출력 시 줄바꿈\r
: 출력 시 캐리지 리턴
- Java 13부터는 텍스트 블록 문법 제공
String str = """
...
""";
자동 타입 변환
- 값의 허용 범위가 작은 타입이 큰 타입으로 대입될 때
- byte < short, char < int < long < float < double
- char타입의 허용 범위는 음수를 포함하지 않기 때문에 byte -> char 자동 변환 불가
byte byteValue = 10;
int intValue = byteValue;
// 자동 형변환
char charValue = 'A';
int intValue = charValue; // 65 저장
강제 타입 변환
int intValue = 10;
byte byteValue = (byte) intValue;
int intValue = 65;
char charValue = (char) intValue;
System.out.println(charValue); // 'A'
double doubleValue = 3.14;
int intValue = (int) doubleValue;
System.out.println(intValue); // 3
String strValue = "A";
char var = (char) strValue; // 컴파일 에러
연산식에서 자동 타입 변환
- 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산 수행
- long 타입이 피연산자로 사용되면 다른 피연산자는 long 타입으로 변환되어 연산 수행
byte x = 10;
byte y = 20;
byte result = x + y; // 컴파일 에러
int result = x + y;
피연산자가 동일한 실수 타입이면 해당 타입으로 연산
- 하나가 double이면 다른 피연산자도 double 타입으로 변환되어 연산되고, 연산 결과 또한 double 타입
float result = 1.2f + 3.4f; // 컴파일: float result = 4.6f;
int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; // 10.0 + 5.5
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int) doubleValue; // 10 + 5
int x = 1;
int y = 2;
double result = x / y;
System.out.println(result); // 0.0
double result = (double) (x / y); // 0.0
double result = (double) x / y; // 0.5
double result = x / (double) y; // 0.5
double result = (double) x / (double) y; // 0.5
+
연산자- 피연산자가 모두 숫자일 경우 덧셈 연산 수행
- 피연산자 중 하나가 문자열일 경우 다른 피연산자도 문자열로 자동 변환되어 문자열 결합 연산 수행
int value = 3 + 7; // 10
String str = "3" + 7; // "37"
// 순차적으로 + 연산 수행
int value = 1 + 2 + 3; // 6
String str = 1 + 2 + "3"; // "33"
String str = 1 + "2" + 3; // 123
String str = "1" + (2 + 3); // "15"
문자열 변환
- 문자열 -> 기본 타입
- `Byte.parseByte`, `Integer.parseInt`, ...
- 기본 타입 -> 문자열
- `String str = String.valueOf(기본값);`
콘솔로 변수값 출력
- println(내용); - 괄호 안의 내용을 출력하고 행 바꿈
- print(내용); - 괄호 안의 내용을 출력하고 행 미바꿈
- printf("형식문자열", 값1, 값2, ...); - 형식 문자열에 맞추어 값 출력
- conversion: d(정수), f(실수), s(문자열)
- 형식 문자열에 포함될 값이 둘 이상일 경우 값의 순번 포함
System.out.printf("이름: %1$s, 나이: %2d", "김자바", 25); // 이름: 김자바, 나이: 25
- flags: 빈 공간 채우는 방법
- 생략 시 왼쪽이 공백으로, -가 오면 오른쪽이 공백으로 채워진다. 0은 공백 대신 0으로 채운다.
- width: 소수점을 포함한 전체 자릿수
- .percision: 소수 이하 자릿수
키보드 입력 데이터를 변수에 저장
Scanner scanner = new Scanner(System.in);
String inputData = scanner.nextLine();
- 기본 타입 비교 시
==
사용, String 타입 비교 시equals()
사용
- 변수 이름으로 사용할 수 없는 것: class, 6hour, #name, int
- 가능: modelName, $value, _age