우당탕탕 개발 블로그 도전기

[Java] 상속과 Override 본문

Java

[Java] 상속과 Override

나루나른 2024. 3. 23. 19:55

https://narunarus.tistory.com/11

 

03.20~03.21[Java]

03.20(수) ● Java 생성자 함수 Java에서 생성자 함수(Constructor)는 객체가 생성될 때 자동으로 호출되는 특별한 유형의 메서드이다. 주로 객체를 초기화하는 데 사용함. 객체의 field(변수)에 초기값을

narunarus.tistory.com

상속이란?

Java에서 상속(Inheritance)은 한 클래스가 다른 클래스의 속성(필드)과 메서드를 물려받을 수 있는 기능을 의미한다.

상속은 코드 재사용성을 높이고, 프로그램의 구조를 체계적으로 관리할 수 있게 해준다.

상속을 통해 기본적인 기능을 가진 클래스(부모 클래스 또는 슈퍼 클래스)로부터 보다 구체적인 기능을 가진 클래스(자식 클래스 또는 서브 클래스)를 생성할 수 있다.

 

상속의 주요 특징과 장점 

1. 코드의 재사용 : 상속을 통해 기존 클래스의 필드 및 메소드를 재사용하여 새로운 클래스를 만들 수 있다. 이는 코드의 중복을 줄이고, 유지보수를 용이하게 한다.

 

2. 확장성 : 상속받은 클래스는 추가적인 기능을 구현할 수 있다. 기존 코드를 수정하지 않고 새로운 기능을 추가할 수 있어, 소프트웨어의 확장성이 높아진다.

 

3. 다형성 : 상속은 다형성의 기반이 되는데, 다형성을 통해 한 인터페이스로 다양한 구현을 제공할 수 있으며, 코드의 유연성과 확장성이 증가한다.

 

4. 계층 구조 : 상속은 클래스 간의 계층 구조를 형성하여, 이 구조를 통해 클래스 간의 관계를 명확하게 할 수 있으며, 객체 지향 설계를 체계적으로 할 수 있다.

 

Java에서 클래스는 'extends' 를 이용해 다른 클래스를 상속 받는다. 다만 자바의 경우 단일 상속만을 지원하므로, 한 클래스는 오직 하나의 클래스만 상속 받을 수 있으며, 인터페이스의 경우는 'implememts'를 사용해 상속받는데 인터페이스는 다중 상속이 가능하다.

 

그 외의 주의 사항으로는 private 접근 제한자를 가진 필드와 메서드는 자식 클래스에서 직접 접근할 수 없으며, 대신 부모 클래스에서 public 또는 protected 접근 제한자를 사용하여 접근할 수 있는 메서드를 제공해야 한다.

또한 자식 클래스는 상속받은 부모 클래스의 메소드를 재정의(오버라이딩)할 수 있다.

 

상속의 예)

class Parent {
    final void show() {//불변하는 값(절대 상수화)
        System.out.println("이 메서드는 오버라이드할 수 없습니다.");
    }
}

class Child extends Parent {
    // 오버라이드 시도 시 컴파일 에러 발생
    // 부모 객체에서 show()라는 메소드를 상속을 통해 참조 할 수는 있지만
    //override를 통해서 재정의해서 재사용 할 수는 없다.
    
    //결론 : 참조는 가능하되, 재정의가 불가능(부모 클래스에서 정의된 그대로 사용해야함.)
    void show() {
        System.out.println("오버라이드 시도!");
    }
}

 

 

Override

Override 란 객체 지향 프로그래밍에서 하위 클래스가 상위 클래스로부터 상속받은 메서드를 재정의하는 것을 말한다.

자식 클래스가 부모 클래스로부터 상속받은 메서드를 자신의 상황에 맞게 구현을 새롭게 할 수 있게 해준다. 

(오버라이딩을 통해 상속받은 메서드와 동일한 메서드 이름, 매개변수 리스트를 가지면서도, 하위 클래스(자식클래스)에 맞게 메서드의 동작을 변경할 수 있다.)

 

메소드를 오버라이딩하기 위해선 몇 가지의 규칙이 있다.

오버라이딩의 규칙

  1. 메서드 시그니처 일치: 오버라이딩할 메소드는 부모 클래스에서 정의된 메소드와 정확히 같은 메소드 이름, 매개변수 목록을 가져야 한다.
  2. 접근 제어 레벨: 오버라이드하는 메서드는 부모 클래스의 메서드와 같거나 더 넓은 접근 제어 레벨을 가져야 한다. 예를 들어, 부모 클래스의 메서드가 protected라면, 자식 클래스에서 오버라이드하는 메서드는 protected 또는 public이어야 한다.(private 접근 제한자는 사용 불가)
  3. 반환 타입: 오버라이드하는 메소드의 반환 타입은 부모 클래스의 메소드 반환 타입과 같거나, 그 반환 타입의 하위 타입이어야 합니다(공변 반환 타입)

Java에서는 @Override 사용하여 메소드가 오버라이드되었음을 나타낸다. 이것은 컴파일러에게 해당 메소드가 부모 클래스의 메소드를 오버라이드한다는 것을 알리며, 만약 부모 클래스에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생시킨다.

 

오버 라이딩의 예)

class Animal {
    public void sound() {
        System.out.println("동물이 소리를 낸다.");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("개가 멍멍 짖는다.");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal myAnimal = new Dog();
        myAnimal.sound(); // 출력: 개가 멍멍 짖는다.
    }
}

 

자바 콘솔창에서의 출력 값

 

해당 예제에서는 'Dog'이라는 이름의 클래스가 'Animal'이라는 이름의 부모 클래스의 메소드를 상속 받지만, Dog이라는 클래스의 이름답게 부모 클래스에서 상속받은 sound()라는 메서드를 자신의 상황에 맞게 구현한 것을 보여준다.