오버 플로우란?

해당 타입의 범위를 넘어서는 것을 오버플로우라고 한다.

오버플로우는 에러가 발생하지 않지만 예상과 다른 결과가 나온다.

 

정수형

정수형의 저장 형식과 범위

저장 형식

  • S : 부호 비트 (양 : 0, 음: 1)
  • N : 타입의 크기(bit)

범위

  • byte : -128 ~ 127 (2^7 ~ 2^7-1)
  • short : -32,768 ~ 32,767 (2^15 ~ 2^15-1)
  • int : - 2,147,483,648 ~ 0 ~ 2,147,483,647 (2^31 ~ 2^31-1)
  • long : -9,223,372,036,854,775,808 ~ 0 ~ 9,223,372,036,854,775,807 (2^63 ~ 2^63-1)

정수형의 선택 기준

  • JVM의 피연산자 스택(operand stack)이 피연산자를 4byte단위로 저장하기 때문에 int를 사용하는 것이 효율적이다.

정수형의 오버 플로우

2진수 1111 + 0001 = 10000이다.

하지만 2진수는 4bit를 범위로 가지고 있어서 0000이 된다.

반대로 0000 - 0001 = 9999이다.

 

즉, 최대값 + 1 = 최소값이 되고 최소값 - 1 = 최대값이 된다.

  부호 없는 정수 2진수 부호 있는 정수  
  0 0000 0  
  1 0001 1  
  2 0010 2  
  3 0011 3  
  4 0100 4  
  5 0101 5  
  6 0110 6  
  7 0111 7 오버 플로우 발생
  8 1000 -8
  9 1001 -7  
  10 1010 -6  
  11 1011 -5  
  12 1100 -4  
  13 1101 -3  
  14 1110 -2  
오버 플로우 발생 16 1111 -1  
0 0000 0  
  1 0001 1  
  2 0010 2  
  • 부호 없는 정수 -> char 0 ~ 65,535
  • 부호 있는 정수 -> short -32,768 ~ 32,767

실수형의 저장 형식과 범위

저장 형식

  • S (Sign) : 부호
  • E (Exponent) : 지수
  • M (Mantissa) : 가수

float

  • 저장 형식 : S(1) + E(8) + M(23) = 32bit (8byte)
  • 범위 : 1.4E-45 ~ 3.4E38

double

  • 저장 형식 : S(1) + E(11) + M(52) = 64bit (16byte)
  • 범위 : 4.9E-324 ~ 1.8E308

실수형의 오버 플로우, 언더 플로우

  • 오버 플로우 : 무한대 (infinity)
  • 언더 플로우 : 양의 최소값보다 작은 값으로 0이 된다.

'개발 언어 > Java' 카테고리의 다른 글

[Java] 형변환  (0) 2021.08.18
[Java] 실수형의 소수점 표현 방식과 BigDecimal  (0) 2021.08.13
[Java] 상수와 리터럴  (0) 2021.08.11
[Java] 기본형과 참조형  (0) 2021.08.11
[Java] 명명 규칙  (0) 2021.08.11

상수

선언 방법

  • 상수는 final을 이용하여 변수를 선언한다.
  • final을 사용하면 값을 변경할 수 없다.
  • final 앞에 static을 붙여 클래스가 로드될 때 미리 생성해둔다.
  • 여러 단어로 되어 있는 상수는 단어 사이에 _(underbar)로 구분한다.
private static final MIN_SPEED = 1;

클래스 선언

  • 클래스 내부의 값은 변경할수 있다.
class Sample {
	public int num = 0;
 	...
}

private static Sample sp = new Sample();

sp = new Sample(); // final로 선언된 변수 변경 불가
sp.num = 10; // 클래스의 변수 변경 가능

리터럴

  • 리터럴은 변하지 않는 직접 입력된 데이터, 즉시 값(immediate value)이라고 한다.
  • 아래의 예시와 같이 100L, 1.5F, 1.5D와 같은 값을 리터럴이라고 한다.
Long l = 100L;
Float f = 1.5F;
Double d = 1.5D;
String s = "가";
char c = 'A';
boolean b = true;

리터럴 접미사

  • Long : L 또는 l
  • Float : F 또는 f
  • Double : D 또는 d (생략 가능)

기본형 (Primitive Type)

종류 자료형 범위 bit byte
논리형 boolean false, true 8 1
문자형 char \ u0000 ~ \ uffff (0~216 - 1) 16 2
정수형 long -9,223,372,036,854,775,808 ~ 0 ~ 9,223,372,036,854,775,807 64 8
int - 2,147,483,648 ~ 0 ~ 2,147,483,647 32 4
short -32,768 ~ 0 ~ 32,767 16 2
byte -128 ~ 0 ~ 127 8 1
실수형 double 4.9E-324 ~ 1.8E308 64 8
float 1.4E-45 ~ 3.4E38 32 4
  • 논리형 : boolean을 제외한 나머지 7개의 기본형은 서로 연산이 가능하다. 1bit로 충분하지만 자바는 최소 단위가 1byte이다.
  • 문자형 : 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 다르지 않으며 정수형, 실수형과 연산이 가능하다. 컴퓨터는 숫자 밖에 모르기 때문에 모든 데이터를 숫자로 변환하여 저장한다.
  • 정수형 : CPU가 가장 효율적으로 처리할 수 있는 타입이며 메모리 절약 시 byte, short를 사용한다.
  • 실수형 : 소수 점을 표현하며 각 자료형마다 소숫점의 자리 수와 오차가 다르다.

