자바 클래스(static)와 인스턴스(non-static) 접근 가능 방향
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
아래 코드를 보자.
public class test1 {
static int money = 0;
public static void main(String[] args) {
inM(2000);
outM(1000);
}
public static void inM(int a){
money += a;
System.out.println(a + "원을 입금하였습니다. 현재 잔액 : " + money);
}
public static void outM(int a){
money -= a;
System.out.println(a + "원을 출금하였습니다. 현재 잔액 : " + money);
}
}
실행 결과
이야기하고 싶은 것은 static int money = 0;을 클래스 단에서 선언해 두었다.
문제를 풀며 내가 고민했던 부분은..
나의 궁금증은 만약 static을 뺀다면 Class 단에서 선언된 인스턴스 변수이고, 객체 생성 없이 각 메소드를 불러오기에 money값을 공유하지 않을까? 였다.
결과는 컴파일 에러다.
이유가 무엇일까?
위에서 언급했듯이, Class 단에서 static 키워드 없이 생성된 변수는 인스턴스 변수이다.
작성한 코드를 보면 인스턴스 생성 없이 바로 메소드에 접근하는 것을 볼 수 있다.
각 메소드에는 인스턴스 변수의 값을 수정하는 로직이 포함되어 있다.
인스턴스 변수는.. 객체 즉 인스턴스 생성 없이 접근을 할 수 없다.
따라서 컴파일 오류를 해결하려면 아래와 같이 코드를 수정하면 된다.
public class test1 {
int money = 0;
public static void main(String[] args) {
test1 t1 = new test1();
t1.inM(2000);
t1.outM(1000);
}
public void inM(int a){
money += a;
System.out.println(a + "원을 입금하였습니다. 현재 잔액 : " + money);
}
public void outM(int a){
money -= a;
System.out.println(a + "원을 출금하였습니다. 현재 잔액 : " + money);
}
}
변경사항
1. test1 Class 객체 생성
2. 메소드의 static 키워드 제거
출력 결과
원하던 결과를 받아 볼 수 있었다.
다만 메소드의 static 키워드가 제거된 데에도 이유가 있다.
바로 정적(static) 메소드에서는 비정적(non-static) 변수 즉 인스턴스 변수를 사용할 수 없기 때문이다.
왜 그런지 조금 더 자세하게 알아보자.
정적(static) 메소드든, 정적 (static) 변수든 현재 비정적(non-static) 즉 인스턴스의 상태를 알 수가 없다.
이게 생성이 되었는지, 생성이 되었다면 몇 개인지, 4개의 인스턴스가 생성되었다면 어디 인스턴스에 접근해야 하는지 알 수가 없다.
예를 들어보자
길에서 천 원짜리 지폐를 주웠다. 하지만 이게 누구 것인지 알 수 없기 때문에 잃어버린 사람에게 정확히 돌려주기 힘든 것 과 같다.
사실 예시는 CCTV를 통해 해당시간에 지나간 사람, 천 원짜리 지폐를 떨어뜨린 사람 등을 특정해서 대략 유추는 할 수 있겠지만, 컴퓨터는 그런 식으로 동작하면 안 된다. 물론 그렇게 찾는다고 무조건 맞다는 보장 또한 없다.
그러면 인스턴스 객체에서 static 영역에 접근할 수는 있을까?
그건 가능하다
public class test1 {
static int money = 0;
public static void main(String[] args) {
test1 t1 = new test1();
t1.inM(2000);
t1.outM(1000);
}
public void inM(int a){
money += a;
System.out.println(a + "원을 입금하였습니다. 현재 잔액 : " + money);
}
public void outM(int a){
money -= a;
System.out.println(a + "원을 출금하였습니다. 현재 잔액 : " + money);
}
}
바로 직전 예시코드에서 int money = 0; 앞에 static 만 추가하였다.
실행 결과
된다.
결론
인스턴스(메소드, 변수) -> 클래스(static) 접근 가능
클래스(static) -> 인스턴스(메소드, 변수) 접근 불가능
이거로 자바랑 조금 친해진 거면 좋겠다.