JAVA/JAVA 멘토시리즈

[JAVA 멘토시리즈] 응용 문제 풀이 (상속)

웹코린이 2023. 5. 25. 12:00
728x90

1. 다음 중 상속과 관련된 단어를 모두 고르세요.

  1. super
  2. super()
  3. this
  4. extends

 

더보기

보기 1) super 키워드를 사용해 부모 클래스의 메소드를 호출할 수 있습니다.

보기 2) 자식 클래스에서 부모 클래스의 생성자를 호출하는 키워드로 super()를 사용한다. 필요에 따라 매개변수를 전달할 수도 있고, 개발자가 직접 생성자를 선언할 때는 자식 클래스에서 반드시 부모 클래스의 생성자를 호출 해줘야 한다.

보기 3) this는 자기 자신을 의미하는 키워드로 상속과는 관련 없는 단어이다. 

보기 4) extends 키워드를 사용해 상속받을 클래스를 지명할 수 있다. 자식 클래스는 부모 클래스의 모든 멤버를 그대로 가져다 쓸 수 있다.

 

2. 다음 코드를 실행했을 때 콘솔창에 출력되는 결과는 무엇입니까 ?

package section10;

class Person {
	void printHello() {
		System.out.println("안녕하세요.");
	}
}

class Student extends Person {
}

public class PRACTICE_10_02 {
	public static void main(String[] args) {
    	Person p = new Person();
        p.printHello();
        
        Student s = new Student();
        s.printHello();
    }
}

 

더보기

[ 출력 결과 ]

안녕하세요

안녕하세요

 

Student 클래스의 부모 클래스는 Person 클래스이고, 모든 자식 클래스는 부모 클래스이기 때문에 두개 다 '안녕하세요' 가 출력 된다.

 

3. <PRACTICE_10_02.java> 코드에서 class Student가 printHello()를 다음과 같이 오버라이드 했을 때, 콘솔창에 출력되는 결과는 무엇입니까 ?

class Student extends Person {
	@Override
    	void printHello() {
    		System.out.println("안녕하세요, 저는 자바를 공부하는 학생입니다.");
    	} 
}

 

더보기

[ 출력 결과 ]

안녕하세요, 저는 자바를 공부하는 학생입니다.

안녕하세요, 저는 자바를 공부하는 학생입니다.

 

상속 받은 메소드를 재정의 하는 것을 오버라이딩이라고 하는데 printHello()를 재정의 했으므로 출력 결과는 위와 같다.

 

4. 다음 코드는 컴파일 에러가 발생합니다. 그 이유는 무엇이며 어떻게 해결해야 할까요 ?

 

[ClassA.java]

package section10;

public class ClassA {
	private int a;
    
    private ClassA(int a) {
    	this.a = a;
    }
    
    public void methodA() {
    	System.out.println("ClassA클래스의 methodA() 메서드입니다. ");
        System.out.println("필드 a의 값은 " + a + "입니다. ");
    }
}

[ClassB.java]

package section10;

public class ClassB {
	public static void main(String[] args) {
    	ClassA ca = new ClassA(3);
        ca.methodA();
    }
}

 

더보기

ClassA에서 생성자에 private을 붙힐 경우, ClassB에서는 접근할 수 없기 때문에 private를 삭제해야 한다.

따라서 ClassA의 생성자 코드를 수정하면 아래와 같다.

 

ClassA() {

      this.a = a;

}

 

5. 다음 두 개의 클래스는 상속 관계에 있으나, 다른 패키지에 속해 있습니다. Child 클래스에서 Parent 클래스의 parentMethod 메서드를 호출하기 위해 어떤 코드를 작성해야 할까요 ?

 

[Parent.java]

package section10.access1;

public class Parent {
	protected void parentMethod() {
    	System.out.println("parentMethod is called.");
    }
}

[Child.java]

package section10.access2;
import section10.access1.*;

public class Child {
	void accessParentMethod() {
    	// ???
    }
}

 

더보기

부모 클래스 Parents의 메소드인 parentsMethod()는 protected로 선언 되어 있는데, protected는 패키지가 달라도 상속관계이면, 자식클래스에서 호출을 할 수 있다. 부모의 클래스 메소드에 접근하기 위해서는 'super.부모클래스의 메소드()'로 접근해야 한다. 따라서 자식 클래스의 코드는 아래와 같이 수정 해야 한다. 

 

public class Child extends Parent {

       void accessParentMethod() {

            super.accessParentMethod();

       }

}

 

728x90