Chapter .02 변수와 타입
2.1 변수
2.1.1 변수란?
변수란, 하나의 값을 저장할 수 있는 메모리 공간이다.
2.1.2 변수의 선언
변수를 사용하기 위해서는 먼저 변수를 선언해야 한다.
어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지를 결정한다.
int age; //정수(int)값을 저장할 수 있는 age 변수 선언
double value; //실수(double)값을 저장할 수 있는 value 변수 선언
같은 타입의 변수는 콤마(,)를 이용해서 한꺼번에 선언할 수도 있다.
int x,y,z;
변수 이름은 메모리 주소에 붙여진 이름이다.
프로그램은 변수 이름을 통해서 메모리 주소에 접근하고, 그곳에 값을 저장하거나 그곳에 있는 값을 읽는다.
변수이름은 자바에서 정한 명명 규칙을 따라야 한다.
자바는 예약어를 가지고 있다.
예약어로 변수 이름을 지정하면 컴파일 에러가 발생하기 때문에 주의해야 한다.
분류 | 예약어 |
기본 데이터 타입 | boolean, byte, char, shor, int, long, float, double |
접근 지정자 | private, protected, public |
클래스와 관련된 것 | class, abstract, interface, extends, implements, enum |
객체와 관련된 것 | new, instanceof, this, super, null |
메소드와 관련된 것 | void, return |
제어문과 관련된 것 | if, else, switch, case, default, for, do, while, break, continue |
논리값 | true, false |
예외 처리와 관련된 것 | try, catch, finally, throw, throws |
기타 | transient, volatile, package, import, synchronized, native, final, static, strictfp, assert |
2.1.3 변수의 사용
변수값 저장
int score; //변수의 선언
score = 90; //값 저장
초기값은 변수의 선언과 동시에 줄 수도 있다.
int score = 90;
변수의 초기값은 코드에서 직접 입력하는 경우가 많은데, 소스 코드 내에서 직접 입력된 값을 리터럴(literal)이라고 부른다.
리터럴은 값의 종류에 따라 정수 리터럴, 실수 리터럴, 문자 리터럴, 논리 리터럴로 구분된다.
|정수 리터럴|
소수점이 없는 정수 리터럴은 10진수로 간주한다.
0, 75, -100
0으로 시작되는 리터럴은 8진수로 간주한다.
02, -04
0x 또는 0X로 시작하고 0~9 숫자나 A, B, C, D, E, F 또는 a, b, c, d, e, f로 구성된 리터럴은 16진수로 간주한다.
0x5, 0xA, 0xB3, 0xAC08
|실수 리터럴|
소수점이 있는 리터럴은 10진수 실수로 간주한다.
0.25, -3.14
대문자 E 또는 소문자 e가 있는 리터럴은 10진수 지수와 가수로 간주한다.
5E7 //5 X 10의 7승
0.12E-5 //0.12 X 10의 -5승
실수 리터럴을 저장할 수 있는 타입은 float, double이 있다.
|문자 리터럴|
작은 따옴표(')로 묶은 텍스트는 하나의 문자 리터럴로 간주한다.
'A' , '한' , '\t', '\n'
역슬래쉬(\)가 붙은 문자 리터럴은 이스케이프(excape) 문자라고도 하는데, 당므과 같이 특수한 용도로 사용된다.
이스케이프 문자 | 용도 | 유니코드 |
'\t' | 수평 탭 | 0x0009 |
'\n' | 줄 바꿈 | 0x000a |
'\r' | 리턴 | 0x000d |
'\"' | "(큰따옴표) | 0x0022 |
'\'' | '(작은따옴표) | 0x0027 |
'\\' | \ | 0x005c |
'\u16진수' | 16진수에 해당하는 유니코드 | 0x0000 ~ 0xffff |
문자 리터럴을 저장 할 수 있는 타입은 char 하나 뿐이다.
|문자열 리터럴|
큰따옴표(")로 묶은 텍ㄷ스트는 문자열 리터럴로 간주한다.
큰따옴표안에는 텍스트가 없어도 문자열 리터럴로 간주된다.
문자열 리터럴 내부에서도 이스케이프 문자를 사용할 수 있다.
"대한민국"
"탭 만큼 이동 \t 하려 합니다."
"한줄 내려 쓰기 \n 합니다."
문자열 리터럴을 저장 할 수 있는 타입은 String 하나 뿐이다.
|논리 리터럴|
true와 false는 논리 리터럴로 간주한다.
true, false
논리 리터럴을 저장할 수 있는 타입은 boolean 하나 뿐이다.
변수값 읽기
변수는 초기화가 되어야 읽을 수 있고, 초기화 되지 않은 변수는 읽을 수가 없다.
잘못된 코딩 예
int value; //변수 value 선언(초기화 안됨)
int result = value + 10; //변수 value의 값을 읽고 10을 더한 값을 result에 저장
변수 value가 선언 되었지만 초기화 되지 않았기 때문에 산술 연산식 value + 10에서 사용할 수 없다.
맞게 고친 후 코드
int value = 30;
int result = value + 10;
2.1.4 변수값 읽기
변수는 중괄호 { } 블록 내에서 선언되고 사용된다.
중괄호 블록을 사용하는 곳은 클래스, 생성자, 메소드인데 클래스와 생성자는 클래스를 학습할떄 살펴보도록 하고, 지금은 모든 변수는 메소드 블록 내에서 존재한다고 생각하자.
따라서 변수를 선언 할 때에는 변수가 어떤 범위에서 사용될 것인지를 생각하고, 선언 위치를 결정해야 한다.
2.2 데이터 타입
모든 변수에는 타입이 있으며, 타입에 따라 젖아 할 수 있는 값의 종류와 범위가 달라진다.
변수를 선언할 때 주어진 타입은 변수를 사용하는 도중에 변경할 수 없다.
따라서 변수를 선언할 떄 어떤 타입을 상요할지 충분히 고려해야 한다.
2.1.1 기본(primitive) 타입
기본 타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입을 말한다.
2.2.2 정수 타입(byte, char, short, int, long)
정수 타입에는 모두 5개의 타입이 있으며 저장 할 수 있는 범위가 서로 다르다.
2.2.3 실수 타입(float, double)
실수 타입은 소수점이 있는 실수 데이터를 저장할 수 있는 타입으로, 메모리 사용 크기에 따라 float과 double이 있다.
2.2.4 논리 타입(boolean)
논리 타입은 1byte(8bit)로 표현되는 논리값(true/false)를 저장 할 수 있는 데이터 타입이다.
boolean 타입은 두가지 상태값을 저장 할 필요성이 있을 경우에 사용되며, 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 이용된다.
2.3 타입 변환
타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.
예를들어 byte 타입을 int 타입으로 변환 하거나 반대로 int 타입을 byte 타입으로 변환하는 행위를 말한다.
타입 변환에는 두가지 종류가 있다.
하나는 자동(묵시적) 타입 변환이고, 다른 하나는 강제(명시적) 타입 변환이다.
2.3.1 자동 타입 변환
자동 타입 변환(Promotion)은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.
자동 타입 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.
큰 크기 타입과 작은 크기 타입을 구분은 사용하는 메모리 크기이다.
예를 들어 byte 타입은 1byte크기를 가지고, int 타입은 4byte 크기를 가지므로 int 타입이 큰 크기 타입이고, byte 타입이 작은 크기 타입이다.
byte byteValue = 10;
int intValue = byteValue; //자동 타입 변환이 일어난다.
byteValue는 byte 타입 변수이므로 1byte의 크기를 가진다.
그리고 intValue는 int 타입 변수이므로 4byte의 크기를 가진다.
따라서 byte 타입 byteValue는 int 타입 intValue로 자동 타입 변환된다.
2.3.2 강제 타입 변환
큰 크기의 타입은 작은 크기의 타입으로 자동 타입 변환을 할 수 없다.
예르르 들어 4byte인 int 타입을 1byte인 byte 타입에 담을 수 없다.
마치 큰 그릇의 물을 작은 그릇 안에 모두 넣을 수 없는 것 과 동일한 이치이다.
하지만 큰 그릇을 작은 그릇 사이즈로 쪼개어 한 조각만 작은 그릇에 넣는다면 가능하다.
즉 int 타입을 4개의 byte로 쪼갠 다음, 끝에 있는 1byte만 byte 타입의 변수에 저장 하는 것은 가능하다.
이와 같이 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어 저장 하는 것을 강제 타입 변환(캐스팅:Casting)이라고 한다.
강제 타입 변환은 캐스팅 연산자 ( )를 이용한다.
int intValue = 103029770;
byte byteValue = (byte)intValue; //강제 타입 변환(캐스팅)
끝 1byte만 byte 타이 ㅂ변수에 담게 되므로 원래 int 값은 보존되지 않는다.
하지만 int 값이 끝 1byte로만 표현 가능 하다면 byte 타입으로 변환해도 같은 값이 유지될 수 있다.
이럴 경우에 강제 타입 변환이 의미 있게 된다.
2.3.3 연산식에서의 자동 타입 변환
연산은 기본적으로 같은 타입의 피연산자(operand) 간에만 수행되기 때문에 서로 다른 타입의 피연산자가 있을 경우 두 피연산자 중 크기가 큰 타입으로 자동 변환도니 후 연산을 수행한다.
예를 들어 int 타입 피연산자와 dobule 타입 피연산자를 덧셈 하면 먼저 int 타입 피연산자가 double 타입으로 자동 변환 되고 연산을 수행한다. 당연히 결과는 double 타입이 된다.
int type으로 계산 결과를 얻고 싶다면 double 타입을 int 타입으로 강제 변환하고 덧셈을 수행하면 된다.
int intValue = 10;
double doubleValue = 5.5;
int result = intValue + (int)doubleValue; //result에 int형 15가 저장