728x90
상속
객체 지향 프로그래밍(OOP: Object Oriented Programming)에서 크게 3요소로 꼽는 캡슐화, 상속, 다형성 세 가지 중 상속에 대해 알아보자.
- 참고) 상속의 다른 표현으로는 계승, 확장(Java에서 상속할 때 extends라는 키워드를 사용한다.)이라는 단어도 사용된다고 한다.
1. 목적
- 코드 재사용성 향상
- 기존 클래스를 확장하여 새로운 클래스를 생성함으로써, 같은 기능을 반복적으로 구현하지 않아도 된다.
- 유지보수 용이
- 공통 기능을 부모 클래스에 두고, 변경이 필요할 때 한 곳만 수정하면 된다.
- 객체 지향 프로그래밍의 원칙 적용
- OOP의 다형성과 캡슐화를 활용하여 효율적인 프로그램 구조를 설계할 수 있다.
- 확장성 향상
- 기존 클래스를 확장(extend)하여 새로운 기능을 쉽게 추가가 가능하다.
- 가독성 및 구조화
- 유사한 클래스들을 그룹화하여, 프로그램 구조를 더욱 이해하기 쉽게 만들어준다.
상속은 객체 지향 프로그래밍(OOP)에서 기존 클래스(부모 클래스 또는 슈퍼 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스 또는 서브 클래스)가 물려받아 재사용하는 개념이다.
이를 통해 코드의 재사용성을 높이고, 유지보수를 유리하게 해준다.
2. 특징
- 부모 클래스의 속성과 메서드를 상속받는다.
- 부모 클래스의 속성과 메서드를 자식 클래스가 그대로 사용할 수 있다.
- 메서드 오버라이딩(Overriding) 가능
- 부모 클래스의 메서드를 자식 클래스에서 재정의(Overriding)하여 새로운 기능을 추가할 수 있다.
- 단일 상속(Single Inheritance) 원칙
- Java는 다중 상속을 직접 지원하지 않으며, 하나의 부모 클래스만 상속이 가능하다.
- 대신 인터페이스를 사용하여 다중 구현할 수 있다..
- super 키워드 사용 가능
super
키워드를 사용하여 부모 클래스의 생성자나 메서드를 호출할 수 있다.
- 생성자는 상속되지 않는다.
- 부모 클래스의 생성자는 직접 상속되지 않지만,
super()
를 사용하여 호출할 수 있다..
- 부모 클래스의 생성자는 직접 상속되지 않지만,
- 접근 제한자(private, protected)에 따라 상속 여부 결정됨
- private 멤버는 상속되지 않는다.
- protected 멤버는 자식 클래스에서 접근이 가능하다.
- 부모 클래스와 자식 클래스가 강하게 연결되어 결합도가 증가한다.
3. 사용 예시
1. 기본적인 상속
// 부모 클래스
class Animal {
String name;
void makeSound() {
System.out.println("animal sound");
}
}
// 자식 클래스 (Animal을 상속받음)
class Dog extends Animal {
void bark() {
System.out.println(name + "'s howl");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "dogdog";
dog.makeSound(); // 부모 클래스의 메서드 사용 가능
dog.bark(); // 자식 클래스의 메서드 사용 가능
}
}
- 출력 결과
animal sound
dogdog's howl
2. 메서드 오버라이딩
class Animal {
void makeSound() {
System.out.println("animal sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("howl");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // "howl" 출력 (부모 메서드 대신 오버라이딩된 메서드 실행)
}
}
3. super
사용
class Animal {
String name;
Animal(String name) {
this.name = name;
}
void makeSound() {
System.out.println(name + "'s sound");
}
}
class Dog extends Animal {
Dog(String name) {
super(name); // 부모 클래스의 생성자 호출
}
void makeSound() {
super.makeSound(); // 부모 클래스의 메서드 호출
System.out.println("howl");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog("dogdog");
dog.makeSound();
}
}
- 출력 결과
dogdog's sound
howl
728x90
'자바' 카테고리의 다른 글
[JAVA] 다형성과 정적, 동적 바인딩 (0) | 2025.03.13 |
---|---|
[JAVA] 추상 클래스(abstract) (0) | 2025.03.13 |
[JAVA] Stream (0) | 2025.03.11 |
[JAVA] 배열(Array) (0) | 2025.03.11 |
[JAVA] record (0) | 2025.03.11 |