데이터 타입(data type): 자바에서 다룰 수 있는 데이터의 종류
1. 기본 타입: 8개
- boolean
- char
- byte
- short
- int
- long
- float
- double
- 자바는 플랫폼 독립적 언어이므로 데이터 타입의 크기가 CPU나 운영체제 등과 관계없이 항상 일정
- 다루는 값의 범위에 따라 적절한 타입을 선택
2. 레퍼런스 타입: 1개
- 한 가지이지만 용도는 3가지이다.
- 배열에 대한 레퍼런스
- 클래스에 대한 레퍼런스
- 인터페이스에 대한 레퍼런스
문자열
- 문자열은 기본 타입에 속하지 않음
- String 클래스로 문자열 표현
String toolName="JDK";
- 문자열과 기본 타입의 +연산 시 기본 타입의 값이 문자열로 바뀌고 두 문자열이 연결된 새로운 문자열 탄생
toolName+1.8
"("+3+","+5+")"
System.out.println("toolName+"이 출시됨");
변수와 선언
변수
- 데이터를 저장하는 공간
- 프로그램 실행 중에 값을 임시 저장
- 변수를 선언하면 타입 크기의 메모리가 할당 -> 프로그램 실행 중에 값을 읽고 쓰는 공간으로 활용
변수 선언
- 데이터 타입과 이름으로 변수 선언
- 같은 타입의 변수를 여러 개 선언하려면 콤마로 분리
- 변수 선언과 동시에 초깃값 지정 가능 -> "초기화"
- 변수 선언 이후에 변수에 값을 저장하고 읽을 수 있음
double area; //데이터 타입 + 변수 이름
char c1, c2, c3; //같은 유형 변수일 경우 콤마로 분리
int radius = 10; //초기화
area = radius*3.14; //변수 radius의 값을 읽고 area에 radius*3.14의 값 저장
리터럴
- 프로그램에 직접 표현한 값
- 정수, 실수, 문자, 논리, 문자열 리터럴
1. 정수 리터럴
- 10진수: 0으로 시작하지 않는 수
- 8진수: 0으로 시작하는 수
- 16진수: 0x로 시작하는 수
- 2진수: 0b로 시작하는수
int n = 15; //십진수
int m = 015; //8진수->(13)₁₀
int k = 0x15; //16진수->(21)₁₀
int b = 0b0101; //2진수->(5)₁₀
- int 타입으로 자동 컴파일됨
- long타입으로 지정하려면 숫자 뒤에 L 또는 l
long g = 24L; //24l이어도 됨
2. 실수 리터럴
- 소수점이나 지수(exponent)형태로 실수를 표현
- double 타입으로 자동 처리됨
- 숫자 뒤에 F나 f를 붙이면 float, D나 d를 붙이면 double 타입으로 변환 가능
double d = 0.1234;
double e = 1234E-4; //1234*10^(-4)=0.1234
float f = 0.1234f; //f = 0.1234로 하면 컴파일 오류
double 2 = .1234D; // .1234와 동일
3. 문자 리터럴
- (' ')로 문자를 표현
- \u 다음에 유니코드 값 사용하여 표현
char a = 'A';
char b = '글';
char c = \u0041; //'A'유니코드 값(0041)사용
char d = \uae00; //'글' 유니코드 값(ae00)사용
4. 논리 리터럴과 boolean 타입
- 논리 리터럴은 true, false 두 개 뿐
- boolean 타입 변수에 직접 치환하거나 조건문에 사용
boolean a = true;
boolean b = 10>0; //10>0이 참이므로 b = true
boolean c = 1; //타입 불일치 오류(C/C++와 달리 자바에서 true=1 아님)
while(true){...} //무한루프(while(1) 안 됨)
5. 기본 타입 이외의 리터럴
- null 리터럴
int n = null; //오류(기본 타입에 사용 불가)
String str = null; //객체 레퍼런스에 대입
- 문자열 리터럴
String str = "GOOD"; //큰따옴표로 표현
※모든 문자열은 String 클래스의 객체
+ JDK7부터 숫자에 '_' 허용 -> 가독성 증가
- 숫자 리터럴의 아무 위치에나 언더스코어('_') 허용: 컴파일러는 리터럴에서 '_'를 제외하고 처리
int price = 20_100; //price = 20100
long cardNumber = 1234_5678_1357_2468L; //1234567813572468
long controlBits = 0b10110100_01011011_10110011;
int age = 2________5; //age = 25
int x = 15_; //오류(리터럴 끝에 _ 사용 불가)
double pi = 3_.14; //오류(소수점 앞뒤에 사용 불가)
long idNum = 12344_32532_L; //오류(L/F 앞에 사용 불가)
int y = 0_x15; //오류(0x 중간이나 끝에 사용 불가)
+ JAVA 10부터 지역 변수 선언 시 타입 대신 var 키워드 사용 가능
var price = 200; //int 타입으로 결정
var name = "yourname"; //String 타입으로 결정
var pi = 3.14; //double 타입으로 결정
var point = new Point(); //Point 타입으로 결정
- 변수 선언 시 초깃값이 주어지지 않으면 오류 발생
- 지역 변수에만 사용 가능
상수
상수 선언
- final 키워드 사용
- 선언 시 초깃값 지정 -> 실행 중 값 변경 불가
final double PI = 3.141592; //상수 선언+데이터 타입+상수 이름+초깃값
타입 변환: 변수나 상수, 리터럴의 타입을 다른 타입으로 변환
1. 자동 타입 변환
- 치환문(=)이나 수식 내에서 타입이 일치하지 않을 때
- 컴파일러는 작은 타입을 큰 타입으로 자동 변환함
long m = 25; //리터럴 25는 int 타입이므로 25(작은 타입)가 long(큰 타입)으로 자동 변환
double d = 3.14*10; //실수 연산 위해 int 타입의 10이 double 타입의 10.0으로 자동 변환
2. 강제 타입 변환(캐스팅 casting)
- 개발자가 강제로 타입 변환을 지시
int n = 300;
byte b = n; //컴파일 오류(int 타입은 byte 타입으로 자동 변환 불가)
byte b = (byte)n; //() 안에 타입을 명시하여 강제 타입 변환
※강제로 타입 변환하더라도 데이터 손실 발생(byte 타입의 b에 300이 저장되지 않고 256을 뺀 나머지 44가 저장)
예제 2-2 상수 PI를 선언하고 원의 면적을 구하는 프로그램 작성
- 원주율 PI=3.14
- 원의 반지름 radius=10.0
- 원의 면적 circleArea
- 원의 면적을 출력
예제 2-3 아래 코드의 실행 결과