[CS] 자바의 정석 독서 #4 - 형변환

2025. 9. 21. 00:09·언어공부/Java | Kotlin

부동소수점을 했으니 이제 형변환까지 하고 2장을 넘어가봅시다.


수동형변환

수동형변환의 대표적인 예시는 캐스팅

int num = (int) "72";

이런식으로 괄호에 변환할 타입을 명시하여 원하는 타입으로 변환시키는데, 이 때 이렇게 형변환을 하면 형변환된 쪽은 아무런 변화가 없다. 즉, "72"가 아니라 String 타입의 변수를 넣어도 그 변수는 아무런 변화가 없다. 값과 타입은 유지된다.

 

기본형에서 불리언을 제외한 모든 타입은 서로 간의 형변환이 가능하다.


정수형 간 형변환

int를 byte로 바꾸거나 long을 int로 바꾸는 등, 큰 타입에서 작은 타입으로 형변환을 진행하면 되긴된다. 다만 값 손실이 있을 수 있다. 무조건 일어나는 것은 아니고, int를 byte로 바꾸는데 10번째 비트값이 1이었다면 무시되는 식으로 변환된다.

그 반대는 언제나 가능하다. 다만 byte를 int로 바꿨다면 24개의 새로운 비트값이 생기는데, 이 새로운 비트값은 부호를 따라간다. byte가 음수라면 1로 채워지고, 양수면 0이 채워지는 방식으로 변환이 이루어진다.


실수형 간 형변환

double에서 float로 변환하면 가수와 지수가 변한다. 지수부분은 double의 기저 1023을 빼고 float의 기저 127을 더하며, 11비트에서 8비트로 조정된다. 가수는 23번째 자리 아래의 값은 버려진다. 다만 24번째 값이 1이라면 올림이 발생할 수 있다.

반대로 float를 double로 변환하면 지수는 8비트에서 11비트로 확장되며, float의 기저 127을 빼고 double의 기저 1023을 더한다. 가수는 23번째 자리 이후의 값은 0으로 채운다.

 

다만 float로 저장할 때 float가 저장할 수 있는 범위를 벗어나서 (소수점 아래 7자리 이상) 값에 변형이 생긴 후 이를 double로 변환했다면, double 변수에는 변형된 float값이 들어간다. 이미 비트가 달라졌기 때문

또한 float로 변형할 때 범위를 넘어가게 되면 무한대, 또는 0을 가지게된다.


정수 - 실수 간 형변환

정수를 실수로

정수를 이진수로 변환한 후에 정규화를 거쳐서 값을 저장한다. 5가 있다면 101 -> 1.01 * 2^2 로 정규화되고 이후로는 실수 저장과 동일하게 진행한다. 범위도 실수형이 정수형보다 크기 때문에 이 부분은 걱정할 필요가 없으나 정밀도에서 오류가 생길 수 있다. int 값은 10자리는 너끈하게 표기할 수 있는 정밀도를 요구하지만, float는 7자리 밖에 정밀도를 보장할 수 없다는 것이 그 예시. 다만 double은 15자리 정밀도를 가지기 때문에 double을 쓰면 된다.

 

실수를 정수로

실수가 저장되어 있으면 실수를 다시

M * 2^N

의 부동소수점 형태로 변환 해야하는데, 자바이 정석 ch2 p.102를 보면 0 10000010 001000111111001101011110 이 있는데, 양수이고, 지수부분은 10000010 = 130, 기저를 빼면 3, 가수 부분은 001... 이다. 이를 부동소수점 방식으로 표현하면

 

1.001000111111001101011110 * 2^3 = 1001.000111111001101011110이고, 정수형에서는 소수점 아래는 버려지므로 1001만 남겨진다. 따라서 값은 9로 나온다. 원래 소수는 9.1234567

 

실수의 소수점을 버린 후의 결과가 정수형에서 오버플로우를 일으킬 경우 오버플로우된 값이 얻어진다.


자동형변환

C프에서도 관련된 내용을 잠깐 다뤘던 것 같은데

계산과정에서 컴파일러가 형변환을 자동적으로 추가해줘 형변환을 생략할 수 있는 경우다.

 

double d = 123;

이렇게..

int값이기에 double로 형변환이 필요하지만 컴파일러가 알아서 해준다.

다만 저장할 수 있는 값을 벗어나면 에러가 터진다. int 값에 너무 큰 값을 주었다거나. 다만 캐스팅을 통한 명시적형변환의 경우에서는 에러가 터지지 않는다.

 

byte b = 1000; //에러
byte b = (byte)1000; //안에러

 

이외에도 연산과정에서도 형변환이 일어나고 (이 경우 표현범위가 넓은 타입으로 형변환이 일어난다. 따라서 double과 int를 더하면 double 값이 구해진다.(산술변환)). 이러한 방식은 값을 최대한 보존할 수 있는 방향으로, 더 표현 범위가 넓은 방향으로 일어난다. 반대방향, 즉 표현 범위가 좁은 방향으로는 반드시 캐스팅을 통한 명시적 형변환을 통해서만 가능하다.

 

이외에도 문자열을 숫자로 바꾸려면

Integer.parseInt()나 Double.parseDouble() 을 쓰면되고, 문자에 ""을 더하면 문자열로 변환되는 것 정도?

 

char-short은 범위가 다르기 때문에 (char은 음수를 표현할 수 없다) 자동 형변환이 일어나지 않는다.


변수가 꽤 길고 이전에 배우지는 못했던 변수 저장, 비트 이런 것도 같이 배워보느라 시간이 꽤 걸린 것 같다. 물론 백준하다가 책을 하나도 안 읽은 날도 있었고.

 

암튼 변수부분은 이제 끝

복습용도로 몇 번만 더 읽어보면 될 듯하다.

'언어공부 > Java | Kotlin' 카테고리의 다른 글

[CS] 자바의 정석 독서 #6 - 객체지향 프로그래밍, OOP란 무엇인가?  (0) 2025.09.24
[CS] 자바의 정석 독서 #5 - 연산자  (0) 2025.09.22
[CS] 자바의 정석 독서 #3 - float, double, 부동소수점, 그리고 오차  (0) 2025.09.20
인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 후기  (0) 2025.09.20
[CS] 자바의정석 독서 #2 - 포매팅  (0) 2025.09.18
'언어공부/Java | Kotlin' 카테고리의 다른 글
  • [CS] 자바의 정석 독서 #6 - 객체지향 프로그래밍, OOP란 무엇인가?
  • [CS] 자바의 정석 독서 #5 - 연산자
  • [CS] 자바의 정석 독서 #3 - float, double, 부동소수점, 그리고 오차
  • 인프런 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 후기
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59)
        • JVM (12)
        • 백엔드 (20)
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

    • 컬러잇 개발블로그
  • 공지사항

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
[CS] 자바의 정석 독서 #4 - 형변환
상단으로

티스토리툴바