super 키워드
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 21번째.
super 키워드는 서브클래스가 부모 클래스를 참조할 수 있는 방법을 제공합니다. 자식 클래스 내에서 부모 클래스의 멤버나 생성자에 접근해야 할 때 필수적입니다.
super의 가장 일반적인 용도는 부모의 생성자를 호출하는 것입니다. 이것은 서브클래스 생성자 내에서 첫 번째 문장이어야 합니다:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // 반드시 첫 번째 줄이어야 함
this.doors = doors;
}
}또한 super를 사용하여 부모 메서드를 호출할 수 있으며, 이는 서브클래스에 동일한 이름의 메서드가 있을 때 특히 유용합니다:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Animal 버전을 호출합니다
System.out.println("Meow!");
}
}super를 this의 반대로 생각하세요. this가 현재 객체를 가리키는 반면, super는 해당 객체의 부모 클래스 부분을 가리킵니다. 이러한 구분은 자식 클래스가 부모의 동작을 완전히 대체하기보다 확장해야 하는 클래스 계층 구조를 구축할 때 매우 중요해집니다.
챌린지
쉬움자식 클래스가 super를 사용하여 부모 생성자를 호출하고 부모 메서드의 동작을 확장하는 방법을 보여주는 가전제품 시스템을 구축해 보겠습니다.
코드를 정리하기 위해 세 개의 파일을 생성합니다:
Appliance.java: 모든 가전제품을 나타내는 부모 클래스를 생성합니다. 다음을 포함해야 합니다:- 가전제품의
brand(String)를 위한 private 필드 wattage(int)를 위한 private 필드- 두 값을 모두 받아 초기화하는 생성자
- 브랜드를 반환하는
getBrand()메서드 - 소비 전력을 반환하는
getWattage()메서드 [brand] - [wattage]W를 반환하는getInfo()메서드
- 가전제품의
WashingMachine.java: Appliance를 상속받는 서브클래스를 생성합니다. 세탁기는 가전제품의 모든 특징을 가지고 있으며, 자신만의 특별한 기능을 추가로 가집니다:- kg 단위의 세탁 용량을 나타내는
capacity(int)를 위한 private 필드 - brand, wattage, capacity를 인자로 받는 생성자 -
super(brand, wattage)를 사용하여 부모 부분을 초기화한 다음 capacity를 설정합니다. - 용량을 반환하는
getCapacity()메서드 super.getInfo()를 사용하여 부모의getInfo()를 호출하고 이를 확장하여[parent info], Capacity: [capacity]kg를 반환하는getInfo()메서드
- kg 단위의 세탁 용량을 나타내는
Main.java: WashingMachine을 생성하고 전체 정보를 표시합니다. brand (String), wattage (int), capacity (int)의 세 가지 입력을 받습니다. 세탁기 객체의getInfo()를 호출한 결과를 출력하세요.
브랜드 이름, 소비 전력, 용량의 세 가지 입력을 받게 됩니다.
여기서 super가 두 가지 목적으로 사용되는 방식에 주목하세요: 상속된 필드를 초기화하기 위해 부모 생성자를 호출하는 것과, 부모의 동작을 완전히 대체하는 대신 그 위에 기능을 추가하기 위해 부모의 메서드를 호출하는 것입니다.
치트 시트
super 키워드는 서브클래스 내에서 부모 클래스를 참조합니다.
부모 생성자를 호출하려면 super()를 사용하세요. 이는 서브클래스 생성자의 첫 번째 문장이어야 합니다:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // 반드시 첫 번째 줄이어야 함
this.doors = doors;
}
}부모 메서드를 호출하려면 super.methodName()을 사용하세요. 이는 서브클래스가 메서드를 오버라이드할 때 유용합니다:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Animal의 버전을 호출함
System.out.println("Meow!");
}
}super는 객체의 부모 클래스 부분을 참조하는 반면, this는 현재 객체를 참조합니다.
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 입력 읽기
String brand = scanner.nextLine();
int wattage = scanner.nextInt();
int capacity = scanner.nextInt();
// TODO: 입력된 값으로 WashingMachine 객체 생성하기
// TODO: 세탁기 객체에서 getInfo()를 호출한 결과 출력하기
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조