본문 바로가기
  • alert("Rocomi의 개발공부 블로그")
JAVA 공부

상속관계

by Rocomi 2024. 6. 25.

상속(inheritance)은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장할 수 있습니다. Java에서 상속은 extends 키워드를 사용하여 구현됩니다.

기본 개념

  • 부모 클래스 (Parent Class, Superclass): 다른 클래스에 속성과 메서드를 제공하는 클래스입니다.
  • 자식 클래스 (Child Class, Subclass): 부모 클래스를 상속받아 부모 클래스의 속성과 메서드를 사용할 수 있는 클래스입니다.

자식 클래스는 부모 클래스의 모든 공용(public) 및 보호(protected) 멤버를 상속받습니다. 또한, 자식 클래스는 부모 클래스의 메서드를 재정의(오버라이딩)하거나 새로운 멤버를 추가할 수 있습니다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 부모 클래스
class Animal {
    // 부모 클래스의 메서드
    public void eat() {
        System.out.println("This animal eats food.");
    }
}
 
// 자식 클래스
class Dog extends Animal {
    // 자식 클래스의 메서드
    public void bark() {
        System.out.println("The dog barks.");
    }
 
    // 부모 클래스의 메서드 오버라이딩
    @Override
    public void eat() {
        System.out.println("The dog eats dog food.");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat(); // "The dog eats dog food."
        dog.bark(); // "The dog barks."
    }
}
 
cs

주요 개념

  1. 단일 상속 (Single Inheritance)
    • Java는 단일 상속만 지원합니다. 즉, 한 클래스는 하나의 부모 클래스만 가질 수 있습니다.
    1
    2
    3
    class A { }
    class B extends A { }
     
    cs
  2. 메서드 오버라이딩 (Method Overriding)
    • 자식 클래스는 부모 클래스의 메서드를 재정의(오버라이딩)할 수 있습니다. 재정의된 메서드는 부모 클래스의 메서드와 동일한 시그니처(메서드 이름, 매개변수 타입 및 개수)를 가져야 합니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Parent {
        public void display() {
            System.out.println("Parent display method");
        }
    }
     
    class Child extends Parent {
        @Override
        public void display() {
            System.out.println("Child display method");
        }
    }
     
    cs
  3. super 키워드
    • super 키워드는 부모 클래스의 멤버에 접근할 때 사용됩니다.
    • 부모 클래스의 생성자를 호출할 때도 사용됩니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Parent {
        public void display() {
            System.out.println("Parent display method");
        }
    }
     
    class Child extends Parent {
        @Override
        public void display() {
            super.display(); // 부모 클래스의 display() 호출
            System.out.println("Child display method");
        }
    }
     
    cs
  4. protected 접근 제어자
    • protected 접근 제어자는 같은 패키지 내에 있는 다른 클래스 또는 상속받은 자식 클래스에서 접근할 수 있습니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Parent {
        protected void display() {
            System.out.println("Protected display method");
        }
    }
     
    class Child extends Parent {
        public void show() {
            display(); // 부모 클래스의 protected 메서드 호출 가능
        }
    }
     
    cs
  5. 생성자와 상속
    • 자식 클래스의 생성자는 항상 부모 클래스의 생성자를 호출합니다. 명시적으로 호출하지 않으면 기본 생성자가 자동으로 호출됩니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Parent {
        public Parent() {
            System.out.println("Parent constructor");
        }
    }
     
    class Child extends Parent {
        public Child() {
            super(); // 부모 클래스의 기본 생성자 호출
            System.out.println("Child constructor");
        }
    }
     
    cs

다형성 (Polymorphism)

상속을 사용하면 다형성을 구현할 수 있습니다. 다형성은 동일한 타입의 객체가 여러 다른 형태를 가질 수 있는 능력입니다. 예를 들어, 부모 클래스 타입의 참조 변수가 자식 클래스 객체를 참조할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}
 
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}
 
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}
 
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();
 
        myDog.makeSound(); // "Bark"
        myCat.makeSound(); // "Meow"
    }
}
 
cs

상속은 코드 재사용성을 높이고, 계층적인 클래스 구조를 만들며, 다형성을 통해 유연한 코드 작성을 가능하게 합니다. 상속을 적절히 사용하면 객체지향 프로그래밍의 강력한 기능을 효과적으로 활용할 수 있습니다. 다만, 과도한 상속은 코드의 복잡성을 증가시킬 수 있으므로 주의가 필요합니다.

 

'JAVA 공부' 카테고리의 다른 글

클래스 다이어그램  (0) 2024.07.01
다형성  (0) 2024.06.26
오버라이딩  (0) 2024.06.24
오버로딩  (0) 2024.06.24
참조변수와 일반변수  (0) 2024.06.24