static메소드 관련 질문입니다.
static 메소드에는 static 변수는 들어갈 수 있는데 일반 변수는 들어갈 수가 없는데
생각해보면 메소드가 선언이 되면 다른 인스턴스에서 호출이 가능해야 하는데
변수는 접근제어지시자에 의해 클래스에서만 호출이 가능할수도 있고 같은 패키지 내에서도 실행이 될수도 있습니다
그렇다면 변수가 public으로 선언될 경우는 static메소드에 들어갈 수 있어야 된다고 생각하는데
이게 되지 않는 이유가 궁금합니다
class AAA
{
int num1;
static int num2;
static void changenum()
{
num1++; // 에러발생
num2++; // 정상실행
}
}
인데 int num1;을 public int num1;로 바꾸어도 실행이 되지 않는 이유가 궁금합니다
public 은 멤버필드나 메소드에 대한 접근권한 제어 즉 객체지향의 데이터 캡슐화(은닉화) 관련된 부분입니다.
그거와 상관없이 static선언은 클래스 변수나, 클래스 메소드에 대한 선언을 할 때 사용합니다.
static으로 선언한다는건 클래스가 인스턴스화 되지 않아도 사용 가능하고 GC 되지 않으면 thread sharing 하게 되는 특징등이 있습니다.
위에 것이 가능한 이유는 static 으로 선언하게 될경우 JVM 메모리에 로딩 되는 위치가 달라집니다.
그렇기 때문에 클래스 메소드에서 클래스 변수가 아닌 값을 참조 할 수 없습니다.
쉽게 설명하면
static 붙은 애들끼리 한 교실에 있고,
static 안붙은 애들끼리 한 교실에 있습니다.
static 애들이 있는 교실에서 안붙은 애를 불러봤자 찾을수가 없겠죠.
static 붙은 것과 안 붙은 것의 변수 저장 위치(메모리)가 다른데 이것을 교실로 비유해서 설명해보았습니다.
public / protected / private 등의 접근제어 관련된 명령어는
한 교실에 여러 조(클래스)가 있을 때
한 학생을 부르기 위해 얼마나 큰 마이크를 주느냐에 따른 차이라고 보시면 되는데요
적은 볼륨의 마이크(private) 를 주면 적은 범위 내에서만 들을 수 있고 (클래스 내부 호출만 가능)
제일 큰 볼륨의 마이크 (public) 를 주면 교실 전체에서 들을 수 있는 거죠 (클래스 외부 호출 가능)
물론 그렇다고 해도, 다른 반 교실의 학생을 데려올 수는 없기 때문에 static 은 완전히 다른 얘기입니다.
위 예제에서 int num1 변수를 public 으로 선언한다는 것은
다른 조 (다른 클래스) 에서도 num1 을 부를 수 있게 하겠다는 얘기입니다.