Tech Trail

[정보처리기사 실기] Java 언어 프로그래밍 특강(7) 본문

Learning/정보처리기사

[정보처리기사 실기] Java 언어 프로그래밍 특강(7)

_밍지_ 2023. 11. 16. 16:48
728x90
반응형
SMALL

44번 문제

public class Circles {
    public static void main(String[] args) {
        int[] ia = {1, 3, 5, 7, 9}; // int ia[] 랑 같음
        for (int x : ia) { // ia의 값을 x에 하나씩 가져온다.
            for (int j = 0; j < 3; j++) {
                if (x > 4 && x < 8) continue;
                System.out.print(" " + x);
                if (j == 1) break;
                continue;
            }
            continue;
        }
    }
}
  1. 배열 ia가 선언되고 초기화됩니다. 배열에는 1, 3, 5, 7, 9 다섯 개의 정수가 들어 있습니다.
  2. 첫 번째 for-each 루프에서 배열 ia의 각 요소를 변수 x에 순차적으로 할당합니다.
  3. 두 번째 for 루프에서 j가 0부터 2까지 증가하며 반복됩니다.
  4. if 문에서는 현재 x의 값이 4보다 크고 8보다 작은지를 확인합니다. 만약 그렇다면 continue 문을 통해 현재 반복을 중지하고 다음 반복으로 넘어갑니다. 그렇지 않으면 출력문이 실행됩니다.
  5. 출력문은 " " + x를 출력하며, x의 값이 출력됩니다.
  6. j가 1일 때 (두 번째 반복에서) break 문을 사용하여 현재 내부 반복문을 종료합니다. 이 때, 내부 반복문은 다음 값을 처리하기 위해 바깥쪽 반복문으로 넘어갑니다.
  7. 바깥쪽 반복문의 continue 문도 사용되어 다음 x 값으로 이동합니다.

<출력>

1 1 3 3 9 9

<과정>

  • 초기 상태: x=1, j=0
  • j=0, j<3 True
  • 첫번째 if문: 4<x<8 조건 False, x에 1 출력
  • 두번째 if문: j==1 조건 False, j for 문으로 올라감. j=1로 증가
  • 첫번째 if문: 4<x<8 조건 False, x에 1 출력
  • 두번째 if문: j==1조건 True, break로 빠져 나와서 레퍼런스 변수가 가르키는 객체가 3이 됩니다(x=3)

  • 첫번째 if문: 4<x<8 조건 False, x에 3 출력
  • 두번째 if문: j==1 조건 False, j for 문으로 올라감. j=1로 증가
  • 첫번째 if문: 4<x<8 조건 False, x에 3 출력
  • 두번째 if문: j==1조건 True, break로 빠져 나와서 레퍼런스 변수가 가르키는 객체가 5가 됩니다(x=5)

  • 첫번째 if문: 4<x<8 조건 True, continue로 인해 j for 문으로 다시 올라감. j=2로 증가
  • 첫번째 if문: 4<x<8 조건 True, continue로 인해 j for 문으로 다시 올라감. j=3로 증가
  • j=3이므로 j<3 조건을 만족하지 않음. x가 5일 때는 출력되지 않습니다.
  • 레퍼런스 변수가 가르키는 객체가 7이 됩니다. (x=7)

  • 첫번째 if문: 4<x<8 조건 True, continue로 인해 j for 문으로 다시 올라감. j=2로 증가
  • 첫번째 if문: 4<x<8 조건 True, continue로 인해 j for 문으로 다시 올라감. j=3로 증가
  • j=3이므로 j<3 조건을 만족하지 않음. x가 7일 때는 출력되지 않습니다.
  • 레퍼런스 변수가 가르키는 객체가 9가 됩니다. (x=9)

  • 첫번째 if문: 4<x<8 조건 False, x에 9 출력
  • 두번째 if문: j==1 조건 False, j for 문으로 올라감. j=1로 증가
  • 첫번째 if문: 4<x<8 조건 False, x에 9 출력

결국 5, 7을 제외한 변수가 두 번씩 출력됩니다.

 

45번 문제

