상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많은데 이럴 때 조상의 메서드를 오버라이딩 한다.
자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받는다.
이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있다.
즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미한다.
오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 함.
하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있음
부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없음
부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없음
class Parent {
void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
}
public class Inheritance05 {
public static void main(String[] args) {
Parent pa = new Parent();
pa.display();
Child ch = new Child();
ch.display();
Parent pc = new Child();
pc.display(); // Child cp = new Parent();
}
}
📌오버로딩(Overloading)
기존에 없던 새로운 메서드를 정의하는 것
📌오버라이딩(Overriding)
상속 받은 메서드의 내용만 변경 하는 것.
📌어노테이션이란?
어노테이션은 JDK5 부터 등장하였으며, 클래스나 메서드, 변수에 @을 사용하는 것이다.
📌어노테이션을 사용하는 이유
어노테이션은 사전적 의미로 주석을 뜻한다.
주석과는 역할이 다르지만, 주석처럼 달아 특수한 의미 부여가 가능하며, 기능 주입이 가능함.
어노테이션을 사용하는 가장 큰 이유는 프로그램에게 추가 정보를 제공하는 메타 데이터를 위해서 사용한다.
📌@Override 사용하는 이유
오버라이드 어노테이션이 없다면 부모로부터 오버 라이딩되었는지 확신할 수 없다.
그래서 만약 해당 어노테이션을 사용하면 컴파일러가 부모 클래스에 있는 메서드명과 매개 변수 등이 동일한지 체크를 한다. 그래서 정확히 해당 클래스가 오버라이딩 됐는지 확인이 가능하다.
객체 타입을 확인하는 연산자이다.
형변환 가능 여부를 확인하며 true / false로 결과를 반환한다.
주로 상속 관계에서 부모객체인지 자식 객체인지 확인하는 데 사용된다.
👉instanceof의 기본 사용방법은 "객체 instanceof 클래스" 를 선언함으로써 사용한다.
class Parent{}
class Child extends Parent{}
public class InstanceofTest {
public static void main(String[] args){
Parent parent = new Parent();
Child child = new Child();
System.out.println( parent instanceof Parent ); // true
System.out.println( child instanceof Parent ); // true
System.out.println( parent instanceof Child ); // false
System.out.println( child instanceof Child ); // true
}
}
1. parent instanceof Parent : 부모가 본인 집을 찾았으니 true
2. child instanceof Parent : 자식이 상속받은 부모 집을 찾았으니 true
(상속을 받았으니 자기 집이라 해도 무방하다?)
3. parent instanceof Child : 부모가 자식 집을 찾았으니 false (자식 집은 자식 집이지 부모 집은 아니니까)
4. child instanceof Child : 자식이 본인 집을 찾았으니 true
Shape[] shape = {new Circle(10),new Triangle(10, 10),new Rectangle(10, 10)};
for (Shape s : shape) {
sumArea += s.getArea();
}
package Prac;
class Shape {
public double getArea() {
return 0.0;
}
}
class Circle extends Shape{
private int r;
public Circle(int num) {
this.r = num;
ㅇ @Override
public double getArea() {
return r * r * Math.PI;
}
}
class Triangle extends Shape{
private int w,h;
public Triangle(int num1, int num2) {
this.w = num1;
this.h = num2;
}
@Override
public double getArea() {
return w * h / 2.0;
}
}
class RRectangle extends Shape{
private int w,h;
public RRectangle(int num1, int num2) {
this.w = num1;
this.h = num2;
}
@Override
public double getArea() {
return w * h;
}
}
public class ShapeArr {
public static void main(String[] args) {
double sumArea = 0;
Shape[] shape = {new Circle(10),new Triangle(10, 10),new RRectangle(10, 10)};
for (Shape s : shape) {
sumArea += s.getArea();
}
System.out.println("넓이 : " + sumArea);
}
}
겜블링 게임에 참여할 선수 숫자>>3
1번째 선수 이름>>영희
2번째 선수 이름>>철수
3번째 선수 이름>>길동
[영희]:<Enter>
3 3 2 아쉽군요!
[철수]:<Enter>
3 3 2 아쉽군요!
[길동]:<Enter>
1 1 1 길동님이 이겼습니다!
Process finished with exit code 0
import java.util.Scanner;
class Player {
private String name;
private int[] arrNum;
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
public boolean game() {
arrNum = new int[3];
for (int i = 0; i < arrNum.length; i++) {
arrNum[i] = (int) (Math.random() * 3 + 1);
}
System.out.print(arrNum[0] + " " + arrNum[1] + " " + arrNum[2] + " ");
if ((arrNum[0] == arrNum[1]) && (arrNum[1] == arrNum[2])) {
return true;
}
return false;
}
}
public class GambleTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("겜블링 게임에 참여할 선수 인원 수 >> ");
int member = sc.nextInt();
Player[] player = new Player[member];
for (int i = 0; i < member; i++) {
System.out.print((i + 1) + "번 째 선수 이름은 ? >> ");
String name = sc.next();
player[i] = new Player(name);
}
String buffer = sc.nextLine(); //엔터찌꺼지제거
while (true) {
for (int i = 0; i < member; i++) {
System.out.print("\n[" + player[i].getName() + "]:<Enter> 종료: 0 ");
buffer = sc.nextLine();
if (player[i].game()) {
System.out.println("\nWoW..!!! " + player[i].getName() + "님이 이겼습니다.");
System.out.println("게임종료");
return; //함수종료
}
}
System.out.println("아쉽군요!");
}
}
}