조상클래스로부터 상속받은 메서드의 내용을 변경하는 것. 쉽게 말해 자신에게 알맞게 덮어쓰는 것
🔸 오버라이딩 하는 자식 클래스의 메서드는
- 조상클래스의 메서드와 이름이 같아야 하고
- 매개변수가 같아야 하며
- 반환타입이 같아야 한다.🔸 접근제어자와 예외
- 접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다. (public > protected > default > private)
- 조상클래스의 메서드보다 더 많은 예외를 선언할 수 없다.
- 인스턴스메서드를 static메서드로 또는 그 반대로 변경할 수 없다.
🔸 오버로딩 : 이름이 같은 '새로운' 메서드를 정의하는 것.
🔸 오버라이딩 : 상속받은 메서드의 내용을 '변경'하는 것.class Parent{ void parentMethod(); } class Child extends Parent{ void parentMethod(){} // 오버라이딩 void parentMethod(int i){} // 오버로딩 void childMethod(){} void childMethod(int i){} // 오버로딩 }
🔸 super : 상속받은 멤버를 참조하는데 사용되는 참조변수, 조상의 멤버와 자신의 멤버를 구별하는 데 사용한다.
( this와 같은 개념)class Super{ public static void main(String args[]){ Child c= new Child(); c.method(); } } class Parent{ int x = 10; // super.x } class Child extends Parent{ int x = 20; // this.x void method(){ System.out.println("x = " + x); // x = 20 System.out.println("this.x = " + this.x); // this.x = 20 System.out.println("super.x = " + super.x); // super.x = 10 } } * 주로 조상클래스의 메서드를 자식클래스에서 오버라이딩한 경우, 조상클래스의 멤버변수와 자손클래스의 멤버변수명이 중복 될 경우에 사용한다.
🔸 super() : 조상클래스의 생성자( *. this()와 같은 개념 )
- 조상클래스의 생성자를 호출해야 하는 이유 : 자식클래스에서 조상클래스의 멤버를 사용할 수도 있는데 사용하기 전에 초기화가 되어있어야 하기 때문.class PointTest{ public static void main(String args[]){ Point3D p3 = new Point3D(1,2,3); } } class Point{ int x, y; Point(int x, int y){ this.x = x; this.y = y; } String getLocation(){ return "x = " + x + ", y = " + y; } } class Point3D extends Point{ int z; Point3D(int x, int y, int z){ super(x, y); // 조상클래스의 Point(int x, int y)와 같음. super()생성자를 안넣어주면 컴파일 에러 발생함. //this.x = x; //this.y = y; this.z = z; /* super()생성자를 넣지 않고 this.x = x, this.y = y, this.z = z만 사용하면 컴파일러가 자동으로 Point()생성자를 추가한다. 하지만 조상클래스에 Point()생성자가 없기 때문에 컴파일 에러가 발생하게 되는 것. 이를 해결하기 위해서는 super()생성자를 사용하거나 조상클래스에 Point()생성자를 추가해야한다. */ } // 오버라이딩 String getLocation(){ return "x = " + x + ", y = " + y + ", z = " + z; } }
🔸 조상클래스의 멤버변수는 조상클래스의 생성자에 의해 초기화되도록 해야한다.