Intro ⭐
변수란 데이터가 저장된 메모리 공간의 주소를 가리키는 식별자 이름을 의미하며, 변수라는 명칭 그대로 저장된 값은 필요에 의해 언제든 변화가 가능합니다.
Java에서는 어떠한 규칙에 따라 변수가 가리킬 메모리를 할당하고, 사용하는지 알아보겠습니다.
변수의 선언 규칙
변수의 이름을 명명할 때에는, 몇 가지 규칙을 따라야 합니다. 이중 일부 규칙은 위배할 경우 컴파일 과정에서 예외(Exception)를 발생시키기도 하며, 일부는 예외를 발생시키지는 않지만 개발자 간의 원활한 의사소통을 위해 권고되기도 합니다.
필수 사항
1. 숫자로 시작 불가
변수명 내에 숫자가 포함되는것은 허용되나, 변수명의 시작이 숫자일 수 없습니다.
public static void main(String[] args) {
String 100level; // Exception 발생
String level100; // 선언 가능
}
2. 예약어 사용 불가
Java에는 여러 예약어, 키워드가 존재합니다. 변수명은 순수 예약어, 키워드로만 이루어질 수 없습니다.
public static void main(String[] args) {
final String while; // Exception 발생
}
3. [$, _] 를 제외한 특수문자를 사용 불가
변수명으로 모든 언어(한국어, 중국어, 영어, )를 사용 가능하지만, 특수문자의 경우 달러($)와 언더바(_)만을 허용합니다.
public static void main(String[] args) {
String >_<; // Exception 발생
String ㅁ_ㅁ; // 선언 가능
}
4. 대소문자를 구분하여 사용
일부 SQL 언어와 달리 Java는 대소문자를 구분하고 있습니다. 대소문자가 다를 경우 다른 변수명으로 인식합니다.
public static void main(String[] args) {
String message = "Hello World";
System.out.println(MESSAGE); // Exception 발생
System.out.println(message); // 성공
}
권고 사항
1. 소문자로 시작
Java에서 통용되는 망명 관습(Naming conventions)에 따라 클래스는 대문자로 시작하는 경우가 많습니다. 이에 따라 변수명은 소문자로 시작하여 혼동을 방지합니다.
public static void main(String[] args) {
String User = "임꺽정"; // 별로에요 :(
String user = "홍길동"; // 최고에요 :)
}
2. 상수(final)로 선언된 변수는 대문자 사용
변하지 않는 값인 상수는 변수와의 구분을 위하여 대문자로만 구성합니다.
public static void main(String[] args) {
final String pi = "3.1415926535"; // 별로에요 :(
final String PI = "3.1415926535"; // 최고에요 :)
}
3. 단어 구분을 위한 카멜식(Camel case)혹은 스네이크식(Snake case) 사용
해당 망명 관습 외 파스칼식(Pascal case), 케밥식(Kebab case)가 존재하지만, 변수명은 소문자로 시작할 것을 권고하고 있으며 특수문자 하이픈(-)은 변수에 포함될 수 없음으로 카멜식 혹은 스네이크식 사용을 권고합니다. 다만 상수의 경우 대문자로 구성되어 있기 때문에, 스네이크식을 사용합니다.
public static void main(String[] args) {
String thisIsCamelCase; // 카멜식
int this_is_snake_case; // 스네이크식
}
변수의 종류
변수는 선언 위치 및 키워드에 따라 생성(메모리 할당)되는 시기가 상이합니다. 프로그래밍 목적에 맞는 상황에 따라 변수를 선언하는것이 중요합니다.
1. 클래스 변수 (Class variables[Static])
클래스 영역에서 자료형 앞에 static 키워드를 추가하여 선언합니다.
클래스가 메모리에 올라갈 때 변수가 생성되고, 프로그램이 종료되면 메모리가 해제됩니다.
주로 여러 객체(인스턴스)에서 공통으로 사용하고자 하는 값을 저장하는 용도로 사용됩니다.
2. 인스턴스 변수 (Instance variables[Non-Static])
클래스 영역에서 선언되는 변수입니다.
new 키워드를 통해 객체(인스턴스)가 생성될 때 생성되며 객체(인스턴스)가 해제되면, 인스턴스 변수도 함께 해제됩니다.
객체(인스턴스)가 개별적으로 사용할 값을 저장하는 용도로 사용됩니다.
3. 지역 변수 (Local variables)
코드 블럭 내 선언되는 변수입니다.
해당 코드 블럭가 수행될 때 생성되며, 수행이 끝남과 동시에 메모리가 해제됩니다.
주로 코드 블럭 내에서 사용되는 for문의 int i 변수가 대표적입니다.
4. 매개 변수 (Parameter)
메소드 호출 시 전달 받는 값에 해당하는 변수입니다.
해당 메소드가 수행될 때 생성되며, 수행이 끝남과 동시에 메모리가 해제됩니다.
public class User {
public static int totalVisitor; // 클래스 변수 (totalVisitor)
private int wallet; // 인스턴스 변수 (wallet)
User(int money) { // 매개변수 (money)
this.wallet = money;
totalVisitor++;
}
private void lose(int price) {
this.wallet -= price;
}
private void win(int money, boolean isJackPot) {
int benefit = 7777; // 지역 변수 (benefit)
if (isJackPot) {
this.wallet += money * benefit;
} else {
this.wallet += money;
}
}
private int showMeTheMoney() {
return this.wallet;
}
private void exit() {
totalVisitor--;
}
}
Honey Tip 🍯
Java에서 변수는 동시에 선언 및 초기화(Initialization)가 가능합니다.
public static void main(String[] args) {
int countA, countB; // 변수 동시 선언
int countC = 0, countD = 0; // 변수 동신 선언 및 초기화
}
저와 같이 간결함을 좋아하는 개발자 분들께서는 여러 변수에 같은 초기값을 할당해야 할때 중복된 값이 보기 싫으실 수도 있습니다🤔 그러나 저처럼 감각적으로 만든 다음 코드는 생각처럼 잘 동작하지 않습니다.
public static void main(String[] args) {
int countA, countB = 0; // 변수 동시 선언
System.out.println(countA); // 예외 발생 (variable countA might not have been initialized)
}
해당 코드가 실제 동작하는 과정은 다음과 같기 때문에 예외가 발생하게 되는 것이죠.
public static void main(String[] args) {
int countA, countB = 0; // 변수 동시 선언
/*
int countA;
int countB = 0;
*/
System.out.println(countA); // 초기화가 되지 않은 변수 사용으로 예외 발생
}
어떻게든 방법을 모색한다면 다음과 같이 사용은 가능하지만 오히려 더 참혹한 코드를 만들어 내게 됩니다.
public static void main(String[] args) {
int countA, countB = countA = 0; // 변수 동시 선언
/*
int countA;
int countB;
countB = countA = 0;
*/
}
이러한 방법은 가독성이 너무 떨어지기 때문에 협업하는 프로젝트의 경우 추천하지 않습니다.
불필요한 라인을 줄이고 간소화하는 것보다 직관적인 코드를 작성하는 것이 추후 유지 보수 측면에서 이해하는 데 도움이 되기 때문입니다.
또한 해당 방법으로 참조 객체를 동시 선언하게 될 경우 같은 주소값을 참조하기 때문에 생각지 못한 문제가 발생할 수 있으니 해당 방안을 지양하여야 합니다.
References
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html
Variables (The Java™ Tutorials > Learning the Java Language > Language Basics)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
Java Language Keywords (The Java™ Tutorials > Learning the Java Language > Language Basics)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
해당 게시글은 독학을 통해 얻은 지식들을 취합하여 작성한 글입니다.
잘못된 내용이 있을 경우 댓글을 통해 지적을 해주신다면 저와, 이 글을 참조하게 될 모든 분들께 큰 힘이 됩니다.