변수가 저장되는 공간의 특성, 자료형
변수와 메모리
- 변수는 컴퓨터 내부의 메모리 공간에 저장됩니다.
- 메모리는 프로그램이 실행되는 작업 공간입니다.
- 예를 들어 int level; 문장을 선언하면 메모리에 4바이트(int 형)크기의 공간이 level이라는 이름으로 할당됩니다. 앞으로 이 메모리를 변수 level로 사용하겠다는 뜻 입니다.
- 즉, 변수를 선언한다는 것은 선언한 변수의 이름으로 어떤 위치에 있는 메모리를 얼마만큼의 크기로 사용하겠다는 뜻입니다.
기본 자료형의 종류
- 자바에서 제공하는 저료형은 기본 자료형과 참조 자료형이 있습니다.
- 기본 자료형은 자바 라이브러리에서 기본으로 제공하며. 얼마만큼의 메모리를 어떻게 사용할 것인지가 이미 정해져 있습니다.
- 기본 자료형은 각 자료형이 사용할 공간의 크기, 즉 바이트 수가 정해져 있습니다.
정수형문자형실수형논리형
1바이트 | byte | boolean | ||
2바이트 | short | char | ||
4바이트 | int | float | ||
8바이트 | long | double |
정수 자료형
- 정수 자료형은 양수, 음수, 0을 나타내는 데 사용하는 자료형입니다.
- byte형, short형, int형, long형 4가지 자료형으로 나타낼 수 있습니다. 각 자료형은 메모리에서 사용하는 바이트 수와 용도가 다릅니다.
- 컴퓨터 내부에서 모든 정보는 0과 1로 표현됩니다. 예를 들어 정수 자료형 중 가장 많이 사용하는 int형(4바이트, 32비트)에 10진수 10을 저장한다면 다음과 같습니다.
- 부호가 있는 수를 표현할 때 맨 앞의 비트는 부호를 나타냅니다.
- 부호 비트가 0이면 양수, 1이면 음수 입니다. 위에서 10은 양수이므로 맨 앞의 비트 값이 0입니다. int는 4바이트이므로 나타낼 수 있는 수의 범위는 맨 앞의 부호비트를 제외하고 생각하면 -2^31~2^31-1입니다. 0은 모든 비트가 0이므로 양수의 범위는 0을 뺀 2^31-1까지 되는 것입니다.
정수자료형이 표현할 수 있는 수의 유효범위
자료형바이트 크기수의 범위
byte | 1 | -2^7~2^7-1 |
short | 2 | -2^15~2^15-1 |
int | 4 | -2^31~2^31-1 |
long | 8 | -2^63~2^63-1 |
byte형
1바이트는 8비트 입니다. 바이트 단위의 정보를 저장하거나 통신할 때 주로 사용합니다.
short형
2바이트로 정수를 표현하는 자료형입니다.
int형
- 정수를 표현할 때 가장 많이 사용하는 자료형입니다.
- 정수 자료형에서 int형을 가장 많이 사용하는 이유는 컴픁너에서 정수 연산을 할 때 4바이트 단위로 처리하는 것이 가장 효율적이기 때문이다.
자바에서는 연산을 할떄 정수형은 int, 실수형은 double를 기본 단위로 사용한 후에 선언된 자료형에 맞게 형변환을 한다. 따라서 형변환이 발생하지 않는 int와 double이 가장 효율적인 자료형이다.
long형
- 자바에서 정수를 표현하는 가장 큰 단위의 자료형 입니다.
- int 형을 넘어서는 정수를 사용할 때 long형을 사용합니다. 그런데 long형을 사용할 때는 주의점이 있습니다.
int num1 = 12345678900;
long num2 = 12345678900;
- 위와 같이 선언하면 두 문장이 모두 오류가 납니다. 첫 번째 문장은 int형으로 표현할 수 있는 범위를 넘어섰기 때문에 오류가 발생합니다.
- 두번째 문장역시 오류가 발생하는데 자바에서는 모든 정수 값을 기본으로 int형으로 처리하기 때문입니다. 즉, 숫자 12345678900을 int로 처리하기 때문입니다.
- 이런 경우는 이 숫자를 long형으로 처리하라고 컴파일러에게 알려주어야 합니다. 그러기 위해서는 long형을 나타내는 식별자인 L이나 l을 사용하려는 숫자 뒤에 붙입니다.
long num2 = 12345678900L;
문자 자료형
- 컴퓨터는 0과 1로만 표현할 수 있다고 했으므로 문자역시 컴퓨터 내부에서 표현할 때 0과 1의 조합으로 나타내야 합니다.
- 따라서 어떤 문자를 컴퓨터 내부에서 표현하려면 정수 값으로 정하고자 약속합니ㅏㄷ.
- 예를 들어 A를 얼마로 표현할 것인지 약속하는데, 이런 코드 값을 모아 둔 것을 문자세트라고 하고 문자를 정해진 코드 값으로 변환하는 것을 문자 인코딩(encoding)이라고 합니다.
- 반대로 코드 값을 다시 문자로 변환하는 것을 **문자 디코딩(decoding)**이라고 합니다.
- 가장 기본이 되는 문자인코딩은 아스키(ASCII)코드 입니다. 아스키 코드는 영문자, 숫자, 특수 문자 등을 나타내는 문자 세트 입니다. 영문자는 대문자, 소문자, 특수문자, 기호를 포함해도 1바이트(2^8 = 256개)로 표현할 수 있기 때문에 아스키 코드는 1바이트만 사용합니다. 하지만 한글 등 다른 언어 문자는 복잡하고 다양하기 때문에 1바이트만으로 모든 문자를 표현하기 어렵습니다. 그래서 2바이트 이상을 사용하게 되었는데, 이때 각 언어의 표준인코딩을 정의해 놓은 것이 '유니코드(unicode)'입니다. 유니코드의 1바이트는 아스키 코드 값과 호환되고, 그 밖의 문자를 2바이트나 그 이상의 조합으로 표현합니다.
- 자바는 유니코드에 기반하여 문자를 표현하기 때문에, 자바의 문자 자료형인 char형은 2바이트를 사용합니다.
- 문자형 변수는 다음과 같이 선언합니다.
char alphabet = 'A';
package selfstudy;
public class Tstory2 {
public static void main(String[] args) {
char alphabet1 = 'A';
System.out.println(alphabet1); // 문자 출력
System.out.println((int)alphabet1); // 문자에 해당하는 정수 값(아스키 코드 값)출력
char alphabet2 = 66; // 정수값 대입
System.out.println(alphabet2); // 정수 값에 해당하는 문자 출력
int alphabet3 = 67;
System.out.println(alphabet3); // 문자 정수 값 출력
System.out.println((char)alphabet3); // 정수 값에 해당하는 문자 출력
}
}
실행결과
A
65
B
67
C
- 프로그램에서 문자를 사용할 때는 항상 **작은따옴표('')**를 사용합니다.
- 문자를 여러 개 이은 문자열을 사용할 때는 **큰 따옴표("")**를 사용합니다. 문자열은 "Hello"처럼 여러 문자를 큰 따옴표로 감싸 표현하고 기본자료형으로는 표현할 수 없습니다.
- 자바에서 문자열을 다룰 때 String 클래스를 사용합니다.
package selfstudy;
public class Tstory3 {
public static void main(String[] args) {
char kor1 = '한';
char kor2 = '\uD55C';
System.out.println(kor1);
System.out.println(kor2);
}
}
실행결과
한
한
문자형 변수에 숫자를 저장한다면
- char형은 문자 자료형이지만 다른 자료형과 마찬가지로 컴퓨터 내부에서는 정수 값으로 표현되기 때문에 정수 자료형으로 분류하는 경우도 있습니다.
- 다른 정수 자료형과 차이점은 char형은 음수값을 표현할 수 없다는 것입니다.
package selfstudy;
public class Tstory4 {
public static void main(String[] args) {
int a = 70;
int b = -70; // 문자형 변수에 음수를 넣으면 오류
char a2 = 70;
System.out.println((char)a);
System.out.println((char)b);
System.out.println(a2);
}
}
실행결과
F
? // 문자형 변수에 음수를 넣으면 오류
F
자바의 기본 인코딩 방식은 모든 문자를 2바이트로 표현하는 UTF-16입니다.
실수 자료형
- 0과 1 사이에는 무한개의 실수가 있습니다. 이 무한개의 실수를 모두 표현하는 데 정수를 표현하는 방식은 한계가 있습니다.
- 컴퓨터에서는 실수는 정수와는 조금 다른 방식으로 표현해야 합니다.
부동소수점 방식
실수값 0.1은 1.0*10^-1으로도 표현할 수 있습니다. 이처럼 가수부분(1.0)과 지수부분(-1)을 나누어서 실수를 나타내는 방식을 부동 소수점 방식이라고 합니다. 이 방식을 사용하면 더 많은 실수를 좀 더 세밀하게 표현할 수 있습니다.
float형과 double형
- 실수 자료형에는 float형과 double 형이 있습니다.
- float형은 부호 1비트, 지수부 8비트, 가수부 23비트로 총 32비트(4바이트)를 사욜합니다.
- double형은 부호1비트, 지수부 11비트, 가수부 52비트로 총 64비트(8바이트)를 사용합니다.
- 자바에서 실수는 double형을 기본으로 사용합니다. float형(4바이트)에 비해 double형(8바이트)이 더 정밀하게 실수를 표현할 수 있습니다.
package selfstudy;
public class Tstory5 {
public static void main(String[] args) {
double d = 3.14;
float f = 3.14F; // 식별자 F 추가
System.out.println(d);
System.out.println(f);
}
}
실행결과
3.14
3.14
- float로 대입되는 값 3.14는 double형이 아닌 float형 값이 대입된다는 의미로 F또는 f를 숫자 뒤에 붙여서 식별해주어야 합니다.
부동 소점 방식의 오류
지수와 가수부로 나태내는 부동 소수점 방식은 지수로 표현되는 값이 0을 나타낼 수 없습니다. 따라서 부동 소수점 값을 연산하면 약간의 오차가 발생할 수 있습니다.
package selfstudy;
public class Tstory6 {
public static void main(String[] args) {
double d = 1;
for(int i = 0; i < 10000; i++) {
d = d + 0.1;
}
System.out.println(d);
}
}
실행결과
1001.000000000159
- 약간의 오차를 감수하고더라도 더 넓은 범위의 실수 값을 표현하기 위해 부동 소수점 방식을 사용합니다.
논리자료형
- 논리자료형은 어떤 변수의 참, 거짓의 값을 나타내는 데 사용합니다.
- 종류는 boolean 한 가지 뿐입니다.
- boolean형 변수는 1바이트로 값을 저장하며, true(참), false(거짓) 두 가지 값만 가집니다.
boolean a;
package selfstudy;
public class Tstory7 {
public static void main(String[] args) {
boolean a = true; // boolean 변수를 선언하고 초기화
System.out.println(a);
}
}
실행결과
true
댓글