지우너

[정보처리기사 실기] JAVA 본문

Records/정보처리기사

[정보처리기사 실기] JAVA

지옹 2024. 8. 10. 10:48

java에서 나오는 문제: 객체 지향(상속, 생성자, static 등)

 

 

 

정보처리기사 실기 프로그래밍 파트의 JAVA 상속 정리

해당 부분이 궁금하다면 제목의 링크를 보거나, 유튜브에 흥달쌤 아버지를 검색하면 자세히 알 수 있다.

[Q&A] JAVA | 아버지가 날 낳은 형태

생성자

class P{
    P() {
        System.out.println("A");
    }
    P(int a) {
        System.out.println("B");
    }
}
class C extends P{
    C(){
        System.out.println("C");
    }
    C(int a){
        System.out.println("D");
    }
    C(int a, int b){
        super(a);
        System.out.println("E");
    }

    public static void main(String[] args) {
        P p1 = new C();
        P p2 = new C(1);
        P p3 = new C(1, 2);
    }
}
더보기

정답

A
C
A
D
B
E


1. P p1 = new C();

C(){
	// P(); // 기본적으로 매개변수 없는 부모 생성자 호출
	System.out.println("C");
}

A

C

P()가 먼저 호출 된 후 C가 출력된다. P()에서 A를 출력하기 때문에 A \n C가 출력된다.

 

2. P p2 = new C(1);

C(int a){
	// P(); // 생략시 부모의 매개변수 없는 생성자 호출
	System.out.println("D");
}

A

D

P()가 먼저 호출 된 후 D가 출력된다. P()에서 A를 출력하기 때문에 A \n D가 출력된다.

 

3. P p3 = new C(1, 2);

C(int a, int b){
	super(a);
	System.out.println("E");
}

B

E

super(a); 라고 부모의 매개변수가 1개인 생성자를 명시적으로 호출해줬다. P(1);이 호출되고(a=1이니까), B가 출력된다.

그리고 E가 출력된다.

 

 

오버라이딩

class P{
    public void func1(){
        System.out.println("A");
    }
    public void func2(){
        System.out.println("B");
    }
}
class C extends P{
    public void func1(){
        System.out.println("C");
    }
    public void func3(){
        System.out.println("D");
    }

    public static void main(String[] args) {
        P p1 = new C();
        p1.func1();
        p1.func2();
        p1.func3();
    }
}

 

더보기

정답

p1.func3()이 에러가 난다.


p1.func1();

아버지가 나를 낳은 형태(부모 p = new 자식()의 형태)에서 오버라이딩이 되었을 경우 자식의 함수를 호출 C

p1.func2();

자식이 오버라이딩 하지 않았으므로 부모의 func2 함수 호출 B

p1.func3();

P p1 = new C(); p1은 자식을 생성했지만 형태는 P 즉, 부모의 형태이다. 이러면 부모가 가진 함수만 호출이 가능하다. func3의 경우 자식에는 있지만, 부모에는 해당 함수가 없다. 따라서 오류가 발생한다.

 

하이딩

class P{
    public static void func1(){
        System.out.println("A");
    }
}
class  C extends P{
    public static void func1(){
        System.out.println("C");
    }

    public static void main(String[] args) {
        P p1 = new C();
        p1.func1();
        C p2 = new C();
        p2.func1();
    }
}

 

더보기

정답

A

C


P와 C의 함수들을 보면 static 키워드가 들어가 있다. 하이딩은 오버라이딩이 아니다. static이 붙으면 오버라이딩이 아니라 각각 가지고 있는 함수가 됨.

1. P p1 = new C(); p1.func1();

P1은 P형태이다. 함수에 static 키워드가 붙어 있기 때문에 부모의 함수를 그대로 출력해야 한다. A 출력

 

2. C p2 = new C(); p2.func1();

p2는 C의 형태이다. 함수에 static 키워드가 붙어 있으므로 C의 static 함수를 출력한다. C 출력

 

멤버변수

class P{
    public int a =10;
    public void func1(){
        System.out.println(a);
    }
    public void func2(){
        System.out.println(a);
    }
}
class C extends P{
    public int a =10;
    public void func1(){
        System.out.println(a);
    }

    public static void main(String[] args) {
        P p1 = new C();
        p1.a=20;
        p1.func1();
        p1.func2();
    }
}

 

 

