언어/Java

[Java] 상속

샥쿠 2023. 8. 22. 12:45

상속이란?

상속의 개념을 이해할 때 “상속”이라는 단어보다 코드에서 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