JAVA

[JAVA] 형변환

sian han 2022. 2. 9. 23:59

※형변환

▶형변환이 필요한 때

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진수표현