본문 바로가기
쿤즈 Dev/Java

[Java] 자바에서 사용하는 상속(Inheritance)에 대해 알아보자

by Koonz:) 2023. 9. 10.
728x90

자바(Java)에서 상속(Inheritance)은 객체 지향 프로그래밍(OOP)의 중요한 개념 중 하나이다. 대부분의 많은 프레임워크들은 대부분 상속을 사용하고 있다. 그리고 이 개념을 알아야 조금 더 효율적으로 개발이 가능하다.

이번 포스팅에서는 자바에서 사용하는 상속에 대해서 알아보자.


상속 Inheritance

자바의 가장 큰 특징은 재사용이다. 자바는 상속을 통해 하나의 클래스(부모 클래스 또는 슈퍼 클래스)에서 정의된 속성과 메서드를 다른 클래스(자식 클래스 또는 서브 클래스)에서 재사용할 수 있다. 이를 통해서 코드의 재사용성을 증가시키고 클래스 간의 계층 구조를 만들 수 있다.

 

다음은 자바에서 상속을 사용하는 방법에 대한 간단한 예제이다.

// 강아지 클래스
public class Dog {
    String name;

    public Dog(String name) {
        this.name = name;
    }

    public void speak() {
        System.out.println(this.name + " 멍멍");
    }
}

// 고양이 클래스
public class Cat {
    public String name;

    public Cat(String name) {
        this.name = name;
    }

    public void speak() {
        System.out.println(this.name + "야옹");
    }
}

// 메인 클래스
public class AnimalTest {
    public static void main(String[] args) {
        Cat cat = new Cat("냐옹");
        Dog dog = new Dog("장군");

        cat.speak();
        dog.speak();
    }
}

위 클래스는 강아지를 나타내는 Dog 클래스와 고양이를 나타내는 Cat 클래스이다. 이 둘은 모두 이름을 가지고 있으며 소리를 낼 수 있는 메서드를 가지고 있다. 그래서 상속을 통해서 이들을 다시 나타내려 한다.

 

// 동물 클래스
public class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public void speak() {
        System.out.println(name + " 소리를 낸다.");
    }
}

// 강아지 클래스
public class Dog extends Animal{

    public Dog(String name) {
        super(name); // 부모의 생성자 호출
    }

    // 부모 클래스의 메서드를 오버라이딩
    @Override
    public void speak() {
        super.speak();
    }
}


// 고양이 클래스
public class Cat extends Animal{

    public Cat(String name) {
        super(name); // 부모의 생성자 호출
    }

    // 부모 클래스의 메서드를 오버라이딩
    @Override
    public void speak() {
        System.out.println(name + " 야옹");
    }

    // 새로운 메서
    public void jump() {
        System.out.println(name + " 점프");
    }
}

// 메인 클래스
public class AnimalTest {
    public static void main(String[] args) {
        Cat cat = new Cat("냐옹");
        Animal dog = new Dog("장군");

        dog.speak();
        cat.speak();
        cat.jump();
    }
}

위 예제에서 공통된 부분을 Animal 클래스로 분리했다. 그리고 Animal 클래스에서는 이름과 소리를 내는 메서드를 이미 생성해 두었다. 그리고 이 클래스를 상속받을 자식 클래스에서는 'extends'라는 키워드를 이용해서 상위 클래스를 상속받는다.

 

이렇게 상속받은 'Cat', 'Dog' 클래스에서는 생성자에서 'super' 키워드를 이용해서 상위 클래스의 생성자에게 이름을 넘겨준다. 자식 클래스는 자신들이 이름이라는 멤버변수를 가지고 있지 않아도 이미 부모로부터 상속받는 멤버변수가 있으므로 그대로 사용이 가능하다.

 

또한 메서드 역시 @Overide 해서 사용할 수 있는데 이는 다음 포스팅에서 조금 더 다뤄보도록 하겠다. 간단하게 말해서 부모에서 만들어진 기능을 그대로 사용이 가능하다는 것이다.

 

메인 클래스에서는 2가지를 사용할 수 있다. 먼저 new Cat()을 이용해서 만든 변수는 데이터 타입이 Cat이다. 하지만 new Dog()으로 만든 인스턴스는 데이터 타입이 Animal이다. 즉, 타입이 Animal이면 이 클래스의 메서드를 사용해서 speak()를 실행시키고 타입이 자식 클래스이면 자식클래스에서 오버라이드한 메서드를 실행한다. 물론 자식에서 부모를 부를 수도 있다.


이번 포스팅에서는 자바에서 사용하는 상속에 대해서 알아보았다. 자식 클래스는 부모 클래스의 속성과 메서드를 상속받고, 필요한 경우 메서드를 오버라이딩하여 자신만의 동작을 정의할 수 있다.

 

상속은 자바에서 코드의 재사용과 구조화를 돕는 중요한 개념 중 하나이다. 객체 지향 프로그래밍의 특성 중 하나인 다형성을 구현하는 데 사용된다.

 

댓글