상속이란?
상속의 개념을 이해할 때 “상속”이라는 단어보다 코드에서 extends
라는 표현이 더 직관적인 것 같다.
상위 클래스를 유지하면서, 상위 클래스를 연장(extend)하여 하위 클래스를 만든다. 하위 클래스는 상위 클래스의 기능을 그대로 가져오면서 새로운 멤버(변수, 메소드)를 추가하거나, 기존의 메소드를 변경(overriding)할 수 있다.
class Calculator1 {
public int sum(int v1, int v2) {
return v1 + v2;
}
}
class Calculator2 extends Calculator1 {
public int subtract(int v1, int v2) {
return v1 - v2;
}
}
- Calculator2는 Calculator1을
extends
키워드로 상속한 하위 클래스이다. - Calculator1은
sum
메소드를 가지고 있고, Calculator2는 Calculator1의sum
및 새로 추가된subtract
메소드를 가진다. - 상위 클래스를 변경하면 이를 상속하는 모든 하위 클래스에도 변경 사항이 반영된다.
- 상속은 코드의 재사용성이 높아지는 장점이 있지만, 한편으로는 코드가 복잡해지는 단점도 있다.
상속과 생성자
생성자는 객체를 생성한다. 생성자의 메소드 이름은 클래스 이름과 같다.
class Calculator1 {
int left, right;
// 생성자
public Calculator1(int left, int right) {
this.left = left;
this.right = right;
}
}
// 생성자를 사용해서 객체 생성
Calculator1 c1 = new Calculator1(10, 20)
super
하위 클래스에서 상위 클래스의 생성자를 호출하는 방법은 super
를 사용하는 것이다. super는 상위 클래스를 가리키는 키워드이다.
class Calculator1 {
int left, right;
public Calculator1(int left, int right) {
this.left = left;
this.right = right;
}
}
class Calculator2 extends Calculator1 {
public Calculaor2(int left, int righ) {
super(left, right); // 상위 클래스 생성자(Calculator1(int left,int right)) 호출
}
}
- 주의할 점: 생성자 내에서 다른 내용보다
super
가 가장 먼저 작성되어야 한다. 부모가 초기화되기 전에 자식이 초기화되는 것을 방지하기 위함.
오버라이딩과 오버로딩
오버라이딩(Overriding)
하위 클래스에서 상위 클래스의 메소드를 변경하여 사용할 수 있는 기능이 메소드 오버라이딩이다.
class Calculator1 {
int left, right;
public void sum() {
System.out.println(this.left + this.right);
}
}
class Calculator2 extends Calculator1 {
public void sum() {
System.out.println("덧셈 결과는 " + this.left + this.right);
}
}
- 하위 클래스에서 상위 클래스와 동일한 메소드를 정의하면 상위 클래스의 메소드를 변경하여 동작한다.
Calculator1 c1 = new Calculator1(10, 20)
Calculator2 c2 = new Calculator2(10, 20)
c1.sum() // 30
c2.sum() // 덧셈 결과는 30
오버로딩(Overloading)
이름은 같지만 시그니처는 다른 메소드를 중복으로 선언할 수 있는 방법을 메소드 오버로딩이라고 한다.
메소드 시그니처(Method signature)란?
메소드가 설계된 구조를 의미하며, 메소드 이름, 파라미터의 순서, 타입, 개수로 식별된다.
class Calculator1 {
public int sum(int v1, int v2) {
return v1 + v2;
}
public int sum(int v1, int v2, int v3) {
return v1 + v2 + v3;
}
}
- 입력된 매개변수의 개수에 따라, 같은 이름의 서로 다른 메소드가 호출된다.
Calculator1 = c1 = new Calculator()
c1.sum(10, 20) // 30 반환
c2.sum(10, 20, 30) // 60 반환
오버라이딩, 오버로딩 비교
- 오버라이딩: 상속과 관련 있으며, 상위 클래스의 메소드를 하위 클래스에서 변경하는 것이다.
- 오버로딩: 상속 여부과 관계 없이 하나의 클래스 내부에서도 오버로딩이 가능하다.
class Calculator1 {
public int sum(int v1, int v2) {
return v1 + v2;
}
// Overloading
public int sum(int v1, int v2, int v3) {
return v1 + v2 + v3;
}
}
class Calculator2 extends Calculator1 {
// Overriding
public int sum(int v1, int v2) {
System.out.println("Overriding");
return v1 + v2;
}
}
'언어 > Java' 카테고리의 다른 글
[Java] final (0) | 2023.08.10 |
---|---|
[Java] abstract (0) | 2023.08.10 |
[Java] 접근 제어자 (0) | 2023.08.10 |
[Java] 클래스와 인스턴스 (0) | 2023.08.10 |