JAVA 13일차

MOZZI KIM·2022년 11월 10일
0

JAVA

목록 보기
13/21
post-thumbnail

1. 메소드 오버라이딩(Overriding) 이란?

📌오버라이딩(overriding)

  • 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많은데 이럴 때 조상의 메서드를 오버라이딩 한다.

  • 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받는다.
    이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있다.

  • 즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미한다.

📌 오버라이딩 조건

  1. 오버라이딩이란 메소드의 동작만을 재정의하는 것이므로, 메소드의 선언부는 기존 메소드와 완전히 같아야 함.
    하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있음

  2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없음

  3. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없음


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();

    }
}

2. 오버로딩 vs 오버라이딩 의 차이는?

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

📌오버라이딩(Overriding)
상속 받은 메서드의 내용만 변경 하는 것.


3. @Override 에 대하여 설명하시오.

📌어노테이션이란?
어노테이션은 JDK5 부터 등장하였으며, 클래스나 메서드, 변수에 @을 사용하는 것이다.

📌어노테이션을 사용하는 이유
어노테이션은 사전적 의미로 주석을 뜻한다.
주석과는 역할이 다르지만, 주석처럼 달아 특수한 의미 부여가 가능하며, 기능 주입이 가능함.
어노테이션을 사용하는 가장 큰 이유는 프로그램에게 추가 정보를 제공하는 메타 데이터를 위해서 사용한다.

📌@Override 사용하는 이유
오버라이드 어노테이션이 없다면 부모로부터 오버 라이딩되었는지 확신할 수 없다.
그래서 만약 해당 어노테이션을 사용하면 컴파일러가 부모 클래스에 있는 메서드명과 매개 변수 등이 동일한지 체크를 한다. 그래서 정확히 해당 클래스가 오버라이딩 됐는지 확인이 가능하다.


4. instanceof 연산자에 대하여 설명하시오.

📌instanceof

  • 객체 타입을 확인하는 연산자이다.

  • 형변환 가능 여부를 확인하며 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

5. 다형성과 함수오버라이딩을 적용하여, 아래의 클래스들을 완성하시오.

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);

	}

}

6. 아래를 프로그래밍 하시오.

겜블링 게임에 참여할 선수 숫자>>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("아쉽군요!");

		}
	}
}


profile
코린이

0개의 댓글