non-static 멤버는 객체마다 별도로 존재하며, 인스턴스 멤버라고도 합니다. 인스턴스 멤버는 객체가 생성될 때 인스턴스 멤버도 생성됩니다. 그렇기 때문에 인스턴스 멤버를 사용하기 위해서는 객체를 먼저 생성해주고 사용해야합니다.
예를들어 아래와 같이 Person클래스가 있다고 가정해봅시다.
class Person{
String name;
int age;
//...생략
public String getName(){
return this.name;
}
//...생략
}
이 Person class의 getName()함수를 사용하고 싶다면 아래와 같이 Person클래스를 new를 사용하여 생성해준 이후에 person.getName()과 같은 형태로 사용할 수 있습니다. new를 통해 객체를 만들어 주지 않는다면 getName()함수는 사용할 수 없습니다.
class PersonTest{
public static void main(String[] args){
Person person = new Person("이름",22);
System.out.println(person.getName());
}
}
또한 인스턴스 멤버는 객체내에 각각 독립적인 공간을 유지하기 때문에 서로의 값을 공유하지 않습니다.
static은 고정된이라는 의미로 static이라는 키워드를 사용하여 static변수와 static메소드를 만들 수 있는데 정적 필드와 정적 메소드라고 하며 이 둘을 합쳐 정적 멤버라고 합니다.
이렇게 만들어진 정적 멤버는 메모리에 한번 할당되어 프로그램이 종료될 때 해제됩니다.
정적 필드와 정적 메소드는 JVM이 Class Loader을 이용해 클래스가 로드되는 시점에 메모리의 Method영역에 최초 한번 올라갑니다. 따라서 클래스 내의 여러 객체들이 정적 멤버를 공유하여 사용합니다.
그리고 객체가 생성되기 전에 이미 Method영역에 생성되므로 객체를 생성하지 않고도 사용 가능합니다.
아까와 같이 Person클래스가 있다고 가정해봅시다. 하지만 위와 다른 점은 getName()의 함수에 static 키워드가 붙어있습니다.
class Person{
String name;
int age;
//...생략
public static String getName(){
return "이름";
}
//...생략
}
이렇게 static 키워드가 붙어있는 멤버는 Person클래스가 로딩될 때 이미 생성되어있습니다. 그렇기 때문에 Person 객체를 생성해주지 않고 Person.getName()으로 사용할 수 있습니다.
class PersonTest{
public static void main(String[] args){
System.out.println(Person.getName());
}
}
이런식으로 사용하는 것이 크게 와닿지 않을 수 있습니다. 자바로 코딩테스트를 준비하는 경우
public class Main{
public static void main(String[] args)throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int m = Math.max(n,5);
}
}
위 와같이 Integer.parseInt()
함수를 사용하여 String을 int로 형변환을 하거나 Math.max()
를 사용하여 두개의 값중 더 큰 값을 비교해본 경험이 있을 것입니다.
이때 Integer클래스의 parseInt()
와 Math클래스의 max()
함수가 static메소드이기 때문에 우리는 별도의 객체 생성없이 바로 사용할 수 있는 것입니다.
실제 Integer클래스의 parseInt()
의 내용입니다. parseInt()함수에 static 키워드가 붙어있음을 알 수 있습니다.
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
static멤버 | non-static 멤버 | |
---|---|---|
생성 위치 | Method(static)영역 | heap 영역 |
생성 시점 | 클래스가 로딩되는 시점 | 객체가 생성되는 시점 |
공유 | 하나의 클래스로부터 생성된 여러 객체가 공유 | 객체 각각 독립된 공간을 유지, 공유 x |