class Example {
Example(int lv){
this.iv = lv;
}
int static cv;
int iv
public void test() {
int lv;
}
}
변수의 종류는 선언 위치에 따라 달라지는데 클래스변수, 인스턴스변수, 지역변수로 나눌 수 있다
클래스변수(Class Variable)
static
키워드가 붙고 클래스 영역에 선언된 변수를 뜻하며, Example 클래스를 여러번 인스턴스화 시켜도 서로 같은값을 공유한다. 즉 모든 인스턴스가 공통된 메모리주소를 공유하게 됨Example.cv
형태로 접근이 가능한데 그 이유는 프로그램 실행 중에 어떤 클래스를 만나게 되면, JVM은 ClassLoader
를 시켜 해당 클래스의 바이트코드를 읽어서 클래스에 대한 정보를 Method Area
에 저장하여 그 때 클래스 멤버도 같이 메모리에 올라게 된다, 이와 같은 이유로 인스턴스를 생성하지 않고도 사용이 가능하다, 자세한 내용은 다음 자바의 메모리 구조에서 다룰 예정이다인스턴스변수(Instance Variable)
지역 변수(local variable)
Stack Area
에 생성되어 해당 메소드 내부에서만 사용이 가능하며 메소드가 종료되면 소멸된다.class Example {
//정수형
byte b;
short s;
int i;
long l;
//실수형
float f;
double d;
//문자형
char c;
//논리형
boolean b;
모든 기본형 타입은 실제 값(데이터)을 변수에 저장한다.
정수형은 byte, short, int, long
이 있으며 모든 정수는 기본적으로 int형으로 나타내고 int형을 초과하는 값을 long타입에 대입하려면 접미사L
을 반드시 붙여주어야 하고 그 이하의 값은 생략이 가능하다. 이외에 byte, short타입은 int타입의 정수를 사용하기 때문에 접미사는 필요 없다.
long l = 10; //접미사 L 생략가능
long l2 = 2200000000L; // int형을 초과하는 값이기에 접미사 L 생략 불가
float, double
이 있으며, 모든 실수는 기본적으로 double형으로 나타내기 때문에 float 타입의 변수에 값을 대입하려면 접미사 F
를 붙여주어야 한다.double d = 0.1;
float f = 0.1F; // 접미사 F 생략 불가
char
하나 이며 char에 저장된 값은 실제로는 숫자를 가르킨다, 즉 값을 대입하기 위해 다음 3가지 방법으로 값을 대입할 수 있다char testchar = 'c'; // 단일 문자열
char testascii = 99; // 아스키코드(문자열의 숫자값)
char testunicode = '\u0063'; // 유니코드값(문자열 맵핑 공간)
boolean
하나 이며 참(true), 거짓(false)의 값을 갖는다.데이터 타입 | 저장 가능한 값의 범위 | byte |
---|---|---|
boolean | false, true | 1 |
char | '\u0000' ~ '\uffff' (0 ~ 65535) | 2 |
byte | -128 ~ 127 | 1 |
short | -32768 ~ 32767 | 2 |
int | -2147483648 ~ 2147483647 | 4 |
long | -9223372036854775808 ~ 9223372036854775807 | 8 |
float | 1.4E-45 ~ 3.4E38 | 4 |
double | 4.9E-324 ~ 1.8E308 | 8 |
오버플로우 : 자료형이 표현할 수 있는 범위 중 최대값 이상의 값을 표현한 경우 발생한다.
최대값을 넘어가면 해당 데이터 타입의 최소값으로 값이 순환됨
예) byte형의 최대값인 127 을 가지는 변수에 +1을 할 경우 최소값인 -128이 됨
언더플로우 : 자료형이 표현할 수 있는 범위 중 최소값 이하의 값을 표현한 경우 발생한다.
최소값을 넘어가면 해당 데이터 타입의 최대값으로 값이 순환됨
예) byte형의 최소값인 -128 을 가지는 변수에 -1을 할 경우 최대값인 127이 됨
boolean 타입을 제외한 primitive 변수타입들 끼리는 형변환이 가능함 char, byte, short, int, long, float, double
자동 타입 변환 : 바이트 크기가 작은 타입에서 큰 타입으로 변환할 때 (예 : byte → int), 덜 정밀한 타입에서 더 정밀한 타입으로 변환할 때 (예 : 정수 → 실수)
byte(1) -> short(2)/char(2) -> int(4) -> long(8) -> float(4) -> double(8) 화살표를 기준으로 좌측의 타입이 우측의 타입으로 자동으로 변환될 수 있다.
float 의 경우 int와 long 보다 크기가 작거나 같지만 표현할 수 있는 값이 정수형 보다 정밀하기 때문에 더 뒤쪽에 있음
수동 타입 변환 : 메모리 용량이 더 큰 타입에서 작은 타입으로는 자동으로 타입이 변환되지 않음, 수동으로 타입을 변환 casting(캐스팅) 해주어야 함
예) int i = 128; byte b = (byte)i; int타입이 byte타입 보다 데이터 크기가 크기 때문에 캐스팅이 필요함, 예시의 경우 btye의 최대크기는 127 이기 때문에 오버플로우가 발생하여 -128이 대입됨
참조 타입은 기본 타입을 제외한 타입으로, 객체의 주소를 저장하는 타입이다. 문자열, 배열, 열거형 상수, 클래스, 인터페이스 등이 있다. 실제 객체는 Heap Area
에 저장되며, 참조 타입 변수는 실제 객체의 주소를 JVM Stack Area
에 저장한다. 그리고 객체를 사용할 때마다 참조 변수에 저장된 객체의 주소를 불러와 사용하게 된다.
test라는 이름의 메모리 공간이 스택 영역에 생성되고, 생성된 test의 인스턴스는 힙 영역에 생성된다. 즉, 스택 영역에 생성된 참조 변수 test는 힙 영역에 생성된 test의 인스턴스 주소 값을 가지게 된다.
Test test = new Test();
처음 블로깅을 해보는데 쉽지만은 않다🤣 메모장에 정리하는 것 보다 코드를 입력할 수 있고 어디서든 볼 수 있는 장점이 있어 맘에든다 앞으로 적극적으로 블로깅을 해볼 생각이다
2022.11.04 17:08 첫번째 작성일