Java super 키워드 마스터: 고급 용법과 실전 예제
Java super 키워드 마스터: 고급 용법과 실전 예제
super 키워드가 Java 상속에서 어떻게 강력한 기능을 제공하는지 명확한 예제와 전문가 가이드로 알아봅니다.
super 키워드는 Java 상속 모델의 초석으로, 하위 클래스가 직계 슈퍼클래스의 멤버(필드, 메서드, 생성자)를 참조할 수 있게 합니다. 그 뉘앙스를 이해하는 것은 깔끔하고 유지보수하기 쉬운 코드 작성에 필수적입니다.
super의 주요 용도
- 오버라이딩된 슈퍼클래스 메서드 호출
- 하위 클래스 필드에 가려진 슈퍼클래스 필드 접근
- 하위 클래스 생성자에서 슈퍼클래스 생성자 명시적 호출
코드 샘플과 함께 각 시나리오를 살펴보겠습니다.
1. 오버라이딩된 슈퍼클래스 메서드 호출
하위 클래스가 메서드를 오버라이딩하면 super.methodName()으로 슈퍼클래스 버전에 여전히 접근 가능합니다. 이는 원래 기능을 잃지 않고 동작을 확장할 때 중요합니다.
예제: 메서드 오버라이딩과 super
class Animal { public void display() { System.out.println("I am an animal"); } } class Dog extends Animal { @Override public void display() { System.out.println("I am a dog"); } public void printMessage() { display(); // Dog.display() 호출 super.display(); // Animal.display() 호출 } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.printMessage(); } }
출력:
I am a dog I am an animal
super.display() 사용으로 슈퍼클래스 구현이 실행되어 기능을 대체하지 않고 확장할 때 유용합니다.
2. 가려진 슈퍼클래스 필드 접근
슈퍼클래스와 하위 클래스가 같은 이름의 필드를 선언하면 하위 클래스 필드가 슈퍼클래스 필드를 가립니다. super.fieldName으로 원래 필드 참조가 가능합니다.
예제: 필드 가림
class Animal { protected String type = "animal"; } class Dog extends Animal { public String type = "mammal"; public void printType() { System.out.println("I am a " + type); // Dog.type System.out.println("I am an " + super.type); // Animal.type } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.printType(); } }
출력:
I am a mammal I am an animal
3. super()로 슈퍼클래스 생성자 호출
생성자는 상속되지 않지만, 하위 클래스는 super()로 슈퍼클래스 생성자를 호출할 수 있습니다. 이는 하위 클래스 생성자의 첫 문장이어야 하며, 슈퍼클래스에 기본 생성자가 없거나 인수를 전달해야 할 때 필수입니다.
예제 1: 기본 생성자 호출
class Animal { Animal() { System.out.println("I am an animal"); } } class Dog extends Animal { Dog() { super(); System.out.println("I am a dog"); } } public class Main { public static void main(String[] args) { new Dog(); } }
출력:
I am an animal I am a dog
예제 2: 매개변수 있는 생성자 호출
class Animal { Animal(String type) { System.out.println("Type: " + type); } } class Dog extends Animal { Dog() { super("Animal"); System.out.println("I am a dog"); } } public class Main { public static void main(String[] args) { new Dog(); } }
출력:
Type: Animal I am a dog
매개변수 있는 경우 컴파일러가 논-디폴트 생성자를 자동 호출할 수 없으므로 super(arguments)가 필수입니다.
super 키워드 마스터로 견고한 상속 계층을 작성하고, 오버라이딩된 로직에 접근 가능하게 하며, 생성자가 적절히 초기화되게 하세요. 이 기법들은 확장 가능한 Java 애플리케이션에 필수적이며 업계 전문가들이 권장하는 모범 사례와 일치합니다.