1. 변수
1.1 변수(variable)란
1.2 변수의 선언
- 변수를 사용하기 위해서는 먼저 변수 선언
- 변수가 선언되면 메모리에 변수의 타입에 알맞은 크기의 저장공간이 확보되어, 값을 저장할 준비
변수 선언
변수타입 변수이름;
int number; // 정수형 변수 number를 선언한다.
- 변수타입은 변수에 담을 값의 종류와 범위를 충분히 고려하여 결정
- 변수를 사용하기에 앞서 적절한 값을 저장해주는 것이 필요
변수의 초기화
// 정수형 변수 number 선언, 변수의 값 10으로 초기화
int number = 10;
int number;
number = 10;
콤마의 사용
int a;
int b;
int x=0;
int y=0;
//
int a, b;
int x=0, y=0;
참고| 지역변수는 사용되기 전 초기화를 반드시 해야하지만 클래스변수와 인스턴스 변수는 초기화를 생략할 수 있다.
1.3 명명규칙(naming convention)
명명규칙
변수의 이름, 메서드의 이름, 클래스의 이름 등 모든 이름을 짓는 데는 반드시 지켜야 할 공통적인 규칙
- 대소문자가 구분, 길이 제한 X
True와 true는 서로 다른 것으로 간주
- 예약어 사용 X
true는 예약어라서 사용 X, True는 사용 가능
- 숫자로 시작해서는 안 된다
top10은 가능, 7up은 불가능
- 특수문자는 '_'와 '$'만 허용
참고| 예약어는 키워드(keyword) 또는 reserved word라고 하는데, 프로그래밍언어의 구문에 사용되는 단어
자바프로그래머 권장규칙
- 클래스의 이름의 첫 글자는 대문자
변수와 메서드의 이름의 첫 글자는 항상 소문자로 한다
- 복합어는 단어경계의 첫글자를 대문자
ex)lastIndexOf, StringBuffer
- 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.
ex) PI, MAX_NUMBER
2. 변수의 타입
- 모든 변수에는 타입(type, 형)이 있으며, 변수의 타입에 따라 저장할 수 잇는 값의 종류와 범위가 달라진다.
- 변수를 선언할 때 저장하고자 하는 값을 고려하여 가장 알맞은 타입을 선택
변수의 타입
기본형(primitive type)
- 실제 값(data) 저장
- boolean, char, byte, short, int, long, float, double
참조형(Reference type)
- 값이 저장되어 있는 주소
- 객체의 주소를 저장
참고| 참조형 변수는 null 또는 객체의 주소(4byte)를 갖는다
- 참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 변수의 타입
- 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈
클래스이름 변수명; // 타입이 클래스 이름인 것들은 모두 참조변수이다.
Date today;
Date today = null
|
Date today = new Date();
- 객체를 생성하는 연산자 new의 연산결과는 생성된 객체의 주소
- 새로 생성된 객체의 주소가 대입연사자 '='에 의해 참조변수 today에 저장
- 참조변수 today를 통해서 생성된 객체 사용
2.1 기본형(primitive type)
논리형(boolean)
- ture | false
- 조건식과 논리적 계산에 사용
문자형(char)
char c1 = 'A';
// java에서는 ''는 character형, ""은 String형을 의미
String s1 = "A";
// char c1 = ''; // error
// char타입의 기본값인 널 문자 (\u0000)가 있지만
// 일반적으로 기본값 대신 공백으로 초기화
char c1 = ' ';
String s1 = null; // s1은 reference variable이므로 null로 초기화 할 수 있다.
String s2 = ""; // 그러나 String은 일반적으로 빈 물자열로 초기화
정수형
- 정수 값 저장
- 주로 사용되는 것은 int와 long
- byte는 이진 데이터, short는 C언어와의 호환위해 추가
실수형
2.2 논리형 boolean
- true와 false 중 하나 저장
- 기본값(default) false
- 1byte
참고| 데이터를 다루는 최소단위가 1byte
2.3 문자형 char
- 2byte (유니코드 문자체계 사용)
- 16진수로 0000부터 ffff까지, 문자를 표현하는데 65536개 코드 사용
char firstLetter = 'A';
|
char firstLetter = '\u0041';
- char ch = 'A';가 수행되면 char형 변수 ch에는 문자 'A'의 유니코드인 65가 저장된다. 변수에 문자를 저장하는 것 같지만 실제로는 정숫값(유니코드)이 저장되는 것이다. 즉 모든 데이터는 숫자로 저장된다.
- println()은 변수의 값을 출력할 때 변수의 타입이 정수형이면 정숫값을 그대로 출력하고, char형이면 정숫값에 해당하는 문자를 찾아서 출력
String 클래스
- char형 변수는 단 하나의 문자 밖에 저장할 수 없기 때문에, 여러 문자를 저장하기 위해서는 String 클래스 사용
char ch = 'J';
String name = "Doo";
- 원래 String은 클래스이므로 String name = new String("Doo");와 같이 연산자 new를 사용해야 하지만, 특별히 위와 같은 표현도 허용
덧셈 연산자
- 덧셈 연산자(+)의 피연산자 중 어느 한 쪽이 String이면, 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String을 결합 (형변환 casting)
"" + 7 === "7"
7 + "" === "7"
7 + " " === "7 "
" " + 7 === " 7"
7 + "7" === "77"
7 + 7 + "" === "14"
"" + 7 + 7 === "77"
true + "" === "true"
null + "" === "null"
- 덧셈 연산은 왼쪽에서 오른쪽의 방향으로 연산 수행하기 때문에 결합순서에 따라 결과가 달라짐
2.4 정수형 byte, short, int, long
종류
- byte 1 -128~127
- short 2 -32,768~32,767
- int 4 –2,147,483,648 ~ 2,147,483,647
- 기본 자료형(default data type)
- byte나 short는 값의 범위가 작은편이라 연산 시 범위를 넘어 잘못된 결과를 얻기 쉽다.
- JVM의 피연산자 스택(operand stack)이 피연산자를 4byte단위로 저장하기 때문에, 크기가 4byte보다 작은 자료형의 값을 계산할 때는 4byte로 변환하여 연산 수행
- long 8
byte b = 1;
short s = 2;
int finger = 10;
long big = 100000000000L // long타입의 리터럴에는 접미사 L을 붙여야 한다.
참고| long타입의 리터럴에는 접미사 'L' 또는 'l'(소문자)을 반드시 붙여야한다. 리터럴에 접미사가 붙어있지 않으면 int 타입으로 간주. 'l'은 숫자 '1'과 혼동할 수 있으므로 'L'사용
참고| 그 자체로 데이터인 것을 '리터럴(literal)'이라고 한다. 예를 들어 'A', "AB", 123.
8진수, 16진수 수
- 8진수 010 === 8
- 16진수 0x10 === 16
부호자리(msb)
오버플로우(overflow)
2.5 실수형 float, double
부동소수점 방식(floating-point)
±a×10^n
- a: 가수(mentissa), 0≦a<1 실수
- n: 지수(exponent)
ex) 3.1415 = 0.31415×10^1
float
- 4byte: S(1)+E(8)+M(23)
- 접미사 f,F (float pi = 3.14f;)
double
- 8byte: S(1)+E(11)+M(52)
- 값의 범위가 더 넓고, 정밀도도 높다.
- 접미사 d,D (생략가능)
3. 형변환
3.1 형변환(캐스팅, casting)
- 모든 연산은 기본적으로 같은 타입의 피연산자(operand)간에만 수행.
- 서로 다른 타입의 피연산자간의 연산을 수행해야하는 경우, 연산을 수행하기 전 형변환을 통해 같은 타입으로 변환.
형변환: 변수 또는 리터럴의 타입을 다른 타입으로 변환하는 것
3.2 형변환 방법
- 기본형과 참조형 모두 형변환이 가능하지만, 기본형과 참조형 사이에는 형변환이 성립되지 않는다.
- 기본형은 기본형으로만, 참조형은 참조형으로만 형변환 가능
참고| JDK1.5부터 오토박싱(autoboxing) 기능이 추가되어, 기본형을 Object 클래스나 wrapper 클래스 같은 참조형으로 형변환할 수 있게 되었다.
형변환 방법
형변환하고자 하는 변수나 리터럴 앞에 변환하고자 하는 타입을 괄호와 함께 붙여준다.
(타입)피연산자
int score = (int)85.4; // double형 값을 int형으로 변환하여 score에 85가 저장된다.
byte b = (byte)score; // score에 저장된 값을 byte형으로 변환하여 b에 저장
- 캐스트 연산자(형변환 연산자)
변환(casting)에 사용하는 괄호
- 캐스트 연산자는 피연산자의 값을 읽어서 지정된 타입으로 형변환하고 그 결과를 반환
- 피연산자는 형 변환 후에도 아무런 변화가 없다.
3.3 기본형의 형변환
- 8개의 기본형 중에서 boolean을 제외한 나머지 7개의 기본형 간에는 서로 형변환이 가능.
- 각 자료형마다 표현할 수 있는 값의 범위가 다르기 때문에 범위가 큰 자료형에서 범위가 작은 자료형으로의 변환은 값 손실이 발생할 수 있다.
- 실수형->정수형에서는 소수점 이하의 값은 버려지게 된다.
- 원칙적으로는 모든 형변환에 캐스트연산자를 이용한 형변환이 이루어져야 하지만, 값의 표현범위가 작은 자료형에서 큰 자료형의 변환은 값의 손실이 없으므로 캐스트 연산자 생략 허용
- 반면에 값의 표현범위가 큰 자료형에서 작은 자료형으로의 변환은 값이 손실될 가능성(possible loss of precision)이 있으므로, JVM이 자동적으로 형변환하지 않고 프로그래머에게 캐스트 연산자를 이용하여 명시적으로 형변환하도록 강요하고 있다(컴파일 에러 발생)
