날아라쩡글이의 블로그입니다.

데이터 타입(오버플로우, 언더플로우) 본문

java (학원 전) story

데이터 타입(오버플로우, 언더플로우)

날아라쩡글이 2021. 8. 2. 16:00
반응형

자료형 ( Data Type )
자료형이란 해당 변수 혹은 상수 공간에 어떤 종류의 값이 저장될 수 있는 지를 지정한다. 
데이터 타입에는 크게 기본형과 참조형 데이터타입이 있다.
기본형 데이터타입(primitive data type): 해당 공간에 2진법으로 변환된 값이 곧장 저장이 된다. 
참조형 데이터타입(reference data type): 실제 값은 다른 곳에 저장이 되고, 그 다른 공간의 주소값이 
            해당 변수/상수에 저장되서, 실제 값을 확인 혹은 변경할려면 그 주소값을'참조'해야한다.
기본형 데이터타입 01
정수형 데이터타입 
정수란 소숫점이 존재하지 않는 온전한 숫자를 우리가 정수라고 한다. 
자바에서는 기본형 데이터타입 중 정수형 데이터타입이 4가지가 있는데 
byte : 8bit .-128(-2의7승)~ 127(2의 7승-1)까지 
short : 16bit -32768(-2의 15승 )~ 32767(2의 15승-1)까지 
int : 32bit 약 -21억(-2147483648(-2의 31승))~21억(2147483647(2의 31승-1))까지
long : 64bit -2의 63승 ~ 2의 63승-1까지
bit : 이진법의 몇번째 숫자인지를 의미함
2의 7승에서 -1의 경우 0까지 합쳐있기 때문이다.


정수형 데이터타입의 경우 숫자 표현이 신기하다. 
맨 왼쪽 자리가 0이면 +, 1이면 -를 뜻하게 된다. 
0000 0000 ->0
0111 1111 ->127
-128<-1
음의자리 1000 0000 ->-128 
1111 1111 ->-1 
127+1  =128 
111 1111 + 1 =1000 0000
byte기준으로는 
0111 1111 + 1 =1000 0000
127+1 = -128이되고 
1000 0000 - 1 =0111 0000
-128-1 =-129이가 됨
 0  127  -128  -1의 형태를 가짐 인덕션 마지막에 +1을 하면 -128값처럼 
최소값이 된다면 오버플로우가 되고 , 최소값에 -1을 하면 최대값인 127인 언더 플로우가 됨

 



그렇기 때문에 해당 데이터 타입이 표현가능한 최대값보다 더 큰 값이 저장되어 
음의 정수로 대표되는 부정확한 값으로 바뀌는 것은 overflow라고 부른다. 
반대로 표현 가능한 최소값 보다 더 작은 값이 저장되어, 부정확한 값으로 바뀌는 것을 underflow라고 부른다. 
부정확한 값 = 너무큰숫자를 넣게 되면 (10) 0000 0000 이될 수 있음.

그리고 컴퓨터의 자료 구조에 따르면 0000 0000 앞에 01과 같은 숫자가 더 붙어 있어

01 10의 형태에 따라서 음수와 양수의 형태를 보이는 것을 알 수 있다. 

 

 


public class Ex06Integer {
public static void main(String[]args) {
    //자바의 경우 우리가 코드에 적은 10진법 값을 자동으로 int로 인식하여 
    //해당 데이터타입의 공간에 넣을 수 있을지 체크하고 만약 범위를 벗어나면 자동으로 에러를 발생시킨다. 
    //byte 데이터타입의 변수 myByte를 선언해보자 
    byte myByte;
    //50의 숫자를 넣자 
    myByte = 50;//출력한다. 
    System.out.println(myByte);
    //myByte = 1000;//byte에 1천을 넣는다. 10진법 값은byte가 표현 가능한 범위를 벗어났기 때문에 자바에서 error가 생성된다.
    
    //따라서 자바에서는 우리가 정수형 데이터 타입이 필요할 경우 
    //기본적으로 int를 사용하고 혹시라도  +-20억을 벗어나는 경우에만 long 데이터 타입을 사용하는 것을 권장한다. 
    
}
}


기본형 데이터타입 02
실수형 데이터타입 
실수란 소숫점 이하의 숫자가 존재하는 숫자 
기본형 데이터타입의 실수를 담당하는 데이터 타입은 float 와 double이 2가지가 있다. 
float : 총 32비트의 실수 
double : 총 64비트의 실수 

 자바에서는 기본적으로 소스코드의 실수를 double로 인식한다. 
 따라서 우리도 실수형 데이터타입이 필요할 때에는 double로 쓰면 된다. 
