Hesitater 2021. 9. 2. 17:55
728x90

2.2 데이터타입

모든 변수에는 타입(type : 형) 이 있으며 ,타입에 따라 저장할 수 있는 값의 종류와 범위가 달라진다.
변수를 선언할 떄 주어진 타입은 변수를 사용하는 도중에 변경할 수 없다. 따라서 변수를 선언할 때 어떤 타입을 사용할지 고려해야한다.

2.2.1기본(원시:primitive) 타입

( 8bit = 1byte 이고 타입()안에 수는 byte의미 ex)int(4byte)
기본(원시) 타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 만한다
정수타입: byte(1),char(2),short(2),int(4),long(8)
실수타입: float(4), double(8)
논리타입 : boolean(1)
데이터 범위는 정확히는 몰라도 그냥 어느정도 인지까지만 생각하고
8bit = 1byte 니깐 bit로도 알 수 있다.

메모리에는 0과 1을 젖아하는 최소 기억 단위인 비트(bit)가 있다. 그리고 8개의 비트를 묶어서 바이트(byte)라고 한다.
기본 타입은 정해진 메모리 사용 크기( 바이트크기) 로 값을 저장하는데 바이트 크기가 클수록 표현하는 값의 범위가 크다. 각 타입에 저장되는 값의 범위를 정확히 외울필요는없음
메모리 사용 크기 정도는 알야야함.

2.2.2 정수 타입( byte, char, short , int, long)

정수타입 byte char short int long
바이트수 1 2 2 4 8

자바는 기본적으로 정수 연산을 int 타입으로 수행한다. 그렇기 떄문에 저장하려는 값이 정수 리터럴 이라면 특별한 이유가 없는 한 int타입 변수에 저장하는 것이 좋다.
byte와 short이 int보다는 메모리 사용 크기가 작아서 메모리를 절약할 수는 있지만, 값의 범위가 작은 편이라서 연산 시에 범위를 초과하면 잘못된 결과를 얻기쉽다

byte, char, short, int, long 자세한것은 책을 참조한다.

byte타입은 정수 타입 중에서 가장 작은 범은 범위의 수를 저장함
-128 ~ 127 ( -2^7 ~ 2^7-1) 양수가 2^7-1인 이유는 0이 포함되기 때문이다

각자 타입 변수에 초과하는값이 들어갈 경우 컴파일 에러발생
ex) Type mismatch" cannot convert from int to byte)발생

정수값 저장범위는 생략

예시로 확인

또한 정수 타입에서 저장할 수 있는 값의 범위를 초과해서 값이 저장될 경우 엉터리 값이 변수에 저장되는데
이러한 값을 쓰레기값이라고 한다. 개발자는 쓰레기값이 생기지 않도록 주의해야 한다.

결과값

byte 변수는 127을 넘어서는 순간 최소값인 -128부터 다시 저장되는것이 보인다 int는 잘 나오네용

Char 타입

