🔖 INDEX
super 키워드
- 'super' 키워드는 하위 클래스에서 상위 클래스의 멤버(필드 또는 메서드)에 접근하기 위해 사용됩니다.
- 상속 관계에서 하위 클래스는 상위 클래스의 멤버를 상속받지만, 동일한 이름의 멤버가 존재할 경우에는 'super' 키워드를 사용하여 상위 클래스의 멤버에 접근할 수 있습니다.
- 'super' 키워드는 상위 클래스의 멤버에 접근하는 데 사용되며, 'super.멤버이름' 형식으로 사용됩니다.
class Animal {
String name;
Animal(String name) {
this.name = name;
}
void sound() {
System.out.println("동물이 소리를 내고 있습니다.");
}
}
class Cat extends Animal {
String color;
Cat(String name, String color) {
super(name); // 상위 클래스의 생성자 호출
this.color = color;
}
void sound() {
super.sound(); // 상위 클래스의 메서드 호출
System.out.println("야옹 야옹");
}
}
public class Main {
public static void main(String[] args) {
Cat cat = new Cat("나비", "검은색");
cat.sound(); // 상위 클래스와 하위 클래스의 메서드 호출
}
}
super 메서드
- 'super()' 메서드는 하위 클래스에서 상위 클래스의 생성자를 호출하는 데 사용됩니다.
- 하위 클래스의 생성자에서 'super()' 메서드를 호출하면 상위 클래스의 기본 생성자가 호출됩니다. 기본 생성자 이외의 다른 생성자를 호출하려면 'super(매개변수)' 형태로 호출합니다.
- 'super()' 메서드는 상위 클래스의 생성자를 호출하여 상위 클래스의 초기화 작업을 수행합니다. 이후에 하위 클래스의 초기화 작업이 진행됩니다.
- 'super()' 메서드는 하위 클래스의 생성자 첫 줄에서만 호출할 수 있으며, 반드시 첫 번째 문장이어야 합니다.
class Animal {
String name;
Animal(String name) {
this.name = name;
}
}
class Cat extends Animal {
String color;
Cat(String name, String color) {
super(name); // 상위 클래스의 생성자 호출
this.color = color;
}
}
public class Main {
public static void main(String[] args) {
Cat cat = new Cat("나비", "검은색");
}
}
장점 및 특징
장점
- 'super' 키워드를 사용하면 하위 클래스에서 상위 클래스의 멤버에 쉽게 접근할 수 있습니다. 이를 통해 코드의 재사용성과 유지보수성이 향상됩니다.
- 'super()' 메서드를 사용하여 상위 클래스의 생성자를 호출하면 상위 클래스의 초기화 작업을 수행할 수 있습니다. 이는 객체 지향 프로그래밍의 상속 개념을 효과적으로 활용하는 데 도움이 됩니다.
특징
- 'super' 키워드를 사용할 때, 상위 클래스에 접근할 수 있는 범위에 따라 접근 가능한 멤버가 달라집니다. 상위 클래스의 private 멤버에는 접근할 수 없습니다.
- 'super()' 메서드는 하위 클래스의 생성자 첫 줄에서만 호출해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다.
- 'super' 키워드와 'super()' 메서드는 상속 관계에서 사용되며, 부모 클래스와 자식 클래스 간의 관계를 강화시킵니다.
- 'super' 키워드를 사용하여 상위 클래스의 멤버를 호출할 수 있고, 'super()' 메서드를 사용하여 상위 클래스의 생성자를 호출할 수 있습니다.
구현 예제
class Animal {
String name;
Animal(String name) {
this.name = name;
}
void makeSound() {
System.out.println(name + "이(가) 소리를 내고 있습니다.");
}
}
class Cat extends Animal {
String color;
Cat(String name, String color) {
super(name); // 상위 클래스의 생성자 호출
this.color = color;
}
void makeSound() {
super.makeSound(); // 상위 클래스의 메서드 호출
System.out.println(name + "이(가) 야옹 야옹 소리를 내고 있습니다.");
}
void printInfo() {
System.out.println("이름: " + name);
System.out.println("색상: " + color);
}
}
public class Main {
public static void main(String[] args) {
Cat cat = new Cat("나비", "검은색");
cat.makeSound(); // 상위 클래스와 하위 클래스의 메서드 호출
cat.printInfo(); // 하위 클래스의 메서드 호출
}
}
위의 예제에서는 Animal 클래스와 Cat 클래스를 정의하고 있습니다. Animal 클래스는 동물을 나타내는 기본 클래스이며, Cat 클래스는 Animal 클래스를 상속받아 고양이를 특화시킨 클래스입니다.
Cat 클래스의 생성자에서는 'super(name)'을 사용하여 Animal 클래스의 생성자를 호출하고 있습니다. 이를 통해 name 필드를 초기화하고 있습니다.
또한, Cat 클래스에서는 makeSound() 메서드를 오버라이딩하여 'super.makeSound()'를 통해 Animal 클래스의 makeSound() 메서드를 호출하고 있습니다. 이를 통해 Animal 클래스의 소리 출력 이후에 "야옹 야옹" 소리를 출력하고 있습니다.
Main 클래스에서는 Cat 객체를 생성하고 makeSound() 메서드와 printInfo() 메서드를 호출하여 상위 클래스와 하위 클래스의 메서드를 호출하고 있습니다.
실행 결과는 다음과 같습니다:
나비이(가) 소리를 내고 있습니다.
나비이(가) 야옹 야옹 소리를 내고 있습니다.
이름: 나비
색상: 검은색
'super' 키워드와 'super()' 메서드 자체는 성능에 직접적인 영향을 주지 않습니다. 그러나 상속 관계가 복잡하거나 깊은 경우, 상위 클래스의 생성자 호출 및 메서드 호출로 인해 성능 저하가 발생할 수 있습니다.
성능 최적화를 위해선 적절한 상속 구조를 설계하고, 불필요한 상위 클래스의 호출을 피하고, 메서드 재정의를 필요한 경우에만 사용하는 등의 방법을 고려할 수 있습니다.
또한, 상속 대신 인터페이스를 활용하는 것도 성능 최적화에 도움이 될 수 있습니다.
'프로그래밍 > JAVA' 카테고리의 다른 글
초보 자바 프로그래밍(55) - Error와 Exception (0) | 2023.06.04 |
---|---|
초보 자바 프로그래밍(54) - 인터페이스와 추상클래스 (0) | 2023.05.21 |
초보 자바 프로그래밍(52) - 상속 (inheritance) (0) | 2023.05.14 |
초보 자바 프로그래밍(51) - 클래스 생성자 (1) | 2023.05.12 |
초보 자바 프로그래밍(50) - 클래스(Class) 멤버 (0) | 2023.05.11 |
댓글