public class Ex07RealNumber {
    public static void main(String[]args) {
        //double의 데이터타입의 변수 myDouble을 선언해보자
        double myDouble;
        //myDouble에 실수 3.14를 저장하자 
        myDouble = 3.14;//출력하자 
        System.out.println(myDouble);
        //myDouble에 5를 저장해보자 
        myDouble = 5;
        System.out.println(myDouble);
        //정수를 실수로 바꿀 때에는 간단하게 , .0만을 붙이면 된다. 실수형 공간에 정수 데이터 타입값을 저장할 수 있다. 
        //만약 myDouble의 값을 int로 변경하여 출력할 경우 error가 발생
        //데이터 손실이 일어나기 때문이다. 
        
        //float 타입의 변수 myFloat을 선언해보자. 
        float myFloat;
        //float 타입의 공간에 우리가 실수를 저장하려면 에러가 발생한다. 코드상의 실수는 데이터 타입이 double이기 때문에 
        //더 작은 공간에 저장하려고 하면 데이터 손실이 발생할 수 있기 때문이다. 
        //따라서, 우리가 해당 실수 값은 double데이터타입의 값이 아닌 float의 데이터값이라는 것을 적어주어야한다. 
        //이때 실수값뒤에 f를 붙여주면 된다 
        myFloat = 3.5f;
        System.out.println(myFloat);//출력한다. 
     
        
      
       
        
        
    }
}


기본형 데이터 타입 03 
문자형 데이터 타입 (Character)
기본형 데이터 타입중에서 문자를 담당하는 데이터 타입은  char 데이터타입이다. 
단,char 데이터타입은 사용이 극히 드문데 그 이유는 한번에 딱 한개의 글자만 저장 가능하기 때문이다. 
public class Ex08Character {
    public static void main(String[]args) {
        //char 데이터타입 변수 myChar를 선언해보자 
        char myChar = 'A';
        //myChar에 'A'를 저장하자 ,출력하자 
        System.out.println(myChar);
        //myChar 에 98을 저장하자 
        myChar = 98;//98이라는 숫자가 2진법으로 변경이 되고,일반 값과 아스키테이블 함께 가지고 있다.  
        System.out.println(myChar);
        //위의 코드는 전혀 문제가 없는 코드이다. 
        //왜냐하면 char은 기본형 데이터타입이기 때문에 
        //우리가 글자를 저장하더라도 실제로 저장되는 값은 2진법으로 변환된 값이기 때문이다. 
        //내부적으로는 아스키 테이블(ASCII 테이블)이라는 
        //특수한 문자표를 사용하여 글자와 해당글자의 숫자값을 준비해놓고 
        //그표의 값과 대조하여 일치하는 글자를 화면에 출력하게 되는 것 이다.
        //''VS ""
        //''은 char의 값을 뜻하고, 한번에 한개의 글자만 쓸 수 있다. 
        //myChar = 'abc'; 위코드는char 값인데도 불구하고 여러글자가 담겨있기 때문에 에러가 발생하는 것이다.

        //""은 String 데이터타입의 값을 뜻하며, String 데이터 타입은 여러개의 글자를 저장할 수 있기 때문에 
        //"ABC" 는 문제가 없는 코드지만, char공간에 String 값을 넣을 수는 없다.
        
        //String 데이터 타입은 기본형 데이터 타입은 아니지만 매우 흔하게 쓰는 데이터 타입으로써 다음과 같이 선언한다. 
        String str;//  참조형임
        // string 데이터타입의 공간에 값을 저장할 때에는 여러가지 방법이 존재하는데 가장 대표적인 방법은 
        //이름 = "값";이다.
        str = "abc";
        

예제 문제 풀기 1 

package day01;

//국어는 80점
//영어는 81점
//수학은 82점 
//평균이 81.0점이 나오도록 
// 이름,국어,영어, 수학, 평균에 맞는 변수를 만들어서
// 화면에 출력되는 프로그램을 작성해보시오 (5분)
public class Ex09GrandBook {
   public static void main(String[]args) {
       String str ="name";
   
       System.out.println(str);
       int korea = 80;
  
       System.out.println(korea);
       int english = 81;
      
       System.out.println(english);
       int math = 82;
      
       System.out.println(math);
 
      double  ave = (korea+english+math)/3;
       System.out.println(ave);
      
   }

}

반응형

'java (학원 전) story' 카테고리의 다른 글

형변환  (0) 2021.08.03
논리형 데이터 타입  (0) 2021.08.03
상수  (0) 2021.08.02
변수  (0) 2021.08.02
주석  (0) 2021.08.02
Comments