자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.
Type | Default | Size | Range |
---|---|---|---|
boolean | false | 1byte | false, true |
char | \u0000 | 2byte | \u0000 ~ \uffff |
byte | 0 | 1byte | -27~27-1 (-128~127) |
short | 0 | 2byte | -215~215-1 (-32768~32767 ) |
int | 0 | 4byte | -231~231-1 (약 +- 20억) |
long | 0L | 8byte | -2 63 ~ 2 63 -1 |
float | 0.0f | 4byte | 1.4*10-45 ~ 3.4*1038 |
double | 0.0 | 8byte | 4.9*10-324 ~ 1.8*10308 |
boolean 타입은 true, false 두 가지 값 중 하나를 가지므로 1bit의 정보를 나타내지만, 메모리 사용 크기는 가상 머신의 구현에 따라 다름
char은 자바에서 유니코드를 사용하므로 2byte
정수 자료형을 나타내는 경우 맨 앞자리 비트를 부호 비트로 사용하고, 남는 비트로 수를 표현
실수 자료형을 나타내는 경우 무한한 실수를 모두 표현 할 수 없기 때문에 부동 소수점 방식으로 표현
부동 소수점 방식: 가수 부분과 지수 부분을 나눠서 실수를 표현하는 방식
부동 소수점 방식을 통해 같은 메모리 크기라도 더 넓은 범위 표현
부동 수소수점 방식 이용시 지수로 표현되는 값이 0을 나타낼 수 없으므로 약간의 오차 발생
정확한 실수 계산 필요할 때는 BigDecimal
사용
import java.math.BigDecimal;
public class FloatingPoint {
public static void main(String[] args) {
double doubleNum = 0.1;
for (int i = 1; i < 10; i++) {
doubleNum += 0.1;
}
System.out.println(doubleNum);
BigDecimal bigDecimalNum = new BigDecimal("0.1");
for (int i = 1; i < 10; i++) {
bigDecimalNum = bigDecimalNum.add(new BigDecimal("0.1"));
}
System.out.println(bigDecimalNum);
}
/*
결과
doubleNum: 0.9999999999999999
bigDecimalNum: 1.0
*/
}
public class ReferenceType {
public static void main(String[] args) {
class Member {
private int id;
private String name;
public Member(int id, String name) {
this.id = id;
this.name = name;
}
}
int num = 10;
String string = "Reference Type";
int[] arr = { 0, 1, 2, 3, 4 };
Member member = new Member(1, "Kim a");
System.out.println("string: " + Integer.toHexString(string.hashCode()));
System.out.println("arr: " + arr);
System.out.println("member: " + member);
/*
결과(개별적)
string: 4f81572f
arr: [I@69222c14
member: week2.ReferenceType$1Member@606d8acf
*/
}
}
종류 | 리터럴 예 |
---|---|
논리형 | true, false |
문자형 | 'A', '1', 111, '\n' '\u0099', ' ' |
문자열 | "string", "new line\n" |
정수형 | 100, 0b0011, 077, 0x0F, 100L, 100_000_000L |
실수형 | 1.02, 1.03d, 1.04f |
//<변수 타입> <변수 이름>
int i;
=
사용해, 우측의 값을 좌측의 변수에 저장i = 5;
public class Var {
public static void main(String[] args) {
int var1 = 1;
int var2 = 2;
}
}
javap -c
로 확인해보면 선언과 초기화가 각각 진행되는 모습
...
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: return
초기화 블럭
public class Initlock{
static String classVar; // 클래스 변수
static int[] arr = new int[10] // 클래스 변수
String instanceVar; // 인스턴스 변수
static { // 클래스 초기화 블럭
classVar = "static { }";
for(intt i=0; i<arr.length; i++){
arr[i] = (int)(Math.random()*10);
}
}
{ // 인스턴스 초기화 블럭
instanceVar = "{ }";
}
}
public class Var {
static int classVar; // 클래스 변수
int instanceVar; // 인스턴스 변수, 필드, 전역 변수
void foo(int paramVar) {// 매개 변수
int localVar = 1; // 지역 변수
classVar++;
instanceVar++;
}
static void staticFoo(){
classVar++;
//instanceVar++;
//error: non-static variable df cannot be referenced from a static context
//인스턴스 변수와 스테틱 메서드의 생성시기 차이때문
}
}
변수의 종류 | 선언위치 | 생성시기 | 스코프 | 해제시기 | 메모리 |
---|---|---|---|---|---|
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 | 클래스 전역 (접근제어자에 따라 다른 클래스에서 사용 가능) | 애플리캐이션 종료할 때 | 힙 영역 or 메타 영역 (자바8 이후) |
인스턴스 변수 | 클래스 영역 | 인스턴스가 생성되었을 때 | 각 인스턴스 내부 (접근제어자에 따라 다른 클래스에서 사용 가능) | GC가 메모리 수거할 때 | 힙 영역 |
지역변수 | 클래스 영역 이외의 영역(메서드, 생성자, 초기화 블럭 내부) | 변수 선언문이 수행되었을 때 | 해당 블럭 내부 | 해당 블럭 종료할 때 | 스택 영역 |
클래스 로더가 힙 영역 or 메타 영역 (자바8 이후)에 클래스 수준의 정보를 저장할 때 저장
자바7 까지는 Permanent Generation(이하 Perm)에 저장했는데, 자바8 이후 Perm이 사라지며 Mata-Space가 등장
PermGen이 JVM이 관리하는 Heap영역에 있던 것과 달리, 메타 영역은 Native 메모리 영역에 위치하며 OS 레벨에서 관리된다
관련 상세 내용은 JEP 122: Remove the Permanent Generation, 기계인간 John Grib: JDK 8에서 Perm 영역은 왜 삭제됐을까 참고
한 공간에 저장하고 모든 인스턴스가 공유
인스턴스 생성하지 않고 사용 가능 클래스이름.클래스 변수
접근제어자에 따라 클래스이름.클래스 변수
로 다른 클래스에서 사용 가능
애플리캐이션이 종료될 때 메모리 해제
static
메서드에서 사용 불가double a = 1000.5;
int b = (int) a;
Animal dog = new Dog();
if(dog instanceof Dog){ //dog의 인스턴스 자료형이 Dog라면
Dog dog = (Dog) dog;
}
byte a = 5;
short b = a;
int c = b;
float d = c;
double e = d;
//Dog는 Animal을 상속
Animal var = new Dog();
[프리미티브 타입 변환]
Convert | Convert To: | |||||||
---|---|---|---|---|---|---|---|---|
From: | boolean | byte | short | char | int | long | float | double |
boolean | - | N | N | N | N | N | N | N |
byte | N | - | Y | C | Y | Y | Y | Y |
short | N | C | - | C | Y | Y | Y | Y |
char | N | C | C | - | Y | Y | Y | Y |
int | N | C | C | C | - | Y | Y* | Y |
long | N | C | C | C | C | - | Y* | Y* |
float | N | C | C | C | C | C | - | Y |
double | N | C | C | C | C | C | C | - |
출저: JAVA in A NUTSHELL: Table 2-4. Java Primitive Type Conversions
int[] arr; //선언(배열을 다루기 위한 참조변수 선언)
arr = new int[3]; //생성(실제 저장공간 생성)
int[] arr2 = new int[3]; //선언과 생성
//원하는 배열의 인덱스에 값 입력
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
//생성과 동시에 기본값으로 초기화
int[] arr3 = new int[]{0, 1, 2};
int[] arr4 = {0, 1, 2};
출저: programcreek
int[][] arr = new int[][]{{0, 1, 2}, {0, 1, 2}};
int[][] arr2 = {{0, 1, 2}, {0, 1, 2}};
int[][] arr3 = {
{0, 1, 2},
{0, 1, 2, 3, 4},
{0, 1, 2, 3}
};
출저: programcreek
var
로 입력시 컴파일러가 초기화 데이터를 통해 타입 추론Map<Integer, String> map1 = new HashMap<>();
var map2 = new HashMap<Integer, String>();