[JAVA] 오버라이딩, super

안요한·2022년 5월 19일
0

JAVA

목록 보기
8/16

2.1 오버라이딩이란?

  • 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것.
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;
		}**
}

2.2 오버라이딩의 조건

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와

  • 이름이 같아야 한다.
  • 매개변수가 같아야 한다.
  • 반환타입이 같아야 한다.

→ 요약하자면 선언부가 서로 일치해야 함. 다만, 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다.

조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때

  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
  • 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

2.3 오버로딩 vs 오버라이딩

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change, modify)

class Parent {
		void parentMethod() {}
}

class Child **extends Parent** {
		void parentMethod() {}      //오버라이딩
		void parentMethod(int i) {} //오버로딩

		void childMethod() {}       
		void childMethod(int i) {}  //오버로딩
		void childMethod() {}       //에러. 중복정의 되었
}

2.4 super

this()와 마찬가지로 super()역시 생성자.

this()는 같은 클래스의 다른 생성자를 호출하지만, super는 조상 클래스의 생성자를 호출하는데 사용된다.

💡 Object클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자, this() 또는 super(),를 호출해야 한다. 그렇지 않으면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.
  1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  2. 생성자 - 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인가?

예제 7-8/PointTest2.java

class PointTest {
	public static void main(String args[]) {
		Point3D p3 = new Point3D();
		System.out.println("p3.x=" + p3.x);
		System.out.println("p3.y=" + p3.y);
		System.out.println("p3.z=" + p3.z);
	}
}

class Point3 {
	int x=10;	
	int y=20;

	Point3(int x, int y) {
		//생성자 첫 줄에서 다른 생성자를 호출하지 않기 때문에 컴파일러가
		//이곳에 'super();'를 삽입한다.
		//super()는 Point의 조상인 Object클래스의 기본 생성자인 Object()를 의미한다.
		this.x = x;
		this.y = y;
	}
}

class Point3D extends Point3 {
	int z=30;

	Point3D() {
		this(100, 200, 300);	// Point3D2(int x, int y, int z)를 호출한다.
	}

	Point3D(int x, int y, int z) {
		super(x, y);			// Point3(int x, int y)를 호출한다.
		this.z = z;
	}
}

Point3D p3 = new Point3D();와 같이 인스턴스를 생성하면 , 아래와 같은 순서로 생성자가 호출된다.

Point3D() -> Point3D(int x, int y ,int z) -> Point(int x, int y) -> Object()
profile
걍이렇게돼브렀다리

0개의 댓글