-
[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 이나 그보다 큰 범위로 바꾸어준다.
계산과 형 변환
- 디테일을 기억하는 것도 중요하지만, 몇 개의 대원칙을 기억해보자.
- 같은 타입끼리의 계산은 같은 타입의 결과를 낸다.
- 서로 다른 타입의 계산은 큰 범위로 자동 형 변환이 일어난다.
- int + int = int
- 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