Java 변수 타입 이해: 종합 가이드
변수는 프로그램이 조작할 수 있는 명명된 저장소를 제공합니다. Java의 각 변수는 특정 타입을 가지며, 이는 변수 메모리의 크기와 레이아웃, 해당 메모리에 저장될 수 있는 값의 범위, 변수에 적용할 수 있는 연산 집합을 결정합니다.
모든 변수는 사용 전에 선언해야 합니다. 다음은 변수 선언의 기본 형태입니다:
data type variable [ = value][, variable [ = value] ...] ;
여기서 data type은 Java의 데이터 타입 중 하나이고 variable은 변수 이름입니다. 지정된 타입의 변수를 두 개 이상 선언하려면 쉼표로 구분된 리스트를 사용할 수 있습니다.
다음은 Java에서 변수 선언과 초기화의 유효한 예들입니다:
예제
int a, b, c; // 세 개의 int a, b, c 선언
int a = 10, b = 10; // 초기화 예제
byte B = 22; // byte 타입 변수 B 초기화
double pi = 3.14159; // PI 값 선언 및 할당
char a = 'a'; // char 변수 a를 'a' 값으로 초기화
이 장에서는 Java 언어에서 사용 가능한 다양한 변수 타입을 설명합니다. Java에는 세 종류의 변수가 있습니다:
지역 변수
지역 변수는 메서드, 생성자, 블록 내에서 선언됩니다.
메서드, 생성자, 블록에 진입할 때 생성되고 해당 메서드, 생성자, 블록을 벗어날 때 소멸됩니다.
접근 수정자를 지역 변수에 사용할 수 없습니다.
지역 변수는 선언된 메서드, 생성자, 블록 내에서만 보입니다.
지역 변수는 내부적으로 스택 레벨에서 구현됩니다.
지역 변수에는 기본값이 없으므로, 최초 사용 전에 선언하고 초기값을 할당해야 합니다.
예제
여기서 age는 지역 변수입니다. pupAge() 메서드 내부에서 정의되며 범위는 이 메서드로만 제한됩니다.
Live Demo
public class Test {
public void pupAge() {
int age = 0;
age = age + 7;
System.out.println("Puppy age is : " + age);
}
public static void main(String args[]) {
Test test = new Test();
test.pupAge();
}
}
이 코드는 다음 결과를 생성합니다:
출력
Puppy age is: 7
예제
다음 예제는 초기화 없이 age를 사용하여 컴파일 시 오류가 발생합니다.
Live Demo
public class Test {
public void pupAge() {
int age;
age = age + 7;
System.out.println("Puppy age is : " + age);
}
public static void main(String args[]) {
Test test = new Test();
test.pupAge();
}
}
컴파일 시 다음 오류가 발생합니다:
출력
Test.java:4:variable number might not have been initialized
age = age + 7;
^
1 error
인스턴스 변수
인스턴스 변수는 클래스 내에서 선언되지만 메서드, 생성자, 블록 밖입니다.
힙에 객체 공간이 할당되면 각 인스턴스 변수 값에 대한 슬롯이 생성됩니다.
인스턴스 변수는 'new' 키워드로 객체가 생성될 때 만들어지고 객체가 소멸될 때 파괴됩니다.
인스턴스 변수는 둘 이상의 메서드, 생성자, 블록에서 참조되어야 하거나 객체 상태의 필수적인 부분으로 클래스 전체에서 유지되어야 하는 값을 가집니다.
인스턴스 변수는 사용 전이나 후에 클래스 레벨에서 선언할 수 있습니다.
인스턴스 변수에 접근 수정자를 줄 수 있습니다.
인스턴스 변수는 클래스의 모든 메서드, 생성자, 블록에서 보입니다. 보통 이 변수들을 private(접근 수준)로 만드는 것이 권장됩니다. 하지만 접근 수정자를 사용하여 서브클래스에 대한 가시성을 줄 수 있습니다.
인스턴스 변수는 기본값을 가집니다. 숫자는 0, 불리언은 false, 객체 참조는 null. 값은 선언 시나 생성자 내에서 할당할 수 있습니다.
인스턴스 변수는 클래스 내부에서 변수 이름을 직접 호출하여 접근할 수 있습니다. 그러나 정적 메서드 내부에서는(인스턴스 변수에 접근 권한이 주어진 경우) 정규화된 이름 ObjectReference.VariableName을 사용해야 합니다.
예제
Live Demo
import java.io.*;
public class Employee {
// 이 인스턴스 변수는 모든 자식 클래스에서 보임
public String name;
// salary 변수는 Employee 클래스에서만 보임
private double salary;
// name 변수는 생성자에서 할당
public Employee (String empName) {
name = empName;
}
// salary 변수에 값 할당
public void setSalary(double empSal) {
salary = empSal;
}
// 이 메서드는 직원 세부사항을 출력
public void printEmp() {
System.out.println("name : " + name );
System.out.println("salary :" + salary);
}
public static void main(String args[]) {
Employee empOne = new Employee("Ransika");
empOne.setSalary(1000);
empOne.printEmp();
}
}
이 코드는 다음 결과를 생성합니다:
출력
name : Ransika salary :1000.0
클래스/정적 변수
클래스 변수는 정적 변수라고도 하며, 클래스 내에서 메서드, 생성자, 블록 밖에 static 키워드로 선언됩니다.
만들어지는 객체 수에 관계없이 클래스당 각 클래스 변수의 복사본은 하나만 존재합니다.
정적 변수는 상수로 선언되는 경우 외에는 거의 사용되지 않습니다. 상수는 public/private, final, static으로 선언된 변수입니다. 상수 변수는 초기값에서 절대 변하지 않습니다.
정적 변수는 정적 메모리에 저장됩니다. final로 선언되어 public 또는 private 상수로 사용되는 경우 외에는 정적 변수를 거의 사용하지 않습니다.
정적 변수는 프로그램이 시작될 때 생성되고 프로그램이 중단될 때 소멸됩니다.
가시성은 인스턴스 변수와 유사합니다. 하지만 대부분의 정적 변수는 클래스 사용자가 접근할 수 있어야 하므로 public으로 선언됩니다.
기본값은 인스턴스 변수와 같습니다. 숫자는 0, 불리언은 false, 객체 참조는 null. 값은 선언 시나 생성자 내에서 할당할 수 있습니다. 또한 특수 정적 초기화 블록에서 값을 할당할 수 있습니다.
정적 변수는 클래스 이름으로 호출하여 접근할 수 있습니다: ClassName.VariableName.
클래스 변수를 public static final로 선언하면 변수 이름(상수)은 모두 대문자입니다. 정적 변수가 public과 final이 아니면 명명 구문은 인스턴스 및 지역 변수와 동일합니다.
예제
Live Demo
import java.io.*;
public class Employee {
// salary 변수는 private static 변수
private static double salary;
// DEPARTMENT는 상수
public static final String DEPARTMENT = "Development ";
public static void main(String args[]) {
salary = 1000;
System.out.println(DEPARTMENT + "average salary:" + salary);
}
}
이 코드는 다음 결과를 생성합니다:
출력
Development average salary:1000
참고 - 외부 클래스에서 변수에 접근할 경우 상수는 Employee.DEPARTMENT로 접근해야 합니다.
다음 단계
이 장에서 이미 접근 수정자(public & private)를 사용했습니다. 다음 장에서는 접근 수정자와 비접근 수정자를 자세히 설명하겠습니다.