정보처리기사 실기 프로그래밍 기출 JAVA 반복문 연산식 상속 static 함수 오버라이딩 중복 재귀함수 문제 풀이
🔗 재귀함수 알아보기
다음은 자바(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
에서 Parent
의 compute
함수를 오버라이딩*하므로, Child
의 compute
함수만 보면 된다.
오버라이딩*
상속관계의 자식 클래스에서 부모의 메서드를 재정의하여 사용
obj.compute(4)
를 가지고 들어가면, 중복 재귀함수가 등장하는 것을 볼 수 있다. 말 그대로 재귀함수가 동시에 두 번 등장하는 것이다.
이 경우는 기존 스택에 쌓는 것과 같은 그림으로 풀기에는 헷갈릴 수 있어서 각 재귀함수에 뿌리를 내려 계산(?)하는 방식으로 진행한다.
compute(4)
를 가지고 들어간 중복 재귀함수를 그림으로 그려보면 아래와 같다.
*compute()
는 줄여서 com()
으로 표기한다.
위에서 아래로 뻗어나가는 형태이고, 각 재귀 함수는 만날 때마다 뿌리를 내려주는 식으로 연산한다. 예를 들어 맨 윗 뿌리의 com(3) + com(1)
식에서, 재귀함수 com(3)
을 만나면 com(3)
의 뿌리를 바로 내려주고, com(1)
도 마찬가지로 뿌리를 내려 각자의 return값을 적어준다.
연산은 재귀함수가 모두 돌고 나서 마지막에 한다.
그러면 밑에서 부터 1 + (-1) = 0
→ 0 + 0 = 0
→ 0 + 1 = 1
이 된다.
정답은 아래와 같다.
1
static
함수와 오버라이딩다음은 자바(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
}
}
코드의 실행 순서는 위의 주석과 같다. 순서대로 따라가보자.
클래스B는 클래스A를 상속하고 있고, 부모 타입 A로 인스턴스 a를 생성한다.
a
로 f()
함수에 접근한다. 이때 자신(=B)의 f()
가 있으므로 원래대로라면 "3 "을 출력하겠지만, f()
함수는 static
함수이다. 🔗 static 메모리?
static
의 경우 객체 생성이 일어나기 전, 즉, new B()
로 a
라는 인스턴스가 생성되기 전에 이미 메모리에 할당되어 있으므로, 이 경우 생성된 객체의 타입을 확인하여 호출한다. 다시 말해, 인스턴스 a의 타입(=클래스A)을 보고 그의 메서드를 호출한다는 뜻이다.
따라서 a.f()
호출시 클래스A의 f()
함수를 가리키게 되므로 "1 "을 출력하는 것이다.
a.g()
는 static
이 아니고, 자신(=B)이 가진 함수이므로 B의 g()
를 호출한다.
따라서 클래스B의 g()
함수 호출로 "4 "가 출력된다.
1 4
🙋🏻 참고한 곳
🔗 홍달쌤 유튜브 🔗 홍달쌤의 정보처리기사 실기 책