본문 바로가기

정보처리기사

[Java] 정처기 문제 풀어보기

23년 1회

1번 출력결과

class Static{
 public int a=20;
 static int b=0;
 }
 public class Main {
 public static void main(String[] args) {
 int a=10; // main 메서드 내부의 지역 변수
 Static.b=a;  // 0 -> 10
 Static st=new Static();
 System.out.println(Static.b++); //아직까진 10이다. b++ 은 코드가 끝난 후에 실행됨.
 System.out.println(st.b); //11
 System.out.println(a); // 지역변수 a :10 출력
 System.out.println(st.a); // Static 인스턴스 변수 st.a : 20 출력
 }
 }
더보기

내가 쓴 답 : 11, 10, 10, 20

정답 : 10, 11, 10, 20

 

b++ 후 처리. 한 줄이 끝난 다음 실행된다.

23년 1회

18번 출력 결과를 쓰시오.(20년 3회 기출과 동일)

abstract class Vehicle{
 String name;
 abstract public String getName(String val);
 public String getName(){
 return "Vehicle name:" + name;
 }
 }
 class Car extends Vehicle{
 private String name;
 public Car(String val){
 name=super.name=val;
 }
 public String getName(String val){
 return "Car name : " + val;
 }
 public String getName(byte val[]){
 return "Car name : " + val;
 }
 }
 public class Main {
 public static void main(String[] args){
 Vehicle obj = new Car("Spark");
 System.out.print(obj.getName());
}
 }
더보기

내가 쓴 답: "Car name : Spark"

정답: "Vehicle name: Spark"

 

풀이 : obj.getName() 호출할 때, obj는 Vehicle 클래스 타입으로 선언된 Car 객체이다.

그런데 obj.getName()은 매개변수를 받지 않는 부모 클래스의 getName() 메서드를 호출한다. 따라서 "Vehicle name:" +name 이렇게 리턴된다. 

 

왜 자식 클래스의 getName()이 호출되지 않는가?

obj가 Vehicle 타입으로 선언되었기 때문에 부모 클래스의 메서드들만 접근 가능

23년 1회

20번 출력 결과

class Parent {
 int x = 100;
 Parent() {
 this(500);
 }
 Parent(int x) {
 this.x = x;
 }
 int getX() {
 return x;
 }
 }
 class Child extends Parent {
 int x = 1000;
 Child() {
 this(5000);
 }
 Child(int x) {
 this.x = x;
 }
 }
 public class Main {
 public static void main(String[] args) {
 Child obj = new Child();
 System.out.println(obj.getX());
 }
 }
더보기

내가 쓴 답: 5000

정답 : 500

 

풀이 : 부모와 자식의 x는 완전히 별개의 값이다. 부모 x, 자식 x가 따로 있다.

중요한 점은, 부모 클래스에서 정의된 메서드는 부모 클래스의 x 필드만 참조한다.

부모 클래스의 getX() 메서드는 자신의 클래스의 필드(x)만 참조하기 때문에, 자식 클래스의 x 값은 영향을 미치지 않는다.

 

그러므로 자식 x의 5000 값은 무시된다.

23년 2회

14번 출력결과

public class Main {
 public static void main(String[] args) {
 String str1 = "Programming";
 String str2 = "Programming";
String str3 = new String("Programming");
 System.out.println(str1==str2);
 System.out.println(str1==str3);
 System.out.println(str1.equals(str3));
 System.out.print(str2.equals(str3));
 }
 }
더보기

내가 쓴 답 : True, False, True, True

정답!

  • str1==str2 : 문자열 리터럴은 String constant pool에 저장되는데 str1과 str2는 같은 "Programming"을 참조하므로 True 값 반환
  • str1==str3 : new String("Programming")은 heap 메모리에 새로운 객체를 생성 -> str3은 pool의 "Programming"이 아니라 다른 객체의 주소를 가짐
  • equals()는 문자열 내용을 비교하고 내용이 같으므로 나머지 둘 다 true 반환

23년 3회

1번 출력결과

public class Main {
 public static void main(String[] args) {
 A b = new B();
 b.paint();
 b.draw();
 }
 }
 class A {
 public void paint() {
 System.out.print("A");
 draw();
 }
 public void draw() {
 System.out.print("B");
 draw();
 }
 }
 class B extends A {
 public void paint() {
 super.draw();
 System.out.print("C");
 this.draw();
 }
 public void draw() {
 System.out.print("D");
 }
 }
더보기

내가 쓴 답 : CDD

정답 : BDCD D

 

풀이 : 
A b = new B(); 로 객체가 새로 생성되었다. 'A b =' 이런식으로 정의되었지만 실질적으로 생성된 객체는 B이고, B의 메서드를 사용하게 된다. 

 

b.paint()

-> super.draw() 니까 부모단 A의 draw로 넘어가본다. B가 출력되고 draw() 함수가 또 사용되었다. 이때의 draw는 this.draw()로 적용된다고 보면 된다. this는 현재 메서드가 실행되는 트리거인 B를 의미하는거지 A를 의미하는게 아니다. (맞는다해도 계속 B만 출력하는 무한루프가 반복될것) B의 draw()는 D 이므로 현재 상황 'BD' 이다.

C를 출력한다. 'BDC'

this.draw() 는  의심의 여지없이 B의 draw 함수를 호출한다. 'BDCD' paint() 함수는 여기서 끝난다.

main 마지막 함수인 b.draw()도 D를 출력한다.

따라서 결과값은 BDCD D 

'정보처리기사' 카테고리의 다른 글

정처기 필기 틀린문제 해설 (05.12)  (0) 2025.05.12