post-custom-banner

정보처리기사 실기 프로그래밍 기출 JAVA 반복문 연산식 상속 static 함수 오버라이딩 중복 재귀함수 문제 풀이
🔗 재귀함수 알아보기

JAVA > 오버라이딩과 중복 재귀함수

📝 문제풀어보기-1

다음은 자바(Java) 소스 코드이다. 출력 결과를 쓰시오.

class Parent {
  public int compute(int num){
    if(num <=1) return num;
    return compute(num-1) + compute(num-2);
  }
}

class Child extends Parent {
  public int compute(int num){
    if(num<=1) return num;
    return compute(num-1) + compute(num-3);
  }
}

class Main {
  public static void main (String[] args){
    Parent obj = new Child();
    System.out.print(obj.compute(4));
  }
}

우선 Child 클래스는 Parent를 상속하는 자식이다.

Child에서 Parentcompute 함수를 오버라이딩*하므로, Childcompute 함수만 보면 된다.

오버라이딩*
상속관계의 자식 클래스에서 부모의 메서드를 재정의하여 사용

obj.compute(4)를 가지고 들어가면, 중복 재귀함수가 등장하는 것을 볼 수 있다. 말 그대로 재귀함수가 동시에 두 번 등장하는 것이다.

이 경우는 기존 스택에 쌓는 것과 같은 그림으로 풀기에는 헷갈릴 수 있어서 각 재귀함수에 뿌리를 내려 계산(?)하는 방식으로 진행한다.

compute(4)를 가지고 들어간 중복 재귀함수를 그림으로 그려보면 아래와 같다.

*compute()는 줄여서 com()으로 표기한다.

위에서 아래로 뻗어나가는 형태이고, 각 재귀 함수는 만날 때마다 뿌리를 내려주는 식으로 연산한다. 예를 들어 맨 윗 뿌리의 com(3) + com(1) 식에서, 재귀함수 com(3)을 만나면 com(3)의 뿌리를 바로 내려주고, com(1)도 마찬가지로 뿌리를 내려 각자의 return값을 적어준다.

연산은 재귀함수가 모두 돌고 나서 마지막에 한다.

그러면 밑에서 부터 1 + (-1) = 00 + 0 = 00 + 1 = 1이 된다.

정답은 아래와 같다.

1


JAVA > static 함수와 오버라이딩

📝 문제풀어보기-2

다음은 자바(Java) 소스 코드이다. 출력 결과를 쓰시오.

class A {
    static void f() {
        System.out.print("1 ");  // 3
    }
    void g() {
        System.out.print("2 ");
    }
}

class B extends A {
    static void f() {
        System.out.print("3 ");
    }
    void g() {
        System.out.print("4 ");  // 5
    }
}

class Main {
    public static void main(String[] args) {
        A a = new B();           // 1
        a.f();                   // 2
        a.g();                   // 4
    }
}

코드의 실행 순서는 위의 주석과 같다. 순서대로 따라가보자.

  1. 클래스B는 클래스A를 상속하고 있고, 부모 타입 A로 인스턴스 a를 생성한다.

  2. af()함수에 접근한다. 이때 자신(=B)의 f()가 있으므로 원래대로라면 "3 "을 출력하겠지만, f()함수는 static함수이다. 🔗 static 메모리?

static의 경우 객체 생성이 일어나기 전, 즉, new B()a라는 인스턴스가 생성되기 전에 이미 메모리에 할당되어 있으므로, 이 경우 생성된 객체의 타입을 확인하여 호출한다. 다시 말해, 인스턴스 a의 타입(=클래스A)을 보고 그의 메서드를 호출한다는 뜻이다.

  1. 따라서 a.f() 호출시 클래스A의 f()함수를 가리키게 되므로 "1 "을 출력하는 것이다.

  2. a.g()static이 아니고, 자신(=B)이 가진 함수이므로 B의 g()를 호출한다.

  3. 따라서 클래스B의 g() 함수 호출로 "4 "가 출력된다.

1 4


🙋🏻‍ 참고한 곳
🔗 홍달쌤 유튜브 🔗 홍달쌤의 정보처리기사 실기 책

post-custom-banner

0개의 댓글