Java 객체지향 Study 5회차

Geun Bo Kim·2023년 4월 13일
0

스터디

목록 보기
5/6
  1. 다형성 인스턴스에서 자식 클래스의 메서드 호출하기

Person 클래스가 있고 그를 상속 받는 Giwoong 클래스가 있습니다.

이 때 두 클래스가 가지고 있는 메서드는 다음과 같습니다.
Person: eat(), sleep()
Giwoong: eat(), study()

여기서 Person 인스턴스 = new Giwoong();의 형태로 인스턴스를 생성하면 해당 인스턴스는 study() 메서드를 사용할 수 없다.

이용할 수 없는 이유와 해당 인스턴스로 study() 메서드를 이용하기 위해 추가할 수 있는 코드는?

(코드로 구현)

public class Person {
    void eat() {
        System.out.println("사람은 음식을 먹습니다.");
    }

		void sleep() {
				System.out.println("사람은 잠을 잡니다.");
		}
}

class Giwoong extends Person{
    @Override
    void eat() {
        System.out.println("기웅님은 음식을 먹습니다.");
    }
    void study() {
        System.out.println("기웅님은 공부합니다.");
    }
}
public class Main {
    public static void main(String[] args) {
        Person person1 = new Giwoong();
				person1.study(); //컴파일 에러
    }
}
  • 김근보(답변) 자식은 부모의 것을 쓸 수 있지만 부모는 자식의 것을 쓸 수 없다. Giwoong클래스로 형변환 시켜줘야 study()메서드를 사용할 수 있다.
  • 김은양(질문) 문제의 답은 형변환을 시키는게 맞긴한데, 문제를 떠나서 새로운 인스턴스를 만드는 것이랑 형변환이랑 뭐가 더 좋아서 뭐를 쓰는 것인지 의문임.
  • 김은서(질문답변) person1을 강제 형변환으로 감싸 study()라는 자식 객체의 메서드를 쓰고, 다시 해당 로직을 벗어나면 원래의 person1 클래스 (Person 데이터 타입의 Giwoong 인스턴스) 그대로 사용할 수 있는 장점이 있다. 그렇기 때문에 아예 인스턴스로 선언을 하는 것과 차이가 있다.
  1. super. 키워드를 이용해 부모 메서드 호출하기

다음 코드를 실행할 때 실행 결과는 무엇일까요?

class A {
    public void method() {
        System.out.println("A.method");
    }
}

class B extends A {
    public void method() {
        System.out.println("B.method");
        super.method();
    }
}

class C extends B {
    public void method() {
        System.out.println("C.method");
        super.method();
    }
}

public class Main {
    public static void main(String[] args) {
        A a = new C();
        a.method();
    }
}
  • 이재호(답변) 살펴보면 B가 A에게, C가 B에게 상속을 받는 구조이고, 메인 클래스를 보면 참조변수 a는 C()를 바라보고 있기 때문에, a.method를 사용하면, C.method를 출력하고, super.method로 부모 클래스의 메서드를 호출하고, C클래스는 B클래스에게 상속받고 있으니, B.method를 출력하고, 다시 super.method로 부모 클래스의 메서드를 호출한다. B클래스는 A클래스를 상속받고 있으니, A,method를 출력한다. C.method B.method A.method
  • 김은서
  • 황석빈(질문) 은양님께서 super키워드를 맨 위에 놓아야 한다고 하셨었는데, 저렇게 놓아도 되는것인지
  • 김은양(질문답변) 가능함
  • 김은양(질문) super키워드와 System.out.println()을 반대로 놓으면 뭐가 나오는 것인지
  • 결과 정답과 반대로 나옴 A.method B.method C.method
  1. @Override 어노테이션

자바에서 상속된 메서드를 오버라이드할 때, @Override 어노테이션을 사용하는 이유는 무엇인가요?

  • 신동현(답변) 코드 가독성을 높임. @Override 어노테이션을 사용하면 메서드가 오버라이드된다는 것을 명시적으로 나타내기 때문. 오타나 잘못된 메서드 이름을 사용하는 등의 실수를 방지. @Override 어노테이션을 사용하면 컴파일러가 상위 클래스에 해당 메서드가 있는지 확인하고 없으면 오류를 발생시킴.
  • 김은양(질문) 어노테이션을 하는 이유중 하나가 안전장치인데, 부모 클래스 메서드의 이름 바꾸면 자식 메서드의 이름도 바뀌는 것인지?
  • 황석빈(질문답변) 어노테이션 살아있고 상속 자체를 지우면 에러가 발생함. 오버라이딩을 검증하는 기능이 있음. 컴파일 단계에서 어떤 걸 상속받아서 뭘 오버라이딩 하는지 검증을 하는거임.
  1. protected 접근제어자

자식 클래스에서 부모 클래스의 protected 메서드를 호출할 수 있는 이유는 무엇인가요?

  • 장기웅(답변) protected 메서드를 호출할 수 있는 이유는 protected는 같은 패키지 내에서 접근 가능하고, 다른 패키지에서는 상속받은 자식에서 접근 가능
  • 김은양(질문) default가 더 넓은 범위인지, protected가 더 넓은 범위인지
  • 김근보(질문답변) protected가 더 넓음
  1. 매개변수가 다른 오버라이딩이 가능한가?

부모 클래스에 “method”란 이름의 메서드가 있습니다. 자식 클래스에서는 “method”라는 이름의 메서드를 사용하지만 매개변수는 부모의 메서드와 다르게 받습니다. 이건 오버라이딩이라고 받아들여질까요?

  • 김은양(답변) 답변은 불가능하다임 오버라이딩에는 조건이 있는데, 그 조건이 메서드가 일치해야 하고 접근 제어자가 자식의 것이 부모의 것보다 작아야 함
  • 이재호(질문) 저 문제에 나오는거 오버로딩이라 할 수 있는지
  • 신동현(답변) 자식 클래스가 부모 클래스의 모든 것을 상속받기 때문에 오버로딩이라고 할 수 있음.
  1. Child 클래스에서 printAB 메소드를 오버라이딩하여 부모 클래스의 a와 b를 출력하도록 만들어보세요.
public class Parent {
    int a = 10;
    int b = 20;
    public void printAB() {
        System.out.println(a);
        System.out.println(b);
    }
}
public class Child extends Parent {
    int a = 30;
    int b = 40;
    @Override
    public void printAB() {
        // 여기에 들어갈 코드를 완성해주세요.
    }
}
  • 고예진(답변)
    public class Parent {
        int a = 10;
        int b = 20;
        public void printAB() {
            System.out.println(a);
            System.out.println(b);
        }
    }
    public class Child extends Parent {
        int a = 30;
        int b = 40;
        @Override
        public void printAB() {
            super.printAB// 여기에 들어갈 코드를 완성해주세요.
        }
    }

(protected 포함) 접근제어자

profile
미래는 개발이다

0개의 댓글