들어가며
static 선언이 붙는 크래스 변수와
클래스 메소드도
상속의 대상에 포함이 되겠는가?
static 선언이 갖는 의미를 떠올리고
논리적으로 접근하면
이 질문에 스스로 답을 할 수 있다.
static 선언이 붙는 '클래스 변수'와 '클래스 메소드'의 상속
앞서 공부한 클래스 변수와 클래스
메소드의 특징을 정리하면 다음과
같다.
- 인스턴스의 생성과 상관없이 접근이 가능하다.
- 클래스 내부와 외부에서(접근 수준 지시자가 허용하면) 접근이 가능하다.
- 클래스 변수와 클래스 메소드가 위치한 클래스 내에서는 직접 접근이 가능하다.
즉 클래스 변수와 클래스 메소드는
인스턴스에 속하지 않는,
딱 하나만 존재하는 변수와 메소드이다.
따라서 상속의 대상이 아니다.
예를 들어서 다음 클래스를 보자.
class SuperCLS {
static int count = 0; // 클래스 변수
public SuperCLS() {
count++; // 클래스 내에서는 직접 접근이 가능
}
}
위의 클래스 내에 선언된 변수 count는
SuperCLS의 인스턴스 내에 존재하지 않는다.
이렇듯 인스턴스 멤버로 존재하지
않으므로,
이를 상속하는 하위 클래스의 멤버로
존재할 수 없다.
그러나 다음 내용에 대해서는 생각해
볼 필요가 있다.
"상위 클래스에 위치한 클래스 변수와 메소드에,
하위 클래스에서는 어떻게 접근하는가?"
즉 위의 클래스를 상속하는 다음 클래스
내에서 클래스 변수 count에
이렇게 변수명으로서 접근이 가능한지를
생각해봐야 한다.
class SubCLS extends SuperCLS {
public void showCount() {
System.out.println(count); // 상위 클래스에 위치하는 클래스 변수에 접근
}
}
결론을 말하자면 이렇듯 변수의 이름만으로
접근이 가능하다.
즉 상위 클래스와 마찬가지로,
이를 상속하는 하위 클래스에서도
이름만으로 클래스 변수와 메소드에
접근이 가능하다.
단, 선언된 접근 수준 지시자가 접근을
허용해야 접근이 가능하다.
즉, private로 선언이 되면 접근이 불가하다.
그럼 다음 예제를 통해서 이에 대한
내용을 확인하자.
class SuperCLS {
protected static int count = 0; // protected는 하위 클래스 접근을 허용
public SuperCLS() {
count++;
}
}
class SubCLS extends SuperCLS {
public void showCount() {
// 상위 클래스에 위치한 클래스 변수 count에 접근
System.out.println(count);
}
}
class SuperSubStatic {
public static void main (String[] arg) {
SuperCLS obj1 = new SuperCLS(); // count 값 1 증가
SuperCLS obj2 = new SuperCLS(); // count 값 1 증가
// 아래 인스턴스 생성 과정에서 SuperCLS 생성자 호출되므로,
SubCLS obj3 = new SubCLS(); // count 값 1 증가
obj3.showCount();
}
}
/* 출력 결과
3
*/
위 예제에서 변수 count의 접근
수준 지시자를 private로 선언하면
이로 인해 컴파일 오류가 발생하는
것도 확인하기 바란다.
참고 및 출처
|