자바는 모든 문자를 유니코드(Unicode)로 처리한다. 유니코드는 세계 각국의 문자들을 코드값으로 매핑한 국제 표준 규약이다. 유니코드는 하나의 문자에 대해 하나으 ㅣ코드값을 부여하기때문에 영문'A' 및 한글 '가'도 하나의 코드값을 갖는다. 유니코드는 0~65535 범위의 2byte 크기를 가진 정수값이다. 0~127까지는 아스키(ASCII) 문자( 특수기호 및 영어 알파벳) 가 할당되어 있고, 44032~55203까지는 한글 11172자가 할당되어 있다. 유니코드를 저장하기 위해 2byte 크기인 char 타입을 제공한다. 유니코드는 음수가 없기 떄문에 char타입의 변수에는 움스 값을 저장할 수 없다. char 타입을 제공한다. 유니코드는 음수가 없기떄문에 char타입 변수에 작은따옴표(')로 감싼 문자를 대입하면 해당 문자으 ㅣ유니코드가 저장된다.

char 변수에 작은 따옴표(')로 감싼 문자가 아니라 직접 유니코드 정수값을 저장할 수도 있다. 특정 문자의 유니코드를 안다면 10진수 or 16진수로 저장하면 되는데, 예를들어 문자 A는 10진수로 65이고, 16진수로 0x41이므로 다음과 같이 char 변수에 저장할 수 있다.  16진수로 저장할 경우에는 유니코드라는 의미에서 '\u+16진수값' 형태로 값을 저장하면된다.  프로그램 코드에서 char 변수에 저장된 유니코드를 알고 싶다면 char 타입 변수를 int 타입 변수에 저장하면된다.

char c = 65;
char c= '\u0041';
char c = 'A';
int Unicode = c;

10진수 말구 2진수,16진수 .. 등등 잘 모르겠다면 세계 언어들이 코드값에 대응하여 값을 가지고 있고
그 값들을 코드로 작성할 수 있다. 라고 생각하자 각 대응하는 값들은 필요할때 참고하자

예시

결과값

 

문자열 저장은 String 타입을 사용해야합니다.

ex) String name = "김태희";
String은 기본 타입이 아니다. STring은 클래스 타입이고 String 변수는 참조 변수이다. 
참조변수..는 다음에 살펴보고.. 문자열을 String 변수에 대입하면 문자열이 변수에 직접 저장되는 것이 아니라, 
String 객체의 번지를 참조하게 된다. String에 대한 자세한건 참조타입에서 설명..
여기서는 문자열을 저장하기 위해 String 변수를 사용해야 한다 라는 것을 알아 두자
char 타입의 변수에 어떤 문자를 대입하지 않고 단순희 초기화를 할 목적으로는
작은따옴표(') 두개를 연달아 붙인 빈(emtpy) 문자를 대압하면 컴파일 에러가발생
그렇기 때문에 공백(유니코드:32) 하나를 포함해서 초기화해야한다.

char c = ''; // 컴파일 에러남 → char c= ' '; 이렇게 써야한다.

String변수는 큰 따옴표(") 두개를 연달아 붙인 빈 문자를 대입해도 괜춘
ex)   String str = "";

short 타입


short 타입은 2byte(16bit)로 표현되는 정수값을 저장할 수 있는 데이터 타입이다.
C언어와의 호환을 위해 사용되며 비교적 자바에서는 잘 사용 되지 않음
급한것이 아니라서 일단 패스..

int 타입

int 타입은 4byte(32bit)로 표현되는 정수값을 저장할 수있는 데이터 타입니다.
int 타입은 자바에서 정수 연산을 하기 위한 기본타입이다.
byte,short 타입의 연산은 int 타입으로변환된 후 연산되고 결과도 int 타입이 된다.
자바에서 정수 연산을 4 byte로 처리하기 떄문이다. 
일단 정수계산은 int 타입을 사용한다고 알아두자.
정수값을 직접 코드에서 입력할 경우 8진수,10진수,16진수로 표현 가능
8진수는 숫자앞에 '0'을 붙이면되고
16진수는 '0x'를 붙이면된다

예시
int number = 10;
int octNumber = 012;
int hexNumber = 0xA;

Int 예시

결과값

 

long 타입



long타입은 8byte(64bit) 로 표현되는 정수값을 저장할 수있는 데이터 타입이다.
수치가 큰 데이터를 다루는 프로그램에서는 long 타입이 필수적으로 사용됩니다.
예를들어 은행,우주,원소..에관련된 것들
long 타입의 변수를 초기화할 때에는 정수값 뒤에 소문자'l' or 대문자 'L'을 붙일 수 있다.
이것은 4byte 정수 데이터가 아니라 8byte 정수 데이터임을 컴파일러에게 알려주기 위한 것.
int타입의 저장범위를 넘어서는 큰 정수는 반드시 l or L 붙여야한다.
그렇지않으면 컴파일 에러가 납니다. 보통 대문자 L 을사용합니다

long 예시

결과값

2.2.3 실수타입( float, double)

실수 타입은 소수점이 있는 실수 데이터를 저장할 수 있는 타입으로
메모리 사용 크기에 따라 float(4byte) 와 double(8byte)가 있다.
책내용이 조금 복잡하다.
float에 비해 double가 약 2배의 자릿수가 배정되고
따라서 float 보다 double가 더 정밀한 값을 저장 할 수 있기 떄문에 높은 정밀도를 요구하는
계산에서는 double를 사용하며 자바에서는 실수 리터럴의 기본 타입을 double 로 간주.
실수 리터럴을 float 타입 변수에 그냥 저장할 수 없다.
실수 리터럴을 float 타입 변수에 저장하려면 리터럴 뒤에 소문자'f' or 대문자'F'를 붙여야한다.

예시
double var1 =3.14;
float var2 =3.14;  //컴파일 에러(Type mismatch : cannot convert from double to float)
float var3 = 3.14F;

예시
int var6 =3000000;  //3000000
double var7 =3e6;  //3000000
float var8 = 3e6f;  //3000000
double var9 = 2e-3;  // 0.002

float, double 예시

결과값

 

2.24 논리 타입(boolean)

boolean 타입은 1byte(8bit)로 표현되는 논리값(true/false) 을 저장할 수 있는 데이터 타입이다.
boolean 타입은 두 가지 상태값을 저장할 필요성이 있을 경우에 사용되며, 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 이용
아래 그림과 같이 stop변수에 true가 저장되어 있기 떄문에 if 블록을 실행해서 "멈춰!!" 가 출력된다.
만약 stop 변수에 false가 저장되어 있다면 else 블록이 실행되어 "시작합니다"를 출력한다

결과값

 

2.3 타입변환

타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.
ex) byte 타입을 int 타입으로 변환 or int 타입을 byte 타입으로 변환하는 행위
타입 변환은 자동(묵시적) 타입변환 , 강제(명시적) 타입변환이 있다.

 

2.3.1 자동 타입 변환

자동 타입 변환(Promotion)은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.
자동 타입 변환은 작은 크기를 가지고 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.

큰 크기 타입과 작은 크기 타입의 구분 사용하는 메모리 크기이다.
ex) byte(1byte) int(4byte) 이므로 int 타입이 더 큰 크기 타입 이다.

