[Java] 상속과 메소드 오버라이딩

전우석·2024년 4월 1일

Java

목록 보기
22/24

상속과 메소드 오버라이딩

상속

상속(Inheritance)은 객체 지향 프로그래밍에서, 부모 클래스가 자식 클래스에 속성(Properties)메서드(methods)를 가져다 사용할 수 있게 넘겨주는 행위이다.

  • 상속은 재사용성을 높이고, 중복 코드를 줄여주는 객체 지향 프로그래밍의 핵심 개념이다.

원리

  • 상속의 기본 원리는 'is-a' 관계가 성립하는 경우에 사용된다.
  • 하위 클래스(Subclass, 자식 클래스)가 상위 클래스(Superclass, 부모 클래스)의 특성을 물려받는 경우, 상속 관계로 나타낼 수 있다.
    • ex). "개는 동물이다(Dog is an Animal)"를 예로 들면,
      - Animal: 동물은 각자의 울음소리를 가지고 있다.
      - Dog: 강아지는 “멍멍” 울음소리를 가지고 있다.

      // 부모 클래스
      public class Animal {
      	private final String sound = "으르렁";
      	
      	public void animalSound() {
      		System.out.println("울음소리: " + this.sound);
      	}
      }
      
      // 자식 클래스 - 아무 것도 선언하지 않았다.
      public class Dog extends Animal {
      }
      
      public class Main {
      		public static void main(String[] args) {
      				Dog dog = new Dog();
      	      dog.animalSound();  // "으르렁"이 출력된다.
      		}
      }
  • 자식 클래스는 부모 클래스의 모든 공개(public) 또는 보호된(protected) 메서드와 속성을 사용할 수 있으며, 필요에 따라 추가적인 메서드나 속성을 정의할 수 있다.

상속의 특징

  • 재사용성
    • 기존에 작성된 클래스를 상속받는 새로운 클래스를 만들 때, 기존 클래스의 코드(속성, 메서드)를 재사용할 수 있다.
  • 확장성
    • 기존 클래스의 기능을 확장하거나, 변경하여 새로운 클래스를 만들 수 있다.
  • 다형성
    • 상속을 통해 다형성을 구현할 수 있으며, 이를 통해 동일한 인터페이스 아래에서 다양한 구현을 할 수 있게 된다.
  • 캡슐화
    • 상속을 통해 자식 클래스는 부모 클래스의 구현 세부 사항을 몰라도 그 기능을 사용하거나 확장할 수 있게 된다.

상속과 final

final 키워드가 붙은 클래스는 상속이 불가능하다. 예를 들어, Java에서 참조 클래스 String은 상속이 불가능하다.

메소드 오버라이딩

메서드 오버라이딩(Method Overriding)은 자식 클래스에서 부모 클래스로부터 물려받은 메서드재정의하는 것을 의미한다.

  • 자식 클래스는 상속받은 메서드를 그대로 사용할 수 있다.
  • 그러나, 특정 기능을 자신의 목적에 맞게 변경해야 할 경우, 메서드 오버라이딩을 사용한다.

메서드 오버라이딩 특징

  • 규칙
    • 재정의되는 메서드는 부모 클래스에서 정의된 메서드와 동일한 메서드 시그니처(메서드 이름, 매개변수 타입 및 개수)를 가져야 한다.

    • 반환 타입접근 제어자도 같거나, 자식 클래스에서 더 접근성이 높은 방향으로 변경할 수 있다.(private → public ..)

      // 부모 클래스 
      public class Calculator {
      	// Methods
      	public double areaCircle(double r) {
      		System.out.println("Calculator 객체의 areaCircle() 실행");
      		return 3.14159 * r * r;
      	}
      }
      
      // 자식 클래스
      public class Computer extends Calculator {
      	@Override  // Override 어노테이션으로 오버라이딩 명시
      	public double areaCircle(double r) {
      		System.out.println("Computer 객체의 areaCircle() 실행");
      		return Math.PI * r * r;  // 더 정확한 계산을 위해 오버라이딩
      	}
      }
  • 동적 바인딩
    • 메서드 오버라이딩은 동적 바인딩을 통해, 런타임(Runtime)에 객체의 실제 타입을 기반으로 호출할 메서드를 결정한다.
    • 이는 같은 메서드 호출이라도 객체의 타입에 따라 다른 결과를 낼 수 있게 한다.

@Override

Java에서는 메서드 오버라이딩 시 @Override 어노테이션(Annotation)을 사용하여 컴파일러에게 명시적으로 알릴 수 있다.

  • 이를 통해 오버라이딩의 의도를 명확히 하고, 실수로 인한 오류를 방지할 수 있다.
    • 컴파일 타임에 메서드 시그니처의 오타나 오류를 미리 잡아낼 수 있게 해준다.

메서드 오버로딩(Overloading)과 오버라이드(Override)의 차이

  • 메소드 오버로딩은, 같은 이름의 메소드를 매개변수의 타입이나 개수를 다르게 하여 여러 번 정의하는 것이다.
    • 메소드 오버로딩은 컴파일 시에 결정(static binding; 정적 바인딩)된다.
  • 반면, 메소드 오버라이딩은 상속 관계에 있는 클래스 간에 같은 이름, 같은 매개변수를 가진 메소드를 재정의하는 것이다.
    • 메소드 오버라이딩은 런타임에 결정(dynamic binding; 동적 바인딩)된다.

0개의 댓글