2-1. 자료형
💡 데이터를 저장하려면 메모리에 값을 저장할 공간을 생성하고 이름을 부여해야 함
- 변수 : 메모리 공간에 부여하는 이름
// 자료형 변수명
int a; // a는 int형 변수
String b; // b는 String형 변수
주의해야 할 점
- 자료형은 반드시 사용하기 전에 선언 해야 한다.
- 자료형은 반드시 한 번만 선언 해야 한다
💡 변수에 한 번 지정된 자료형을 바꿀 수 없는 이유?
변수의 자료형이 처음 선언되면 메모리에는 선언된 자료형의 데이터만 저장할 수 있는 공간이 만들어지는데, 메모리에서 한 번 만들어진 공간은 사라질 수는 있어도 데이터를 저장하는 기능은 변경할 수 없기 때문
변수 사용하기
- 변수의 선언과 동시에 값 대입
- // 자료형 변수명 = 값; int a = 3;
- 변수 선언과 값 대입 분리하기
- // 자료형 변수명; // 변수명 = 값; int a; a = 3;
// 요약
public class Example1 {
public static void main(String[] args) {
// 변수 = 기억장소 이름
int a; // 변수 선언
a = 0; // 변수 초기화
int b = 0; // 변수 선언과 초기화
int i=0, j=0, k=0; // 한꺼번에 선언과 초기화
a = a+ 5; i = a + 20; j = a - 20;
System.out.println("a="+a);
System.out.print("i="+i+"\\n");
System.out.printf("j=%d",j);
}
2-2. 변수 이름 짓기
- 이름 지을 때 필수 사항
- 영문 대소 문자와 한글을 사용할 수 있다.
- 특수 문자는 밑줄(_)과 달러($)표기만 사용할 수 있다.
- 아라비아 숫자를 사용할 수 있다. 단, 첫 번째 글자로는 사용할 수 없다.
- 자바에서 사용하는 예약어는 사용할 수 없다.
- 변수 명을 지을 때 권장 사항
- 영문 소문자로 시작한다.
- 영문 단어를 2개 이상 결합할 때는 새로운 단어의 첫 글자를 대문자로 한다.
- 낙타표기법 : 이름은 소문자로 시작하고 새로운 단어를 결합할 때 의미를 파악하기 쉽도록 대문자로 시작
- 변수의 생존 기간
- 메모리에 변수가 만들어진 이후 사라지기 까지의 기간
- 변수는 선언된 시점에 생성됨
package sec1;
public class Example3 {
// 변수명 규칙
// 1. 영문 소문자로 시작
// 2. 예약어는 사용할 수 없음
// 3. 변수명 중간에 공백을 사용할 수 없음
// 4. 시작시 $ 또는 _(UnderScore)로 시작할 수 있음
// 5. 대문자와 소문자가 서로 엄격히 다르다.
// 관례
// 1. 누구나 쉽게 그 변수가 어떠한 역할을 하는지 쉽게 알 수 있도록
// 2. 여러 단어로 변수명을 정할 경우
// Snake(파스칼케이스) 방식 또는 카멜 방식으로 연결한다.
// ex1) chunjaeitcenter
// 스네이크 - chunjae_it_center
// 카멜 - chunjaeItCenter
// 3. 개발 기준서를 기준으로 접두어나 접두사를 붙여 정함
// ex1) 단순 데이터 저장일 경우 - 해당 변수는 모두 set으로 시작함
// setKim
int a, a1, $a, _a;
int Aa; // 대문자로 시작하지 않도록 유의
// int k*j; 연산자를 변수로 활용할 수 없음
// int 1a; 숫자로 시작할 수 없음
// int a b; 변수명 중간에 띄워쓰기 할 수 없음
// int class; 예약어를 변수명으로 활용할 수 없음
}
2-3. 자료형의 종류
- 메모리는 목적에 따라 3가지 영역으로 나뉨
- 첫번째 영역
- 클래스(class) 영역
- 정적(static) 영역
- 상수(final) 영역
- 두번째 영역
- 스택(stack) 영역
- 세번째 영역
- 힙(heap) 영역
- 첫번째 영역
기본 자료형과 참조 자료형의 차이
💡 기본 자료형은 스택 메모리에 생성된 공간에 실제 변숫값을 저장하는 반면, 참조 자료형은 실제 데이터 값은 힙 메모리에 저장하고, 스택 메모리의 변수 공간에는 실제 변숫값이 저장된 힙 메모리의 위칫 값을 저장한다.
기본 자료형의 메모리 크기와 저장할 수 있는 값의 범위
- 자료형의 크기가 클수록 저장하는 값의 범위도 넓어진다.
- 각 정수 자료형의 값 범위
- n개의 비트로(bit)로 표현할 수 있는 정수 = 2의 n제곱
- 1byte(=8bit) = 2의 8 제곱(=256)
- 정수는 음수, 0, 양수를 포함하므로 - 표현할 수 있는 전체 개수 중 반은 음수, 나머지 반은 0과 양수에 할당한다. ⇒ 바이트 자료형의 값 범위 -2의 7제곱 ~ 2의 7제곱 -1
public class Example6 { public static void main(String[] args) { int a = 100; int b = 0b100; // 실제 연산과 논리연산 등을 수행 // 2진수 --> 4x1 = 4 int c = 0100; // 권한 부여 및 수행, 회수 // 8진수 --> 8의 2승 = 64x1 = 64 int d = 0x100; // 실제 물리적 주소 또는 메모리 주소 // 16진수 --> 16의 2승 = 256x1 = 256 System.out.println("a = " +a); System.out.println("b = " +b); System.out.println("c = " +c); System.out.println("d = " +d); }
- 각 실수 자료형의 값 범위
- float = 4byte / double = 8byte
- 실수는 저장 방식이 부동 소수점, 즉 ‘가수X밑의 지수 제곱의 형태로 저장
- float 자료형 - 1bit, 23bit, 8bit
- double 자료형 - 1bit, 52bit, 11bit를 할당
- float = 4byte / double = 8byte
- 부울대수 자료형 - boolean
- true(참), false(거짓)의 값만 저장할 수 있는 자료형
- 자료 처리의 최소 단위가 바이트 이므로 1byte가 할당된다.
boolean a = true; boolean b = false;
- true(참), false(거짓)의 값만 저장할 수 있는 자료형
- 리터럴(Literal) : 코드에 직접 작성한 값
- 정수 자료형 - byte, short, int, long
- 정수 리터럴의 기준
- byte와 short 자료형에 저장할 수 있는 범위 내의 정숫값이 입력됐을 때
- byte, short에 저장 할 수 없는 범위의 정수 리터럴은 모두 int자료형으로 인식
- 크기에 상관없이 int, long에 정수 리터럴을 입력할 때도 int 자료형으로 인식
- 정수 리터럴의 기준
- 실수 자료형 - float, double
- 문자 자료형 - char
- char 자료형 메모리 안은 문자가 아니라 정수가 저장된 형태이므로 char에 문자에 해당하는 정숫값을 직접 입력해도 똑같은 결과를 얻을 수 있다.
- → char 자료형에 정수를 저장할 수 있는 이유
- char 자료형은 정숫값과 더불어 유니코드 값을 직접 입력 가능
- → \\u+16진수 유니코드 : 유니코드 값은 2byte, 즉 16진수 4자리로 표현해야함
public class Example5 {
public static void main(String[] args) {
byte b1 = 104;
// byte b2 = -129; 해당 표현범위보다 작음(언더플로우)
// byte b3 = 128; 해당 표현범위보다 크면(오버플로우)
char c1 = 'k';
char c2 = 0; // 언더플로우
char c3 = 65535; // 오버플로우
short s1 = 32766;
short s2 = -32768; // -32768 < -> 언더플로우
short s3 = 32767; // 32767 > -> 오버플로우
int i1 = 1000;
int i2; //
int i3;
long l1 = 9223372036854775806L;
long l2;
long l3;
float f1 = 3.4028235E37f;
float f2;
float f3;
double d1 = 1.7976931348623157E308d;
double d2;
double d3;
}
}
2-4. 기본 자료형 간의 타입 변환
- 타입변환(Type Casting) : boolean을 제외한 기본 자료형 7개는 자료형을 서로 변환할 수 있다.
- 타입 변환 방법은 단순히 변환 대상 앞에 (자료형)만 표기하면 된다.
- 정수나 실수 리터럴은 숫자 뒤에 L이나 F를 붙여 각각 long, float로 타입 변환 수행 가능
// 자료형 간의 타입 변환 방법 // 자료형 A 변수명 = (자료형 A) 값 long 변수명 = 값 + L; long 변수명 = 값 + l; float 변수명 = 값 + F; float 변수명 = 값 + f;
※ 타입 변환을 수행할 때는 저장할 수 있는 값의 범위나 종류가 달라지므로 값이 변할 수 있다.
자동 타입 변환과 수동 타입 변환
💡 자료형의 크기 byte < short/char < int < long< float < double
public class Example7 {
public static void main(String[] args) {
// byte(1)<char(2)<short(2)<int(4)<long(8)
// float(4)<double(8)
// 자동형변환(auto casting) : 해당 타입에서 크기가 같거나 더 큰 타입에 대입되었을 때 발생
int data1 = 1004; // 정수형 타입
float data2 = data1; // 실수형 타입으로 변수를 설정함으로써 타입이 변환됨
char data3 = 'K';
int data4 = data3; // 75번 유니코드 K -> 아스키코드로 변환
// 강제 형변환 : 형변환 연산자를 활용하는 형변환 -- 가능하면 안 쓰는 것이 좋다. ~ 데이터의 신빙성이 떨어지기 때문
int data5 = 2048;
byte data6 = (byte)data5; // (byte) : 형변환 연산자 --> 알 수 없는 데이터로 삽입
System.out.println("data1= " +data1);
System.out.println("data2= " +data2);
System.out.println("data3= " +data3);
System.out.println("data4= " +data4);
System.out.println("data5= " +data5);
System.out.println("data6= " +data6);
}
}
- 자동 타입 변환 : 컴파일러가 자동으로 수행업캐스팅 : 크기(범위)가 작은 자료형을 큰 자료형에 대입 → 어떠한 데이터 손실 발생 X
- 다운 캐스팅 : 큰 자료형을 작은 자료형에 대입하는 행위 → 데이터 손실이 발생할 수 있으므로 컴파일러에 따른 자동 타입 변환은 일어나지 않으며, 개발자가 직접 명시적으로 타입 변환을 수행 해야 한다.
- 수동 타입 변환 : 개발자가 직접 타입 변환 수행
- 기본 자료형 간의 연산