상속이란?
자바에서 상속은 객체 지향 프로그래밍(OOP)의 중요한 개념 중 하나입니다. 상속은 클래스 간에 코드를 재사용하고 클래스의 계층 구조를 형성하는 데 사용됩니다.
자바에서 클래스는 다른 클래스로부터 상속을 받을 수 있습니다. 상속을 통해 부모 클래스의 특성과 메소드를 자식 클래스가 물려받을 수 있습니다. 상속은 코드의 재사용성을 높이고 유지보수를 쉽게 만들어줍니다.
상속의 특징
상속은 객체 지향 프로그래밍에서 중요한 특징 중 하나로, 클래스 간의 계층 구조를 형성하여 코드의 재사용성을 높이는 메커니즘입니다. 다음은 상속의 주요 특징에 대한 설명입니다.
- 코드 재사용성: 상속을 통해 부모 클래스의 특성과 메소드를 자식 클래스가 물려받을 수 있습니다. 이로 인해 코드의 중복을 방지하고, 공통된 기능이나 속성을 여러 클래스에서 공유할 수 있습니다.
- 계층 구조: 상속은 클래스 간에 계층 구조를 형성합니다. 부모 클래스와 그로부터 파생된 자식 클래스들이 서로 다른 레벨에 위치하여 클래스 간의 관계를 명확히 합니다.
- 확장성: 새로운 기능이나 속성을 추가하고 싶을 때, 기존 클래스를 수정하지 않고 새로운 클래스를 만들어 부모 클래스를 상속받을 수 있습니다. 이는 기존 코드에 영향을 미치지 않으면서도 새로운 기능을 추가할 수 있게 합니다.
- 다형성(Polymorphism): 상속은 다형성을 지원합니다. 부모 클래스 타입의 변수로 자식 클래스의 객체를 참조할 수 있습니다. 이는 코드의 유연성을 높여주며, 같은 메소드 호출에 대해 다양한 동작을 수행할 수 있습니다.
- 접근 제어: 상속 관계에서 부모 클래스의 멤버에 대한 접근 권한을 지정할 수 있습니다. public, protected, private 등의 접근 제어자를 사용하여 캡슐화를 유지하면서도 필요한 부분을 외부에 노출하거나 제한할 수 있습니다.
- 단일 상속: 자바에서는 단일 상속만 허용됩니다. 즉, 한 클래스는 하나의 부모 클래스만을 상속할 수 있습니다. 이는 클래스 간의 관계를 명확하게 유지하고 복잡성을 줄이는 데 도움이 됩니다.
상속 사용법
자바에서 상속을 사용하는 방법은 다음과 같습니다.
부모 클래스 생성
먼저, 부모 클래스를 정의합니다. 이 클래스는 공통된 특성이나 메소드를 포함합니다.
// 부모 클래스
class 부모클래스 {
int 부모변수;
void 부모메소드() {
System.out.println("부모 메소드");
}
}
Java자식 클래스 생성 및 상속
자식 클래스를 정의하고, extends 키워드를 사용하여 부모 클래스를 상속받습니다.
// 자식 클래스
class 자식클래스 extends 부모클래스 {
int 자식변수;
void 자식메소드() {
System.out.println("자식 메소드");
}
}
Java객체 생성 및 사용
자식 클래스의 객체를 생성하고, 부모 클래스의 멤버와 자식 클래스의 멤버를 사용할 수 있습니다.
public class Main {
public static void main(String[] args) {
// 자식 클래스의 객체 생성
자식클래스 자식 = new 자식클래스();
// 부모 클래스의 변수 및 메소드 사용
자식.부모변수 = 10;
자식.부모메소드();
// 자식 클래스의 변수 및 메소드 사용
자식.자식변수 = 20;
자식.자식메소드();
}
}
Java💡상속을 통해 부모 클래스의 특성을 재사용하고, 자식 클래스에서 필요에 맞게 확장 및 수정하여 유연하게 프로그램을 구성할 수 있습니다.
메소드 오버라이딩
메소드 오버라이딩은 자식 클래스에서 부모 클래스의 메소드를 재정의하는 개념입니다. 이를 통해 자식 클래스는 부모 클래스에서 상속받은 메소드를 자신의 필요에 맞게 재정의할 수 있습니다. 메소드 오버라이딩을 통해 동일한 메소드 이름을 가지면서도 각 클래스의 특성에 맞게 동작을 변경할 수 있습니다.
메소드 오버라이딩의 조건
- 메소드 시그니처 동일성: 오버라이딩하는 메소드는 부모 클래스의 메소드와 시그니처(이름, 매개변수 타입 및 순서, 반환 타입)가 동일해야 합니다.
- 접근 제어자: 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스에서의 접근 제어자와 동일하거나 넓은 범위로 변경할 수 있습니다.
- 예외 처리: 오버라이딩하는 메소드에서는 부모 클래스의 메소드와 동일한 예외를 던지거나 그 예외의 하위 클래스를 던질 수 있습니다. 그러나 더 많은 예외를 던질 수는 없습니다.
예제
// 부모 클래스
class 부모클래스 {
void 메소드() {
System.out.println("부모 메소드");
}
}
// 자식 클래스
class 자식클래스 extends 부모클래스 {
// 부모 클래스의 메소드를 오버라이딩
@Override
void 메소드() {
System.out.println("자식 메소드로 재정의");
}
}
public class Main {
public static void main(String[] args) {
// 자식 클래스의 객체 생성
자식클래스 자식 = new 자식클래스();
// 오버라이딩된 메소드 호출
자식.메소드(); // "자식 메소드로 재정의"
}
}
Java💡위의 예제에서 자식클래스는 부모클래스의 메소드를 오버라이딩하여 새로운 내용으로 구현했습니다. 메소드 오버라이딩을 통해 자식 클래스에서는 부모 클래스의 동일한 이름의 메소드를 새로운 동작으로 바꿀 수 있습니다.
super
super는 자바에서 사용되는 키워드 중 하나로, 주로 상속 관계에서 부모 클래스의 멤버에 접근할 때 또는 부모 클래스의 생성자를 호출할 때 사용됩니다. super는 다음과 같은 기능을 수행합니다:
부모 클래스의 멤버에 접근
자식 클래스에서 부모 클래스와 동일한 이름의 멤버(변수 또는 메소드)가 있는 경우, super 키워드를 사용하여 부모 클래스의 멤버에 접근할 수 있습니다.
class 부모클래스 {
int 변수 = 10;
void 메소드() {
System.out.println("부모 메소드");
}
}
class 자식클래스 extends 부모클래스 {
int 변수 = 20;
void 메소드() {
System.out.println("자식 메소드");
System.out.println("자식 변수: " + 변수);
System.out.println("부모 변수: " + super.변수); // super를 사용하여 부모 클래스의 변수에 접근
super.메소드(); // super를 사용하여 부모 클래스의 메소드 호출
}
}
Java부모 클래스의 생성자 호출
자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때 사용됩니다. 부모 클래스의 생성자는 super()를 통해 호출됩니다. 만약 부모 클래스의 매개변수를 갖는 생성자를 호출해야 한다면, super(매개변수)와 같이 사용합니다.
class 부모클래스 {
부모클래스() {
System.out.println("부모 클래스의 기본 생성자");
}
부모클래스(int 매개변수) {
System.out.println("부모 클래스의 매개변수를 갖는 생성자");
}
}
class 자식클래스 extends 부모클래스 {
자식클래스() {
super(); // 부모 클래스의 기본 생성자 호출
}
자식클래스(int 매개변수) {
super(매개변수); // 부모 클래스의 매개변수를 갖는 생성자 호출
}
}
Java💡super를 사용하여 부모 클래스의 멤버에 접근하거나 생성자를 호출함으로써, 상속된 클래스 간의 관계를 구성하고 유연하게 코드를 작성할 수 있습니다.
결론
상속은 자바에서 객체 지향 프로그래밍의 핵심 개념 중 하나로, 부모 클래스의 특성과 메소드를 자식 클래스가 물려받아 코드의 재사용성을 높이는 메커니즘입니다. 이를 통해 계층 구조를 형성하고, 코드를 간결하게 구성할 수 있습니다. 부모 클래스의 멤버에 접근할 때는 super 키워드를 사용하며, 필요에 따라 메소드를 재정의하여 새로운 동작을 정의할 수 있습니다. 상속을 사용하면 코드의 유연성과 구조화된 관계를 유지할 수 있어 효율적인 프로그래밍이 가능합니다.