이번 글에서는 본격적으로 JAVA언어에 대해 배워보겠습니다. 변수에 대해 알아봅시다.
변수 Variable
1. 변수의 개념
프로그래밍 언어를 처음 공부하시는 분들이라면 변수라는 단어를 봤을 때 수학의 변수. 즉, 변하는 값을 떠올리시겠죠? 하지만 프로그래밍에서의 변수는 값. 즉, 데이터가 아닌 데이터를 담는 메모리를 의미합니다.
저번 글에서 자바의 [자동 메모리 관리]를 설명할 때 컴퓨터에게 명령을 내리는 과정에서 메모리라는 저장공간을 사용하게 된다고 말씀드렸습니다. 필요한 데이터/ 명령어를 메모리에 저장해 놓고 필요할 때 가져다 쓴다고 했죠. 우리가 저장된 데이터를 찾을 땐 메모리의 주소값을 사용합니다. 현실에서 건물의 주소로 특정 장소를 찾는 것처럼요.
변수는 메모리이고, 변수의 이름은 메모리의 주소에 붙는 이름입니다. 따라서 변수에 값을 할당하는 것은 메모리에 저장하는 것과 동일합니다. 메모리 공간에 저장된 값은 변경이 가능하기 때문에 개발자들은 이를 '변수'라 칭하게 되었습니다.
하나의 변수에는 하나의 값만 저장할 수 있으며 변수의 타입에 따라 메모리의 크기도 달라집니다.
변수를 사용하기 위해서는 변수를 선언하고 초기화하는 과정이 필요합니다.
2. 변수의 선언과 초기화
변수 선언 : 변수의 타입을 지정하여 알맞은 크기의 저장 공간 확보, 이름 짓기
타입 이름;
int age;
변수 초기화 : 변수를 사용하기 전에 처음으로 값을 저장하는 것
이름 = 값;
age = 20;
변수 선언과 초기화는 동시에 가능합니다.
타입 이름 = 값;
int age = 20;
자 세 가지 개념이 나왔습니다. 타입 / 이름 / 값
세 개념에 대해 자세히 알아봅시다.
우선 가장 단순한 이름부터 알려드리고 타입과 값은 묶어서 설명드리겠습니다.
3. 변수의 이름
❗ 명명 규칙
- 길이에 제한은 없지만 짧고 의미 있는 이름을 사용합니다.
- 숫자로 시작할 수 없습니다.
- 특수 문자는 _와 $만 사용이 가능합니다.
- 카멜 표기법 사용이 권장됩니다.
- 상수의 이름은 카멜 표기법을 따르지 않고 모두 대문자로 쓰며 여러 단어로 이루어진 경우 _로 구분합니다.
- 예약어는 사용이 불가합니다.
❓ 카멜 표기법이란?
여러 단어로 이루어진 이름일 경우 첫 글자는 소문자, 다음 단어의 첫 문자는 대문자로 표기합니다.
예시 ) firstName, lastName, camelCase
❓ 상수란?
변수와 반대되는 개념으로 값을 한 번만 저장할 수 있는 공간을 의미합니다. 타입 앞에 static final을 붙여 선언하며 한 번 초기화하면 값을 변경할 수 없습니다.
예시 ) static final int FONT_SIZE = 10;
❓ 예약어란?
프로그래밍 언어에서 이미 의미를 가진 이름입니다.
CLEAN CODE :
이후에 좋은 코드를 작성하는 방법에 대해 배우게 된다면 꼭 짧은 이름이 좋은 이름은 아니라는 것을 알게 됩니다. 좋은 코드는 읽기 좋은 코드입니다. 짧은 이름을 추천하는 것도 그것이 가독성을 높이는 쉬운 방법이기 때문입니다. 하지만, 이를 오인하고 짧은 이름만을 고집하는 것은 바람직하지 않습니다. 변수의 존재 이유를 설명할 수 있는 의미 있는 이름을 지어주세요. 발음하기 어려운 약어를 사용하거나, 검색하기 어려운 보편적인 (코드에 자주 사용되는) 단어는 피하는 것이 좋습니다.
4. 변수의 타입과 값
1) 기본형 / 기본 타입 (8개) : 실제 값 (리터럴)을 저장합니다.
|
타입
|
메모리 사용 크기
|
저장되는 값의 허용 범위
|
|
|
정수 타입
(숫자) |
byte
|
1byte
|
8bit
|
-(2의 7제곱) ~ (2의 7제곱 - 1)
|
|
short
|
2byte
|
16bit
|
-(2의 15제곱) ~ (2의 15제곱 - 1)
|
|
|
char
|
2byte
|
16bit
|
0 ~ 65535(유니코드)
|
char은 'a', 'Z' 와 같은 하나의 문자,
하지만 유니코드로 변환 시 숫자값을 가짐 ['] 작은따옴표로 감싸서 표현 |
|
int
|
4byte
|
32bit
|
-(2의 31제곱) ~ (2의 31제곱 - 1)
|
가장 많이 사용됨
2의 31제곱은 약 21억 |
|
long
|
8byte
|
64bit
|
-(2의 63제곱) ~ (2의 63제곱 - 1)
|
어미에 대소문자 L
|
|
실수 타입
(소수점이 있는 숫자) |
float
|
4byte
|
32bit
|
(1.4 * 10의 -45제곱) ~ (3.4 * 10의 38제곱)
|
어미에 대소문자 F
정밀도 : 7자리 |
double
|
8byte
|
64bit
|
(4.9 * 10의 -324제곱) ~ (1.8 * 10의 308제곱)
|
float보다 많이 사용됨
어미에 대소문자 D (생략가능) 정밀도 : 15자리 |
|
논리 타입
(true / false) |
boolean
|
1byte
|
8bit
|
true(1), false(0)
|
|
비트(bit)는 한 자리의 이진수를 의미합니다. 8비트(bit) = 1바이트(byte)
특수문자 문자 리터럴 : 이스케이프 문자
tab | \t |
backspace | \b |
form feed | \f |
new line | \n |
carriage return | \r |
역슬래쉬 | \\ |
작음따옴표 | \’ |
큰따옴표 | \” |
유니코드(16진수)문자 | \u유니코드 |
2) 참조형 / 참조 타입 : 실제 값이 아닌 주소를 저장합니다.
기본형/ 기본 타입이 아닌 모든 타입이 속합니다.
가장 많이 사용되는 것은 문자열 String 타입니다. String형 변수는 다른 참조형 변수들과 달리 객체를 생성하는 코드를 생략하고 문자열을 저장할 수 있습니다. 하지만 그렇다고 해서 String 형 변수에 문자열 리터럴이 저장되는 것은 아닙니다. String형 변수에는 문자열이 담긴 객체의 주소 값이 저장됩니다.
자료형 기본값
자료형 | 기본값 |
boolean | false |
char | ‘\u0000’ |
byte, short, int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d 또는 0.0 |
참조형 변수 | null |
5. 부동 소수점
실수형 / 실수 타입 변수는 값을 부동소수점수의 형태로 저장합니다. 부동소수점수는 다음과 같이 세 부분으로 나누어 저장됩니다.
float : S(1 bit) + E(8 bit) + M(23 bit)
double : S(1 bit) + E(11 bit) + M(52 bit)
S : 부호, 0이면 양수 1이면 음수
E : 지수, 부호 있는 정수, 지수의 범위는 -127 ~ 128 (float), -1023 ~ 1024 (double)
M : 가수, 실제값을 저장하는 부분, 10진수로 7자리 (float), 15자리 (double)의 정밀도로 저장 가능
부동소수점의 오차
부동소수점으로 표현된 실수는 오차가 있을 수 있습니다. 그 이유는 위와 같이 실수를 표현하는 크기의 범위가 정해져 있는데, 실수에는 무한소수가 존재하기 때문입니다. 더군다나, 10진수로는 유한소수이더라도, 2진수로 변환하면 무한소수가 되는 경우도 있습니다.
정확한 실수 연산을 하려면 BigDecimal을 사용해야 합니다.
⭐ 더 자세히 알아보기
- 실수를 1.xxx * 2^n의 형태로 변환합니다.
- 지수 n에 기저값 127(float), 1023(double)을 더한 값을 2진수로 변환하여 저장합니다.
- 1.xxx에서 1. 을 제외한 23자리의 2진수를 가수로 저장합니다.
- 이때 23자리를 넘어가는 값들은 잘려나갑니다.
- 잘려나간 값들에 의해 발생할 수 있는 최대오차는 약 2^-23입니다.
- 이 값은 10진수로 0.0000001192(약 10^-7)입니다.
- 따라서 float의 정밀도는 소수점 이하 6자리가 됩니다.
6. 형변환
변수의 형 / 타입을 바꾸는 것을 형변환이라 합니다.
자동 형변환
작은 허용 범위 타입에서 큰 허용 범위의 타입 변환은 자동으로 이루어집니다.
허용 범위 크기 순
byte < short, char < int < long < float < double
- 예외적으로 byte는 char 보다 작은 허용 범위를 가지고 있지만 자동형 변환되지 않습니다. byte는 음수범위를 포함하지만 char는 포함하지 않기 때문입니다.
- 정수 타입 변수가 산술 연산식에서 피연산자로 사용되면 byte, short, char 타입 변수들이 int 타입으로 자동 형변환 됩니다.
- 정수, 실수 타입끼리 연산할 때 허용 범위가 더 큰 피연산자 타입으로 자동 형변환 됩니다.
- 피연산자 중 문자열이 포함되어 있으면 나머지 피연산자도 문자열로 자동 형변환 됩니다. 하지만 연산은 순차적으로 수행된다는 사실을 기억해야 합니다.
- 예시 ) String str = 1 + 2 + "3"; -> String str = 3 + "3"; (3이 문자열로 자동 형변환) -> String str = "33";
강제 형변환
(타입)피연산자
위와 같은 형태로 강제 형변환이 가능합니다. 기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능합니다. 기본형과 참조형은 서로 형변환할 수 없습니다. 문자열은 (타입)이 아닌 다른 방법으로 형변환합니다.
- 정수의 큰 타입에서 작은 타입으로의 변환은 크기의 차이만큼 잘려나가기 때문에 ‘값 손실’이 발생할 수 있습니다.
- 실수의 큰 타입(double)에서 작은 타입(float)으로의 변환은 지수는 double의 기저인 1023을 뺀 후 float의 기저인 127을 더하고, 가수는 double의 가수 52자리 중 24번째 자리를 반올림하여 23자리만 저장하고 나머지를 버립니다. float범위를 넘는 값을 float으로 형변환하면 무한대, 혹은 0을 결과로 얻습니다.
- 정수형을 실수형으로 변환화면 정밀도의 제한으로 인한 오차가 발생할 수 있습니다.
- 실수형을 정수형으로 변환하면 실수형의 소수점 이하 값은 반올림하지 않고 버려집니다.
- 문자열을 기본 타입으로 변환할 때는 (타입)이 아니라 타입.parse타입(변수명)으로 변환합니다. 타입의 첫 글자는 대문자로 입력합니다. 이때, 문자열이 기본형 리터럴 형태가 아닌 경우 예외(Exception)가 발생합니다.
- 예시 ) Integer.parseInt("3000"); O 가능
- 예시 ) Integer.parseInt("three thousand"); X 불가능
- 기본 타입을 문자열로 변환할 때는 String.valueOf() 메서드를 이용합니다.
변수의 개념부터 형변환까지 많은 내용에 대해 알아보았습니다. 프로그래밍 언어를 처음 접하시는 분이라면 어렵게 느껴지시는 게 당연합니다.'이것까지 외워야 해?'라는 생각이 드시는 건 넘어가고 이해를 우선순위로 두고 읽어보셨으면 좋겠습니다. 정리를 위해 읽으시는 독자분들께는 도움이 되셨으면 좋겠습니다. 읽어주셔서 감사합니다. 다음 글에서는 연산자로 찾아오겠습니다.
'개발언어 > Java : 자바' 카테고리의 다른 글
자바 쉽게 배우기 6 - 클래스와 객체 (0) | 2023.01.06 |
---|---|
자바 쉽게 배우기 5 - 배열 (0) | 2023.01.04 |
자바 쉽게 배우기 4 - 조건문과 반복문 (0) | 2023.01.03 |
자바 쉽게 배우기 3 - 연산자 (0) | 2023.01.02 |
자바 쉽게 배우기 1 - 자바란 무엇인가? (0) | 2022.12.30 |