public class Test {
    public static void main(String args[]){
        int i, j, n=0;
        aaa:
        for(i=0; i<3; i++){
            for(j=0; j<3; j++){
                System.out.print("abc"+ " ");
                continue aaa;
            }
        }
        System.out.println("ccc");
    }
}
  1. 바깥쪽 for 루프 (i 값에 대한 반복)가 처음에 시작됩니다. i는 0입니다.
  2. 내부 for 루프 (j 값에 대한 반복)가 시작되고 j 값은 0부터 2까지 변화합니다.
  3. "abc"를 출력하고 continue aaa; 문장이 실행되어 바깥쪽 for 루프(i for 루프)로 제어가 이동합니다.
  4. 바깥쪽 for 루프에서 i 값이 증가하고, i는 1이 됩니다.
  5. 다시 내부 for 루프가 시작되고 "abc"를 출력한 후 continue aaa; 문장이 실행되어 바깥쪽 for 루프(i for 루프)로 이동합니다. ("aaa:" 레이블이 있으므로 "continue aaa;" 문장이 실행될 때, 제어가 j for 루프가 아닌 바깥쪽 for 루프 (i for 루프)로 이동
  6. )
  7. 바깥쪽 for 루프에서 i 값이 증가하고, i는 2가 됩니다.
  8. 다시 내부 for 루프가 시작되고 "abc"를 출력한 후 continue aaa; 문장이 실행되어 바깥쪽 for 루프(i for 루프)로 이동합니다.
  9. 바깥쪽 for 루프에서 i 값이 증가하고, i는 3이 됩니다. 이제 바깥쪽 for 루프를 빠져나가게 됩니다.
  10. "ccc"를 출력합니다.

<출력>

abc abc abc ccc

 

46번 문제

public class Test {
    public static void main(String[] args) {
        int i=1, j=5;
        do {
            if (i>j) {
                continue;
            }
            j--;
            System.out.println("i=" + i + " and j =" + j);
        } while (++i < 3);
        System.out.println("i=" + i + " and j =" + j);
    }
}
  1. 초기 상태: 변수 i는 1로 초기화되고, 변수 j는 5로 초기화됩니다.
  2. do-while 루프 시작: do 키워드로 시작하는 무한 루프가 시작됩니다. (for 문은 반복횟수가 0~n회인 반면, do-while 문은 반복횟수가 1~n회임)
  3. if (i > j) { continue; }: 현재 i 값인 1은 j 값인 5보다 작으므로 if 문의 조건이 거짓이 되지 않아 continue 문은 실행되지 않습니다.
  4. j--;: j 값을 1 감소시킵니다. j는 이제 4가 됩니다.
  5. System.out.println("i=" + i + " and j =" + j);: 현재 i와 j 값을 출력합니다. 출력 결과는 "i=1 and j=4"가 됩니다.
  6. while (++i < 3);: i를 1 증가시키고, i가 3보다 작은 동안 루프를 계속 실행합니다. ++i는 i를 먼저 2로 증가시키고, 그 다음에 비교합니다.
  7. 루프가 한 번 더 실행됩니다. i가 2이므로 j 값을 감소시키지 않고 바로 출력합니다. 출력 결과는 "i=2 and j=4"가 됩니다.
  8. while (++i < 3); 다시 루프가 실행됩니다. i가 3이 되므로 루프를 빠져나가게 됩니다.
  9. System.out.println("i=" + i + " and j =" + j);: 최종 i와 j 값을 출력합니다. 출력 결과는 "i=3 and j=4"가 됩니다.

<출력>

i=1 and j =4
i=2 and j =3
i=3 and j =3

 

47번 문제

class Testcount {
    public static void main(String args[]) {
        long charge = 5000;
        String country1 = args[1];
        String country2 = "Korea"; 
        if (country1.equals(country2))
            charge = 10000;
        else
            charge = 20000;
        System.out.println(charge + "[" + args.length + "]");
    }
}

실행 c:\java Testcount Korea Germany
  1. 먼저, 프로그램은 다음과 같이 실행됩니다: c:\java Testcount Korea Germany. 여기서 Korea는 args[0], Germany는 args[1]에 해당합니다.
  2. main 함수 내에서 long charge = 5000;charge 변수를 초기화합니다.
  3. 다음으로, String country1 = args[1]; 코드에서 country1 변수에 args[1]에 해당하는 값인 "Germany"를 할당합니다.
  4. String country2 = "Korea"; 코드에서 country2 변수에 "Korea"를 할당합니다.
  5. 조건문 if (country1.equals(country2))에서 country1 (Germany)와 country2 (Korea)를 비교합니다. 이 두 값은 다르므로 else 블록으로 이동합니다.
  6. charge = 20000; 코드가 실행되어 charge 변수에 20000이 할당됩니다.
  7. 마지막으로, System.out.println(charge + "[" + args.length + "]");를 통해 결과를 출력합니다. charge는 20000이고, args.lengthargs 배열의 길이를 나타내므로 2입니다. args[0]에는 "Korea"가, args[1]에는 "Germany"가 들어 있기 때문입니다.

<출력>

20000[2]

 

48번 문제

class A {}
class B extends A {}

class Test {
    void dis(A a) {
        System.out.print("aaa" + " ");
    }

    void dis(B b) {
        System.out.print("bbb" + " ");
    }

