변수
변수란, 단 하나의 값을 저장할 수 있는 메모리 공간이다.
변수를 선언하면, 메모리의 빈 공간에 '변수타입'에 알맞은 크기의 저장공간이 확보되고,
앞으로 이 저장공간은 '변수이름'을 통해 활용할 수 있다.
변수를 선언하면 메모리는 여러 프로그램이 공유하는 자원이므로 다른 프로그램에 의해 저장된 알 수 없는 쓰레기 값이 남아있을 수도 있다. 그래서 변수는 사용되기 전 적절한 값으로 초기화 하는 것이 좋다.
지역변수는 사용하기 전에 초기화를 반드시 하지만 클래스 변수와 인스턴스 변수는 초기화를 생략할 수 있다.
변수를 선언할 때는 저장하려는 값의 특성을 고려하여 가장 알맞은 자료형을 변수의 타입으로 선택한다.
자료형은 크게 '기본형' 변수 8가지와 그 외 '참조형' 변수로 나눈다.
그러면 기본형과 참조형의 차이는 무엇일까?
- 기본형 변수는 실제 값, 즉 데이터를 저장한다.
- 참조형 변수는 어떤 값이 저장되어 있는 주소(4 byte 크기의 정수)를 값을 저장한다. 8개의 기본형을 제외한 나머지 타입이다.
리터럴
int age=23; //23이 리터럴
String name="kim"; //"kim"이 리터럴
리터럴은 단어 의미 그대로 그 자체로 값을 의미한다.
리터럴에도 변수의 타입처럼 타입이 있다.
정수형과 실수형에는 여러 타입이 존재하므로, 리터럴에 접미사를 붙여서 타입을 구분한다.
- long타입의 리터럴에 접미사 'l' 또는 'L'을 붙이고, 접미사가 없다면 int 타입의 리터럴이다. ex 10L, 100L, 10, 100
- byte와 short타입의 리터럴은 별도로 존재하지 않으며, 그냥 int 타입의 리터럴을 사용한다.
- 10진수 외에도 2, 8, 16진수로 표현된 리터럴을 변수에 저장할 수 있으며,
- 16진수라는 것을 나타내기 위해 리터럴 앞에 접두사 '0x', '0X'를 추가한다.
- 8진수의 경우에는 '0'을 붙인다.
int octNum=010; //8진수 10, 10진수로 8
int hexNum=0x10; //16진수, 10진수로 16
int binNum=0b10; //2진수, 10진수로 2
JDK1.7 부터는 정수형 리터럴의 중간에 구분자'_'를 넣을 수 있게 되어서 큰 숫자를 편하게 읽을 수 있다.
long big=1000_000_000_000;
long hex=0xFFFF_FFFF_FFFF_FFFFL;
실수형에서는 float타입의 리터럴에 접미사 'f' 또는 'F'를 붙이고, double 타입의 리터럴에는 접미사 'd' 또는 'D'를 붙인다.
float pi= 3.14f;
double rate= 1.618d;
정수형에서는 int가 기본 자료형인 것처럼 실수형에서는 double이 기본 자료형이라서 접미사 'd'는 생략이 가능하다.
실수형 리터럴인데, 접미사가 없으면 double 타입 리터럴이라는 것이다.
float pi=3.14; //에러. 이 부분에서 정말 많이 배웠다고 생각.. float 타입 변수에 double 타입 리터럴 저장 불가
double rate= 1.618; //리터럴 접미사 d는 생략가능
문자열 리터럴
덧셈 연산자 +는 피연산자가 모두 숫자일 때는 두 수를 더하지만,
피연산자 중 어느 한쪽이 String이면 나머지 한 쪽을 먼저 String으로 변환한 다음 두 String으로 결합한다.
기본형과 참조형의 구별 없이 어떤 타입의 변수도 문자열과 덧셈연산을 수행하면 그 결과가 문자열이 되는 것이다.
예를 들어 7 + "7"을 진행하면 "77"이 결과물로 리턴된다.
문자형 char
char ch = 'A'; //해당 문자 유니코드 값인 65가 저장된다.
System.out.println(ch+1); //값이 66이 나온다.
위 문장은 변수에 문자가 저장되는 것 같지만, 사실은 문자가 아닌 문자의 유니코드(정수)가 저장된다.
컴퓨터는 숫자밖에 모르므로 모든 데이터를 숫자로 변환하여 저장하는 것이다.
문자 'A'의 유니코드는 65이므로, 변수 ch에는 65가 저장된다.
만약 어떤 문자의 유니코드를 알고 싶다면 char형의 변수를 int로 캐스팅을 해주면 된다.
int code=(int)ch;
문자를 코드로 변환하는 것을 문자 인코딩, 코드를 문자로 변환하는 것을 문자 디코딩이라고 한다.
형변환
- 기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.
- 기본형과 참조형간의 형변환은 불가능하다.
- 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만,
- 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
댓글