- 대소문자가 구분되며 길이에 제한이 없다.
- 예약어를 사용해서는 안 된다.
예약어는 'keyword' 또는 'reserved word'라고 하는데, 프로그래밍언어의 구문에 사용되는 언어를 뜻한다. 따라서 예약어는 클래스나 변수, 메서드의 이름으로 상ㅇ할 수 없다.- 숫자로 시작해서는 안 된다.
- 특수문자는 '_'와 '$'만을 허용한다.
- 클래스 이름의 첫 글자는 항상 대문자로 한다.
-변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다.- 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다.
- 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
-PI, MAX_NUMBER
위의 규칙들은 반드시 지켜야 하는 것은 아니지만, 코드를 보다 이해하기 쉽게 하기 위한 자바 개발자들 사이의 암묵적인 약속이다.
만일 특별한 방식으로 식별자를 작성해야 한다면 미리 규칙(coding convention)을 정해놓고 프로그램 전체에 일관되게 적용하는 것이 필요하다.
java에서는 모든 이름에 유니코드에 포함된 문자들을 사용할 수 있지만, 적어도 클래스이름은 ASCII코드(영문자)로 하는 것이 좋다. 유니코드를 인식하지 못하는 OS도 있기 때문이다.
변수의 이름은 짧을수록 좋지만, 약간 길더라도 용도를 알기 쉽게 '의미있는 이름'으로 하는 것이 바람직하다. 변수의 선언문에 주석으로 변수에 대한 정보를 주는 것도 좋은 생각이다.
int curPos = 0; //현재 위치(current position)
int lastPos = -1; //마지막 위치(last position)
변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택하면 된다.
자료형은 크게 기본형과 참조형 두 가지로 나눌 수 있는데, 기본형 변수는 실제 값(data)을 저장하는 반면, 참조형 변수는 어떤 값이 저장되어 있는 주소(address)를 값으로 받는다.
기본형(primitive type)
참조형(reference type)
참조형 변수(또는 참조변수)를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입이 된다. 그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.
- 변수의 타입이 기본형이 아닌 것들은 모두 참조변수이다.
다음은 Date클래스 타입의 참조변수 today를 선언한 것이다.
참조변수는 null 또는 객체의 주소를 값으로 갖으며 참조변수의 초기화는 다음과 같다.
Date today = new Date(); //Date객체를 생성해서, 그 주소를 today에 저장
객체를 생성하는 연산자 new의 결과는 생성된 객체의 주소이다. 이 주소가 대입연산자 '='에 의해서 참조변수 today에 저장되는 것이다. 이제 참조변수 today를 통해서 생성된 객체를 사용할 수 있게 된다.
|참고| 참조형 변수는 null 또는 객체의 주소(4byte, 0x0~0xFFFFFF)를 값으로 갖는다. null은 어떤 객체의 주소도 저장되어 있지 않음을 뜻한다.
단, JVM이 32bit가 아니라 64bit라면 참조형 변수의 크기는 8byte가 된다.
Q. 자료형(data type)과 타입(type)의 차이
A. 기본형은 저장할 값(data)의 종류에 따라 구분되므로 기본형의 종류를 얘기할 때는 '자료형'이라는 용어를 사용한다. 참조형은 항상 '객체의 주소'를 저장하므로, 객체의 종류에 의해 구분되므로 참조형 변수의 종류를 구분할 때는 '타입'이라는 용어를 사용한다.
'타입(type)'이 '자료형(data type)'을 포함하는 보다 넓은 의미의 용어이므로 굳이 구분하지 않아도 된다.
기본형에는 모두 8개의 타입(자료형)이 있으며, 크게 논리형, 문자형, 정수형, 실수형으로 구분된다.
분류 | 타입 |
---|---|
논리형 | boolean |
true와 false중 하나를 값으로 갖으며, 조건식과 논리적 계산에 사용, 다른 기본형과의 연산 불가능 | |
문자형 | char |
문자를 저장하는데 사용되며, 변수에 하나의 문자만 저장할 수 있음 | |
정수형 | byte, int, short, long |
정수를 저장하는데 사용되며, 주로 int가 사용. byte는 이진 데이터를 다룰 때 사용되며, | |
short는 C언어와의 호환을 위해서 추가 | |
실수형 | float, double |
실수를 저장하는데 사용되며, 주로 double이 사용 |
분류 | 1 byte | 2 byte | 4 byte | 8 byte |
---|---|---|---|---|
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
'상수'는 한 번 값을 저장하면 다른 값으로 변경할 수 없다.
반드시 선언와 동시에 초기화해야하며, 그 후부터는 상수의 값을 변경하는 것이 허용되지 않는다.
상수를 선언하는 방법은 변수와 동일하며, 단지 변수의 타입 앞에 키워드 'final'을 붙여주기만 하면 된다.
final int MAX_SPEED = 10; //상수 MAX_SPEED를 선언 & 초기화
final int MAX_SPEED; // 에러. 상수는 선언과 동시에 초기화해야 함.
final int MAX_SPEED = 10; // ok. 상수 MAX_SPEED를 선언 & 초기화
MAX_SPEED = 20; // 에러. 상수의 값은 변경할 수 없음.
상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이며, 여러 단어로 이루어져있는 경우 '_'로 구분한다.
|참고| JDK 1.6 부터 상수를 선언과 동시에 초기화되지 않아도 되며, 사용하기 전에만 초기화하면 되도록 바뀌었다. 그래도 상수는 선언과 동시에 초기화하는 습관을 들이는 것이 좋다.
우리가 기존에 알고 있던 '상수'의 다른 이름
원래 12, 123, 3.14, 'A' 와 같은 값들이 '상수'인데, 프로그래밍에서는 상수를 '값을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의하였기 때문에 '상수' 대신 '리터럴'이라는 용어를 사용한다.
변수(variable): 하나의 값을 저장하기 위한 공간
상수(constant): 값을 한 번만 저장할 수 있는 공간
리터럴(literal): 그 자체로 값을 의미
int year(변수) = 2014(리터럴);
final int MAX_VALUE(상수) = 100;
Q. 상수가 필요한 이유
A. 상수는 리터럴에 '의미있는 이름'을 붙여서 코드의 이해와 수정을 쉽게 만든다. 다른 값으로 계산할 때 여러 곳을 수정할 필요없이 상수의 초기화만 다른 값으로 해주면 된다.
- 리터럴의 접미사가 붙는 타입은 long, float, double뿐인데, double은 생략 가능하므로 long과 float의 리터럴에 접미사를 붙이는 것만 신경쓰면 된다.
- 리터럴의 접두사와 섭미사는 대소문자를 구별하지 않는다.
정수형과 실수형에는 여러 타입이 존재하므로, 리터럴에 접미사를 붙여서 타입을 구분한다.
2.
int octNum = 010; // 8진수 10, 10진수로 8
int hexNum = 0x10; // 16진수 10, 10진수로 16
int binNum = 0b10; // 2진수 10, 10진수로 2
3.
long big = 100_000_000_000L; // long big = 100000000000L;
long hex = 0xFFFF_FFFF_FFFF_FFFFL; // long hex = 0xFFFFFFFFFFFFFFFFL;
4.
float pi = 3.14f; // 접미사 f 대신 F 사용 가능
double rate = 1.618d; // 접미사 d 대신 D 사용 가능
float pi = 3.14; // 에러. float 타입 변수에 double 타입 리터럴 저장 불가
double rate = 1.618; // OK. 접미사 d 생략 가능
리터럴에 소수점이나 10의 제곱을 나타내는 기호 E 또는 e, 그리고 접미사 f, F, d, D를 포함하고 있으면 실수형 리터럴로 간주된다.
자료형 | 실수형 리터럴 | 다른 형태의 동등한 표현 |
---|---|---|
double | 10. | 10.0 |
double | .10 | 0.10 |
float | 10f | 10.0f |
float | 3.14e3f | 3140.0f |
double | 1e1 | 10.0 |
double | 1e-3 | 0.001 |
잘 쓰이지는 않지만 기호 p를 이용해서 실수 리터럴을 16진수 지수형태로 표현할 수 있다.
p는 2의 제곱을 의미하며, p의 왼쪽에는 16진수를 적고 오른쪽에는 지수를 10진수 정수로 적는다. (실수형)
0x1p1 = (1 × 16^0 ) × 2¹ = 1.0 × 2 = 2.0
0x0.2p-1 = (2 × 16^-1 ) × 2^-1 = 0.125 × 0.5 = 0.0625
0x12p3 = (1 × 16¹ + 2 × 16^0 ) × 2³ = (16 + 2) × 8 = 114.0
리터럴의 타입은 저장될 변수의 타입과 일치하는 것이 보통이지만, 타입이 달라도 저장범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다.
그러나 리터럴의 값이 변수의 타입의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장범위 넓으면 컴파일 에러가 발생한다.
int i = 'A'; // OK. 문자 'A'의 유니코드인 65가 변수 i에 저장된다.
long l = 123; // OK. int보다 long 타입이 더 범위가 넓다.
double d = 3.14f; // OK. float보다 double 타입이 더 범위가 넓다.
int i = 0x123456789; // 에러. int 타입의 범위를 넘는 값을 저장
float f = 3.14; // 에러. float 타입보다 double 타입의 범위가 넓다.
문자열은 '문자의 연속된 나열'이라는 뜻이며, 영어로 'string'
'A'와 같이 작은따옴표로 문자 하나를 감싼 것을 '문자 리터럴'이라고 한다.
두 문자 이상은 큰 따옴표로 감싸야 하며 '문자열 리터럴'이라고 한다.
char 타입의 변수는 '단 하나의 문자'만 저장할 수 있으므로, 여러 문자(문자열)을 저장하기 위해서는 String 타입을 사용해야 한다.
문자열 리터럴은 빈 문자열을 허용하지만 문자 리터럴은 반드시 ''안에 하나의 문자가 있어야 한다.
String str = ""; // OK. 내용이 없는 빈 문자열
char ch = ''; // 에러. ''안에 반드시 하나의 문자가 필요
char ch = ' '; // OK. 공백 문자(blank)로 변수 ch를 초기화
원래 String은 클래스이므로 아래와 같이 객체를 생성하는 연산자 new를 사ㅏ용해야 하지만 특별히 위와 같은 표현도 허용한다.
String name = new String("JAVA"); //String 객체를 생성