[자바/JAVA] 변수(Variable)란 무엇인가, 용어를 중심으로
- Java
- 2021. 5. 25.
자바에서 변수(Variable)는 '값을 저장하는 공간'으로 어찌 보면 간단한 개념이다. 사용법 자체도 직관적이기 때문에 코딩을 처음 배우는 사람도 보자마자 이해하는 데는 별 무리가 없다. 그렇지만 변수는 '지역변수'나 '참조 변수'처럼 특수한 형태로 세분화되기도 하고, '데이터 타입' '데이터 타입 변환(형변환)' 같은 개념도 엮여 있으며 코딩을 구성하는 매우 기본적인 단위인 만큼 개념을 정확히 이해할 필요가 있다.
정의
코딩을 통해 만들어진 프로그램은 기능을 수행하며 데이터를 메모리에 저장하게 된다. 이때 변수는 하나의 값을 저장할 수 있는 메모리의 공간으로서 역할을 수행한다. 데이터는 여러 타입을 가지고 있는데(정수, 실수, 참과거짓 등) 하나의 변수에는 한 가지의 타입만 저장할 수 있다.
선언
변수를 사용하기 위해서는 먼저 변수를 선언해야 한다. 데이터타입 변수명;
으로 한다.
int age;
double value;
int age, score; // 같은 타입 변수는 한번에 선언 가능
선언된 변수 age, value, score 등은 이제 사용될 준비가 된 것이다.
변수 이름은 원하는 데로 지으면 된다. 되도록 이름만 봐도 어떤 데이터가 저장돼 있을지 알 수 있는 변수명이 좋다.
값 저장
변수는 데이터를 담는 그릇이다. 그릇에 값을 담기 위해서는 연산자(=)를 사용한다. 자바에선 =는 같다는 의미가 아니라 오른쪽에 있는 값을 왼쪽에 있는 변수에 저장한다는 의미다. 참고로 같다는 의미는 == 연산자를 사용한다.
int age = 20; // age라는 변수에 int 타입 값 20을 저장
boolean b = true; // b라는 변수에 boolean 타입 값 true 저장
이처럼 소스 코드에서 값을 직접 입력하는 걸 리터럴(literal)이라고 말한다.
사용 범위
변수는 코드의 위치에 따라 사용 가능 여부가 달라진다. 기본적으로 중괄호{} 블록 안에서만 선언, 사용된다. 그 말은 클래스, 생성자, 메서드 등의 블록 안에서 사용된다는 의미다. 메서드 {} 안에 선언된 변수를 지역변수(Local Variable)이라고 부른다. 말 그대로 지역{} 안에서 사용되는 변수인 셈이다. 지역변수는 메서드가 실행되고 나면 메모리에서 사라진다.
예를 들어 if
,for
, while
등의 {} 안에 선언된 변수는 해당 블록이 끝나면 메모리에서 사라진다.
public void static main(String[] args) {
int i = 5; // main 메서드 안에 선언된 i
if(i > 0) {
// if문 안에 선언된 j
int j = i + 5; // j값은 10
} // if문 종료. j값 메모리에서 사라짐
if(i > 0) {
int j = i + 5; // j값은 15가 아닌 10
}
}
데이터 타입
위에서 언급했듯 자바에는 여러 데이터 타입이 존재한다. 각 데이터 타입이 어떤 데이터를 표현하는지는 당연히 알아야겠지만 이왕이면 각 데이터 타입이 사용하는 메모리 크기도 기억해두면 좋다. 메모리 사용 크기가 클수록 더 많은 범위의 데이터를 표현한다고 보면 될 거 같다. 이게 중요한 이유는 아래 설명할 데이터 타입 변환(형변환)에 영향을 주기 때문이다.
데이터 타입 | 메모리 사용 크기 | |
---|---|---|
정수형 | byte | 1 byte |
정수형 | char | 2 byte |
정수형 | short | 2 byte |
정수형 | int | 4 byte |
정수형 | long | 8 byte |
실수형 | float | 4 byte |
실수형 | double | 8 byte |
논리형 | boolean | 1 byte |
위의 데이터 타입들을 묶어서 기본형(primitive) 타입이라고 한다.
String의 변수는 참조 변수
여기서 주의할 점. 문자열을 저장하는 String
은 기본형 타입이 아니다. 매우 자주 사용되는 데이터 타입이고 위화감 없이 기본형과 어울리는 듯한 느낌(?)이 있어서 혼동하는 경우가 있는데 주의해야 한다. 코드상으로 보기엔 사용상의 차이도 없어 보인다. 그러나 로직상으로는 큰 차이가 있다. 가령 int i = 1;
에서 i는 변수다. i에는 1이라는 값이 직접 저장된다. 반면 String s = "STRING";
이라는 코드에서 s는 참조 변수다. 해당 코드가 실행되면 s에 STRING이라는 문자열이 직접 저장되는 게 아니라 STRING을 담는 객체가 생성되고 s는 객체의 주소값을 저장한다.
형변환
데이터 타입을 변환하는 것을 형변환 이라고 부른다. int 타입을 double 타입, String 타입 등으로 바꾸는 식이다. 기본적으로는 크게 두 가지 형태다.
- 자동 형변환(Promotion)
- 명시적 형변환(Casting)
사소한 거긴 한데 또 하나 짚고 넘어갈 것. 명시적 형변환을 가리키는 캐스팅(Casting)을 큰 개념에서의 형변환과 같은 말(형변환 = Casting)로 잘못 인식되고 있는 경우가 꽤 있는 거 같다. 뭐 별 상관없긴 하지만.
자동 형변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다. 위에서 언급한 데이터 타입별 메모리 사용 크기가 여기서 적용된다. 비유하자면 작은 그릇을 큰 그릇에 담는 건 자연스럽게 가능한 일이다. 자바에서도 이런 경우엔 별도의 조치가 필요하지 않다.
// int(4byte), double(8byte)
// 자동변환(promotion)
int i = 100;
double d = i; // 100은 d에 저장되며 100.0으로 변환
반면 명시적 변환은 큰 크기를 가지는 타입이 작은 크기를 가지는 타입에 저장될 때 발생한다. 부자연스러운 일이므로 끼워 맞추기 위한 별도의 조치가 필요하다. (변환할 데이터 타입)변수
방식으로 구현한다. 억지로 맞춘다는 건 데이터의 손실 가능성이 있다는 말이기도 하다(아래 코드에선 문제가 없다).
// 명시적 변환(Casting)
double d = 100.0;
int i = (int)d; // 100.0은 i에 저장되며 100으로 변환
'Java' 카테고리의 다른 글
PreparedStatement.executeUpdate();가 동작하지 않을 때 (0) | 2021.06.13 |
---|---|
[자바/JAVA] 예외(Exception) 처리에 대해, try ~ catch | throw (0) | 2021.05.30 |
[자바/JAVA] 키-값으로 저장되는 HashMap (0) | 2021.05.22 |
[자바/JAVA] 일반 배열보다 편리한 ArrayList (0) | 2021.05.20 |
[자바/JAVA] Properties로 XML 파일에 값 넣기 (0) | 2021.05.18 |