    public static void main(String args[]) {
        Test te = new Test();
        A a = new A();
        B b = new B();
        A c = new B();
        te.dis(a);
        te.dis(c);
        te.dis(b);
    }
}
  1. 클래스 AB가 정의됩니다. B 클래스는 A 클래스를 상속합니다.
  2. Test 클래스가 정의됩니다. 이 클래스에는 dis 메서드가 세 번 정의되어 있습니다.
  3. main 메서드가 시작됩니다. Test 클래스의 객체 te가 생성됩니다.
  4. A 클래스의 객체 a가 생성됩니다.
  5. B 클래스의 객체 b가 생성됩니다.
  6. A 타입의 변수 c가 생성되고, 이 변수에 B 클래스의 객체가 할당됩니다.
  7. te.dis(a); 코드가 실행됩니다. dis 메서드는 A 타입의 매개변수를 받으며, 따라서 void dis(A a) 메서드가 호출됩니다. 결과적으로 "aaa"가 출력됩니다.
  8. te.dis(c); 코드가 실행됩니다. 변수 cB 클래스의 객체를 가지고 있지만, 매개변수 타입이 A이므로 void dis(A a) 메서드가 호출됩니다. 결과적으로 "aaa"가 출력됩니다.
  9. te.dis(b); 코드가 실행됩니다. 변수 bB 클래스의 객체를 가지고 있고, 매개변수 타입이 B에 맞으므로 void dis(B b) 메서드가 호출됩니다. 결과적으로 "bbb"가 출력됩니다.

<출력>

aaa aaa bbb

이때, te.dis(a);te.dis(c);에서 "aaa"가 출력되는 이유는 메서드 오버로딩의 동적 바인딩(dynamic binding) 때문입니다.

 

 

49번 문제

class A {
    String str;

    public A(String str) {
        this.str = str;
    }

    public String toString() {
        return "aa" + str + "aa";
    }
}

class Test {
    public static void main(String args[]) {
        A a = new A("bbb");
        A b = new A("ccc");

        // 객체를 출력할 때는 객체의 toString 메서드를 자동으로 호출하여 결과를 출력합니다.
        System.out.println(a); // "aaabbbbaa"
        System.out.println(b); // "aaacccaa"

        // 멤버 변수에 직접 접근하는 경우에는 toString 메서드가 호출되지 않고, 해당 멤버 변수의 값을 출력합니다.
        System.out.println(a.str); // "bbb"
        System.out.println(b.str); // "ccc"
    }
}

이 프로그램은 A 클래스와 Test 클래스로 구성되어 있습니다.

1. A 클래스:

  • str이라는 문자열 멤버 변수를 가집니다.
  • A 클래스의 생성자는 문자열을 입력받아 str 멤버 변수에 저장합니다.
  • toString 메서드는 객체를 문자열로 표현할 때 사용되며, 여기서는 "aa"로 감싼 str 값을 반환합니다.

2. Test 클래스:

  • main 메서드가 있는 클래스로, 프로그램의 시작점입니다.
  • A 클래스의 객체 ab를 생성하고 각각 "bbb"와 "ccc"를 생성자에 전달하여 초기화합니다.
  • System.out.println()을 사용하여 다음을 출력합니다:
  • a 객체를 출력하면 toString 메서드가 호출되어 "aabbbaa"가 출력됩니다.
  • b 객체를 출력하면 toString 메서드가 호출되어 "aacccaa"가 출력됩니다.
  • a.stra 객체의 str 멤버 변수 값을 직접 출력하므로 "bbb"가 출력됩니다.
  • b.strb 객체의 str 멤버 변수 값을 직접 출력하므로 "ccc"가 출력됩니다.

<출력>

aabbbaa
aacccaa
bbb
ccc

참고) a.str과 같이 멤버 변수에 직접 접근하는 경우, a 객체의 str 멤버 변수 값을 반환합니다. 이 때는 toString 메서드가 직접 호출되지 않습니다. 그러나 System.out.println(a);와 같이 레퍼런스 변수만을 사용하여 객체를 출력할 때는, Java는 해당 객체를 문자열로 변환하기 위해 toString 메서드를 자동으로 호출합니다.

 

 

 

 

💡 이 게시글은 PC 환경에 최적화하여 작성되었습니다.

💡 위 내용은 에듀윌에서 무료로 제공한 '정보처리기사 비밀 언어 특강' 문제를 직접 풀고 정리한 것입니다.

틀린 부분이 있다면 언제든 댓글 남겨주세요 :)

💡정보처리기사 실기 시험을 준비하시는 분들께는 아래 링크에서 해당 강의를 먼저 듣는 것을 권장합니다.

IT 자격증 1위 에듀윌 (eduwill.net)

 

 

728x90
반응형
LIST