안녕하세요. J4J입니다.
이번 포스팅은 자바의 자료형에 대해 적어보는 시간을 가져보려고 합니다.
우선 자료형에 대해 알기 전에 알고 있어야 될 개념들이 있습니다.
바로 상수, 변수, bit, byte에 대한 개념입니다.
상수란?
상수라는 것은 무엇일까요?
상수는 항상 일정하게 유지되는 값을 의미합니다.
아마 대부분의 사람들이 상수에 대한 개념을 인지하고 있을 것입니다.
왜냐하면 학교를 다니면서 수학시간에 들어 봤을거거든요.
변수란?
그럼 변수는 무엇일까요?
변수도 어느정도 개념을 인지하고 있을 것입니다.
왜냐하면 상수와 이유가 동일하거든요.
변수를 정의해보면 일정한 값을 가지지 않고 상황에 따라 변화되는 값이라 할 수 있습니다.
bit, byte
먼저 bit는 무엇일까요?
bit는 데이터를 나타내는 가장 작은 단위로 0과 1로만 표현됩니다.
0과 1로만 표현되는 것도 수학시간에 배운 기억이 있으실 것입니다.
바로 이진수가 생각나실거에요.
결과적으로 bit는 이진수를 의미한다고 말할 수 있습니다.
이번엔 bit와 byte의 관계에 대해서도 알아봅시다.
bit와 byte는 등호(=)를 사용하여 1byte = 8bit 라는 표현을 할 수 있습니다.
그러므로 byte에 대해 설명해보라고 하면 1bit가 8개 모일 시 만들어지는 데이터를 나타내는 단위라고 말할 수 있겠습니다.
그럼 이 bit와 byte를 왜 알고 있어야 될까요?
그 이유는 나라마다 각각 다른 언어들을 사용하는 것처럼 컴퓨터나라에서도 자신들이 사용하는 언어들이 있는데 그 언어들 중 하나가 바로 bit입니다.
컴퓨터가 아무리 똑똑하다고 하지만 사람들이 사용하는 언어에 대해서는 전혀 알지 못합니다.
이런 이유 때문에 우리가 사용하는 언어들을 컴퓨터가 인식하기 위해 bit로 변경해주고 변경된 bit를 컴퓨터가 읽어 우리가 명령한 대로 실행이 되는 것입니다.
어? 그러면 bit만 알면되지 byte까지 굳이 알아야 될까요?
이 대답은 of course 입니다!
왜냐하면 우리가 주로 사용하는 언어들인 알파벳, 한글 뿐만 아니라 특수문자, 숫자 등이 모두 byte 단위이기 때문입니다. (뒤에 자료형에서도 계속 나오구요.)
알파벳, 특수문자, 숫자 등은 모두 1byte로 표현이 되고 한글은 2byte로 표현이 됩니다.
그렇기 때문에 byte에 대해서도 알고 있어야 하며 시간이 지날수록 오히려 bit보다 byte가 더 친숙하게(?) 느껴지시게 될 것입니다.
그럼 이제 미리 알아야 될 개념에 대해 알았으니 자료형에 대해 알아보도록 하겠습니다.
자료형
자료형이란 상수나 변수와 같은 데이터들을 종류에 따라 저장할 수 있는 크기를 규정해 놓은 것을 의미합니다.
그럼 자료형에는 무엇이 있을까요?
자바에서 사용되는 자료형은 정수형, 실수형, 논리형, 문자형, 문자열이 있습니다.
정수형
정수형은 다음과 같이 정리를 할 수 있습니다.
구분 | 바이트 | 사용가능한 값의 범위 |
---|---|---|
byte | 1 | -128 ~ 127(-27 ~ 27-1) |
short | 2 | -32768 ~ 32767(-215 ~ 215-1) |
int | 4 | -2147483648 ~ 2147483647(-231 ~ 231-1) |
long | 8 | -9223372036854775808 ~ 9223372036854775807(-263 ~ 263-1) |
이 표를 보시면 어? byte는 1byte를 사용하는데 왜 사용가능 범위가 -128 부터 127이지? 라는 의문이 드실 겁니다.
아까 bit를 설명할 때 말씀드렸듯이 bit는 이진수입니다.
그리고 1byte는 bit가 몇 개?? 맞습니다. 8개입니다.
그럼 bit 8개를 나열하게 되면 xxxx xxxx로 나열을 할 수 있는데 x값에 0또는 1값이 들어오면 만들어질 수 있는 경우의 수는 몇개일까요?
x값 하나에 올 수있는 경우의 수는 2가지 이고 각각의 x는 서로 독립적이기 때문에 결과적으로 2x2x2x2x2x2x2x2 = 256이라는 값이 나오게 됩니다.
그럼 다시 표에서 byte의 사용가능한 범위를 보면 -128부터 127인데 이 사이의 숫자는 총 몇개일까요?
정답은 127-(-128)+1 = 256이 나오게 되고 위의 값과 동일하다는 것을 확인할 수 있습니다.
정리하자면 256이라는 값을 -가 있는거에도 반 만큼 -가 없는거에도 반 만큼 준다고 생각하시면 됩니다. (참고로 0은 -가 안붙어 있습니다.)
그 다음 큰 값인 short도 byte와 동일합니다.
2byte는 16bit와 같고 xxxx xxxx xxxx xxxx로 나열이 가능하며 이로인해 만들어지는 경우의 수는 65536개 이고 이 값을 -에도 반 만큼 -가 아닌거에도 반 만큼 주면 표에 나와 있는 것처럼 -32768 ~ 32767이라는 값이 나오게 됩니다.
이런 정수형들은 코드에서 다음과 같이 작성하여 사용할 수 있습니다.
package dataType;
public class Integer {
public static void main(String[] args) {
byte byteVal = 12;
short shortVal = 3456;
int intVal = 789012345;
long longVal = 6789012345678901234L;
System.out.println("byte값: " + byteVal);
System.out.println("short값: " + shortVal);
System.out.println("int값: " + intVal);
System.out.println("long값: " + longVal);
}
}
여기서 눈썰미가 좋으신 분들은 long에 데이터를 저장할 때는 숫자 뒤에 L이 추가되어 있는 것을 볼 수 있습니다.
그 이유는 일반 정수값을 입력할 때 자바에서는 기본적으로 int형으로 생각을 합니다.
byte와 short는 int보다 작은 범위의 값들이기 때문에 byte와 short에서 사용되는 값들이 모두 int에 포함되어 있어 문제가 없지만 long은 int보다 큰 범위의 값이기 때문에 int형이 담을 수 없는 범위를 저장하려면 숫자 뒤에 L을 붙여 long에 저장할거다를 표현해 주는 겁니다.
만약 long에 데이터를 저장할 때 int범위에 들어있는 값을 저장한다면 굳이 L을 숫자 뒤에 붙이지 않아도 됩니다.
실수형
실수형은 다음과 같이 정리할 수 있습니다.
구분 | 바이트 | 정수(부호+가수) | 지수 | 사용가능한 값의 범위 |
---|---|---|---|---|
float | 4 | 24bit | 8bit | 1.4E-45 ~ 3.402823E38 |
double | 8 | 11bit | 53bit | 4.9E-324 ~ 1.8E308 |
이 표도 보시면 어? 정수형에서의 int와 float는 바이트가 같은데 사용가능한 범위가 왜 다르죠? 라는 의문이 드실겁니다.
그 이유는 int는 단순히 정수값만 표현을 하지만 float는 실수값도 표현하기 때문입니다.
우선 인지해야 될 부분은 위의 표가 정수형과 다른 것 중 하나는 정수와 지수가 따로 표기되어 있다는 것입니다.
float같은 경우는 4byte이기 때문에 총 32bit를 사용하고 그 중 정수에 24bit, 지수에 8bit를 사용한다는 것입니다.
즉 (224)28 만큼 표현이 된다는 것이죠. (계산은 해보고 싶으면 해보세요.)
그렇기 때문에 결과적으로 실수형의 바이트가 정수형과 같지만 정수형보다 훨씬 더 높은 값의 범위를 가지고 있습니다.
이런 실수형들도 다음 코드와 같이 작성하여 사용할 수 있습니다.
package dataType;
public class Real {
public static void main(String[] args) {
float floatVAl = 1.23f;
double doubleVal = 3.41323;
System.out.println("float값: " + floatVAl);
System.out.println("double값: " + doubleVal);
}
}
위의 코드도 보시면 float에는 숫자 뒤에 f가 붙어있는 것을 보실 수 있습니다.
정수형에서 정수값을 기본적으로 int로 생각하듯이 실수형에서는 기본적으로 double로 생각을 합니다.
그렇기 때문에 long을 구분한것과 같이 float도 구분을 위해 f를 숫자 뒤에 붙여서 사용을 합니다.
하지만 정수형과는 달리 float는 어떠한 값을 넣더라도 항상 숫자 뒤에 f를 붙여줘야만 합니다.
논리형
논리형은 다음과 같이 정리할 수 있습니다.
구분 | 바이트 | 사용가능한 값 |
---|---|---|
boolean | 1 | true / false |
논리형은 정말 단순하게 true / false만 저장이 가능합니다.
코드는 다음과 같이 작성하여 사용할 수 있습니다.
package dataType;
public class logic {
public static void main(String[] args) {
boolean booleanVal1 = true;
boolean booleanVal2 = false;
System.out.println("boolean1값: " + booleanVal1);
System.out.println("boolean2값: " + booleanVal2);
}
}
이와 같이 true와 false만 데이터를 저장하여 사용하게 됩니다.
문자형
문자형은 다음과 같이 정리할 수 있습니다.
구분 | 바이트 | 사용가능한 값의 범위 |
---|---|---|
char | 2 | 0 ~ 65535(0 ~ 215-1) |
문자형은 또 특이하게 사용가능한 범위를 보면 음수값이 존재하지 않는다는 특징이 있습니다.
코드는 다음과 같이 작성하여 사용할 수 있습니다.
package dataType;
public class Character {
public static void main(String[] args) {
char charVal1 = 'A';
char charVal2 = 65;
System.out.println("char1값: " + charVal1);
System.out.println("char2값: " + charVal2);
}
}
여기서 또 특이한 점은 char에는 문자 하나를 담거나 또는 정수값을 담을 수 있습니다.
하지만 결과를 보면 넣은 것과 다른 값이 나오죠?
처음에 말씀드렸듯이 컴퓨터는 우리가 사용하는 언어를 알지 못합니다.
그렇기 때문에 컴퓨터가 우리가 사용하는 언어를 이해시켜주기 위해 컴퓨터의 언어로 변경되고 결과적으로 A라는 알파벳이 컴퓨터에게는 65와 같다는 것을 보여주고 있습니다.
A뿐만 아니라 다른 알파벳들도 모두 매핑되는 정수값이 존재합니다.
문자열
문자열은 String을 이용하여 표현을 합니다.
String은 다른 자료형과는 달리 정해진 바이트나 범위가 존재하지 않고 정해진 메모리의 크기만큼 저장할 수 있습니다.
코드 사용방법은 다음과 같습니다.
package dataType;
public class Strings {
public static void main(String[] args) {
String stringVal1 = "J4J가 설명하는";
String stringVal2 = "자료형";
System.out.println("stringVal1값: " + stringVal1);
System.out.println("stringVal2값: " + stringVal2);
}
}
위의 코드와 같이 문자열을 작성하고 싶을 때는 String을 이용하여 작성을 하시면 됩니다.
이렇게 자료형에서 알고 있어야 되는 것들은 크게 총 5가지가 있습니다.
코드를 작성하기 위해서 가장 기본적으로 알고 있어야 되는 것이기 때문에 어떤 값을 저장할 때 어떤 자료형을 사용해야 되는지를 명확히 알고 있어야 합니다.
생각보다 자료형들의 사용 가능 범위에 대해 자세히 알고 있어야 되는 순간이 가끔씩 존재하기 때문에 대략적으로 인지하고 계시기를 추천드립니다.
이상으로 자료형에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Language > Java' 카테고리의 다른 글
[Java] 자바기초 - Wrapper Class (0) | 2020.12.13 |
---|---|
[Java] 자바기초 - 형 변환(Promotion/Casting) (0) | 2020.12.11 |
[Java] 자바기초 - 입/출력 (0) | 2020.12.08 |
[Java] 자바기초 - IDE (0) | 2020.12.06 |
[Java] 자바기초 - JVM/JDK/JRE (0) | 2020.12.06 |
댓글