본문 바로가기

프로그래밍 언어/자바

[Java] 연산자 우선순위, 자료형, 기타 등등(24.05.20)

연산자 우선순위

  1. 단항, 이항, 삼항 연산자 순으로 우선순위를 가짐.
    • ‘++’ ← ‘a + b’ ← ‘a ? b : c‘
  2. 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 가짐.
    • 산술 연산자( + , - , * , / , % )
    • 비교 연산자( < , ≤ , ≥ , == , ≠ )
    • 논리 연산자( && , || , & , | , ^ , ! )
    • 대입 연산자( = , += , -= , *= , /= , %= )
  3. 단항, 부호, 대입 연산자를 제외한 모든 연산의 방향은 왼쪽에서 오른쪽임.
  4. 복잡한 연산식에는 괄호 ()를 사용해서 우선순위를 정함.

 

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가 자원을 해제하지만, 해제 시점을 예측할 수 없어, 예기치 못한 버그가 발생할 수 있음.

 

자료형 종류

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 타입인 경우,
    다른 모든 피연산자도 String 타입으로 Promotion 되고, '+' 연산은 덧셈(Addition)이 아닌 접합(Concatenation) 연산으로 수행된다.

0.1d == 0.1f → false 인 이유

  • double과 false에서 표현된 정밀도가 달라서 발생하는 문제
  • → 단정밀도 표현법 복습 필요
  • 0.5d == 0.5f → true 임
  • → 딱 떨어지기 때문에 true

 

기본적인 ASCII 코드 값

  • 0 : NUL
  • 48 : 0
  • 49 : 1
  • 65 : A
  • 97 : a