작성
·
96
0
[질문 내용]
2147483647이 int 타입의 최고값이라고 설명하는 부분에서
long maxIntValue = 2147483647; 이라고 long 타입으로 maxIntValue변수에 값을 초기화하였는데요.
여기서 2147483647을 제가 예시로 int intValue = 2147483647; 라고 초기화를 하면 정상적으로 오류없이 되는데
문제는 maxIntValue를 intValue에 저장할 때 왜 형변환을 해야 하는지 잘 모르겠습니다.
정상적으로 intValue에 2147483647값을 초기화를 했을때는 문제없이 잘 되는데, 어짜피 maxIntValue가 long타입으로 int보다 크고, 애초에 2147483647값이 int의 값 범위 안에 충분히 들어오는 값인데도 불구하고, 저장된 maxIntValue를 intValue안에 넣으면 당연히 정상일 텐데 왜 형변환을 해야 하는지 궁금합니다.
답변 2
0
아쉽게도 컴퓨터가 10진법이 아닌 이진법으로 계산하는 녀석이기 때문에 가능한 일이라 생각합니다. 그대로 뚝 떼서 옮겨도 문제 없는데 형변환 표시를 강제적으로 해야하나 하는 생각이 들 수 있지만 long형태와 int 형태에서 자료를 저장하기 위해 필요한 비트 수 자체가 다릅니다.
인텔리제이 같이 작업환경 내에서 컴파일하기 전에 문제가 있을 부분을 지적해서 이를 대비할 수 있는 것이지 실제 자바 컴파일러가 컴파일 하기 전부터 상황을 전부 알고 융통성있게 행동하지 않기 떄문이라고 생각합니다.
똑같은 양의 물이지만 큰 그릇에서 작은 그릇으로 온전히 옮기려 할 때 깔대기를 쓰는 것 처럼, 일종의 보증이라 생각해도 괜찮다고 생각합니다. 작은 그릇에서 큰 그릇으로 담는 것은 문제가 될 일이 없지만(묵시적 형변환), 큰 그릇에서 작은 그릇으로 담을 때 작은 그릇의 담긴 액체가 넘치지 않는다는 보장은 못하지 않습니까.(명시적 형변환)
0
안녕하세요, 인프런 AI 인턴입니다. soojinkimss님.
질문 주신 내용은 자바의 형변환과 관련된 주제로, long 타입과 int 타입 간의 관계를 이해하기 위해 중요한 내용입니다.
2147483647
은 int 타입의 최대 값이며, 이 범위 내의 값은 int 타입으로도 문제없이 사용 가능합니다. 질문에서 언급하신 부분에서 long 타입으로 변경한 이유는, long 타입의 변수가 int 타입보다 더 넓은 범위를 다룰 수 있기 때문입니다. 예를 들어, long maxIntValue = 2147483647;
은 문제가 없으나, long 타입은 64비트이며 int 타입은 32비트로 더 작은 저장소를 가지고 있습니다.
따라서 long 타입의 변수를 int 타입으로 변환하려면, 자바에서는 명시적인 형변환(casting)을 통해 데이터 손실이 발생할 수 있음을 의도적으로 체크하도록 요구합니다. 이로 인해 다음과 같은 코드에서 형변환이 필요합니다:
intValue = (int) maxIntValue; // 형변환
형변환을 요구하는 이유는, long 타입의 데이터가 int 타입으로 변환될 때 정보 손실이 발생할 가능성이 있기 때문에, 프로그래머가 이를 명시적으로 검토하도록 하기 위함입니다.
이전에 유사한 질문이 있었습니다. 관련 답변을 추가로 확인하고 싶으시다면 아래 링크를 참고해 주세요:
- 형변환에서 발생하는 문제와 해결 방법
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
제 말 뜻은 어쨌든 2147483647값이 int 의 값 범위에 속하는데 maxIntValue의 값이 int범위안에속하는 숫자 값인데도 불구하고 자동 형 변환으로 대입이 되어야 하는 식이 빨간 줄로 오류가 뜨고 명시적 형 변환을 하니 오류가 없어지는 겁니다. 답변해주신 말처럼 long타입이 64비트로 저장되어 있으니 int타입이 저장소가 32비트라서 int타입의 값 범위에 속하는 숫자더라도, int타입의 변수에 값을 넣으려면 형 변환을 꼭 해야 한다고 이해하면 될까요?
쉬운 설명 감사합니다. 덕분에 이해가 좀 되네요~bb