[Java] 오버플로우, 언더플로우

윤지현·2022년 9월 4일
0

Java

목록 보기
2/2
post-thumbnail

✍ 자바에서의 변수 자료형(Data Type)

1. Overflow와 Underflow 사전적 정의

  • Overflow (오버플로우) : 메모리의 표현 범위에서 벗어난 수의 값을 저장하는 경우
  • Underflow (언더플로우) : 메모리가 표현할 수 있는 수보다 적은 수의 값을 저장하는 경우

Java에서는 변수의 Type을 꼭 지정해 주어야 합니다. 자동으로 변수 타입을 지정하는 Python 과는 차이가 있죠.

Python은 대표적인 '동적언어'로 런타임 시 자동으로 변수의 타입이 지정됩니다. 그렇기 때문에 변수를 선언할 때, 함수가 매개변수를 받을 때에 자료형을 따로 지정하지 않습니다.

반면 Java는 '정적언어'로 컴파일할 때 변수의 타입이 결정되기 때문에, 변수를 선언할 때에는 자료형을 별도로 지정해주어야 합니다. Java 외에도 C언어 또한 변수 타입을 지정해주어야 하는 정적언어입니다.

이처럼 정적언어에서의 자료형은 데이터를 표현할 수 있는 범위가 정해져 있습니다. 따라서 변수 범위 밖으로 넘어가게 되면 예상치 못한 값들이 반환됩니다. 이 현상이 바로 Overflow와 Underflow 입니다.

Overflow 또는 Underflow가 발생하면 최상위 비트, 최하위 비트를 벗어난 데이터가 인접 비트를 덮어쓰는 잘못된 결과를 얻을 수 있습니다.

2. 기본 Type (primitive type)

'타입'은 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 합니다.

자바에서는 여러 형태의 타입을 미리 정의하여 제공하고 있는데, 이것을 기본 타입(primitive type)이라고 합니다.

자바의 기본 타입에는 대표적으로는 정수형, 실수형, 문자형 그리고 논리형 타입이 있습니다.

1) 정수형 타입

  1. byte
  2. short
  3. int (기본)
  4. long

자바에서 가장 기본이 되는 정수형 타입은 int형입니다. 따라서 컴퓨터는 내부적으로 정수형 중에서도 int형의 데이터를 가장 빠르게 처리합니다.

정수형 데이터의 타입을 결정할 때에는 반드시 자신이 사용할 데이터의 최대 크기를 고려해야 합니다.

2) 실수형 타입

자바의 실수형 타입의 기본 타입에는 2가지가 있습니다.

과거에는 실수를 표현할 때 float형을 많이 사용했지만, 하드웨어가 발달하여 메모리 공간이 증가된 현재에는 double형이 가장 많이 사용되는 기본형이 되었습니다.

  1. float
  2. double (기본)

실수형 데이터의 타입을 결정할 때에는 표현 범위 이외에도 반드시 유효 자릿수를 고려해야 합니다.

컴퓨터에서는 실수를 표현하는 방식에 오차가 발생할 수 밖에 없는 태생적인 한계를 지니고 있기 때문입니다. 이러한 실수형 데이터의 오차는 자바뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통적인 문제입니다.

float floatNum = 1.23f; // 소수점 인식을 위해 'f' 기입 필요
System.out.println("floatNum = " + floatNum);
// Result: floatNum = 1.23
// ['f' 미입력 _ 오류] java: incompatible types: possible lossy conversion from double to float

double doubleNum = 1.23; // double은 별도 'f' 입력 필요 없음
System.out.println("doubleNum = " + doubleNum);
// Result: doubleNum = 1.23

System.out.println(Float.MAX_VALUE);  
// Result: 3.4028235E38 (=3.4028235 * 10^38)

System.out.println(Double.MAX_VALUE); 
// Result: 1.7976931348623157E308 (=1.7976931348623157 * 10^308)

3) 문자형 타입

  1. char

컴퓨터는 2진수밖에 인식하지 못하므로 문자도 숫자로 표현해야 인식할 수 있습니다.

자바에서는 유니코드(unicode)를 사용하여 문자를 표현합니다.

C언어와 C++에서는 아스키코드(ASCII)를 사용하여 문자를 표현합니다. 아스키코드(ASCII)는 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식입니다.
아스키코드는 문자 하나를 7비트로 표현하여 총 128개의 문자를 표현할 수 있습니다.

아스키코드는 영문자와 숫자밖에 표현 못 하지만, 유니코드는 각 나라의 모든 언어를 표현할 수 있습니다. 유니코드는 문자 하나를 16비트로 표현하여 총 65,536개의 문자를 표현할 수 있습니다.

4) 논리형 타입

  1. boolean

논리형은 참(true)이나 거짓(false) 중 한 가지 값만을 가질 수 있는 Boolean type을 의미합니다.

Boolean형의 기본값은 'false' 이며, 기본 타입 중 가장 작은 크기인 1바이트의 크기를 가집니다.

출처

jangThang. "오버플로우(Overflow)와 언더플로우(underflow)", 7 Apr. 2016, https://blog.naver.com/star7sss/220676519181

ssung.k. "[python] Type Hints, python에 타입을 지정한다?", 20 Jun. 2021, https://ssungkang.tistory.com/entry/python-Type-Hints

코딩교육 티씨피스쿨.
http://www.tcpschool.com/java/java_datatype_basic

profile
Welcome to Multi-Player's Life :-)

0개의 댓글