변수란?
데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간.
데이터를 저장할 수 있는 메모리 공간이며 그 값은 변경될 수 있다.
JAVA의 변수 종류
1. 기본형 - Primitive Type (원시 타입)
실제 연산에 사용되는 자료형.
메모리 공간에 직접 저장됨.
자바는 다음과 같은 8개 종류의 기본 자료형을 제공한다.
- 정수형 : byte, short, int, long
- 실수형 : float, double
- 문자형 : char
- 논리형 : boolean
자료형 | 이름 | 메모리 | 기본값 |
정수형 | byte | 1byte | 0 |
정수형 | short | 2byte | 0 |
정수형 | int | 4byte | 0 |
정수형 | Long | 8byte | 0L |
실수형 | float | 4byte | 0.0F |
실수형 | double | 8byte | 0 |
문자형 | char | 2byte | '\u0000' |
논리형 | boolean | 1byte | false |
기본형 변수는 기본 값이 존재해 null값을 가질 수 없다.
2. 참조형 - Reference Type
기본형을 제외한 나머지 모든 타입은 참조 타입이다.
class, interface, String 등이 있다.
메모리의 힙 영역에 값을 저장한 후 주소를 참조하는 형식으로 저장된다.
기본값이 없어 null 값을 부여할 수 있다.
상수와 리터럴?
상수 : 한 번 저장하면 값 변경 불가능한 변수. final 키워드로 선언하며, 선언과 동시에 초기화해야한다.
리터럴 : 그 자체로 값을 의미하는 것, 12, 3.14, 'A' 등등
변수 선언과 초기화
변수는 생성 되는 시점과 메모리 공간 등에 따라 3가지 종류로 구분할 수 있다.
- 전역 변수
- 클래스 내에서 static 키워드로 선언한다.
- Method Area(static) 영역에 생성된다.
- 동일한 클래스의 모든 객체들과 공유된다.
- 인스턴스 변수
- 클래스의 속성으로 선언된 변수
- 객체가 생성될때 Heap Area에 생성된다.
- 해당 객체 인스턴스 전체에서 사용된다.
- 지역 변수
- 특정 스코프 {} 내에서 생성되어 그 안에서만 사용 가능하다.
- Stack Area 에 생성된다.
- 메소드 함수, 반복문 등에서 사용되며 외부와 공유되지 않는다.
지역 변수는 생성 후 사용하기 위해선 반드시 초기화해줘야한다.
전역, 인스턴스 변수는 생성 시에 기본값으로 초기화된다.
상수(final) 변수 선언시에는 무조건 선언과 동시에 초기화 해줘야한다.
public class Main{
public static void main(String[] args){
Hello hello = new Hello();
hello.hi();
}
}
class Hello{
static int staticV;
private int heapV;
public void hi(){
int stackV = 1;
}
}
위의 코드를 실행했을 때의 메모리 결과를 T 메모리 구조로 나타낸 결과다.
- Class Loader가 프로그램을 실행하는데 필요한 java.lang과 같은 필수 클래스들을 로딩한다.
- Main.class 를 로딩한다.
- public static void main 함수를 찾아 실행시킨다.
- main 함수에서 Hello.class를 사용해야 하므로 Hello.class를 로딩하고 static 변수를 기본값으로 초기화한다..
- 힙 영역에 hello 객체를 생성하고 인스턴스 변수를 기본값으로 초기화한다.
- hello 객체의 hi 메소드를 수행하고 지역 변수를 생성한 후 초기화한다.
메소드 함수의 static 키워드
static 메서드에서는 static하지 않은 변수(인스턴스 변수) 사용 불가능하지만
그냥 메서드에서 static 변수 사용은 가능하다.
static 영역에 클래스가 로딩될때 static 변수는 초기화해서 만들지만
인스턴스 변수는 객체가 생성될때 Heap영역에 만들어지기 때문.
static 메소드에서 인스턴스 변수 사용은 불가능 (어떤 인스턴스의 객체를 참조해야할지 모름)
형변환, 캐스팅
특정 타입의 변수를 다른 타입으로 변환해서 사용할 수 있다.
float a = 123.456F;
int aa = (int) a;
System.out.println(aa); //123
() 괄호를 이용해서 변경할 타입을 앞에 붙여주기만 하면 된다.
기본형 변수는 boolean을 제외한 나머지 타입끼리 서로 형변환이 가능하다.
그러나 같은 자료형이여도 타입에 따라 값을 저장하는 방식이 다르기 때문에 형변환시 데이터 손실이 발생할 수 있다.
예를 들어 다음과 같이 float 타입을 int 타입으로 변환시 소수점 이하 값을 버린다.
int 타입을 float 타입으로 변환하면, 정밀도 제한으로 인해 큰 수의 경우 오차가 발생할 수 있다. (double을 최대한 사용하자)
자동 형변환
자바는 경우에 따라 형변환을 생략해도 자동으로 형변환을 적용해준다.
저장범위가 큰 타입에 작은 타입의 변수를 할당하면 자동으로 타입이 변환된다.
(여기서 말하는 저장범위는 메모리 크기가 아닌 수를 표현할 수 있는 범위이다.)
화살표 방향으로는 자동 형변환이 가능하다.
반대 방향으로 변환하기 위해선 반드시 () 괄호를 사용해 형변환을 명시해줘야만 한다.
또한 String 객체와 + 연산을 사용하면 모든 타입을 String 타입으로 자동으로 변환해준다.
(String + any type = String + String = String)
'JAVA' 카테고리의 다른 글
JAVA의 정석 정독하기 #5 - 배열(Array) (0) | 2023.10.29 |
---|---|
JAVA의 정석 정독하기 #4 - 조건문과 반복문 (0) | 2023.10.22 |
JAVA의 정석 정독하기 #3 - 연산자 (0) | 2023.10.07 |
JAVA의 정석 정독하기 #1 - JVM이란? (0) | 2023.10.02 |
JAVA 문법 공부 #1 - 기본 문법 정리 (0) | 2023.03.05 |