11. 클래스 메서드(static메서드)와 인스턴스 메소드
클래스 메서드도 클래스변수처럼 객체를 생성하지 않고도
클래스이름.메서드이름(매개변수)
와 같은 형식으로 호출이 가능하다. 반면, 인스턴스 메소드는 객체를 생성해야만 호출이 가능하다.
특징
1. 클래스를 설계할 때, 멤버변수 중에서 모든 인스턴스에 공통으로 사용하는 것에 static를 붙인다.
생성된 각 인스턴스들은 독립적이라서 각 인스턴스의 변수는 서로 다른 값을 유지하지만, 모든 인스턴스에서 값이 유지되어야 하는 변수의 경우는 static를 붙여서 클래스 변수로 정의한다.
2. 클래스 변수는 인스턴스를 생성하지 않아도 사용 가능하다.
클래스 변수는 클래스가 메모리에 올라갈 때 이미 자동으로 생성된다.
3. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
클래스 메서드의 경우 인스턴스 생성 없이 호출이 가능하기 때문에 호출되었을 때, 인스턴스가 존재하지 않을 수 있다. 그래서 클래스 메서드에서 인스턴스 변수의 사용을 금지한다.
반면 인스턴스 메서드에서는 언제든지 클래스 메서드를 사용 가능하다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않으면, static을 붙이는 것을 고려해야 한다.
메서드 작업내용에서 인스턴스 변수를 필요로 한다면, static를 붙일 수 없다. 하지만 인스턴스 변수를 필요로 하지 않는다면, static를 붙이는 것이 더 성능이 향상된다.
<예제>
12. 클래스 멤버와 인스턴스 멤버간의 참조와 호출
같은 클래스 안의 멤버 간에는 별도로 인스턴스를 생성하지 않고도, 참조와 호출을 할 수 있지만, 클래스 멤버가 인스턴스 멤버를 참조 혹은 호출하고자 하는 경우에는 인스턴스가 생성되어 있어야 한다.
그 이유는 둘의 생성 시기에 차이가 있기 때문인데, 인스턴스 멤버는 인스턴스가 생성된 이후에 생기고, 클래스 멤버는 클래스가 메모리에 올라간 순간 생기기 때문이다.
즉, 인스턴스 멤버가 있는 순간에는 항상 클래스 멤버가 존재하지만, 클래스 멤버가 존재하는 순간에 인스턴스 멤버가 존재하지 않을 수 있다는 것이다.
그래서 인스턴스 메서드는 다른 인스턴스 멤버나 클래스 멤버를 호출 가능하지만, 클래스 멤버에서는 인스턴스 멤버의 호출이 불가능한 경우가 있다. 이는 메서드와 메서드의 관계나 메서드와 변수의 관계에서나 마찬가지다.