Menu
Coddy logo textTech

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!");
    }
}

superthis의 반대로 생각하세요. this가 현재 객체를 가리키는 반면, super는 해당 객체의 부모 클래스 부분을 가리킵니다. 이러한 구분은 자식 클래스가 부모의 동작을 완전히 대체하기보다 확장해야 하는 클래스 계층 구조를 구축할 때 매우 중요해집니다.

challenge icon

챌린지

쉬움

자식 클래스가 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() 메서드
  • 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()를 호출한 결과 출력하기
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