Java의 변수와 메서드에 대해 알아보자.
Java 변수
Java의 변수는 클래스변수, 인스턴스변수, 지역변수로 구분된다.
각 변수의 차이는 선언된 위치이다.
클래스변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스변수 | 인스턴스가 생성될 때 | |
지역변수 | 클래스 영역 이외의 영역 | 변수 선언문이 수행되었을 때 |
글로 보면 어려움이 있을 수 있는데 아래 코드로 보면 확실히 알 수 있다.
public class VariablePractice {
static int classVariable = 1; // 클래스변수
int instanceVariable = 2; // 인스턴스변수
public void method() {
int localVariable = 3; // 지역변수
}
}
각 변수를 하나씩 살펴보자.
클래스변수
클래스변수는 모든 클래스가 공유하는 변수로 클래스 영역에서 static를 붙이면 클래스변수가 된다.
클래스변수는 해당 클래스가 메모리에 적재될 때부터 프로그램이 종료될 때까지 유지된다.
공유한다는 것을 확인해 보기 위해 아래 코드를 작성해 보았다.
public class VariablePractice {
public static void main(String[] args) {
TestClass test1 = new TestClass();
TestClass test2 = new TestClass();
TestClass test3 = new TestClass();
System.out.println("test1: " + test1.getTestNum());
System.out.println("test2: " + test2.getTestNum());
System.out.println("test3: " + test3.getTestNum());
}
}
class TestClass {
static int testNum = 0;
public static int getTestNum() {
return testNum++;
}
}
TestClass()엔 클래스변수 testNum을 0으로 선언, getTestNum() 메서드를 호출할 때마다 testNum이 1씩 증가한다.
TestClass 인스턴스를 각각 생성하고 getTestNum()을 호출했고 그 실행 결과는 아래와 같다.

객체 변수를 다르게 해 가며 getTestNum() 메서드를 호출했음에도 testNum의 값이 증가했다.
즉, 변수를 공유했다.
이처럼 클래스변수는 모든 인스턴스가 공유하기에 '클래스명.클래스변수'의 형태로 활용하는 것을 권장한다.
실제로 이와 같이 활용하지 않으면 아래처럼 노란 줄로 주의를 한다.

'클래스명.클래스변수'로 바꾸자 노란 줄이 사라진 모습이다.

인스턴스변수
인스턴스변수는 클래스 영역에서 static이 붙지 않은 변수로 클래스 인스턴스를 생성할 때 생성된다.
클래스변수와 달리 각 인스턴스가 독립적으로 사용한다.
아래 코드는 위의 코드에서 static만 없앤 것이다.
public class VariablePractice {
public static void main(String[] args) {
TestClass test1 = new TestClass();
TestClass test2 = new TestClass();
TestClass test3 = new TestClass();
System.out.println("test1: " + test1.getTestNum());
System.out.println("test2: " + test2.getTestNum());
System.out.println("test3: " + test3.getTestNum());
}
}
class TestClass {
int testNum = 0;
public int getTestNum() {
return testNum++;
}
}
결과는 모두 0이 나왔다.

지역변수
지역변수는 메서드, 생성자, for문 등 클래스영역이 아닌 곳에서 선언된 모든 변수이다.
변수 선언문이 실행되면 생성되며 블록{ }을 벗어나면 소멸된다.
간단한 예제로 아래 블록을 벗어난 곳에서 i를 사용하려고 하여 컴파일에러가 발생한 모습이다.

Java 메서드
메서드도 static의 유무로 활용 방법이 다르다.
static이 붙으면 클래스 메서드, 붙어있지 않으면 인스턴스 메서드이다.
인스턴스 메서드
인스턴스 메서드는 인스턴스변수를 활용해 작업을 하는 메서드이다.
인스턴스가 생성될 때부터 해당 메서드를 활용할 수 있다.
예를 들어 아래의 printTestNum이 인스턴스 메서드이다.
TestClass 인스턴스를 생성하지 않으면 활용할 수 없다.
public class VariablePractice {
public static void main(String[] args) {
TestClass test = new TestClass();
test.printTestNum();
}
}
class TestClass {
int testNum = 0;
public void printTestNum() {
for(int i = 0; i < 10; i++)
System.out.println(i);
}
}
클래스 메서드
클래스 메서드는 인스턴스변수와 관련 없는 작업을 하는 메서드이다.
클래스가 메모리에 적재될 때부터 프로그램이 끝날 때까지 활용할 수 있다.
클래스변수처럼 '클래스명.클래스메서드'의 형태로 활용한다.
인스턴스가 필요하지 않기에 아래처럼 별다른 작업 없이 곧바로 활용할 수 있다.
public class VariablePractice {
public static void main(String[] args) {
TestClass.printTestNum();
}
}
class TestClass {
public static void printTestNum() {
for(int i = 0; i < 10; i++)
System.out.println(i);
}
}
클래스 메서드는 클래스변수, 지역변수는 활용할 수 있지만 인스턴스변수는 활용할 수 없다.
그 이유는 클래스 메서드를 활용할 때 인스턴스변수가 생성되지 않은 상태일 수 있기 때문이다.
메서드의 활용 변수를 잘 파악하고 인스턴스변수와 관련이 없으면 static을 붙이는 것이 좋다.
메서드 호출시간이 짧아지기 때문이다.
'Java > Java' 카테고리의 다른 글
Java - .of .asList .emptyList (0) | 2023.10.02 |
---|---|
Java - 생성자, 초기화 블록 (1) | 2023.09.25 |
Java - enum (0) | 2023.09.22 |
Java - Integer (0) | 2023.09.21 |
Java - Collections unmodifiable (0) | 2023.09.19 |