변수
변수는 프로그램의 처리 과정에서 데이터를 담아둘 수 있는 메모리의 공간으로 한 마디로 물건을 넣는 박스와 같다. 프로그램에서 사용해야할 데이터를 저장하지 않으면 그 선언과 동시에 증발해버리기 때문에 꼭 어디엔가 저장을 해야 재사용이 가능해지는데 이 역할을 하는 것이 변수인 것이다.
변수 선언과 초기화
일단 변수를 사용하려면 기본적으로 선언을 해줘야 컴퓨터가 이를 알아먹고 제역할을 한다. 변수의 선언은 데이터가 담길 데이터타입 + 변수의 이름 그리고 종결어미인 세미콜론으로 이루어진다. 변수를 초기화 하는 것은 변수가 처음 가지는 값을 설정해주는 것이다.
int a; //int = 데이터타입 a = 변수명
int a= 1; //이렇게 하면 변수 선언과 초기화가 동시에 되는 것이다.
여기서 중요한 점은 Java는 예약어를 변수명으로 사용하지 못하는 점, 변수명의 대소문자를 구분하기에 변수이름이 Apple이라면 apple로 재호출 할 수 없다는 점, 그리고 변수의 이름이 숫자로 시작하지 못하며 $와 _를 제외한 특수문자로 시작하는 변수명은 선언이 불가능 하다는 점이다.
데이터 타입
변수를 선언할 때 적었던 int 와 같은 키워드가 바로 데이터 타입인데, 이는 문자와 숫자로 이루어진 데이터가 어떤 타입으로 저장되고 있는지를 분류하는 것이다. 데이터 타입에는 총 4종류로
- 정수형 타입
- 실수형 타입
- 문자형 타입
- 논리형 타입
등이 있다.
1. 정수형 타입
정수형 타입 데이터는 말 그대로 정수를 저장하고자 할 때 사용하는데 총 4가지의 종류가 있으며 각각의 종류는 담는 데이터의 크기별로 분류가 되어있다!
자료형 | 바이트 | 비트 | 저장 가능한 값의 범위 |
byte | 1 | 8 | -127 ~ 127 (2^8단계) |
short | 2 | 16 | -32,768 ~ 32,767 (2^16 단계) |
int | 4 | 32 | -2,147,483,648 ~ 2,147,483,647 (2^32단계) |
long | 8 | 64 | -2^63 ~ 2^63-1 |
*여기서 byte는 ASCII코드 기준 표현할 수 있는 글자의 가장 최소 단위를 기준으로 8비트를 설정해뒀기 때문에 1바이트가 1글자의 단위가 된 것이다.
2. 실수형 타입 (소숫점 숫자 저장)
자료형 | 바이트 | 비트 | 저장 가능한 값의 범위 | 오차범위 |
float | 4 | 32 | 1.4 x 10^-45 ~ 3.4 x 10^38 | 소수 이하 6자리 |
double | 8 | 64 | 4.9 x 10^-324 ~ 1.8x10^308 | 소수 이하 15자리 |
컴퓨터가 실수를 처리할 때는 기본적으로 오차가 존재하는데 데이터를 표현하는 비트의 수에 따라 오차는 줄어들기 때문에 실수형 데이터는 정밀도(오차범위)가 중요하게 여겨진다.
*float의 경우 변수의 값 뒤에 꼭 f를 붙여줘야 에러가 나지 않는다!
3.문자형 타입
자료형 | 바이트 | 비트 | 저장 가능한 값의 범위 |
char | 2 | 16 | 0 ~ 2^16-1 (유니코드 0 ~65535) |
Java는 ASCII 대신 유니코드를 사용하기 때문에 char 자료형의 바이트 수는 1바이트가 아닌 2를 사용하는데 그 이유는 영자만을 지원하는 ASCII와는 다르게 실질적으로 모든 언어를 지원하는 Unicode의 크기가 더 크기 때문에 더 높은 범위를 지원하는 것이다. 참고로 char 타입에 변수를 대입할 때는 작은 따옴표 (' ')를 사용해야 한다.
4.논리형 타입
자료형 | 비트 | 반환 값 |
boolean | 1 | true 또는 false |
논리형 타입은 true와 false를 저장하는데 엄밀히 따지자면 0과 1로 표현하기에 필요한 메모리를 1비트만 가지는 것이다. 하지만 Java에서 다루는 최소 크기 단위가 byte이기 때문에 1bit라 할 지라도 1byte로 취급한다.
형변환
자동형변환
Java에선 기본적으로 다른 데이터 타입을 사용한 값을 다른 데이터 타입을 사용하고 있는 변수에 넣더라도 자동으로 그 데이터 타입을 바꿔주는 기능을 제공하고 있는데 이를 자동 형변환이라고 한다. 자동 형변환은 프로그램 작성자가 별도의 작업을 하지 않아도 Java가 알아서 알맞은 타입으로 변환해주는데 여기서 중요한 점은 더 큰 데이터타입을 더 작은 데이터 타입으로 변환하는 것은 불가능하다는 점이다 (강제변환은 여전히 가능하다)
자동형변환이 되는 경우
- byte 에서 short short에서 int 등 작은 단위의 데이터타입에서 큰 타입으로 변환
- int 등의 정수형 타입에서 float 등의 실수형 타입으로 변환
- char(문자)에서 정수나 실수로 변환
자동형변환이 안되는 경우
- int 에서 short, double에서 float 등 큰 단위의 데이터타입에서 작은 타입으로 변환
- float(실수) 에서 int(정수)로 형변환
- 실수나 정수에서 문자로 변환
byte a = 1;
int b = 25;
float c = 32.64f;
char d = 'A';
int X = a;
byte Y = b; //더 큰 int를 byte에 넣을 수 없기 때문에 에러가 난다
int Z = d;
char z = b; //정수인 b를 문자형인 z에 넣으려 하니 에러가 난다
명시적 형변환/강제형변환 (casting)
강제형변환은 말 그대로 형변환을 사용자가 강제하여 데이터 타입을 바꾸는 행위를 뜻하는데 앞서 자동형변환이 안된 경우에도 데이터가 왜곡되는 것을 감안하고 강제형변환을 통해 데이터타입을 바꿔줄 수도 있다.
(변환하고자하는 타입)변수명;
앞에서 자동형변환이 안된 데이터타입들을 강제형변환을 통해 형변환 시켜보자.
byte Y = (byte)b;
char Z = (char)b;
System.out.println(Y);
System.out.println(Z);
'Java' 카테고리의 다른 글
Java 프로그래밍 - 객체와 클래스 (0) | 2024.09.09 |
---|---|
Java 프로그래밍 - 반복문과 배열 (0) | 2024.09.06 |
Java 프로그래밍 - 조건문, 반복문 (1) | 2024.09.05 |
Java 프로그래밍 기본 (상수, 연산자) (0) | 2024.09.05 |
Java 프로그래밍 - 시작하기 (0) | 2024.09.04 |