변수란 데이터를 저장하기 위한 공간이며, 정확히 말하면 데이터를 저장하기 위해 할당된 메모리(정확히는 RAM에 할당된 메모리)를 의미한다.
이때, 변수에는 이름을 붙일 수 있으며, 이를 변수명
이라고 한다.
또한, 변수는 정수, 실수, 문자등 특정한 데이터의 종류를 저장하기 위한 타입이 존재하며, 이를 자료형
이라고 한다.
JAVA의 자료형은 다음과 같이 구성되 있다.
자료형 | 데이터 | 크기 | 저장 가능 범위 |
---|---|---|---|
boolean | 참, 거짓 | 1 byte | true, false |
char | 문자 | 2 byte | unicode 문자 |
byte | 정수 | 1 byte | -128 ~ 127 |
short | 정수 | 2 byte | -32,768 ~ 32,767 |
int | 정수 | 4 byte | -2,147,483,648 ~ 2,147,483,647 (약 ±21억) |
long | 정수 | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (약 ±920경) |
float | 실수 | 4 byte | ±(1.4E-45 ~ 3.4E38) |
double | 실수 | 8 byte | ±(4.94E-324 ~ 1.79E308) |
이때, Ex는
를 의미한다.
JAVA에서 변수의 선언은 다음과 같이 할 수 있다.
자료형 변수이름;
예를 들어 char
자료형으로 ch 라는 이름으로 변수를 만들고 싶다면 다음과 같이 변수를 선언할 수 있다.
char ch;
이 자료형에는 만자 하나를 담을 수 있으며, 예를 들어 변수에 "P"라는 문자를 저장하고 싶을때는 다음과 같이 할 수 있다.
ch='P';
변수 선언에도 사용이 불가능한 이름이 있다.
먼저, 변수의 이름은 숫자로 시작할 수 없다. 예를 들어
int first_data;// 사용 가능
int data1;// 사용 가능
int 1data;// 사용 불가
와 같이 first_data
의 경우는 변수로 사용이 가능한 이름이나, 1data
, 1_data
와 같이 숫자로 시작하는 이름은 변수로 사용이 불가능하다.
또한 $
와 _
를 제외한 특수문자 역시 변수로 사용이 불가능하다.
또한, 대소문자가 구분된다.
예를들어 변수 이름 first
와 First
는 다른 변수이다.
또한, if
, continue
, true
, else
와 같이 java 문법에서 사용하는 명령어인 예약어 역시 변수명으로 사용할 수 없다.
또한, long
자료형에 값을 대입하려면 long data=100L;
과 같이 대문자 혹은 소문자로 L을 끝에 적어야 하며, 실수를 표현하는 자료형의 경우 float data=2.3f;
와 같이 뒤에 다문자 혹은 소문자 F를 적어야 한다.
이에 대해서는 다음장에서 자세히 다룰 예정이니 지금은 참고 정도만 해두자.
앞에서 short
자료형과 byte
자료형 역시 정수 영역을 저장함을 볼 수 있었다.
그렇다면 이 코드를 한번 해석해 보도록 하자.
public class ByteTest {
public static void main(String[] args) {
byte a, b, c;// 변수 선언
a=10;// a=10 대입
b=20;// b=20 대입
c=a+b;// a+b 연산
System.out.println(c);// 결과 출력
}
}
byte
자료형으로 변수 a
, b
, c
를 선언하고, a=10, b=20을 대입한 후, 이 둘을 더하는 간단한 연산이다.
코드를 실행시켰을 때 console에 10과 20을 더한 30이 출력되리라 예상할 것이다.
그러나, 실행 결과를 보면 다음과 같다.
output:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from int to byte
놀랍게도 예상했던 결과가 아닌 Type mismatch
라는 오류가 출력됨을 알 수 있다.
이와 같이 오류가 발생하는 이유는 java 내부에서는 정수형 데이터를 연산할 때 int
지료형으로 변환후 연산하기 때문이다.
즉, 우리가 short
혹은 byte
자료형으로 변수를 선언해도 결국 java 내부에서는 연산시 int
자료형으로 변환을 하게 된다.
이를 코드로 나타내면 다음과 같다.
public class ByteTest {
public static void main(String[] args) {
int a, b;// 변수 선언
byte c;// 변수 선언
a=10;// a=10 대입
b=20;// b=20 대입
c=a+b;// a+b 연산
System.out.println(c);// 결과 출력
}
}
코드를 보면 a
와 b
는 연산을 위해 int
로 선언됬으나, c
의 경우 여전히 byte
자료형이기 때문에 자료형의 크기가 달라서 오류가 발생하는 것이다. 이러한 오류를 Type mismatch
오류라고 한다.
즉, 우리는 정상적으로 byte
자료형을 이용해 코드를 작성했으나, java 내부에서 형변환을 자동적으로 하면서 발생하는 문제이다.
그러나, long
자료형으로 코드를 작성한 경우에는 연산시 int
자료형으로 변환시 long
자료형이 int
자료형보다 표현할 수 있는 정수의 범위가 넓어 데이터의 손실이 발생할 수 있기 때문에 long
자료형으로 작성한 경우, 연산시 long
으로 연산이 된다.
변수에 1.54와 25.1652를 저장후, 두 수의 합과 차, 곱을 구하시오.
변수에 10과 23를 저장후, 두 수의 곱을 구하시오.
short형 변수에 10과 23를 저장후, 두 수의 합과 차, 곱을 구하시오.
public class Q1 {
public static void main(String[] args) {
float a, b;
float sum, sub, mul;// 합, 차, 곱
a=1.54f;
b=25.1652f;
sum=a+b;
sub=a-b;
mul=a*b;
System.out.println("a+b: "+sum);
System.out.println("a-b: "+sub);
System.out.println("a*b: "+mul);
}
}
result:
a+b: 26.7052
a-b: -23.625198
a*b: 38.754406
public class Q2 {
public static void main(String[] args) {
int a, b;
int mul;// 곱
a=10;
b=23;
mul=a*b;
System.out.println("a*b: "+mul);
}
}
result:
a*b: 230
public class Q3 {
public static void main(String[] args) {
short a, b;
int sum, sub, mul;// 곱
a=10;
b=23;
sum=a+b;
sub=a-b;
mul=a*b;
System.out.println("a+b: "+sum);
System.out.println("a-b: "+sub);
System.out.println("a*b: "+mul);
}
}
result:
a+b: 33
a-b: -13
a*b: 230
위 주소에서 code를 다운로드 받아 eclipse로 직접 정답 확인이 가능하다.
https://github.com/isaiahIM/java_basic/tree/main/variable%20and%20data%20type