잡다한 지식/CS 베이스

[한국은행 전산학 기출][2019] 객체지향 언어의 특징

GGOBOOGI 2021. 5. 9. 23:58
반응형

한국은행에서 제공하는 필기시험 기출문제는 해설이 제공되지 않습니다.
이 글에서 제시하는 풀이는 제 풀이일 뿐, 정답이 아닐 수 있습니다.
틀린 부분이나 부족한 부분이 있을 시, 댓글로 남겨주세요. 감사합니다.

 

이전에 풀었던 새끼 문제들까지 한번에 정리해보자.

 


문제

프로그래밍 언어와 관련하여 다음 물음에 답하시오.

 

(1) 객체지향언어가 지니는 장점에 대해 간략히 설명하시오.

 

(2) 객체지향언어 중 JAVA는 다중 상속이 불가능하고, C++는 다중 상속이 가능하다. 상속에 있어서 단일 상속과 다중 상속의 차이를 설명하고 다중 상속이 가지는 문제점을 설명하시오.

 

(3) 객체지향언어의 특성인 오버로딩(overloading)과 오버라이딩(overriding)에 대해 간략히 설명하시오.

 

(4) 다음 물음에 답하시오.

 

(4-1) 다음 JAVA 코드의 실행 결과를 작성하시오.

class Parent{
    Parent(){
        System.out.println("Parent 1");
    }
    
    Parent(String str){
        System.out.println("Parent 2");
    }
}

class Child extends Parent{
    Child(){
        System.out.println("Child 1");
    }
    
    Child(String str){
        System.out.println("Child 2");
    }
}

class FamilyTest{
    public static void main(String args[]){
        Child c1 = new Child();
        Child c2 = new Child("a");
    }
}

(4-2) 다음 JAVA 코드에서 문제가 있는 부분 두 곳을 지적하고, 그 이유를 설명하시오.

class Parent{
    Parent(){
        System.out.println("Parent");
    }
}

class Child extends Parent{
    Child(){
        System.out.println("Child");
    }
    
    public void init(){
        System.out.println("init");
    }
}


public class Main
{
	public static void main(String[] args) {
		Parent p = null;
		Child c1 = new Child();
		Child c2 = null;
		
		p = c1;
		p.init();
		c2 = p;
	}
}

(4-3) 재귀호출 방식을 사용하여 x^n을 구하는 함수를 JAVA 코드로 작성하시오.

static long power(int x, int n){






}

풀이

 

(1) 객체지향언어가 지니는 장점에 대해 간략히 설명하시오.

 

과거의 내가 정리해 두었다.

 

https://huilife.tistory.com/entry/프로그래밍언어론-객체지향-프로그래밍-언어의-특징?category=1192291

 

(2) 객체지향언어 중 JAVA는 다중 상속이 불가능하고, C++는 다중 상속이 가능하다. 상속에 있어서 단일 상속과 다중 상속의 차이를 설명하고 다중 상속이 가지는 문제점을 설명하시오.

 

이것도 과거의 내가 정리해 두었다.

 

https://huilife.tistory.com/entry/프로그래밍언어론-오버로딩overloading과-오버라이딩overriding의-차이점?category=1192291

 

(3) 객체지향언어의 특성인 오버로딩(overloading)과 오버라이딩(overriding)에 대해 간략히 설명하시오.

 

과거의 나 또 소환.

 

https://huilife.tistory.com/entry/한국은행-전산학-기출2019-다중-상속의-문제점?category=1192291

 

(4) 다음 물음에 답하시오.

 

(4-1) 다음 JAVA 코드의 실행 결과를 작성하시오.

 

문제에 제시되어 있는 코드가 물어보는 가장 중요한 점은 다형성도 다형성이지만 상속받은 생성자의 호출에 관한 것이다.

 

여기서 하나 짚고 넘어가야 할 것은 Child 클래스는 Parent 클래스를 상속받았기 때문에, Child 생성자가 실행될 때 super()로 인한 부모 생성자의 직접적 호출이 없다면 먼저 자동으로 Parent의 기본 생성자부터 실행하고 오게 된다.

 

따라서 위의 코드의 실행 결과는 다음과 같다.

 

Parent 1                                                                                                                                
Child 1                                                                                                                                 
Parent 1                                                                                                                                
Child 2 

만약, c2를 생성하면서 Parent 2 생성자로 가고 싶으면 super 함수를 이용하여 super(str)으로 매개변수를 넘겨줘야 상위 클래스의 해당 생성자를 호출할 수 있다. super 를 이용한 언급이 없다면 자동으로 기본 생성자인 Parent()를 호출하게 된다.

 

(4-2) 다음 JAVA 코드에서 문제가 있는 부분 두 곳을 지적하고, 그 이유를 설명하시오.

 

첫 번째 문제가 있는 부분은 여기이다.

p.init()

p는 Parent 타입의 변수이기 때문에, 아무리 Child 클래스의 인스턴스 변수로 생성했다 하더라도 p는 Parent 클래스가 가진 멤버 변수나 멤버 함수만 접근할 수 있다.

init()은 Child 클래스의 멤버 함수이기 때문에, p에서 접근이 불가능하다.

 

만약, p에서 init() 함수에 접근을 하고 싶다면 다운캐스팅(downcasting)을 다음과 같이 이용하면 접근이 가능하다.

다운캐스팅은 자신의 고유한 상태를 잃어버린 서브클래스의 객체를 다시 복구시켜주는것을 의미한다.

이는 p에 담긴 인스턴스의 태생이 Child이기 때문에 가능한 일이며, 만약 p가 new Parent()로 태생이 Parent라면 업캐스팅이 불가능하다.

((Child)p).init()

 

두 번째 문제가 있는 부분은 여기이다.

c2 = p

c2는 Child 클래스 타입의 변수이고, p는 Parent 클래스 타입의 변수이다.

앞에서도 언급했듯이, p는 Parent 클래스 타입이므로 Parent가 가진 멤버 변수와 멤버 함수에만 접근이 가능하다.

 

c2는 Parent 클래스를 상속받은 Child 클래스 타입이므로, Parent가 가진 멤버 변수와 멤버 함수 이외에 추가적으로 작성한 init()과 같은 함수에 대한 정보가 필요하지만, p는 Parent 클래스 타입이므로 Child 클래스만이 가진 추가적인 정보를 가지고 있지 않아 정보 제공이 불가능하다.

 

만약, p를 c2로 대입하고 싶다면, 다음과 같이 다운캐스팅을 사용해야 한다.

c2 = (Child)p

이 또한 p의 태생이 Child이기 때문에 가능한 일이며, p가 Parent 인스턴스를 가질 경우 c2 = p를 할 방법은 없다.

 

(4-3) 재귀호출 방식을 사용하여 x^n을 구하는 함수를 JAVA 코드로 작성하시오.

 

다음과 같은 방법을 통해 O(logN)의 시간복잡도를 가지는 함수를 구현할 수 있다.

static long power(int x, int n){
        if(n == 0){
            return 1;   
        }
        else if((n%2) == 0){
            long tmp = power(x, n/2);
            return tmp * tmp;
        }
        else{
            long tmp = power(x, (n-1)/2);
            return x * tmp * tmp;
        }
}
반응형