실수형의 정밀도

자료형 정밀도 bit byte
float 7자리 32 4
double 15자리 64 8
  • 정밀도가 높을 수록 오차 범위가 줄어든다.

각 자료형의 범위

-2^n-1 ~ 2^n-1 - 1이며, n은 자료형의 bit 수이다.
int의 경우 bit가 4byte * 8bit = 32bit라서 -2^31 ~ 2^31 - 1이다.

 

참조형 (Reference Type)

  • 참조형은 객체의 메모리 주소를 저장한다.
  • 참조형은 객체의 종류에 의해 구분되므로 타입이라 칭한다.
  • String, Integer, Boolean, List 등 클래스가 참조형 타입니다.
Date date = new Date();
Sample sp = new Sample();
  • 참조형 변수는 객체의 메모리 주소를 참조한다. ex) date, sp
  • 객체에 사용된 클래스를 객체의 타입이라고 한다. ex) Date, Sample

래퍼 클래스 (Wrapper Class)

  • 기본형의 8가지 자료형을 객체로 사용하기 위한 클래스
기본형 (Primitive Type) 래퍼 클래스 (Wrapper Class)
boolean Boolean
char Character
long Long
int Integer
short Short
byte Byte
double Double
float Float
  • char, int형을 제외하고 나머지 자료형은 각 자료형의 첫 글자를 대문자로 바꾸면 클래스가 된다.

래퍼 클래스 (Wrapper Class) 상속 관계도

  • Boolean, Character 클래스를 제외한 래퍼 클래스는 Number라는 상위 클래스와 상속 관계에 있다.

Boxing과 UnBoxing

  • JDK 1.5 이전에는 기본형과 래퍼 클래스 간 연산이 불가능하였다.
  • 현재는 컴파일러가 intValue와 같은 메서드를 붙여 기본형과 래퍼 클래스 간의 연산이 가능해졌다.
// JDK 1.5 이전

int i = 5;
Interger j = 5;
i+j; //에러 발생

//JDK 1.5 이후
int i = 5;
Integer j = 5;
i+j.intValue(); //intValue()로 자료형 int를 받아 연상

Boxing & UnBoxing

  • Boxing : 기본형을 래퍼 클래스로 변환하는 것을 의미한다.
  • UnBoxing :
  • 래퍼 클래스를 기본형으로 변환하는 것을 의미한다.
Integer i = new Integer(100); // Boxing
int j = i.intValue(); // UnBoxing

Auto Boxing & Auto UnBoxing

Integer i = 17; // Auto Boxing
int j = i; // Auto UnBoxing

Boxing & UnBoxing Compile 비교

// 컴파일 전
Integer int = (Integer) x;
Object o = (Object) x;
Long l = 100L;


// 컴파일 후
Integer int = Integer.valueOf(x);
Object o = (Object) Integer.valueOf(x);
Long l = new Long(100L);

기본형과 참조형의 비교

Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
int num3 = 100;

num1 == num2; // 참조형과 참조형 비교 false

num1 == num3; // 참조형과 기본형 비교 true
num1.equals(num3) // equals를 이용한 참조형과 기본형 비교 true;

클래스, 인터페이스

  • 첫 글자는 항상 대문자로 한다.
  • 주로 명사로 명명한다.
  • 여러 단어로 이루어진 이름일 경우 단어의 첫 글자를 대문자로 한다. (Pascal Case)
    class ClassName
    interface InterfaceName​

메서드

  • 첫 글자는 항상 소문자로 한다.
  • 주로 동사로 명명한다.
  • 여러 단어로 이루어진 이름일 경우 단어의 첫 글자를 대문자로 한다. (Camel Case)
    public int get() {
    	...
    }
    
    public boolean set(int n) {
    	...
    }
    
    public String findName() {
    	...
    }
    
    public int getBackNumber(String name) {
    	...
    }
  • 생성자의 경우 첫 글자를 대문자로 한다. (Pascal Case)
    class ClassName {
    
    	public ClassName() {
        	...
        }
        
    }​

변수

  • 첫 글자는 항상 소문자로 한다.
  • 한 글자로 된 변수는 지양한다.
  • 변수에 약어를 사용하지 않고 충분한 사용 의미를 담는다.
  • 여러 단어로 이루어진 이름일 경우 단어의 첫글자를 대문자로 한다. (Camel Case)
    private int number = 0;
    private String userName = "이름";
    private boolean isSuccess = true;​

패키지

  • 모든 패키지 명은 소문자로 한다.
    com.sample.package.router
    com.sample.package.handler
    com.sample.package.service​

상수

  • 모든 글자를 대문자로 한다.
  • 여러 단어로 이루어진 이름일 경우 _(underbar)로 구분한다. (Snake Case)
    private static final int MAX;
    private static final int MIN;
    private static final int MAX_VALUE;
    private static final int MIN_VALUE;​

+ Recent posts