헷갈리는 클래스 영역의 변수 용어에 관해 정리해보고자 합니다.
멤버 변수 : 클래스 영역에 선언된 변수
클래스 변수 : 멤버 변수 중 static이 붙은 변수로, 해당 클래스의 인스턴스 모두가 공유
인스턴스 변수 : 멤버 변수 중 static이 붙지 않은 변수로, 해당 인스턴스만 접근 가능한 변수
(메서드 내부의 변수는 지역 변수이고, 자바에는 전역 변수의 개념이 없다고 합니다.
관련 링크 -> https://shm-m.github.io/blog/global_variable)
예제 코드를 통해 살펴보겠습니다.
import java.util.ArrayList;
import java.util.List;
public class Chef {
private static final String COMPLETE_COOK_ANNOUNCEMENT = " 준비가 완료되었습니다.";
private static final String COMPLETE_MENUS_ANNOUNCEMENT = "완성된 요리 : ";
private static List<String> dishes = new ArrayList<>();
private int countOfMe = 0;
public void cook(String menu) {
System.out.println(menu + COMPLETE_COOK_ANNOUNCEMENT);
dishes.add(menu);
this.countOfMe += 1;
}
public void informCountMadeMyMe() {
System.out.println(this.countOfMe);
}
public void informWholeCompleteMenus() {
System.out.println(COMPLETE_MENUS_ANNOUNCEMENT + dishes);
}
}
위 Chef 클래스는 음식을 요리하고,
해당 요리사가 만든 음식 개수와,
총 준비된 메뉴 리스트 알려줍니다.
여기서 변수의 종류를 정리해보면,
멤버 변수 : COMPLETE_COOK_ANNOUNCEMENT, COMPLETE_MENUS_ANNOUNCEMENT, dishes, countOfMe
클래스 변수 : COMPLETE_COOK_ANNOUNCEMENT, COMPLETE_MENUS_ANNOUNCEMENT, dishes
인스턴스 변수 : countOfMe
와 같습니다.
아래와 같이 main함수를 실행해보겠습니다.
public class Practice {
public static void main(String[] args) {
Chef woojin = new Chef();
Chef paul = new Chef();
woojin.cook("밥");
paul.cook("국");
woojin.informCountMadeMyMe();
paul.informCountMadeMyMe();
woojin.informWholeCompleteMenus();
paul.informWholeCompleteMenus();
}
}
woojin와 paul이 각각 밥과 국을 요리했습니다.
그리고 각자가 만든 요리 개수 묻습니다.
마지막으로 woojin. paul은 전체 준비된 메뉴 리스트를 묻습니다.
위와 같이 출력됨을 확인할 수 있습니다.
Chef 클래스의 countOfMe 변수(인스턴스 변수)는 각 인스턴스에만 영향을 받았습니다.
하지만 woojin이 준비한 밥, paul이 준비한 국 모두 dishes라는 클래스 변수에 추가되었습니다.
dishes 변수는 모든 인스턴수에게 영향을 받았음을 알 수 있습니다.
멤버 변수와 클래스 변수, 인스턴스 변수의 차이와 활용에 대해 알아보았습니다.
'Java' 카테고리의 다른 글
[Java] 예외처리 반복 - 올바른 입력값을 받을 때까지 (try-catch) (2) | 2022.11.23 |
---|---|
[Java] 간단한 예외처리(try catch) 원리 (feat. throws IllegalArgumentException은 왜 빨간 줄이 안 생길까?) (0) | 2022.11.16 |
do while문의 사용 이유와 방법 - (#자바 #Java) (0) | 2022.11.11 |
자바 테스트 에러 해결 - java.lang.assertionerror: expecting code to raise a throwable. (0) | 2022.11.03 |
forEach로 예외처리하기 (Unhandled exception: java.lang.Exception 에러 해결) (0) | 2022.11.02 |