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 |
---|