[자바] 클래스 상속

Kingyj·2024년 11월 20일

extends의 역할

  • 한 클래스가 다른 클래스의 속성과 메서드를 물려받아 확장할 때 사용한다.
  • 상속받는 클래스는 부모 클래스의 멤버(필드와 메서드)를 사용할 수 있다.

코드_extends

class Parent {
    void yj() {
        System.out.println("Hello from Parent!");
    }
}

class Child extends Parent {
    void yjChild() {
        System.out.println("Hello from Child!");
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.yj();       // 부모 클래스의 메서드
        child.yjChild();  // 자식 클래스의 메서드
    }
}

출력_extends

Hello from Parent!
Hello from Child!

그렇다면, 밑의 코드는 과연 가능할까?

public class Main {
    public static void main(String[] args) {
        사람 a사람 = new 심슨();
    }
}

정답은 불가능이다. 사람의 리모콘 a사람은 사람만 인식 할 수 있다.
그런데, 이를 가능하게 할 수 있다.

public class Main {
    public static void main(String[] args) {
         사람 a사람 = new 사람();
        a사람 = new 심슨();
    }
}
class 사람 { }
class 심슨 extends 사람 { }

위의 코드처럼 a사람(리모콘)은 원래는 사람만 사용 할 수 있지만, class를 통해 심슨 extends(도) 사실은 사람이다라고 java에게 알려주면 a사람(리모콘)은 심슨이 될 수 있다.


abstract의 역할

abstract는 Java에서 추상 클래스와 추상 메서드를 정의하는 데 사용됩니다. 추상 클래스와 메서드는 객체 지향 프로그래밍(OOP)에서 "설계의 틀"을 제공하며, 하위 클래스에서 구현 세부 사항을 제공해야 합니다.

  1. 추상 클래스
  • 정의: 하나 이상의 추상 메서드를 포함하거나, 객체를 직접 생성할 수 없는 클래스입니다.
  • 특징:
    • 추상 클래스는 상속을 통해서만 사용 가능합니다.
    • 추상 메서드를 포함할 수도, 포함하지 않을 수도 있습니다.
    • 일반 메서드와 필드도 가질 수 있습니다.

코드

abstract class Animal {
    abstract void makeSound(); // 추상 메서드 (구현 없음)

    void eat() { // 일반 메서드 (구현 있음)
        System.out.println("This animal eats food.");
    }
}
  1. 추상 메서드
  • 정의: 선언만 하고 구현하지 않은 메서드. 하위 클래스에서 반드시 구현해야 합니다.
  • 특징:
    • abstract 키워드를 사용하여 선언합니다.
    • 구현(메서드 본문)이 없습니다.
    • 추상 메서드를 가진 클래스는 반드시 추상 클래스여야 합니다.

코드

abstract class Animal {
  abstract void makeSound(); // 하위 클래스에서 구현해야 함
}

코드_추상 클래스와 메서드 활용

// 추상 클래스
abstract class Animal {
    // 추상 메서드
    abstract void makeSound();

    // 일반 메서드
    void eat() {
        System.out.println("This animal eats food.");
    }
}

// 하위 클래스
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Woof! Woof!");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow! Meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.makeSound(); // Woof! Woof!
        dog.eat();       // This animal eats food.

        Animal cat = new Cat();
        cat.makeSound(); // Meow! Meow!
        cat.eat();       // This animal eats food.
    }
}

출력

Woof! Woof!
This animal eats food.
Meow! Meow!
This animal eats food.

0개의 댓글