더보기

정답

10

20


1. P p1 = new C();

p1은 부모의 a=10, 자식의 a=10 이렇게 가지게 된다.

 

2. p1.a=20;

p1은 P의 형태이기 때문에 p1.a=20이라고 하면 부모의 a가 20으로 바뀐다.

 

3. p1.func1();

func1()은 오버라이딩된 함수이기 때문에 자식의 func1을 실행하게 된다. 자식의 func1에서 변수 a를 출력하게 되는데, 자식의 func1에서 가까운 것은 자식의 변수이다. 따라서 자식의 a인 10을 출력한다.

 

4. p1.func2();

func2()는 부모에만 있는 함수이다. 따라서 부모의 함수를 실행한다. 부모의 func2에서 변수 a를 출력한다. func2와 가까운 것은 부모의 변수 a이다. 따라서 부모의 변수 a에 저장된 20을 출력한다.

 

[Q&A] JAVA | 아버지가 날 낳았을때, 변수의 유효범위

class A{
    int a = 10;
    public A(){
        System.out.print("가");
    }
    public A(int x) {
        System.out.print("나");
    }

    public static void main(String[] args) {
        B b1 = new B();
        A b2 = new B(1);
        System.out.print(b1.a+b2.a);
    }
}
class B extends A{
    int a =20;
    public B() {
        System.out.print("다");
    }
    public B(int x) {
        System.out.print("라");
    }
}

 

더보기

정답: 가다가라30


Point. super(x)이런 식으로 직접 호출된 게 아니라면 기본적으로 super()을 호출.

 

1. B b1 = new B() // B클래스의 매개변수 없는 생성자 호출

public B() {
	//A(); // 부모생성자 먼저 호출
	System.out.print("다");
}

가다

(이때 b1의 부모도 같이 생성되기 때문에 부모.a=10 자식.a=20의 값을 갖게 됨)

 

2. A b2 = new B(1) // B클래스의 매개변수가 하나인 생성자 호출

public B(int x) {
	//A(); // 부모생성자 먼저 호출
	System.out.print("라");
}

가라

(이때 b2의 부모도 같이 생성되기 때문에 부모.a=10 자식.a=20의 값을 갖게 됨)

 

3. System.out.print(b1.a+b2.a);

b1은 B로 생성됨 B b1 = new B(); 따라서 b1.a는 b1의 B의 a인 20이 된다.

b2는 A로 생성됨 A b2 = new B(1); 따라서 b2.a는 b2의 A의 a인 10이 된다.

그러므로, b1.a+b2.a=20+10=30

30이 출력된다.

 

종합적으로 "가다가라30"이 출력되게 된다.

 

class Foo{
    public int a =3;
    public void addValue(int i){
        a = a+i;
        System.out.println("Foo: " + a + " ");
    }
    public void addFive(){
        a+=5;
        System.out.println("Foo: " + a + " ");
    }
}
class Bar extends Foo{
    public int a =8;

    public void addValue(double i) {
        a=a+(int)i;
        System.out.println("Bar: " + a + " ");
    }
    public void addFive(){
        a+=5;
        System.out.println("Bar: " + a + " ");
    }

    public static void main(String[] args) {
        Foo f = new Bar();
        f.addValue(1);
        f.addFive();
    }
}

 

 

더보기

정답

Foo: 4 
Bar: 13


1. Foo f = new Bar();

Foo 형태로 Bar 생성. f는 Foo.a=3, Bar.a=8을 모두 가짐.

 

2. f.addValue(1);

addValue(1)은 매개변수가 정수인 함수이므로 부모의 addValue(int)가 호출된다.

(* addValue(1)은 부모의 addValue(int i)를 오버라이딩(매개변수가 1개인 addValue함수)한 후, 오버로딩(int→double) 한 함수이다.)

부모의 함수와 가까운 부모의 변수에 매개변수로 들어온 1을 더한다. Foo.a=4

"Foo:" + a를 출력하면 "Foo: 4 " 가 출력된다.

 

3. f.addFive();

f.addFive()는 자식 클래스에서 오버라이딩한 함수이므로 자식의 addFive()를 호출한다.

자식의 함수와 가까운 자식의 변수 a에 a+=5를 해준다. Bar.a=8+5=13

"Bar: "+ a를 출력하면 "Bar: 13 "가 출력된다.