본문 바로가기

개발/Java

[Java] 변수

 

상수 표현

 

final 붙이면 값이 수정이 안 되기때문에 상수를 표현할 때 쓰인다.

final int NUM = 10;

 

 

상수는 처음에 생성되고 값이 안 변하기때문에 인스턴스(객체)마다 상수를 저장할 필요가 없다. 따라서 아래와같이 앞에 static을 같이 붙여서 사용하기도 한다. (공용 static, 수정안됨 final)

 

만약 상수가 100번 사용될 때, static으로 선언을 안 하면 같은 값을 같는 메모리가 100개 중복 생성되게 된다. 이럴 때 static으로 선언해주면 하나의 메모리를 참조할 수 있기때문에 효율면에서 좋아진다.

static final String COMPANY = “Genesis”;

 

 

 

추가로, 클래스에 final 제어자를 사용하면 해당 클래스는 다른 클래스가 상속받을 수 없게 되고, 메소드에 사용하면 해당 메소드는 오버라이딩을 할 수 없게 된다.

 

 

 

 

 

기본형 변수

boolean / char / 정수 / 실수

 

정수형 변수의 long은 뒤에 접미사 L을 붙여줌.

long longnum = 1234L;

 

실수형 변수의 float는 뒤에 접미사 f를 붙여줌.

float floatnum = 12.34f;

 

 

 기본형 변수를 매개변수로 사용한다면, 메서드 안에서 읽는 것만 가능하다. 값을 복사해서 넘기기때문에 원본의 변화가 없다.

 

 

 

 

 

참조형 변수 

어느 공간에 있는 주소값을 바라보고 있는 변수

참조형 변수는 String / Object / Array / List 등과 같이 대문자로 시작한다. 객체(인스턴스)또한 참조형 변수이다.

 

참조형 변수를 매개변수로 사용한다면, 값 자체(주소)를 넘기는 것이기때문에 메서드 안에서 읽고 , 변경도 가능하다.

 

 

 

 

 

래퍼 클래수 변수

기본형 변수를 클래스로 한번 감싸는 변수 → 그러면 클래스가 돼서 다양한 메소드 사용가능 !

//박싱
//Integer 래퍼 클래스 num에 21의 값을 저장

int number = 21;
Integer num = new Integer(number);
Integer num = number; //이렇게로도 래퍼 클래스 사용 가능

//언박싱
int n = num.intValue(); //래퍼 클래스들은 inValue 메소드 사용가능

 

자동으로 박싱, 언박싱해주는 방법도 있다.

Integer num = new Integer(17);  // Boxing
int n = num.intValue(); // UnBoxing

Character ch = 'X'; // AutoBoxing
char c = ch; // AutoUnBoxing

 

그냥 박싱, 언박싱 해주는 것보다 코드가 훨씬 더 간결해진다.

 

 

 

 

문자 vs 문자열
  1. 문자형은 끝에 널문자 \0가 없음, 문자열은 널문자 있음.
  2. 문자형은 ‘’(작은 따옴표)를 사용해 선언, 문자열은 “”(큰 따옴표)을 사용해 선언.
  3. 문자형은 기본형 변수라 Stack영역에 값이 저장되어있지만, 문자열은 참조형변수라 Stack영역엔 주소값이 저장되어있고 Heap영역에 원본 값이 저장되어있다.

 

 

 

 

형변환

명시적 형변환 vs 암묵적 형변환

저장 공간이 넓은 변수에서 좁은변수로 형변환을 할 땐 앞에 (double) 등으로 명시적으로 형변환해주어야함.

하지만, 저장 공간이 좁은 변수에서 넓은 변수로 형변환을 할 땐 앞에 따로 안 붙여줘도 자동으로 형변환 가능.

 

 

 

 

변수 타입별 크기 순서

 

byte(1byte) → short(2byte) → int(4byte) → long(8byte) → float(4byte) → double(8byte)

char(1byte)

 

작은 크기의 타입이 큰 크기의 타입과 계산될 때, 자동으로 큰 크기의 타입으로 형 변환 됨.

 

예시 코드

int num = 10;
double res = num/4; //2.0
int res = num/4; //2
double res = num/4.0; //2.5