정보처리기사 실기 프로그래밍 기출 JAVA 반복문과 연산식 상속 생성자 문제 풀이
🔗 자바 문제 더 풀기
다음은 n이 10일 때, 10을 2진수로 변환하는 자바 소스 코드이다. A, B 괄호 안에 알맞은 값을 적으시오.
public class Main {
public static void main(String[] args) {
int[] a = new int[8]; // 2진수 담을 변수
int i = 0; // 반복 횟수
int n = 10; // 10진수값
while ( *괄호 A* ) {
a[i++] = *괄호 B*;
n /= 2;
}
for (i = 7; i >= 0; i--) {
System.out.print(a[i]);
}
}
}
코드를 이해하기 위해 먼저 각 변수의 역할을 파악해보자.
int a
: 2진수 8자리를 담을 변수 ex) 00001010
int i
: while문 내부에서 사용될 반복 횟수만큼 증가하는 값 저장 변수
int n
: 주어진 10진수 값 (2진수로 변환할 값)
이제 반복문 코드로 들어가보자.
일단 괄호 A를 먼저 특정할 순 없다. 괄호 B의 계산이 어떻게 될지 알아야 while문의 조건 범위를 알 수 있기 때문이다.
따라서 우선 괄호 B로 가보자.
while
문을 돌면서 2진수로 변경되야할 값은 n
이니까 n
에게 뭔가를 해야한다. 즉 n
을 가지고 연산식을 만들어야 한다.
그 다음은 진법변환 방식을 생각해보자.
10진수에서 2진수 진법변환
10진수를 2진수로 바꿀 때, 10진수n
을 2로 나눠서 그 몫이 더 이상 2로 나누어지지 않을 때까지 나누고, 그 나머지 값을 뒤에서부터 읽어 2진수로 친다.
위의 진법변환 방법을 읽어보면 "~때까지"라는 부분이 있다. 이 말은 코드로 치면 반복문 사용을 의미하는 구문이다. 여기서 사실상 괄호 A와 괄호 B의 답을 유추할 수 있게 된다.
다시 코드로 돌아가보자. 문제의 코드에서 진법변환에 필요한 "더 이상 2로 나누어지지 않을 때까지 나누고"에 해당하는 부분은 이미 n /= 2;
로 작성되어 있다.
우리가 n
에 저장해야할 건 나머지 부분이다. 나머지를 읽어 2진수가 되기 때문이다.
그러면 괄호 B에는 n % 2
이 들어간다고 유추할 수 있다.
그러면 while 안에 들어갈 n
의 조건은?
위에서 언급되었다시피 더 이상 나누어지지 않을 때까지만 필요하니까 “0 초과여야 한다” 또는 “0이 아니어야한다” 정도면 좋겠다.
따라서 괄호 A에는 n > 0
또는 n != 0
가 적절하다.
정답을 정리하면 아래와 같다.
괄호 A:
n > 0
또는n != 0
괄호 B:n % 2
클래스A가 클래스B를 상속한다 = A는 자식이 되어 부모인 B의 맴버를 물려받아 쓰겠다
public Class B{ .... }; // 부모 클래스
public Class A extends B { .... }; // 자식 클래스
상속 관계이더라도 물려받을 수 없는 경우:
부모 클래스의 private
필드/메소드
부모와 자식이 서로 다른 패키지에 있을 때 부모 클래스의 default
필드/메소드
객체의 초기화를 위해 객체 생성시 자동으로 호출되는 함수.
생성자 이름은 클래스 이름과 동일해야 하며, 리턴 타입이 없다. 매개변수 조건에 따라 오버로딩* 이 가능하다.
오버로딩(overloading)*
이름이 같고 매개변수의 타입/개수가 다른 함수를 여러개 정의하는 것
super()
vs. this()
super()
: 부모의 기본 생성자 호출
this()
: 자신의 기본 생성자 호출
다음 Java 프로그램의 출력 값은?
class Super {
Super() {
System.out.print('A'); // 6 -> A
}
Super(char x) {
System.out.print(x); // 2 -> C
}
}
class Sub extends Super {
Sub() {
super(); // 5
System.out.print('B'); // 7 -> B
}
Sub(char x) {
this(); // 4
System.out.print(x); // 8 -> D
}
}
class Main {
public static void main(String[] args) {
Super s1 = new Super('C'); // 1
Super s2 = new Sub('D'); // 3
}
}
객체 생성 순서*
자바에서는 자식 객체를 생성하면, 부모 객체를 먼저 생성한 후 자식 객체가 생성된다.
위 코드의 주석은 프로그램의 실행 흐름이다. 순서대로 따라가보자.
Super타입의 인자를 가진 s1 인스턴스를 생성한다.
인자를 받는 Super()
생성자를 찾아가 'C'를 출력한다.
Super타입의 s2 인스턴스를 생성한다. Sub는 Super의 자식 클래스다.
인자를 받는 Sub()
생성자를 찾아가니, 인자 없는 생성자 호출하는 this()
함수를 호출한다.
인자 없는 생성자 Sub()
로 가니, 부모의 인자 없는 생성자를 호출하는 super()
를 호출하고 있다.
부모의 인자 없는 생성자 Super()
로 가면 'A'를 출력한다.
super()
호출이 끝났으니 그 아래인 System.out.print('B');
를 실행하여 'B'가 출력된다.
4번에서 인자를 받는 Sub()
생성자의 this()
함수 호출이 끝난 후 그 아랫줄인 System.out.print(x);
를 실행하여 'D'를 출력한다.
CABD
🙋🏻 참고한 곳
🔗 홍달쌤 유튜브 🔗 홍달쌤의 정보처리기사 실기 책