-
CH2 변수(Variable)DevBook/Java의 정석 2022. 1. 13. 23:32
✔️ 변수
- 단 하나의 값을 저장할 수 있는 메모리 공간
- 메모리의 빈 공간에 '변수타입'에 알맞은 크기의 저장공간이 확보되고, 이 저장공간은 '변수이름'을 통해 사용할 수 있게 됨
#️⃣ 변수의 초기화
- 변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 초기화 해야 함
- 전에 다른 프로그램에 의해 저장된 '알 수없는 값(garbage value)'이 남아있을 수 있기 때문임
#️⃣ 변수의 명명규칙
- 프로그래밍에서 사용하는 모든 이름을 '식별자(identifier)'라고 하며, 같은 영역 내에서 서로 구분될 수 있어야 함
<식별자 규칙>
1. 대소문자가 구분되며 길이에 제한이 없음
- True와 true는 서로 다른 것으로 간주됨
2. 예약어를 사용할 수 없음
- true는 예약어라서 사용할 수 없지만, True는 가능함
3. 숫자로 시작하면 안됨
- top10은 허용하지만, 7up은 허용 X
4. 특수문자는 '_'와 '$'만을 허용함
- $harp은 허용되지만, S#arp는 허용되지 않음
<권장 규칙>
1. 클래스 이름의 첫 글자는 항상 대문자로 함
- 변수와 메서드의 이름의 첫 글자는 항상 소문자로함
2. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 함
- lastIndexOf, StringBuffer
3. 상수의 이름은 모두 대문자로 함(여러 단어로 이루어진 경우 '_'로 구분함)
- PI, MAX_NUM
✔️ 변수의 타입
▶️ 기본형과 참조형
기본형 변수 - 실제 값(data)을 저장
참조형 변수 - 어떤 값이 저장되어 있는 주소(memory address)를 값으로 가짐
→ 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수
▶️ 기본형(prmitive type) : 8개
논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
▶️ 참조형(reference type) : 위의 8개를 제외한 나머지 타입
객체의 주소를 저장함
변수의 타입이 기본형이 아닌 것들은 모두 참조변수임
#️⃣ 기본형(prmitive type)
분류 타입 논리형 boolean true / false 중 하나를 값으며, 조건식과 논리적 계산에 사용된다. 문자형 char 문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있다. 정수형 byte, short, int, long 정수를 저장하는데 사용되며, 주로 int가 사용된다. byte는 이진 데이터를 다룰 때 사용되며, short는 C언어와의 호환을 위해서 추가되었다. 실수형 float, double 실수를 저장하는데 사용되며, 주로 double이 사용된다. - 문자형인 char는 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 별반 다르지 않으며, 정수형 or 실수형과 연산이 가능함
- 반면, boolean은 다른 기본형과의 연산이 불가능함
- 즉, boolean을 제외한 나머지 7개의 기본형은 서로 연산과 변환이 가능함
▶️ 기본 자료형의 종류와 크기
종류/ 크기 1 byte 2 byte 4 byte 8 byte 논리형 boolean 문자형 char 정수형 byte short int(기본 자료형) long 실수형 float double(기본 자료형) #️⃣ 상수와 리터럴(constant & literal)
▶️ 상수(constant)
변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없음
final int MAX_SPEED = 10; // 상수 선언 & 초기화
→ JDK1.6부터 상수를 선언과 동시에 초기화 하지 않고 사용하기 전에만 초기화하면 되도록 바뀌었지만, 상수는 선언과 동시에 초기화하는 습관을 들이는 것이 좋음
→ 한 번 초기화가 되면 상수 값 변경 불가능함
→ 상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례임
▶️ 간단 정리
변수(variable) 하나의 값을 저장하기 위한 공간 상수(constant) 값을 한번만 저장할 수 있는 공간 리터럴(literal) 그 자체로 값을 의미하는 것 int year = 2022; // year: 변수, 2022: 리터럴 final int MAX_VALUE = 2022; // MAX_VALUE: 상수, 2022: 리터럴
▶️ 상수가 필요한 이유
Q. 그냥 리터럴을 직접 쓰면 될 텐데, 굳이 상수가 따로 필요할까?
// 리터럴로 표기한 경우 int triangleArea = (20 * 10) / 2; // 삼각형의 면적 구하는 공식 // 상수를 사용한 경우 final int WIDTH = 20; // 폭 final int HEIGHT = 10; // 높이 int triangleArea = (WIDTH * HEIGHT) / 2; // 삼각형의 면적 구하는 공식
→ 상수는 리터럴에 '의미있는 이름'을 붙여서 코드의 이해와 수정을 쉽게 만듦
▶️ 리터럴의 타입과 접미사
변수의 타입은 저장될 '값의 타입(리터럴의 타입)'에 의해 결정되므로, 만일 리터럴에 타입이 없다면 변수의 타입도 필요없을 것임
종류 리터럴 접미사 논리형 false, true X 정수형 123, 0b0101, 077, 0xFF, 100L L 실수형 3.14, 3.0e8, 1.4f, 0x1.0p-1 f, d 문자형 'A', '1' X 문자열 "ABC", "123" X 정수형과 실수형에는 여러 타입이 존재하므로, 리터럴에 접미사를 붙여 타입을 구분함
→ 정수형: long타입의 리터럴에 접미사 'L'을 붙이고, 접미사가 없으면 int타입의 리터럴임
→ 실수형: float타입의 리터럴에는 'f'를, double타입의 리터럴에는 'd'를 붙임 (double은 기본 자료형 이어서 접미사 생략 가능함)
float pi = 3.14; // 컴파일 에러 (float타입 변수에 double타입 리터럴 지정불가) float pe = 3.14f; // 올바른 표현 double rate = 1.618; // 접미사 d는 생략 가능함
즉, long & float의 리터럴에 접미사를 붙이는 것만 신경쓰면 됨!
▶️ 문자 리터럴과 문자열 리터럴
- 문자 리터럴: 'A'와 같이 작은따옴표로 문자 하나를 감싼 것
- 문자열 리터럴: 두 문자 이상을 큰 따옴표로 감싼 것
String str = ""; // 빈 문자열 허용 char ch = ''; // 에러 (빈 문자 허용 X) char ch = ' '; // 공백 문자(blank)로 변수 ch 초기화
- 기본형과 참조형 구별 없이 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 됨
- 문자열 + any type → 문자열 + 문자열 → 문자열
- 기본형 타입의 값을 문자열로 변환할 때 빈 문자열("")을 더해주면 됨
▶️ 형식화된 출력 - printf()
- printf()는 지시자(specifier)를 통해 변수의 값을 여러 가지 형식으로 변환하여 출력하는 기능을 가짐
✔️ 기본형(primitive type)
#️⃣ 문자형 - char
- char형 변수에는 문자가 아닌 '문자의 유니코드(정수)'가 저장됨 (컴퓨터에 저장하기 위해 모든 데이터를 숫자로 변환하여 저장하는 것)
▶️ 인코딩과 디코딩(encoding & decoding)
- 문자 → 코드 변환 : '문자 인코딩'
- 코드 → 문자 변환 : '문자 디코딩'
- 문자를 컴퓨터에 저장할 때는 인코딩을 해서 숫자로 변환해서 저장하고, 저장된 문자를 컴퓨터에서 읽어올 때는 디코딩을 해서 숫자를 원래의 문자로 되돌려야 함
#️⃣ 정수형 - byte, short, int, long
▶️ 정수형의 선택 기준
- byte나 short보다 int를 사용하도록 하자
- byte, short는 저장할 수 있는 값의 범위가 작은 편이라서 연산 시 범위를 넘어서 잘못된 결과를 얻기 쉬움
- JVM의 피연산자 스택(operand stack)이 피연산자를 4byte단위로 저장하기 때문에 크기가 4byte보다 작은 자료형(byte, short)의 값을 계산할 때 4 byte로 변환하여 연산을 수행하므로, int를 사용하는 것이 더 효율적임
- 정수형 변수 선언 시 int타입으로 하고, int의 범위(약 +- 20억)을 넘어서는 수를 다뤄야할 때는 long을 사용하도록 함
✔️ 형변환
#️⃣ 형변환 방법
(타입)피연산자
- (): 캐스트 연산자 or 형변환 연산자
- 기본형(primitive type)에서 boolean을 제외한 나머지 7개의 타입들은 서로 형변환이 가능함
- float타입의 값을 int타입으로 변환할 때 소수점 이하의 값은 반올림 X, 버림으로 처리됨
- 정수형의 표현 형식으로 소수점 이하의 값은 표현할 수 없기 때문임
- float타입의 값을 int타입으로 변환할 때 소수점 이하의 값은 반올림 X, 버림으로 처리됨
- 기본형과 참조형간의 형변환은 불가능함
- 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있음
- 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환함
- char와 short의 경우, 서로 범위가 달라서 둘 다 2 byte의 크기로 같지만, 둘 중 어느 쪽으로의 형변환도 값 손실이 발생할 수 있으므로 자동 형변환 수행 X