클래스 메서드
는 클래스 변수
처럼 객체를 생성하지 않고도 호출이 가능하다.
클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
* 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스변수로 정의해야 한다.
클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
* static
이 붙은 변수는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다.
클래스 메서드는 인스턴스 변수를 사용할 수 없다.
클래스메서드는 인스턴스 생성 없이 호출 가능하므로 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있다.
그래서 인스턴스 변수의 사용을 금지한다.
메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
인스턴스 변수를 필요로 하지 않는다면 static을 붙이는 것이 좋다. (메서드 호출시간이 짧아지므로 성능이 향상)
static을 안 붙인 메서드는 실행 시 호출되어야 할 메서드를 찾는 과정이 추가적으로 필요하기 떄문에 시간이 더 걸린다.
Class TestClass{
void instanceMethod(){}
static void staticMethod(){}
void instanceMethod2() {
instanceMethod();
staticMethod();
}
static void staticMethod2() {
instanceMethod(); // 에러!! 인스턴스메서드를 호출할 수 없다.
staticMethod(); // static 메소드는 호출할 수 있다.
}
}
Class TestClass2 {
int iv;
static int cv;
void instanceMethod() {
System.out.println(iv);
System.out.println(cv);
}
static void staticMethod() {
System.out.println(iv); // 에러!! 인스턴스 변수를 사용할 수 없다.
System.out.println(cv); // static 변수는 사용할 수 있다.
}
}
JDK1.5
부터 동적으로 지정해줄 수 있게 되었다.public PrintStream printf(String format, Object... args) {...}
만일 여러 문자열을 하나로 결합하여 반환하는 concatenate메서드를 작성한다면, 아래와 같이 작성해야할 것이다.
String concatenate(String s1, String s2) {...}
String concatenate(String s1, String s2, String s3) {...}
String concatenate(String s1, String s2, String s3, String s4) {...}
이럴 때, 가변인자를 사용하면 된다.
String concatenate(String... str) {...}
아마 눈치 챘을 것인데, 가변인자는 내부적으로 배열을 이용한다. 그래서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성된다. (가변인자가 편리하지만, 이런 비효율이 숨어있으므로 꼭 필요한 경우에만 가변인자를 사용하자)
그러면 가변인자는 아래와 같이 매개변수의 타입을 배열로 하는 것과 어떤 차이가 있는가?
String concatenate(String[] str) {...}
String result = concatenate(new String[0]); // 인자로 배열을 지정
String result = concatenate(null); // 인자로 null을 지정
String result = concatenate(); // 에러. 인자가 필요함.
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 단, 다음의 두 조건을 만족시켜야 한다.
다음의 코드는 생성자를 작성할 때 지켜야하는 두 조건을 모두 만족시키지 못했기 때문에 에러가 발생한다.
Car(String color) {
door = 5;
Car(color, "auto", 4); // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
// 에러2. this(color, "auto", 4);로 해야한다.
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
this
는 참조변수로 인스턴스 자신을 가리킨다.this
역시 사용할 수 없음)this
인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있다.
모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.this()
생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.