2.1 변수선언
변수는 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름. 변수를 통해 프로그램은 메모리 번지에 값을 저장하고 읽을 수 있다.
변수 = 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름
자바의 변수는 다양한 타입의 값을 저장할 수 없다. 즉, 정수형 변수에는 정수값만 저장할 수 있고, 실수형 변수에는 실수 값만 저장할 수 있다.
정수형 변수 = 정수값 ( 하나의 값만 저장 가능)
실수형 변수 = 실수값 ( 하나의 값만 저장 가능)
변수를 사용하려면 변수 선언이 필요한데, 변수 선언은 어떤 타입의 데이터를 저장할 것인지 그리고 변수 이름이 무엇인지 결정하는 것이다.
타입 이름
int age // 정수 (int) 값을 저장할 수 있는 age 변수 선언
double value // 실수 (double) 값을 저장할 수 있는 value 변수 선언
변수 이름은 첫 번째 글자가 문자여야 하고, 중간 부터는 문자, 숫자, $, _를 포함할 수 있다. 또한, 첫 문자를 소문자로 시작하되 캐멀 스타일로 작성하는 것이 관례임.
| 캐멀(camel) 스타일 낙타의 등처럼 대소문자가 섞여 있도록 작성하는 스타일을 말함. 자바 소스 파일명과 변수명을 작성할 때 관례적으로 사용. 1. 자바 소스 파일명(클래스명)은 대문자로 시작하는 것이 관례 Week.java MemberGrade.java ProductKind.java 2. 변수명은 소문자로 시작하는 것이 관례 score mathScore sportsCar |
변수가 선언되었다면 값을 저장할 수 있는데, 이때 대입 연산자인 =를 사용한다. 자바에서는 우측 값을 좌측 변수에 대입하는 연산자로 사용함.
int score; // 변수 선언
score = 90; // 값 대입
변수 선언은 저장되는 값의 타입과 이름만 결정한 것이지, 아직 메모리에 할당된 것은 아니다. 변수에 최초로 값이 대입될 때 메모리에 할당되고, 해당 메모리에 값이 저장된다.
변수에 최초로 값을 대입하는 행위를 변수 초기화라고 하고, 이때의 값을 초기값이라고 한다. 초기 값은 다음과 같이 변수를 선언함과 동시에 대입할 수도 있다.
int score = 90; // 변수 초기화
초기화되지 않은 변수는 아직 메모리에 할당되지 않았기 때문에 변수를 통해 메모리 값을 읽을 수 없다. 따라서 다음은 잘못된 코딩이다.
int value; // 변수 value 선언
int result = value + 10; // 변수 value 값을 읽고 10을 더해서 변수 result에 저장
변수 value가 선언되었지만, 초기화되지 않았기 때문에 value + 10에서 value 변수값은 읽어올 수 없다. 따라서 위 코드는 다음과 같이 변경해야 한다.
int value = 30; // 변수 valuer 30으로 초기화
int result = value + 10; // 변수 value (30)값을 읽고 10을 더해서 변수 result에 저장
초기화 되지 않은 변수를 연산식에 사용할 경우 컴파일 에러(The local variable value may not have been initialized)가 발생하는 것을 보여준다.
package ch02.sec01;
public class VariableInitializationExample {
public static void main(String[] args) {
int value;
int result = value + 10; // 빨간 줄은 컴파일 오류를 표시한 것임.
System.out.println(result);
}
}
package ch02.sec01;
public class VariableUseExample {
public static void main(String[] args) {
int hour = 3;
int minute = 5;
System.out.println(hour + "시간 " + minute + "분");
int totalMinute = (hour*60)+minute;
System.out.println("총 "+totalMinute+"분");
}
}
| 실행결과 |
| 3시간 5분 총 185분 |
변수는 또 다른 변수에 대입되어 메모리 간에 값을 복사할 수 있다. 다음 코드는 변수 x값을 변수 y값으로 복사한다.
int x = 10;
int y = x;
package ch02.sec01;
public class VariableExchangeExample {
public static void main(String[] args) {
int x = 3;
int y = 5;
System.out.println("x:" + x + ", y:" + y);
int temp = x;
x = y;
y = temp;
System.out.println("x:" + x + ", y:" + y);
}
}
| 실행 결과 |
| x: 3, y: 5 x: 5, y: 3 |
2.2 정수 타입
변수는 선언될 때의 타입에 따라 저장할 수 있는 값의 종류와 허용 범위가 달라진다. 자바는 정수, 실수, 논리값을 저장할 수 있는 기본 타입 8개를 다음과 같이 제공한다.
| 값의 분류 | 기본 타입 | |
| 정수 | byte, char, short, int, lon | |
| 실수 | float, double | |
| 논리 (true, false) | boolean | |
정수 타입은 총 5개로, 다음과 같이 메모리 할당 크기와 저장되는 값의 범위를 가지고 있다.
| 타입 | 메모리 크기 | 저장되는 값의 허용 범위 | ||
| byte | 1byte | 8bit | -128 ~ 128 | |
| short | 2byte | 16bit | -32,768 ~ 32,768 | |
| char | 2byte | 16bit | 0 ~ 65535 (유니코드) | |
| int | 4byte | 32bit | -2,147,483,648 ~ 2,147,483,647 |
|
| long | 8byte | 64bit | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
1byte = 8bit, bit는 0과 1이 저장되는 단위를 말함.
각 타입에 저장되는 값의 허용 범위를 모두 외울 필요는 없지만 메모리 할당 크기는 알고 있는 것이 좋다.
| 종류 | byte | short | int | long |
| 크기 (단위 bit) | 8 | 16 | 32 | 64 |
다음 예제는 byte 타입 변수에 허용 범위를 초과한 값을 대입했을 경우 컴파일 오류가 발생하는 것을 보여준다.
package ch02.sec02;
public class ByteExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
byte var1 = -128;
byte var2 = -30;
byte var3 = 0;
byte var4 = 30;
byte var5 = 127;
byte var6 = 128; // 컴파일 에러(Type mismatch: cannot convert from int to byte
System.out.println(var1);
System.out.println(var2);
System.out.println(var3);
System.out.println(var4);
System.out.println(var5);
System.out.println(var6);
}
}
long 타입은 수치가 큰 데이터를 다루는 프로그램에서 사용 됨. 은행이나 과학 분야에서 사용되는 프로그램들임. 기본적으로 컴파일러는 정수 리터럴을 int 타입 값으로 간주하기 때문에, int 타입의 허용 범위 ( -2,147,483,648 ~ -2,147,483,647)를 초과하는 리터럴(코드에서 프로그래머가 직접 입력한 값을 리터럴이라고 함.)은 뒤에 소문자 'l' 이나 대문자 'L'을 붙여 long 타입 값임을 컴파일러에게 알려줘야 한다.
package ch02.sec02;
public class LongExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
long var1 = 10;
long var2 = 20L;
long var3 = 1000000000000; // 컴파일러는 int로 간주하기 때문에 에러 발생
long var4 = 1000000000000L;
System.out.println(var1);
System.out.println(var2);
System.out.println(var4);
}
}
2.3 문자 타입
하나의 문자를 작은 따옴표(')로 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 유니코드로 변환 되어 저장하는데, 유니코드는 세계 각국의 문자를 0~65535 숫자로 매핑한 국제 표준 규약이다. 자바는 이러한 유니코드를 저장할 수 있도록 char 타입을 제공한다.