※형변환
▶형변환이 필요한 때
1. 연산
- 가장 큰 자료형으로 자동형변환되어 계산됨
2. 대입
- 대입조건 : 좌우변의 자료형이 일치해야한다
- 양 변의 자료형이 일치하지 않을 경우 형변환 필요
▶형변환의 종류
● 자동 형변환 (=암시적 변환)
- 작은 범위의 자료형을 큰 범위 자료형에 할당하는경우 자동형변환이 된다
int a = 10;
long b=a;
△이 경우 int 인 a 는 long 으로 자동형변환환되어 b에 들어간다
<자동형변환 규칙>
△왼쪽부터 오른쪽으로 커지는 순서
- char 자료형은 byte/short 와 애초에 비교대상이 될 수 없다. 누가 더 큰지 판단불가.
따라서 char -> int . . . 순서로 크기를 비교한다
- 그림기준 왼쪽에 있는것은 오른쪽에 있는것으로 자동형 변환되지만,
오른쪽에 있는것이 왼쪽에 있는것이 되고싶다면 명시적 형변환이 필요하다.
int a = 123;
long b=a;
- int < long // int가 long으로 자동 형변환됨
▷자동형 변환 with 연산
double d =5.6;
double m = y*d;
double * double = double
따라서 m 은 double 로 설정해두고 결과값을 받아야 한다
▷ 헷갈리는 char / int 형변환 !
char ch1='A';
int num1=ch1;
System.out.println(num1);
= 65
🎉char => int 자동형변환 가능🎉
▷ int 미만 자료형 연산시 자동형변환
byte a = 10, b=20, c;
c=a+b;
- error) incompatible types: possible lossy conversion from int to byte
- 연산 시 int 보다 작은 자료형의 연산의 경우
int 로 자동형변환되어 계산하기 때문에 결과값 역시 int 로 도출된다
- cpu는 int 형 정수연산을 가장 고속으로 처리하도록 설계되어있기때문
● 명시적 형변환
- 큰 범위의 자료형을 작은 자료형에 할당하는 경우
ex ) int a =3;
short b = a; => 에러발생 error: incompatible types: possible lossy conversion from float to long int > short 이기 때문에 int 값을 short 에 우겨넣을 수 없다
int a =3;
short b =(short)a; => GOOD !
명시적 형 변환 시 Cast 연산자()를 이용한다
★But 주의해야할 것 !
int a = 35000
short b = (short)a
△ 양변의 자료형이 달라 명시적 변화를 했기 때문에 문제가 없어보이지만 ~
short 자료형은 +-32000 까지만 담을 수 있는 그릇이다.
= 이처럼 해당 자료형의 범위에 들어갈 수 없는 값을 넣을 시
error 는 없지만 , garbage 값이 도출된다
▷명시적 형변환 with 연산
int x=1, y=2;
float f=(float)x/y;
△ 이해하기
int < float
x/y => int / int = int
f 에 int 값 할당 불가. float 형태로 값을 받고 싶음. 따라서 (float)x 을 통해 x 를 float 자료형으로 변환
x/y => float / int = float
이 때 나온 결과값은 자료형 float 인 f 에 할당가능
▷헷갈리는 String / int 사이의 형변환 !!!
- String 과 int 는 Cast() 로 자료형을 우겨넣어도 형변환이 불가하다
- type 은 type 끼리 / class 는 class 끼리만 형변환이 가능
- String : class
int : type => 따라서 이대로는 형변환불가 !
- int 의 class type : Integer 를 사용하면 class class 끼리 형변환 가능
- integer.parselnt() : ㅇㅇ 정수(Int)로 바꿔줄께 ~ 라는 뜻. .
- ~parse~ : 문자열 > 숫자형변환해줌
- 자매품 : Float.parseFloat() String => float 으로 바꿔줄께
Double.parseDouble() String => double 로 바꿔줄께
Byte.parseByte() String => byte 로 바꿔줄께
String str = "1234";
int b = Integer.parseInt(str);
System.out.println (b+1);
= 1235
△ 이해하기
문자열 1234 를
integer.parselnt() 통해 정수로 변경
정수 1234+1 = 1235
문자열 => 숫자형 가능했다면
숫자형 => 문자열도 가능하다 !
▷Integer.toString
int a = 10;
String str = Integer.toString(a);
- 정수 10이 문자열 "10" 으로 변환됨
- 자매품 : Double.toString();
Long.toString();
Float.toString();
<정리> 명시적 형변환 방법 3가지
1. 캐스트 연산자 : (자료형) 변수명 ...
2. parseInt() 메서드 : 문자열 -> 수치형 형변환
3. .toString() 메서드 : 수치형 -> 문자열 형변환
※Scanner
- scanner는 자바에서 기본적으로 제공하는 라이브러리 이며,
사용자로부터 입력받을 때 Scanner 클래스의 next~() 메서드 이용
- Scanner sc = new Scanner(System.in);
▶ nextInt()
- 정수를 입력받는다
- 통채로 사용자가 입력한 정수값
Scanner sc = new Scanner(System.in);
System.out.print("지방의 그램을 입력하세요:");
int a = sc.nextInt();
▶ nextLine()
- 문자열을 입력받는다
- 통채로 사용자가 입력한 문자열 값 (공백 상관 x)
※ JAVA 의 표기법
1. 지수표기법 = e표기법
- 10의 거듭제곱 표현
int a = 1000000;
int a = 1e6;
- 0이 붙는개수만큼 e 뒤에 숫자를 써준다
- 1 * 10^6 = 1곱하기 10(e)의 6제곱 = 1000000
double a = 1.5e-3 / 1.5 곱하기 10 의 -3제곱 / 0.0015
double b = 1.5E+3 / 1.5 곱하기 10 의 3제곱 / 1500.0
double c = 1.5E3 / 1.5 곱하기 10 의 3제곱 / 1500.0
2. 숫자표기법
- 16,8,2 진수가 있는데 출력되는값은 10진법으로 나타난다
▷ 16진수
- 0x 로 시작하면 16진수 표현
int n1 = 0xA0E ;
0x = 이것은 16진수이다
A = 10
0 = 0
E = 14
=> 10 (A) * 256 (8의3제곱)
+ 0 * 16 (8의 2제곱)
+ 14
=16진수 0xA0E = 10진수 2574
▷ 16진수
- 0o로 시작하면 8진수표현
int n2=0o125;
=> 1*64+2*8+5 => 10진수 85
▷ 2진수
- 0b로 시작하면 8진수표현
'JAVA' 카테고리의 다른 글
[JAVA] for 무한루프 / scope / (0) | 2022.02.14 |
---|---|
[JAVA] 중첩if / switch 문 / 반복문_for (0) | 2022.02.14 |
[JAVA] 연산자 / 제어문 (0) | 2022.02.10 |
[JAVA] 값 할당 / 변수자료형 / 자료형분류 / Escape Sequence (0) | 2022.02.08 |
[JAVA] JAVA 실행과정 이해하기 / 자바코드의 구조 (0) | 2022.02.07 |