Study/Java

[Java] 오버라이딩

운체 2020. 3. 12. 05:24

오버라이딩

자바 질문 중에 단골로 나오는 오버로딩과 오버라이딩.. 오버라이딩은 저번에 공부를 했으니 오버라이딩을 공부해보았다. 기억하기 쉽게 오버로딩과 오버라이딩의 차이도 적어놨다. 그리고 상속에서 다루지 못한 super가 책에 함께 언급되어 같이 적어보았다. 이 두 개밖에 없어서 오늘의 공부 필기는 다른 포스팅에 비해 분량이 적을 것 같다.

오버라이딩은 상속받은 메소드의 내용을 변경하는 것이다. 부모 클래스에 존재하던 메소드가 현재 클래스에 맞지 않는 경우 재정의가 가능하다. 오버라이딩은 메소드의 내용만 새로 작성하는 것으로 조건이 몇 가지 존재하는데,

  1. 선언부(이름, 매개변수, 리턴 타입)가 같아야 한다.
  2. 접근 제어자(public, private 등)를 좁은 범위로 변경할 수 없다.
  3. 메소드의 인스턴스와 static 변환이 불가능하다.

오버로딩 VS 오버라이딩

  • 오버로딩: 이름이 같지만 매개변수를 달리하여 함수를 새로 정의하는 것
  • 오버라이딩: 함수의 내용을 자체를 재정의하는 것 (덮어 씌우는 느낌이다!)

super

조상 클래스로부터 상속받은 멤버를 참조할 때 사용하는 참조 변수이다. 상속받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때는 super를 통해 구별이 가능하다. 

class Main {

  public static void main(String args[]) {

      Child c = new Child();
      c.method();
  }
  
}

class Parent {

	int x = 10;
    
}

class Child extends Parent {

	int x = 20; // 조상인 Parent가 가진 멤버 변수 x와 이름이 같다!
	void method() {
		System.out.println(this.x); // 20
		System.out.println(super.x); // 10
	}
    
}
뜬금없지만 티스토리 코드 블록 너무 따닥따닥 붙어있다..ㅠ 스페이스바는 또 너무 넓고,, 스킨 편집으로도 안되고,,, 방법 아는 분 계시면 알려주세요..

super()

this()와 마찬가지로 생성자 역할을 하며, super()은 조상 클래스의 생성자를 호출하는 데 사용한다. 조상 클래스의 멤버 변수를 초기화할 때는 조상의 생성자를 통해 초기화해야 하므로 무조건 super()를 사용해야 한다.

  • 무조건 첫 줄에 삽입해야 하는 것을 잊지 말자!