study

(230424) Java - 타입변환

hjkeeeem 2024. 7. 25. 20:22

EADFF2 형광 색상 코드

롤백하는 법 

commit , push, merge 이후에는 롤백이 되지 않는다.

add인 상태에서 commit창에 들어가 해당 클래스 우클릭 -> 롤백

 

String 및 타입 설명

String name = "김현정"; // primitive 타입 쓰듯이 초기화
String name2 = new String("김현정") // 원래는 이렇게 생김

Scanner sc = new Scanner(System.in) // ()안에 들어가는 것이 파라미터

String에 대한 질문 ( = Never 인성 면접 볼 때 나왔던 질문 )

참조타입의 변수 - 주소만 복사가됨

primitive타입 변수 - 값이 복사가 됨

 

참조타입이라 바로 대입을 하는 것이 아니라 new와 같이 사용 됨

 

 

세가지 변수 출력하기

 

 

int와 float의 계산 차이점

float fOne = 1;
float fTwo = 2;

System.out.printf("%f\n", fOne + fOne / fTwo);

int iOne = 1;
int iTwo = 2;
System.out.printf("%d", iOne + iOne / iTwo);

결과

int의 경우 소수점 아래를 버리게 됩니다.

 

 

 

Float 과 Double 비교 

   + Float -> 32비트 / 대략 7자리의 정밀도로 소수점 아래 6자리까지 출력 가능

   + Double -> 64비트 / 대략 15자리의 정밀도로 소수점 아래 14자리까지 출력 가능

   + Double 을 넘어가는 것은 BigDecimal 을 사용함

Float 형에는 소수 7자리에서 반올림 하는 경우가 있기 때문에 6자리까지 입력해주는 것이 올바르다.

Float 형인 f1에 15자리 숫자가 들어가게 되면 에러가 나게 됨.

Float 형을 선언하고 소수를 직접 변수에 넣을 시 f를 붙이지 않게 되면 에러가 난다. (6번째 줄 주석 참고)

Float 형에 정수를 넣고 출력 시 [정수.000000] 혹은 [정수.0] 이런 식으로 출력이 된다. ( sout과 souf의 출력 방식 차이)

 

 

1 + 1인데 왜 2가 아니고 11 일까?

Line 5 : 숫자+문자열

Line 5 : 문자열

 

때문에 숫자+문자열을 표현하려면 Integer.paseInt 를 이용해 "1"의 문자열을 숫자로 변경하여 Result 값을 2로 만들 수 있다.

 

 

타입 캐스팅

- 타입을 바꾸는 것

 

강제 타입 변환으로 double형을 int로 변경하기

 

 

하지만 String 타입을 int형으로 바꾸려면 오류가 뜬다.

String -> int로 변경하려면 강제 타입 변환이 아닌 Integer.parseInt로 변경해야한다.

이유는 강제 타입 변환은 기본타입 변수들끼리는 가능하나 String은 참조타입이기 때문에 강제 타입 변환을 사용 할 수 없는 것이며,

Integer.parseInt는 정수만 변경 가능하기 때문에 다른 float(실수형)들은 Float.parseFloat을 사용해야 한다.

 

 

소수점 이하 열여섯 자리 이상을 처리 해야 하는 경우

BigDecimal이라는 클래스를 사용하며, 1.234567890123456789를 열여덟 자리까지 정확하게 표현하고자 한다면 다음과 같이 BigDecimal 클래스를 사용

BigDecimal bigDecimal = new BigDecimal("1.234567890123456789");
System.out.println(bigDecimal);

 

제목

 

 

 

CS

Q. 반으로 나눴을 때 가운데 인덱스가 어디냐 (int이기 때문에)

A.

배열의 길이가 9일 경우

9 / 2 = 4 이기 때문에 4

0 1 2 3 4 5 6 7 8

 

배열의 길이가 10일 경우

10 / 2 = 5 이기 때문에 5

0 1 2 3 4 5 6 7 8 9

 

 

* 부동 소수점 방식 (=부유한다

loat은 32비트(4바이트)의 크기를 가지며, 1비트는 부호(+인지,  -인지를 구분)를, 8비트 는 지수를, 23비트는 가수를 나타내는데 사용됩니다. 이로 인해 float은 대략 일곱자리의 정밀도를 가집니다. 참고로 int도 32비트(4바이트)를 사용합니다.

 

부동 소수점 부분을 가수부(mantissa)라고도 합니다. 가수부는 그 수의 숫자 부분을 지정하고 지수부는 그 수의 크기(소수점의 위치)를 지정합니다. 부동 소수점 기수법에서 어떤 수(n)이 가수부 (a)와 지수부(b)로 표현되면 n=a×rb가 됩니다(r는 기수).

 

예를 들면 10진수 314,600,000과 0.0000451은 각각 3,146E5와 451E-7로 표현되는데 3,146과 451은 가수부이고 E5와 E-7은 지수입니다. 따라서 314,600,000=3,146×10^5가 되고, 0.0000451=451×10^-7이 됩니다.

(참고) TTA 정보통신용어사전

 

  • 가수 mantissa, 假數 거짓 가, 셈 수 - 소수점 이하부분



한자 공부 등한시 한 결과 프로그래밍 하는데 지장을 받은적이 있습니다.

 

314,600,000

3억 1천 4백 60만 → 3146E5

 

3146(가수부)E5(지수부)

 

가수부 지수부
3146  00000
  E5

Q. float f2 = 1.23e10; 은 한글로 쓰면 몇일까요?

A.

가수부 지수부
1.23 00000 00000 (E10)

 

FloatDigit 파일 설명

public class FloatDigit {
    public static void main(String[] args) {

        float f5 = 1.23e5f;
        float f6 = 1.23e6f;
        float f7 = 1.23e7f;
        float f8 = 1.23e8f;
        float f9 = 1.23e9f;
        float f10 = 1.23e10f;
        double d10 = 1.23e10;

        //souf
        System.out.printf("f5 : %f\n", f5);
        System.out.printf("f6 : %f\n", f6);
        System.out.printf("f7 : %f\n", f7);
        System.out.printf("f8 : %f\n", f8);
        System.out.printf("f9 : %f\n", f9);
        System.out.printf("f10 : %f\n", f10);
        System.out.printf("d10 : %f\n", d10);

        //sout
        System.out.println("f7 = "+ f7);
        System.out.println("f8 = "+ f8);
        System.out.println("f9 = "+ f9);
        System.out.println("f10 = "+ f10);
        System.out.println("d10 = "+ d10);

결과

f10부터 이상하게 표시 나는 경우가 있다.

f10 이 1.23e10 으로 나오지 않고 1.23000003E10 으로 나옴. 

이럴 경우는 float -> double로 바꿔주면서 마지막 결과인 d10 = 1.23E10이라는 정상적인 결과를 얻을 수 있다.

 

+ f를 붙일 시 7자리를 초과하면 반올림 된다는 것을 알고 코딩하라는 의미