열정 실천

[Java] 객체 지향 프로그래밍의 핵심 :: 상속 _ 오버라이딩, 추상클래스, super 본문

카테고리 없음

[Java] 객체 지향 프로그래밍의 핵심 :: 상속 _ 오버라이딩, 추상클래스, super

구운오니 2024. 10. 7. 19:45
728x90

 

객체 지향 프로그래밍에서는 상속이라는 개념을 통해 한 클래스가 다른 클래스의 속성와 메소드를 재사용할 수 있다. 

 

  • 부모 클래스(Superclass 또는 Parent class): 다른 클래스에 의해 상속되는 클래스입니다. 부모 클래스의 필드와 메서드는 자식 클래스에 상속됩니다.
  • 자식 클래스(Subclass 또는 Child class): 부모 클래스를 상속받아 생성된 클래스입니다. 자식 클래스는 부모 클래스의 모든 **멤버(필드와 메서드)**를 상속받으며, 추가적인 필드와 메서드를 정의하거나 부모의 메서드를 재정의할 수 있습니다.

 

 

extends

 

자바에서는 extends 키워드를 사용하여 상속을 구현한다. 

 

class Animal {

}

class Dog extends Animal {

}

 

 

오버라이딩

 

자식 클래스가 부모 클래스에서 정의된 메소드를 재정의하여 사용하는 것을 의미한다.

이는 객체 지향 프로그래밍에서 다형성을 구현하는 중요한 기능 중 하나이다.

 

- 메소드 이름매개변수 목록이 동일해야 한다.

- 반환 타입은 같거나, 자식 클래스 타입이어야한다. 

- 접근 제어자는 부모 클래스의 메소드와 같거나 더 넓은 범위를 가져야 한다. 

   (부모 : protected 일 때, 자식 : public 가능)

class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

 

 

super 키워드

 

자식 클래스에서 부모 클래스의 생성자나 메서드를 호출할 때 사용한다. 자식 클래스의 생성자는 반드시 부모 클래스의 생성자를 호출해야 하며, 이때 super()를 사용한다.

 

class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        super.makeSound();  // 부모 클래스의 makeSound() 메소드 호출 "Some sound" 출력
        System.out.println("Bark");  // "Bark" 출력
    }

}

public class Main {
    public static void main(String[] args) {
    
        Dog dog = new Dog(); // Dog 객체 생성
        dog.makeSound(); 
        
    }

 

 

 

추상클래스 abstract 

 

객체를 생성할 수 없는 클래스이다. 추상 클래스는 주로 공통된 속성과 메소드를 정의하고, 이를 상속받는 자식 클래스에서 구체적인 구현을 제공하도록 강제하는 용도로 사용된다.

 

// 추상 클래스
abstract class Animal {
    // 일반 메소드
    public void eat() {
        System.out.println("This animal is eating");
    }

    // 추상 메소드
    public abstract void makeSound();  // 자식 클래스에서 구현해야 함
}

// Dog 클래스는 Animal 클래스를 상속받고 추상 메소드를 구현해야 함
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

// Cat 클래스도 Animal 클래스를 상속받고 추상 메소드를 구현해야 함
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();  // Dog 객체 생성
        dog.eat();               // "This animal is eating" 출력
        dog.makeSound();         // "Bark" 출력

        Animal cat = new Cat();  // Cat 객체 생성
        cat.eat();               // "This animal is eating" 출력
        cat.makeSound();         // "Meow" 출력
    }
}

 

 

 

 


 

 

 

자식클래스로 생성한 객체를 부모클래스의 타입으로 형변환을 하는 경우가 있는데 (또는 반대로) 이는 변수와 메소드 사용에 제한을 주게 된다. 더 자세한 설명과 예시는 아래 글에서 확인가능!-!

 

 

https://guun-oni.tistory.com/113

 

[JAVA] 객체의 형변환 - 업캐스팅(묵시적 형변환), 다운캐스팅(명시적 형변환)

묵시적 형변환 (업캐스팅)   :: 자식 클래스의 객체를 부모 클래스 타입으로 변환SuperClass A = new SubClass();  자식 클래스는 부모 클래스를 확장하므로, 자식 클래스의 객체는 부모 클래스 타입으

guun-oni.tistory.com

 

 

 

728x90