IT프로그램 언어/Java

Java(상속과 다형성)

필립곽 2024. 12. 25. 14:22
반응형

Java는 객체 지향 프로그래밍(Object-Oriented Programming, OOP) 언어로, 상속(Inheritance)과 다형성(Polymorphism)이라는 두 가지 중요한 개념을 제공합니다. 이번 포스팅에서는 초보자를 위해 이 두 개념을 자세히 설명하고, 예제를 통해 이해를 돕겠습니다.

 

1. 상속의 개념과 사용법

상속은 한 클래스가 다른 클래스의 속성과 메서드를 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높이고, 계층 구조를 통해 객체를 조직할 수 있습니다. 상속을 사용하면 기존 클래스를 기반으로 새로운 클래스를 쉽게 만들 수 있습니다.

1.1 상속의 기본 구조
Java에서 상속은 extends 키워드를 사용하여 구현합니다. 기본 클래스(부모 클래스)와 파생 클래스(자식 클래스) 간의 관계를 설정합니다.

예제:
// 부모 클래스
class Animal {
    void eat() {
        System.out.println("Animal is eating");
    }
}

// 자식 클래스
class Dog extends Animal {
    void bark() {
        System.out.println("Dog is barking");
    }
}
위의 예제에서 Animal 클래스는 기본 클래스이고, Dog 클래스는 Animal 클래스를 상속받습니다. Dog 클래스는 Animal 클래스의 eat() 메서드를 사용할 수 있습니다.

1.2 상속의 사용법
상속을 통해 자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받습니다. 자식 클래스에서 부모 클래스의 메서드를 호출할 수 있으며, 필요에 따라 메서드를 오버라이드(재정의)할 수도 있습니다.

예제:
class Cat extends Animal {
    @Override
    void eat() {
        System.out.println("Cat is eating");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat(); // Animal is eating
        dog.bark(); // Dog is barking

        Cat cat = new Cat();
        cat.eat(); // Cat is eating
    }
}
위의 코드에서 Dog 클래스는 Animal 클래스의 eat() 메서드를 상속받아 사용할 수 있으며, Cat 클래스는 eat() 메서드를 오버라이드하여 고유한 동작을 정의합니다.

 

2. super 키워드

super 키워드는 자식 클래스에서 부모 클래스의 메서드나 생성자를 호출할 때 사용됩니다. 이를 통해 부모 클래스의 속성이나 메서드를 명시적으로 참조할 수 있습니다.

2.1 super 키워드의 사용법
부모 클래스의 메서드 호출: 자식 클래스에서 부모 클래스의 메서드를 호출할 때 사용합니다.

 

예제:
class Animal {
    void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    void eat() {
        super.eat(); // 부모 클래스의 eat() 메서드 호출
        System.out.println("Dog is eating");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat(); // Animal is eating
                    // Dog is eating
    }
}


위의 예제에서 Dog 클래스의 eat() 메서드는 super.eat()를 통해 부모 클래스의 eat() 메서드를 호출한 후, 자신의 동작을 추가합니다.

부모 클래스의 생성자 호출: 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때 사용합니다.

 

예제:
class Animal {
    Animal() {
        System.out.println("Animal constructor");
    }
}

class Dog extends Animal {
    Dog() {
        super(); // 부모 클래스의 생성자 호출
        System.out.println("Dog constructor");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog(); // Animal constructor
                             // Dog constructor
    }
}


위의 코드에서 Dog 클래스의 생성자는 super()를 통해 부모 클래스의 생성자를 호출합니다. 이로 인해 부모 클래스의 생성자가 먼저 실행됩니다.

 

3. 다형성(Polymorphism)과 메서드 오버라이딩

다형성은 같은 메서드 호출이 객체의 타입에 따라 다르게 동작하는 것을 의미합니다. Java에서는 메서드 오버라이딩을 통해 다형성을 구현할 수 있습니다.

3.1 메서드 오버라이딩

메서드 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것입니다. 이를 통해 자식 클래스는 부모 클래스의 메서드를 자신의 방식으로 구현할 수 있습니다.

예제:
class Animal {
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dog barks");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("Cat meows");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myDog.sound(); // Dog barks
        myCat.sound(); // Cat meows
    }
}
위의 예제에서 Animal 클래스의 sound() 메서드는 Dog와 Cat 클래스에서 각각 오버라이딩되어 다르게 동작합니다. Animal 타입의 변수에 Dog와 Cat 객체를 할당하여, 같은 메서드 호출이 서로 다른 결과를 출력하는 것을 확인할 수 있습니다.

3.2 다형성의 장점
다형성은 코드의 유연성을 높이고, 유지보수를 용이하게 합니다. 새로운 클래스가 추가되더라도 기존 코드를 수정하지 않고도 새로운 동작을 추가할 수 있습니다.

예제:
class Animal {
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dog barks");
    }
}

class Cat extends Animal {
    @Override
    void sound() {
        System.out.println("Cat meows");
    }
}

public class Main {
    public static void makeSound(Animal animal) {
        animal.sound();
    }

    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        makeSound(myDog); // Dog barks
        makeSound(myCat); // Cat meows
    }
}
위의 코드에서 makeSound() 메서드는 Animal 타입의 객체를 매개변수로 받아, 해당 객체의 sound() 메서드를 호출합니다. 이로 인해 다양한 동물 객체를 전달하더라도, 각 동물의 소리를 출력할 수 있습니다.

 

4. 마치며

Java의 상속과 다형성은 객체 지향 프로그래밍의 핵심 개념으로, 코드의 재사용성과 유연성을 높이는 데 큰 역할을 합니다. 상속을 통해 클래스 간의 관계를 설정하고, 다형성을 통해 동일한 메서드 호출이 다양한 동작을 수행할 수 있도록 합니다. 이러한 개념들을 잘 이해하고 활용하면, Java 프로그래밍에서 더 나은 구조와 효율성을 갖춘 코드를 작성할 수 있습니다.

반응형