연산자 우선순위
- 단항, 이항, 삼항 연산자 순으로 우선순위를 가짐.
- ‘++’ ← ‘a + b’ ← ‘a ? b : c‘
- 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가짐.
- 산술 연산자( + , - , * , / , % )
- 비교 연산자( < , ≤ , ≥ , == , ≠ )
- 논리 연산자( && , || , & , | , ^ , ! )
- 대입 연산자( = , += , -= , *= , /= , %= )
- 단항, 부호, 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽임.
- 복잡한 연산식에는 괄호 ()를 사용해서 우선순위를 정함.
Scanner
- java.util 패키지에 포함되어 있어 java.util을 import를 해줘야 사용할 수 있다.
- 기본적인 데이터 타입을 모두 입력받을 수 있다.
- 토큰(공백,개행,탭)을 기준으로 데이터를 입력받는다.
- Scanner 클래스의 메서드
- 토큰(Token) : 공백 문자(Spacebar), 탭(Tab), 개행(Enter) 등으로 구분되는 요소
- next() : String을 읽음. 토큰(Token)을 기준으로 읽음
- nextLine() : String을 읽음. 개행(Enter)을 기준으로 읽음
- nextInt() : int를 읽음
- nextBoolean() : boolean을 읽음
- nextByte() : byte를 읽음
- nextShort() : short를 읽음
- nextLong() : long을 읽음
- nextFloat() : float을 읽음
- nextDouble() : double을 읽음
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 기본타입
byte a = sc.nextByte();
short b = sc.nextShort();
int c = sc.nextInt();
long d = sc.nextLong();
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
// 실수타입
float e = sc.nextFloat();
double f = sc.nextDouble();
System.out.println(e);
System.out.println(f);
// 논리타입
boolean g = sc.nextBoolean();
System.out.println(g);
// 문자타입
char h = sc.next().charAt(0);
String i = sc.next();
String j = sc.nextLine();
System.out.println(h);
System.out.println(i);
System.out.println(j);
}
}
- next자료형() 메서드의 경우, 아래의 Exception을 throw 할 수 있다.
- InputMismatchException : 다음 토큰이 자료형 데이터가 아니거나, 범위를 넘을 경우
- NoSuchElementException : input에 문제가 생겼을 경우
- IllegalStateException : scanner가 닫혔을 경우
- close() 메서드를 가짐
- 만약 Scanner 사용이 종료된 후, close() 메서드를 호출하지 않으면?
- 자원 누수(Resource Leaks):
- close()를 호출하지 않으면 파일, 데이터베이스 연결, 네트워크 소켓 등의 시스템 자원이 계속 점유된 채로 남아있게 됩니다.
- 이로 인해 시스템 자원이 고갈되어 프로그램 성능이 저하되거나 심각한 경우 프로그램이 중단될 수 있습니다.
- 예측할 수 없는 동작:
- close()를 호출하지 않으면 객체가 GC(Garbage Collection) 대상이 될 때 finalizer나 cleaner가 호출되어 자원을 해제하려 합니다.
- 하지만 finalizer와 cleaner는 예측할 수 없는 시점에 실행되므로, 자원 해제가 적절한 시점에 이루어지지 않을 수 있습니다.
- 이로 인해 프로그램의 동작이 예측할 수 없게 되고 버그가 발생할 수 있습니다.
- 즉, close하지 않아도 GC가 자원을 해제하지만, 해제 시점을 예측할 수 없어, 예기치 못한 버그가 발생할 수 있음.
- 자원 누수(Resource Leaks):
- 만약 Scanner 사용이 종료된 후, close() 메서드를 호출하지 않으면?
자료형 종류
byte
- size : 1 byte
- range : -128 ~ 127
short
- size : 2byte
- range : -32,768 ~ 32,767 (-2^15 ~ 2^15 - 1)
int
- size : 4 byte
- range : -2,147,483,648 ~ 2,147,483,647 (-2^31 ~ 2^31 - 1)
long
- size : 8 byte
- range : -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (-2^63 ~ 2^63 - 1)
float
- size : 4 byte
- range : 7자리 정밀도
7자리 까지는 정확한 표현이 가능하지만, 8자리 부터는 정확한 표현이 어렵다
public static void main(String[] args) {
System.out.println(1234567.0f); // 1234567.0
System.out.println(12345.67f); // 12345.67
System.out.println(123.4567f); // 123.4567
System.out.println(1.234567f); // 1.234567
System.out.println(0.01234567f); // 0.01234567
System.out.println(91234567.0f); // 9.1234568E7
System.out.println(912345.67f); // 912345.7
System.out.println(9123.4567f); // 9123.457
System.out.println(91.234567f); // 91.234566
System.out.println(0.91234567f); // 0.91234565
}
double
- size : 8 byte
- range : 15자리 정밀도
7자리가 넘어가면 double 사용
자료형 형변환
명시적 형변환
1. 문자 → 숫자
String s_num = "10";
int i_num = Integer.parseInt(s_num);
int i_num2 = Integer.valueOf(s_num);
String s_num = "10";
double d_num = Double.valueOf(s_num);
float f_num = Float.valueOf(s_num);
2. 숫자 → 문자
- Integer → String
int i_num = 10;
String s_num;
s_num = String.valueOf(i_num);
s_num = Integer.toString(i_num);
s_num = ""+i_num; // 문자열 + 숫자 => 문자열
- Float, Double → String
float f_num = 10.10f;
double d_num = 10.10d;
String s_num;
s_num = String.valueOf(f_num);
s_num = Float.toString(f_num);
System.out.println(s_num); // 10.1
s_num = String.valueOf(d_num);
s_num = Double.toString(d_num);
System.out.println(s_num); // 10.1
3. 정수 ↔ 실수
- Double, Float → Integer
- double d_num = 10.101010; float f_num = 10.1010f; int i_num; i_num = (int)d_num; System.out.println(i_num); // 10 <- 소수점 이하 버림 i_num = (int)f_num; System.out.println(i_num); // 10 <- 소수점 이하 버림
- Integer → Double, Float
- int i_num = 10; double d_num = (double)i_num; System.out.println(d_num); // 10.0 float f_num = (float)i_num; System.out.println(f_num); // 10.0
묵시적 형변환
- boolean형은 형변환이 불가능하다
- Promotion (프로모션; 자동 타입 변환)
- 값의 Range(허용 범위)가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생한다.
- Range의 크기는 ‘자료형’의 크기를 의미함
- Promotion in Integer Operation (정수 연산에서의 프로모션)
- 정수 연산에서, 피연산자들 모두 int 형 이하의 Range를 가졌다면, 피연산자 모두는 int 형으로 Promotion 된다.
- 정수 연산에서, 피연산자 중 하나라도 long 형이 존재하면, 피연산자 모두는 long 형으로 Promotion 된다.
- Promotion in Floating Point Operation (실수 연산에서의 프로모션)
- 실수 연산에서, 피연산자의 타입이 모두 같다면, 해당 타입으로 연산이 그대로 진행된다.
- 피연산자 중 하나라도 double 타입이면, 다른 피연산자도 모두 double 타입으로 Promotion 된다.
- int 타입과 double 타입을 연산하는 경우, 모두 double 타입으로 Promotion 된다.
- Promotion in String Operation (문자열 연산에서의 프로모션)
- '+' 연산자를 통한 연산에서, 하나 이상의 피연산자가 String 타입인 경우,
0.1d == 0.1f → false 인 이유
- double과 false에서 표현된 정밀도가 달라서 발생하는 문제
- → 단정밀도 표현법 복습 필요
- 0.5d == 0.5f → true 임
- → 딱 떨어지기 때문에 true
기본적인 ASCII 코드 값
- 0 : NUL
- 48 : 0
- 49 : 1
- 65 : A
- 97 : a
'프로그래밍 언어 > 자바' 카테고리의 다른 글
자바는 어떻게 파일경로를 보고 File을 찾아낼까? (0) | 2024.05.17 |
---|---|
Object 클래스의 hashCode() native code 밑바닥까지 파헤치기 (2) | 2024.01.21 |
[Java] String & StringBuilder & StringBuffer (0) | 2023.12.12 |
[Java] 람다 (0) | 2023.12.04 |
[Java] 제네릭 (1) | 2023.12.04 |