ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 형 변환, 계산과 형 변환, 스캐너
    언어/Java 2024. 10. 26. 10:58
    단축키 Tip
    Shift + F6 
    특정 문자열 다 바꾸기
    ex)
    안녕하세요. 저는 안녕입니다. (단축키 입력) 안녕 -> 호호
    호호하세요. 저는 호호입니다.
    • 자바에서 형 변환은 2가지가 있다.
    • 묵시적 형 변환명시적 형 변환
    • 쉽게 말해 자동으로 해주냐(묵시적) 타입을 지정해주어야 하느냐(명시적)의 차이이다.

    묵시적 형 변환

    int intvalue = 10;
    long longVaule;
    longValue = intValue;
    • 묵시적 형 변환은 작은 범위(int 형 타입) -> 큰 범위(long형 타입) 일 때 자동으로 이루어진다.
    • 위 코드를 뜯어보면 아래와 같다.
    int intValue = 10;
    double doubleValue;
    doubleValue = (double) intValue; // 형 맞추기
    double = (double) 10;
    doubleValue = 10.0; // 형 변환

    명시적 형 변환

    double doubleValue = 1.5;
    int intValue;
    // intValue = doubleValue; // 컴파일 오류 발생 큰 범위 -> 작은 범위 넣을 때
    intValue = (int)doubleValue;
    sout(intValue); // 1
    • 작은 범위에 큰 범위 타입을 넣으려고 하면 컴파일 오류가 발생한다. ( 큰 그릇안에 작은 그릇은 넣을 수 있지만, 반대는 성립하지 않는 것이라 생각하자)

    형 변환을 한다고 doubleValue 자체의 타입이 변경되거나, 그 안에 있는 값(1.5)이 변경되는 건 아니다.

    변수의 값은 대입 연산자 ( = ) 를 사용해서 직접 대입할 때만 변경된다. 


    만약 큰 범위에서 작은 범위로 명시적 형 변환을 할 때,  그 값의 범위를 넘어버리면?

    예를 들어서 int는 2147483647 까지 표현할 수 있다. 표현 가능한 최댓값에서 1만 더해도 그 값이 무언가 이상해질 거 같다. 

    long maxIntValue = 2147483647; // int 최댓값
    long maxIntOver = 2147483648L; // int 최댓값 + 1
    int intValue = 0;
    
    intValue = (int)maxIntValue; // 형 변환
    sout(intValue); // 214783647 
    
    intValue = (int)maxIntOver; // 형 변환
    sout(intValue); // -214783648
    • 2의 보수에 따라 음수를 표현하는 어쩌구 저쩌구 무튼 그게 중요한 게 아니라. 
    • 프로그래머의 의도와 다르게 나왔다는 것이다. 이 문제를 오버플로우가 발생했다고 말한다. 
    • 따라서 이 음수값을 어떻게 계산해서 나왔고가 중요하기 보단.
    • 오버플로우 그 자체가 문제점이기 때문에
    • int 로 형 변환했던 것을 상위 타입인 long 이나 그보다 큰 범위로 바꾸어준다.

    계산과 형 변환

    • 디테일을 기억하는 것도 중요하지만, 몇 개의 대원칙을 기억해보자.
    1. 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
    2. 서로 다른 타입의 계산은 큰 범위로 자동 형 변환이 일어난다. 
      1. int + int = int
      2. long + int = long + long
    double div2 = 3 / 2;

     

    • 한번 위 소스 코드의 결과를 생각해보자.

     

     

     

     

     

     

    • 정답은 1.0 이다.
    • 그 이유는 3과 2는 int형 타입이다. 
    • 따라서 3 나누기 2 는 1.5 이지만 int형 타입이기 때문에 뒤에 .5가 버려지게 된다.
    • 그 다음 double형으로 형 변환이 되어서 1.0이 되는 것이다. 

    Scanner

    Scanner scanner = new Scanner(System.in);
    • 현재 수준으로는 위 소스 코드를 뜯어볼 수 없다. 객체와 클래스를 배워야 정확히 이해할 수 있다.
    • 지금은 Scanner 기능을 사용하기 위해 new를 사용해서 Scanner를 만든다 정도로 이해하자.
    • Scanner은 System.in을 사용해서 사용자의 입력을 편리하게 받도록 도와준다. 
    String str = scanner.nextLine(); // 입력을 String으로 가져온다.
    • 엔터(\n) 을 입력할 때까지 문자를 가져온다.
    • 즉, 엔터 전까지 문자만 가져오기 때문에 \n는 남아 있다. 

    print(), println()

    sout.print("hello");
    sout.print("word");
    // helloworld

    문제와 풀이 3 ScannerWhileEx1

    package scanner.ex;
    
    import java.util.Scanner;
    
    public class ScannerWhileEx1 {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
    
            while (true) {
                System.out.print("이름을 입력하세요 (종료를 입력하면 종료) : ");
                String name = input.nextLine();
                if (name.equals("종료")) {
                    System.out.println("프로그램을 종료합니다.");
                    break;
                }
                
                System.out.print("나이를 입력하세요 : ");
                int age = input.nextInt();
    
                System.out.println("입력한 이름 : " + name + "  나이 : " + age);
    
            }
        }
    }

    • while 문을 사용하는 데 위와 같이 출력되었다. 
    • 그 이유는 nextInt(); 는 10\n 
    • 따라서 input.nextLine(); // \n 을 가져와 버려주자. 

    영한형님 말씀으로는 그렇게 중요한 건 아니라 알아만 두자 라고 하셨다.

    '언어 > Java' 카테고리의 다른 글

    [Java] 반환타입, 메서드 오버로딩  (0) 2024.10.30
    [Java] 메서드 (feat. 인수 != 매개변수)  (2) 2024.10.29
    [Java] 배열, 향상된 for문  (0) 2024.10.28
    [Java] operator and conditional statement  (3) 2024.10.24
    [Java] variable  (1) 2024.10.23
Designed by Tistory.