상속이란?
객체 지향 프로그램에서 상속은 부모 클래스의 필드와 메소드를 자식 클래스에게 물려주는 것입니다.
이렇게 부모 클래스의 필드와 메소드를 자식 클래스가 상속받아 쓰는 것입니다. 이때 자식 클래스에는 또 다른 필드와 메소드가 들어갈 수 있습니다.
상속의 장점
- 코드 재사용 : 상속을 통해 부모 클래스의 속성과 메서드를 자식 클래스로 물려받을 수 있습니다. 이로 인해 부모 클래스의 코드를 중복해서 작성하지 않고도 자식 클래스에서 해당 코드를 활용할 수 있습니다.
- 확장성 : 상속을 통해 기존 클래스를 확장하여 새로운 클래스를 정의할 수 있습니다. 새로운 클래스에서는 부모 클래스의 기능을 유지하면서 추가적인 속성과 메서드를 정의할 수 있습니다.
- 다형성 : 상속은 다형성을 가능하게 합니다. 부모 클래스 타입의 변수에 자식 클래스의 객체를 할당할 수 있으며, 이를 통해 같은 인터페이스를 갖는 여러 클래스를 통합적으로 다룰 수 있습니다.
- 유지 보수 용이성 : 부모 클래스에서 변경이 필요한 경우, 해당 변경 사항을 부모 클래스에만 적용하면 자식 클래스들에게도 영향을 미칩니다. 이로써 코드의 일관성을 유지하며 유지 보수를 용이하게 할 수 있습니다.
- 추상화와 모델링 : 상속은 현실 세계의 객체들을 프로그래밍 모델로 변환할 때 사용됩니다. 부모 클래스는 공통적인 특성을 추상화하고, 자식 클래스는 이러한 특성을 구체화하여 현실 세계의 모델을 표현할 수 있습니다.
- 계층 구조 구축 : 상속을 이용하여 클래스들 간에 계층 구조를 구축할 수 있습니다. 이를 통해 복잡한 문제를 간단한 모듈로 분할하여 다룰 수 있습니다.
- 코드 일관성과 가독성 : 상속을 사용하면 비슷한 기능을 가진 클래스들이 유사한 구조를 갖게 됩니다. 이로써 코드의 일관성과 가독성이 증가하며, 유지 보수가 편리해집니다.
클래스 상속
프로그램에서는 현실과 다르게 자식이 부모를 선택합니다. 자식 클래스를 선언할 때 어떤 부모로부터 상속받을 것인지를 결정할 수 있습니다.
public class 자식클래스 extends 부모클래스 {
}
자바는 다중 상속을 허용하지 않습니다. 즉, 여러 개의 부모 클래스를 상속할 수 없습니다!!
//자식 객체 생성
자식클래스 자식 = new 자식클래스();
//자식이 부모의 필드, 메소드 사용 가능
자식.부모필드
자식.부모메소드
부모 생성자 호출
자바에서는 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성됩니다.
즉 위에를 보면 자식 객체를 생성할 때 부모 클래스 객체가 먼저 생성되는 것입니다.
모든 생성자는 객체가 있어야 한다. 부모 객체도 생성자가 있어야 합니다.
부모 객체는 어디서 생성자를 호출 하는 것일까???
부모 생성자는 super()에 의해 호출됩니다. super()는 컴파일 과정에서 자동으로 추가됩니다.
- 부모 클래스에 기본 생성자가 없다면 자식 생성자 선언에서 컴파일 에러가 발생합니다!!!!
- 부모 클래스에 기본 생성자가 없고 매개변수 생성자만 있다면 super(매개값,...)으로 처리해줘야 합니다.
메소드 재정의
부모 클래스의 모든 메소드가 자식 클래스에게 맞게 설계되어 있다면 가장 이상적이지만, 만약 자식 클래스가 사용하기에 적합하지 않은 메소드가 있을 수 있습니다. 이런 메소드는 자식 클래스에서 재정의해서 사용해야 합니다!! 이것을 메소드 오버라이딩이라고 합니다. 또 이와 비슷한 개념으로 메소드 오버로딩이 있습니다.
메소드 오버라이딩
메소드메서드 오버라이딩은 부모 클래스에 정의된 메소드를 자식 클래스에서 재정의하는 것을 말합니다.
class Animal {
void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Dog barks");
}
}
주의할 점
- 부모 메소드의 선언부(리턴 타입, 메서드 이름, 매개변수)와 동일해야 합니다.
- 접근 제한을 더 강하게 오버라이딩할 수 없습니다.(public -> private으로 변경 불가능)
- 새로운 예외를 throws 할 수 없습니다.
- 자바에는 @Override가 존재해 컴파일 시 정확히 오버라이딩이 되었는지 체크해 줍니다!!
메소드 오버로딩
메소드 오버로딩은 같은 이름을 가진 메소드를 여러 개 정의하는 것을 말합니다. 이때 메소드의 시그니처(메서드 이름과 매개변수의 개수와 타입)가 달라야 합니다. 오버로딩된 메소드들은 같은 기능을 수행하지만, 다양한 매개변수를 받아 처리할 수 있도록 설계됩니다.
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
부모 메소드 호출
자식 클래스에서 부모 메소드를 호출 할려면 어떻게 해야 할까?
super()키워드와 도트(.) 연산자를 사용하면 숨겨진 부모 메소드를 호출할 수 있습니다. 여기서 숨겨져 있다는 것은 생성자를 오버라이딩 하면 무조건 우선순위는 자식의 메소드 입니다. 그래서 super().메소드 이름으로 부모의 메소드를 호출합니다.
class Parent {
public void method() {
// 작업 처리1
}
}
class Child extends Parent {
@Override
public void method() {
super.method();
// 작업 처리2
}
}
final 클래스와 final 메소드
final로 선언한 클래스는 더 이상 상속할 수 없습니다.
final로 선언한 메소드는 더 이상 오버라이딩 할 수 없습니다.
접근 제한자와 상속
접근 제한자에는 public, private, default, protected가 존재합니다.
- public (공개 접근 제한자)
- 어디서든 접근 가능한 가장 넓은 범위의 접근 제한자입니다.
- public으로 선언된 멤버는 클래스 외부에서도 접근할 수 있습니다.
- 다른 패키지에서도 접근 가능합니다.
- private (비공개 접근 제한자)
- 해당 클래스 내부에서만 접근 가능한 제한적인 범위의 접근 제한자입니다.
- private으로 선언된 멤버는 클래스 외부에서 직접 접근할 수 없습니다.
- 클래스 외부에서 접근해야 할 경우에는 public 메소드를 통해 간접적으로 접근해야 합니다.
- default (package-private, 아무 접근 제한자 없음)
- 같은 패키지 내에서만 접근 가능한 접근 제한자입니다.
- 멤버에 별도의 접근 제한자가 지정되지 않은 경우, 기본적으로 적용됩니다.
- 클래스 멤버에 default 접근 제한자를 사용하면 해당 클래스와 같은 패키지 내에서만 접근할 수 있습니다.
- protected (보호된 접근 제한자)
- 같은 패키지 내에서나 해당 클래스를 상속받은 하위 클래스에서 접근 가능한 접근 제한자입니다.
- protected로 선언된 멤버는 상속 관계에서 하위 클래스에서 오버라이딩 등의 활용을 위해 사용됩니다.
여기서 protected는 상속받은 하위 클래스에서 접근 가능하게 합니다. 즉, 같은 패키지이거나 자식 객체만 사용 가능합니다!! 직접 객체를 생성해서 사용하는 것은 안됩니다!!
출처
이것이 자바다
https://product.kyobobook.co.kr/detail/S000061695652
'JAVA 공부' 카테고리의 다른 글
추상 클래스와 봉인된 클래스 (0) | 2023.08.14 |
---|---|
상속에 대해(2) (0) | 2023.08.14 |
메모리 사용 영역에 대해 (0) | 2023.08.08 |
Java 8, 11, 17 (0) | 2023.08.03 |
JVM, JRE, JDK에 대해서 (0) | 2023.08.03 |