minOS

자바의 정석 ch7-7~9 오버라이딩 본문

TIL/남궁성의 자바의 정석

자바의 정석 ch7-7~9 오버라이딩

minOE 2023. 11. 23. 19:06
728x90

ch7-7 오버라이딩

- 상속 받은 조상의 메서드를 자신에게 맞게 변경하는 것

예시1
class Point {
    int x;
    int y;

    String getLocation(){
        return "x:" + x + " y:"+y;
    }
}

class Point3D extends Point{
    int z;


    //조상의 getLocation()을 오버라이딩

    String getLocation(){
        return "x:" + x + " y:"+y +" z:"+z;
    }
}

public class Main {
    public static void main(String[] args) {

        Point3D p = new Point3D();
        p.x=3;
        p.y=8;
        p.z=5;
        System.out.println(p.getLocation());
    }
}

출력



예시2 

class Point {
    int x;
    int y;
    
    //생성자 생성
    Point(int x ,int y){
        this.x =x;
        this.y =y;
    }
   //Object클래의 toString()을 오버라이딩
    public String toString(){
        return "x:" + x + " y:"+y;
    }
}


public class Main {
    public static void main(String[] args) {
        Point p = new Point(2,5);
        System.out.println(p);
    }
}

출력



 

ch7-8~9 오버라이딩 vs 오버로딩

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

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

오버라이딩의 조건
1. 선언부가 조상 클래스와 일치해야 한다.(반환타입,메서드 이름, 매개변수 목록)
2.접근 제어자를 조상 클래스의 메서드 보다 좁은 범위로 변경 불가하다.
3. 자식 클래스의 메서드 예외는 조상 클래스의 메서드 보다 많이 선언할 수 없다.

2번 조건 예시
class Animal {
    // 부모 클래스의 메서드
    public void makeSound() {
        System.out.println("동물이 소리를 낸다.");
    }
}

class Dog extends Animal {
    // 조상 클래스의 메서드를 오버라이딩
    // 접근 제어자를 더 넓은 범위로 변경하는 것은 허용됨
    @Override
    public void makeSound() {
        System.out.println("강아지가 멍멍 소리를 낸다.");
    }
}

class Cat extends Animal {
    // 아래의 코드는 컴파일 에러를 발생시킵니다.
    // 조상 클래스의 메서드의 접근 제어자를 좁은 범위로 변경할 수 없음
    // private 또는 default로 변경하면 컴파일 에러 발생
    // protected나 public으로 변경하는 것은 허용됨
    // @Override
    private void makeSound() {
        System.out.println("고양이가 야옹 소리를 낸다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.makeSound();  // "강아지가 멍멍 소리를 낸다." 출력

        Cat myCat = new Cat();  // 컴파일 에러 발생
        myCat.makeSound();
    }
}

 

위의 코드에서 `Cat` 클래스에서 `makeSound` 메서드를 `private`로 변경하면 컴파일 에러가 발생한다. 이는 자식 클래스에서 조상 클래스의 메서드를 오버라이딩할 때, 접근 제어자를 좁은 범위로 변경하는 것이 허용되지 않기 때문이다.

3번 조건 예시
class Parent {
    // 부모 클래스의 메서드에서는 IOException 예외를 던집니다.
    public void someMethod() throws IOException {
        // 메서드 구현
    }
}

class Child extends Parent {
    // 아래의 코드는 컴파일 에러를 발생시킵니다.
    // IOException 예외보다 더 구체적인 Exception 예외를 던지고 있음
    @Override
    public void someMethod() throws Exception {
        // 메서드 구현
    }
}

 

위의 코드에서 `Child` 클래스에서 `someMethod` 메서드를 오버라이딩할 때, `IOException` 예외보다 더 일반적인 `Exception` 예외를 던지고 있습니다. 이는 허용되지 않으며, 컴파일 시에 오류가 발생합니다. 이는 자식 클래스에서는 예외를 던지는 범위를 줄이지 못하고, 슈퍼클래스의 예외를 그대로 따라야 한다는 원칙에 기인합니다.

 

오버로딩의 조건
1. 클래스 안에 메서드 이름이 같아야 한다.
2.매개변수는 개수 또는 타입이 달라야 한다 (또는 중요)
3.반환 타입은 영향이 없다

예시
class MyMath{
	
    static long add(long a, long b){
        return a+b;
    }

    static long add(long a, int b){
        return a+b;
    }

    static long add(int x, long y) {
        return x + y;
    }
    
    static int add(int[] a){
        int result =0;
        for(int i =0;i<a.length;i++){
            result += a[i];
        }
    return result; }
}


public class Main {
    public static void main(String[] args) {
        System.out.println(MyMath.add(100,200L));

        System.out.println(MyMath.add(100L,200L)); //static 메소드 객체 생성 X


        MyMath mm0 = new MyMath(); //static 메소드 객체 생성 o
        int[] arr ={100,200,300} ;
        System.out.println(mm0.add(arr));

        System.out.println(MyMath.add(new int[] {10, 20, 30})); //static 메소드 객체 생성 x

        MyMath mm1 = new MyMath();
        System.out.println(mm1.add(5,6L)); //static 메소드 객체 생성 0

    }
}​

출력

 

오버라이딩, 오버로딩 구분

class Parent{
    void parentMethod(){
        System.out.println("부모클래스");
    }
}

class Child extends Parent{
    void parentMethod(){
        System.out.println("자식클래스");
    } // 오버라이딩
    void parentMethod(int i){} // 오버로딩

    void childMethod(){} //메서드 정의
    void childMethod(int i){} // 오버로딩
    // void childMethod(){} // 중복정의 , 에러
}


public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.parentMethod();
    }
}

 

출력

728x90