반응형
✅ 상속 Inheritance
기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
코드의 재사용성을 높이고 코드의 중복을 제거하여, 생산성과 유지보수에 크게 기여한다.
💡 조상 Parent, Super / 자손 Sub 클래스
조상 클래스(Parent, Super class): 상속하는 클래스
자손 클래스(Sub class): 상속받는 클래스
- 조상 클래스는 자손 클래스의 멤버(필드, 메서드)를 사용할 수 없다.
- 자손 클래스는 조상 클래스의 모든 멤버(필드, 메서드)를 상속받는다.
- 자손 클래스는 조상 클래스의 모든 멤버(필드, 메서드)를 사용할 수 있다.
- 자손 클래스는 조상 클래스의 멤버(필드, 메서드)를 재정의하여 새로운 동작을 구현하는 오버라이딩(Overriding)을 할 수 있다.
- 자손 클래스는 조상 클래스보다 더 나은 기능을 제공할 수 있어 대체할 수 있다.
- 자손 클래스는 조상 클래스에서 상속받은 멤버의 접근 제한자를 그 이상으로 바꿀 수 없다.
💡 단일 상속 Single Inheritance
자바에서는 클래스는 단일 상속만을 지원하며, 다중 상속은 지원하지 않는다.
다중 상속으로 인해 발생하는 다양한 문제점들을 방지하기 위한 것이다.
단일 상속 (Single Inheritance)
- 클래스 간 명확한 계층 구조를 가지도록 하여 클래스의 구조를 단순하고 명료하게 유지한다.
- 클래스 간 결합도를 줄여 유지보수와 확장성을 향상한다.
- 일반적인 프로그래밍 모델이기 때문에, 이를 따르는 것이 일관성 있는 설계를 유지할 수 있다.
다중 상속(Multiple Inheritance)
- 상속한 두 클래스에서 동일한 이름의 메서드나 변수가 존재할 경우 충돌이 발생한다.
- 여러 클래스에서 같은 메서드를 오버라이딩 하거나 super 키워드를 이용해 호출하는 경우 코드의 복잡도가 증가한다.
- 각 클래스의 구현 방법이 다르면 조합하는 과정에서 혼란을 가진다.
💡 상속 구현
상속을 받을 클래스를 정의한다.
- extends 키워드를 사용하여 조상 클래스를 지정한다.
public class ParentClass {
// 부모 클래스의 속성과 메서드
}
public class ChildClass extends ParentClass {
// 자식 클래스의 추가적인 속성과 메서드
}
상속받은 클래스를 사용한다.
- 자손 클래스는 조상 클래스의 모든 멤버(필드, 메서드)를 상속받는다.
- 자손 클래스는 조상 클래스의 모든 멤버(필드, 메서드)를 사용할 수 있다.
- 자손 클래스는 조상 클래스의 멤버(필드, 메서드)를 재정의하여 새로운 동작을 구현하는 오버라이딩(Overriding)을 할 수 있다.
public class ChildClass extends ParentClass {
private int childAttribute;
public void childMethod() {
// 추가적인 메서드 구현
}
// 부모 클래스의 메서드 재정의(오버라이딩)
@Override
public void parentMethod() {
// 자식 클래스에서 부모 클래스의 메서드를 재정의하여 구현
}
}
super 키워드를 사용하여 조상 클래스의 속성, 메서드에 접근한다.
public class ChildClass extends ParentClass {
private int childAttribute;
public ChildClass(int parentAttribute, int childAttribute) {
super(parentAttribute); // 부모 클래스의 생성자 호출
this.childAttribute = childAttribute;
}
public void childMethod() {
super.parentMethod(); // 부모 클래스의 메서드 호출
// 추가적인 메서드 구현
}
}
메서드 오버라이딩(overriding)을 통해 조상 클래스의 메서드를 재정의한다.
- @Override 어노테이션을 사용하여 오버라이딩한 메서드임을 명시한다.
public class ChildClass extends ParentClass {
private int childAttribute;
// 부모 클래스의 메서드 오버라이딩
@Override
public void parentMethod() {
// 자식 클래스에서 부모 클래스의 메서드를 재정의하여 구현
}
}
✅ 참조 변수 super, 생성자 호출 super()
💡 참조 변수 super
자손 클래스에서 조상 클래스의 멤버를 참조할 때 사용한다.
- 조상 클래스의 생성자나 멤버(필드, 메서드)를 호출할 수 있다.
- 동일한 이름의 변수를 자손 클래스에서 사용할 경우, super 키워드를 사용하여 조상 클래스의 멤버 변수를 참조할 수 있다.
super.필드명
super.메서드명()
class Parent {
public int x = 10;
}
class Child extends Parent {
public int x = 20;
public void printX() {
System.out.println("Parent x: " + super.x); // 부모 클래스의 x 출력
System.out.println("Child x: " + x); // 자식 클래스의 x 출력
}
}
💡 생성자 호출 super()
자손 클래스의 생성자에서 조상 클래스의 생성자를 호출할 때 사용한다.
- 자동으로 조상 클래스의 기본 생성자가 호출된다.
- 반드시 자손 클래스 생성자의 첫 번째 줄에 위치해야 한다.
super(인자)
class Parent {
public Parent(int x) {
System.out.println("Parent Constructor: " + x);
}
}
class Child extends Parent {
public Child(int x, int y) {
super(x); // 부모 클래스의 생성자 호출
System.out.println("Child Constructor: " + y);
}
}
✅ Object 클래스
자바의 모든 클래스의 조상 클래스이며, java.lang 패키지에 속해 있다.
자바의 모든 클래스는 Object 클래스를 상속받는다.
- clone(): 객체를 복제하여 새로운 객체를 생성한다.
- equals(Object obj): 두 객체가 같은지 비교한다.
- finalize(): 객체가 소멸될 때 호출되는 메서드이다.
- getClass(): 객체의 클래스 정보를 반환한다.
- hashCode(): 객체의 해시 코드를 반환한다.
- notify(): 대기 중인 스레드를 깨운다.
- notifyAll(): 대기 중인 모든 스레드를 깨운다.
- toString(): 객체를 문자열로 변환하여 반환한다.
- wait(): 다른 스레드의 통지를 기다린다.
- wait(long timeout): 다른 스레드의 통지를 기다리는 시간을 제한한다.
- wait(long timeout, int nanos): 다른 스레드의 통지를 기다리는 시간과 나노초를 제한한다.
반응형
'기타 > 백엔드 기초' 카테고리의 다른 글
스트링부트 | 스트링부트(String Boot)란? (0) | 2023.04.26 |
---|---|
자바 Java | 접근제어자: 객체 지향 프로그래밍의 캡슐화 원칙과 예시 코드 (0) | 2023.03.07 |
자바 Java | import문 사용법과 단축키 (0) | 2023.03.07 |
자바 Java | 패키지(Package)의 개념과 활용 방법 (0) | 2023.03.07 |
자바 Java | 생성자(Constructor) 개념: 객체 초기화의 핵심, this() 키워드, 생성자 간 호출 방법 (0) | 2023.02.16 |
자바 Java | 다형성(Polymorphism) 핵심: 오버로딩(Overloading)과 출력 다양성 (1) | 2023.02.16 |
자바 Java | 호출 스택(Call Stack) 구조와 원리: 메서드 실행 과정의 이해 (0) | 2023.02.16 |
자바 Java | 객체지향 프로그래밍(OOP)의 핵심 개념: 객체, 클래스, 메소드, 참조 변수에 대한 이해와 활용 방법 (0) | 2023.02.16 |