[Java] 오버라이딩(Overriding)

bien·2023년 11월 4일
0

java

목록 보기
4/11

오버라이딩에 대해 알아보자!


1. 오버라이딩이란?

override: v.덮어쓰다.

  • 오버라이딩(overriding)
    • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것.
    • 선언부 변경 불가
    • 구현부({}) 내용만 변경 가능.

상속받은 기능(메서드)를 나에 맞가 변경가능하다!

class Point {
	int x;
    int y;
    
    String getLocation() {
    	return "x:" + x + ", y:" +y;

class Point3D extends Point {
	int z;
    
    String getLocation() {
    	return "x :" + x + ", y:" + y + ", z:" + z;
	}        
}

Point3D가 위의 Point 클래스를 상속받고, getLocation()을 오버라이딩 한다.


2. 오버라이딩의 조건

  1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
    • 이름, 매개변수, 반환타입이 같아야 한다.
  2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
class Paraent {
	void parentMethod() throws IOException, SQLException {
    	// ...
    }

class Child extends Parent {
	void parentMethod() throws IOException {
    	// 자식이 부모보다 예외가 많을 수 없다.
    	// ...
    }
}

3. 오버로딩 vs 오버라이딩

둘은 이름이 비슷할 뿐, 전혀 상관이 없다. 자주 헷갈리니 한번 짚고 넘어가자.

  • 오버로딩(overloading)
    • 기존에 없는 새로운 메서드를 정의하는 것(new)
  • 오버라이딩(overriding)
    • 상속 받은 메서드의 내용을 변경하는 것 (change, modify)
class Parent {
	void parentMethod() {}
}

class Child extends Parent {
	void parentMethod() {} // 1. 오버라이딩 overriding
    void parentMethod(int i) {} // 2. 오버로딩 overloading
    
    void childMethod() {} // 3. 메서드 정의
    void childMethod(int i) {} // 4. 오버로딩 overloading
    void childMethod() {} // 5. 중복정의. ERROR

4. super

  • super
    • 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수.
    • (local variable과 istance variable 구분을 위한)this와 유사
    • this를 대신 사용 가능하지만, 조상 클래스와 멤버가 중복 정의되어 구별이 필요한 경우에만 사용하는 것이 좋다.
class Parent {
	int x = 10;
}    

class Child extends Parent {
	int x = 20;
    
    void method() {
    	System.out.println("x=" + x); // 20
    	System.out.println("this.x=" + this.x); // 20
    	System.out.println("super.x=" + super.x); // 10
}

5. super() - 조상 클래스의 생성자

  • super()
    • 조상의 생성자를 호출할 때 사용
      • 조상의 생성자, 초기화 블럭은 상속되지 않는다.
    • 조상의 멤버는 조상의 생성자를 호출해서 초기화
class Point {
	int x, y;
    
    Point (int x, int y) {
    	this.x = x;
        this.y = y;
	}
}

Point 클래스를 상속받고, 자신의 멤버인 z를 가지는 Point3D를 예시로 살펴보자.

부적절한 예시

	int z;
    
    Point3D(int x, int y, int z) {
    	this.x = x; // 조상의 멤버를 초기화
        this.y = y; // 조상의 멤버를 초기화
        this.z = z;
	}
}

조상의 멤버를 직접 초기화하고 있다. 상속으로 x, y역시 자신의 멤버변수이므로 가능하나, 권장되지 않는 방식이다.

적절한 예시

Print3D(int x, int y, int z) {
	super(x, y); // 조상클래스의 생성자 Point(int x, int y)를 호출
    this.z = z; // 자신의 멤버를 초기화

조상의 생성자를 불러와 조상의 생성자를 통해 상속받은 멤버변수를 초기화한다. 그리고 자신의 멤버는 직접 초기화 하고 있다.

어떻게 초기화해야 할 지는 조상 자신이 제일 잘 알고있다. 따라서 조상의 생성자를 불러와 "조상님, 멤버변수 초기화 좀 부탁드립니다."하고 부탁을 하는것이 적절하다.

주의사항

생성자의 첫 줄에 반드시 생성자(super() 혹은 this())를 호출해야 한다. 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입한다.


Reference

profile
Good Luck!

0개의 댓글