static이라는 키워드가 메소드 앞에 붙으면 이 메소드는 클래스 메소드(static method)가 된다.
무슨 말인지 알쏭달쏭하겠지만 예제를 보면 매우 쉽다.
public class Counter { static int count = 0; Counter() { this.count++; } public static int getCount() { return count; } public static void main(String[] args) { Counter c1 = new Counter(); Counter c2 = new Counter(); System.out.println(Counter.getCount()); } }getCount() 라는 static 메소드가 추가되었다. main 메소드에서 getCount() 메소드는 Counter.getCount() 와 같이 클래스를 통해 호출할 수 있게 된다.
※ 클래스 메소드 안에서는 인스턴스 변수 접근이 불가능 하다.
위 예에서 count는 static 변수이기 때문에 클래스 메소드(static method)에서 접근이 가능한 것이다.
객체 생성이 안되었으니까 접근이 안된다는 말 맞죠?
객체 생성하면 되는거 맞죠?
클래스 메소드가 static 메소드였네..;; 뭐 이런
그러니까 객체 생성하지 않은 static 메소드는 인스턴스 변수에 접근이 불가능하고
객체를 생성한 static 메소드는 인스턴스 변수에 접근이 되나요?
안되네 그냥
아예 그냥 컴파일 자체가 안되네.. 뭐 이런 퍽퍽한 언어가 다 있어
객체 생성했으면 클래스 메소드라도 인스턴스 변수에 접근은 되어야 되는거 아닙니까?
아 안되겠다 클래스 메소드가 먼저 메모리에 할당되니까 안되겠구나..
static 메소드는 this포인터를 안받을껄? 그래서 인스턴스 변수를 접근 못하는거고
간단하게 설명하면 static이라는건 선언 할 필요가 없음, 그러니까 프로그램이 컴파일 되고 실행이 되면 선언문이 없어도 메모리에 쭉 올라가있는 상태. 그래서 자바의 시작은 public static main이지 main함수를 선언 해 줘서 쓸 수 있는거면 선언 할 수 잇는 구문이 필요하니까 닭이먼저냐 달걀이 먼저냐가 되버림 그래서 static으로 메모리에 올려놓고 시작하는거
저 예제를 설명하면 클래스 자체는 스태틱이 아니라서 선언해야되지만 내부에 변수는 스태틱임 그러니까 굳이 전체 클래스 호출없이도 클래스이름.변수이름으로 호출이 가능, 그러니까 이 클래스가 100개든 10000개든 저 스태틱 변수는 저 클래스 안에서 공유를함 그래서 싱글턴 패턴에서 카운터 같은게 가능... 한데 이런건 아직 몰라도됨
그냥 쉽게 생각하면 지금 당장은 스태틱=선언이 필요없는 것 이라고 생각하면 편함, 근데 선언이 필요없다는건 메모리에 항상 올라가있다는거니까 거기까지도 좀 생각해야됨
넵 감사합니다