날아라쩡글이의 블로그입니다.
데이터 타입(오버플로우, 언더플로우) 본문
자료형 ( 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 |