byte(1) < short(2) < int(4) < long(8) < float(4)  < double(8)

float은 4byte 크기인데 int(4byte)와 long(8byte) 보다 더 큰타입으로 표시했다.
그이유는 표현할 수 있는 값의범위가 float이 더 크기때문이다 (잘모르겠으면 일단 암기)

예시

결과값

 

자동 타입 변환 예시

결과값

 

2.3.2 강제 타입 변환

큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할 수 없다.
ex) int(4byte) -> byte(1byte)으로  담을 수 없다.
마치 큰 크릇의 물을 작은 그릇 안에 모두 넣을 수 없는 것 과 동일한 이치라고한다.
하지만 큰그릇을 작은 그릇 사이즐 ㅗ쪼개어서 한조각만 작은 그릇에 넣는다면 가능하다.
즉int 타입을 4개의 byte로 쪼갠 다음, 끝에 있는 1byte만 byte 타입 변수에 저장하는 것은 가능하다
이와 같이  강제적응로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 
강제 타입 변환(캐스팅 : Casting) 이라고 한다.
강제 타입 변환은 캐스팅 연산자() 를 사용하는데, 괄호 안에 들어가는 타입은 쪼개는단위임

예시

결과

 

강제 타입 변환 예시

결과값

 

강제 타입 변환에서 주의할 점은 사용자로부터 입력받은 값을 변환할 때 값의 손실이
발생하면 안된다는 것이다. 강제 타입 변환을 하기 전에 우선 안전하게 값이 보존될 수 있는지
검사하는것이 좋다 아래 예제는 byte 타입으로 변환하기 전에 변환될 값이 byte 타입으로 변환된 후에도
값의 손실이 발생하지 않는지 검사해서 올바른 타입 변환이 되도록한다.

예시

결과값

 

기본타입 최대값 상수 최소값 상수
byte Byte.MAX_VALUE BYTE.MIN_VALUE
short Short.MAX_VALUE Short.MIN_VALUE
int Interger.MAX_VALUE Interger.MIN_VALUE
logn Long.MAX_VALUE Long.MIN_VALUE
float Float.MAX_VALUE Float.MIN_VALUE
double Double.MAX_VALUE Double.MIN_VALUE

 

강제 타입 변환에서 또 다른 주의점이 있다. 정수 타입을 실수 타입으로 변환할 때 정밀도 손실을 피해야한다.
다음 예저를 보면 int 타입 변수 num1과 num2에 동일한 123456780 값을 저장시키고
num2를 float 타입으로 변환시킨 후, 다시 int 타입으로 변환해서 num2에 저장한다.
그리고 num1에서 num2를 뺸 결과를 변수 result에 저장하고 콘솔에 출력
동일한 값을 뺏기 때문에 당연히 0이 출력되는것이 맞다.

결과값

 

그러나 실행 결과를 보면 0이 안나온다. 이러한 결과가 나온이유는
int값을 float 타입으로 자동 변환하면서 문제가 발생했기 때문이다
비트 수가 할당되는것이 달라서... 라고 일단..그렇게 ...뭔가 다르다! 라고 생각하자..

// float : 부호(1비트) + 지수 (8비트) + 가수(23비트)
// double : 부호(1비트) + 지수(11비트) + 가수(52비트)

음.. 설명이 조금 복잡해서... 그냥 변환되는 과정에서 문제가 있다.. 라고 일단 ...

이 예시로 보면

 

2.3.3 연산식에서 자동 타입변환

연산은 기본적으로 같은ㅇ 타입의 피연산자(operand) 간에만 수행되기 때문에
서로 다른 타입의 피연산자가 있을경우 두 피연산자 중 크기가 큰타입으로 자동 변환된후 연산 수행한다.
자바는 정수 연산일 경우 int타입을 기본으로한다.
그이유는 피연산자를 4byte 단위로 저장하기 때문이다
음 조금 복잡하다고 생각되면
int(4byte)보다 작은 타입(byte,char,short)은 int 타입으로 변환된 후 연산이 수행됩니다.
int(4byte)보다 큰 타입(long,float,double)은  더 큰 타입으로 변환된 후 연산이 수행됩니다.

더 큰쪽으로 따라간다~!~!

걍 예시 때려박을꼐용..

결과값

 

대략적인...것

 

연산식에서 자동 타입 변환 예시

결과값

 

선생님께서 책 읽고 예시 한번씩 적어 보라고 하셨는데

예시를 적어 보는건 문제가 안되는데

생각이 짧아서 책 내용도 함께 써보겠다는건 말도 안되는건 아닌데 시간이 오래걸려서

예시 문제 와 뒤에 확인문제 풀면서 필요한 것들 위주로 쓰겠습니다..