[Java] 변수/변수의 타입/상수/리터럴/타입의 불일치
by Choi HyeSun
변수 - 정의
- 단 하나의 값을 저장할 수 있는 메모리 공간
변수 - 선언
-
변수를 사용하려면 먼저 변수를 선언해야 함
-
변수타입 변수이름;
-
타입이 같은 경우 ‘,(콤마)’를 구분자로 여러 변수를 한 줄에 선언할 수 있음
변수 - 초기화
-
변수를 선언한 이후부터는 변수를 사용할 수 있으나, 그 전에 반드시 변수를 ‘초기화(initialization)’ 해야함
- 메모리는 여러 프로그램이 공유하는 자원이므로 전의 다른 프로그램에 의해 저장된 ‘알 수 없는 값(쓰레기 값; garbage value)’이 남아있을 수 있기 때문
-
변수의 초기화란, 변수를 사용하기 전에 처음으로 값을 저장하는 것
-
변수의 값을 저장할 때는 대입 연산자 ‘=’를 이용
-
변수 = 값;
-
선언과 마찬가지로 타입이 같은 경우 ‘,(콤마)’를 구분자로 여러 변수를 한 줄에 선언할 수 있음
-
변수 선언과 동시에 초기화할 수 있음
변수 - 명명규칙
-
대소문자가 구분되며 길이에 제한이 없음
-
Sunny와 sunny는 서로 다른 것으로 간주
-
예약어를 사용해서는 안 됨
-
true는 예약어라서 사용할 수 없지만, True는 사용할 수 있음
-
-
예약어
-
keyword 또는 reserved word라고 하는데 프로그래밍 언어의 구문으로 사용되는 단어
-
Java의 예약어 예) abstract, boolean, break, byte, case, catch, class, const …
-
-
숫자로 시작해서는 안 됨
- Sunny25은 허용되지만 25Sunny는 비허용
-
특수문자는 ‘_‘와 ‘$’만 허용
- $Sunny는 허용되지만, S$unny는 비허용
-
자바 프로그래머에게 권장하는 규칙(암묵적인 규칙)
-
클래스의 이름의 첫 글자는 항상 대문자로 할 것
-
변수와 메서드의 이름의 첫 글자는 항상 소문자로 할 것
-
여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 할 것 (lastIndexOf, StringBuffer)
-
상수의 이름은 모두 대문자로 하고, 여러 단어일 경우 ‘_‘로 구분할 것 (PI, MAX_NUMBER)
-
규칙은 아니지만)
변수의 이름은 짧을수록 좋지만 약간 길더라도 용도를 알기 쉽게 ‘의미있는 이름’으로 하는 것이 바람직하고,
변수의 선언문에 주석으로 변수에 대한 정보를 주는 것도 좋은 생각
변수 - 타입 : 기본형
-
실제 값(data)을 저장 → Java의 실제 연산에 사용되는 것은 모두 기본형 변수
-
모두 8개 - 계산을 위한 실제 값을 저장
-
논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
-
boolean : 논리형
-
조건식과 논리적 계산에 사용
-
8bit / 1byte
-
false, true
-
-
char : 문자형
-
(한 개의) 문자를 저장하는데 사용
-
16bit / 2byte
-
’\u0000’ ~ ‘\uffff’ (0~2^16-1, 0 ~ 65535)
-
-
byte : 정수형
-
정수를 저장하는데 사용 - 이진 데이터
-
8bit / 1byte
-
-128 ~ 127 (-2^7 ~ 2^7-1)
-
-
short : 정수형
-
정수를 저장하는데 사용 - C언어와의 호환
-
16bit / 2byte
-
-32,768 ~ 32,767 (-2^15 ~ 2^15-1)
-
-
int : 정수형
-
정수를 저장하는데 사용 - 주로 사용됨
-
32bit / 4byte
-
-2,147,483,648 ~ 2,147,483,647 (-2^31 ~ 2^31-1, 약 ±21억)
-
-
long : 정수형
-
정수를 저장하는데 사용
-
64bit / 8byte
-
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (-2^63 ~ 2^63-1)
-
-
float : 실수형
-
실수를 저장하는데 사용
-
32bit / 4byte
-
1.5E-45 ~ 3.4E38 (1.410^-45 ~ 3.410^38) || 정밀도 7자리
-
-
double : 실수형
-
실수를 저장하는데 사용 - 주로 사용됨
-
64bit / 8byte
-
4.9E-324 ~ 1.8E308(4.910^-324 ~ 1.810^308) || 정밀도 15자리
-
변수 - 타입 : 참조형
-
주소(memory address) 값을 저장 (null 또는 주소 값을 가질 수 있음)
-
8개의 기본형을 제외한 나머지 타입 - 객체의 주소를 저장
- 변수의 타입이 기본형이 아닌 것들은 모두 참조변수
-
참조 변수 선언
-
클래스이름 변수이름;
상수(constant) - 정의
-
변수 : 하나의 값을 저장하기 위한 공간
-
상수 : 값을 한번만 저장할 수 있는 공간
-
상수는 리터럴에 ‘의미있는 이름’을 붙여 코드의 이해와 수정을 쉽게 만듦
-
값을 변경할 때도 여러 곳을 수정할 필요 없이 상수 초기화 값만 변경하면 됨
-
-
리터럴 : 그 자체로 값을 의미하는 것
상수 - 선언
-
변수와 동일하며, 변수의 타입 앞에 키워드 ‘final’을 붙여주면 됨
-
선언과 동시에 초기화하는 것이 좋으며, 그 후부터는 상수의 값을 변경하는 것이 허용되지 않음
-
암묵적인 관례로, 모두 대문자를 사용하며 여러 단어로 이루어진 경우 ‘_‘로 구분
-
final 변수타입 변수이름 = 값;
리터럴(literal) - 정의
-
수학에서 말하는 ‘상수’
- 예) 12, 123, 3.14, ‘A’
-
Java에서는 상수를 다른 개념으로 사용하기 때문에 ‘상수’ 대신 리터럴이라는 용어를 사용
리터럴(literal) - 타입(종류)
종류 | 리터럴 | 접미사 |
---|---|---|
논리형 | false, true | 없음 |
정수형 | 123, 0b0101, 077, 0xFF, 100L | l, L |
실수형 | 3.14, 3.0e8, 1.4f, 0x1, 0p-1 | f, d |
문자형 | ‘A’, ‘1’, ‘\n’ | 없음 |
문자열 | “ABC”, “123”, “A”, “true” | 없음 |
리터럴(literal) - 타입과 접두/미사(정수형)
-
short, byte : int타입의 리터럴 사용
-
int : 접미사 없음
-
long : 접미사 ‘l’ or ‘L’ (소문자 l은 1이랑 헷깔리므로 L 사용 권장)
-
정수형 리터럴 중간에 구분자’_‘를 넣을 수 있게 됨 (JDK 1.7 ~)
-
long a = 1000000L; → long a = 1_000_000L;
-
큰 숫자를 구분하기 편하게 (위의 선언은 동일함)
-
-
2진 리터럴
-
2진수 - 접두사 ‘0b’ or ‘0B’ (예) 0b10 → 2진수 10 → 10진수로 2
-
8진수 - 접두사 ‘0’ (예) 010 → 8진수 10 → 10진수로 8
-
10진수 - 생략
-
16진수 - 접두사 ‘0x’ or ‘0X’ (예) 0x10; → 16진수 10 → 10진수로 16
-
리터럴(literal) - 타입과 접두/미사(실수형)
-
float : 접미사 ‘f’ or ‘F’
-
double : 접미사 ‘d’ or ‘D’, 생략 가능(int처럼)
-
실수형 리터럴과 다른 형태의 동등한 표현
자료형 | 실수형 리터럴 | 다른 형태의 동등한 표현 |
float | 10f | 10.0f |
float | 3.14e3f | 3140.0f |
double | 10. | 10.0 |
double | .10 | 0.10 |
double | 1e1 | 10.0 |
double | 1e-3 | 0.001 |
-
기호 p를 이용한 16진 지수 형태의 표현
-
p는 2의 제곱을 의미
-
p의 왼쪽에는 16진수를 적고 오른쪽에는 지수를 10진수로 적음
-
p는 대/소문자 모두 사용 가능 (p, P)
-
p가 포함된 리터럴은 실수형
-
예시
0x1p1 = (1 * 16^0) * 2^1 = 1.0 * 2 = 2.0
0x0.2p-1 = (2 * 16^-1) * 2^-1 = 0.125 * 0.5 = 0.0625
0x12p3 = (1 * 16^1 + 2 * 16^0) * 2^3 = (16+2) * 8 = 144.0
-
리터럴(literal) - 타입(문자형)
-
작은 따옴표 ‘로 문자 하나를 감싼 것 (예) ‘A’
-
char Type의 변수
리터럴(literal) - 타입(문자열형)
-
큰 따옴표로 “문자열을 감싼 것 (예) “”, “A”, “AB”
-
empty String (“”) 허용
-
문자열 리터럴은 무슨 타입을 더하던 문자열로 반환
-
문자열 + any type → 문자열 + 문자열 → 문자열
-
any type + 문자열 → 문자열 + 문자열 → 문자열
-
예시
-
7 + “ “ → “7” + “ “ → “7 “
-
” “ + 7 → “ “ + “7” → “ 7”
-
7 + 7 + “” → 14 + “” → “14” + “” → 14
-
”” + 7 + 7 → “7” + 7 → “7” + “7” → “77”
-
true + “” → “true” + “” → “true”
-
null + “” → “null” + “” → “null”
-
타입의 불일치
-
리터럴의 값이 변수의 타입의 범위를 넘어서면 컴파일 에러 발생
- 예) int의 리터럴인 11111111값을 byte 타입의 변수에 저장할 수 없음
-
리터럴의 타입이 변수의 타입보다 저장범위가 넓으면 컴파일 에러 발생
- 예) double 리터럴인 3.14를 float 타입의 변수에 저장할 수 없음
-
해결방법 → 형변환
Subscribe via RSS