Tech Trail

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

Learning/정보처리기사

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

_밍지_ 2023. 11. 17. 09:12
728x90
반응형
SMALL

💡 드디어 마지막 특강!

 

50번 문제

class Feline {
    public static void main(String[] args) {
        Long x = 42L; // Long 타입의 정수 값인 42와 44로 취급해도 무방
        Long y = 44L; // 즉 x = 42, y =44 
        System.out.print(" " + 7 + 2 + " ");       // "+"가 7이랑 2를 연결한다는 의미. 앞에 문자열이 들어가면 연산자가 안 되고, 연결이 됨. 
        System.out.print(foo() + x + 5 + " ");  
        System.out.println(x + y + foo());         // x + y는 문자열 연결이 아니라 연산자로 수행
    }

    static String foo() {
        return "foo";
    }
}
  1. Long 타입의 변수 xy가 각각 42L과 44L로 초기화됩니다. (x를 42, y를 44로 봐도 무방)
  2. 첫 번째 System.out.print 문에서는 문자열과 숫자를 연결하여 출력합니다. " "는 문자열이고, 7과 2는 숫자이므로 문자열 연결이 수행됩니다. 따라서 " 72 "가 출력됩니다.
  3. 두 번째 System.out.print 문에서는 foo() 메서드의 반환 값인 "foo"와 x의 값을 연결하고, 그 뒤에 5를 더한 후 문자열 연결을 수행합니다. 따라서 "foo425 "가 출력됩니다.
  4. 세 번째 System.out.println 문에서는 xy를 더하고, 그 결과에 foo() 메서드의 반환 값을 연결하여 출력합니다. 따라서 "86foo"가 출력됩니다.

<출력>

 72 foo425 86foo

주의: V72Vfoo425V86foo: V 부분은 띄어쓰기 되어있는 상태입니다.

참고: 수치가 있어도 앞에 문자열이 있으면 "+"는 문자열 연결로 사용됩니다.

예를 들어 7+2+" "+5+2의 값을 출력하는 경우 " " 앞 부분은 연산을 해야하며, " " 뒷 부분은 문자열 연결을 해야합니다. 따라서 "9 52"가 출력됩니다.

 

51번 문제

class Test {
    public static void main(String[] args) {
        int a = 245;
        String str = "245";
        String value = String.valueOf(a);  // String.valueOf: 숫자를 문자열로 바꿔줌. 즉, value에는 문자열 245가 들어감.
        
        if (str.equals(value))
            a = 100;
        else
            a = 200;
        
        System.out.println(a);
    }
}
  1. 정수형 변수 a를 245로 초기화합니다.
  2. 문자열 변수 str에 "245"를 할당합니다.
  3. String.valueOf(a)를 사용하여 정수 a를 문자열로 변환하여 value 변수에 저장합니다. 이때, value는 "245" 문자열을 가집니다.
  4. if 문에서 strvalueequals 메서드로 비교합니다. 두 문자열이 동일하므로 (strvalue가 모두 "245"인 경우) a를 100으로 변경합니다.
  5. 변경된 a 값을 출력합니다. 따라서 "100"이 출력됩니다.

<출력>

100

 

52번 문제

class Division {
    public static void main(String[] args) {
        int a, b, result;
        a = 3;
        b = 0;
        try {
            result = a / b;
            System.out.print("A");
        } catch (ArithmeticException e) {  // Exception 예외 처리
            System.out.print("B");
        } finally {
            System.out.print("C");
        }
        System.out.print("D");
    }
}
  1. 정수형 변수 ab, 그리고 결과를 저장할 result 변수를 선언하고 초기화합니다.
  2. a를 3으로 초기화하고 b를 0으로 초기화합니다.
  3. try 블록에서는 a / b를 시도합니다. 하지만 b가 0이기 때문에 ArithmeticException 예외가 발생합니다.
  4. 예외가 발생하면 catch 블록이 실행됩니다. 여기서 "B"를 출력합니다.
  5. finally 블록은 예외 발생 여부와 상관없이 항상 실행됩니다. "C"를 출력합니다.
  6. System.out.print("D");try-catch-finally 블록이 끝난 후에 실행되며 "D"를 출력합니다.

<출력>

BCD

참고: 예외가 발생하지 않았다면 ACD가 출력

 

 

53번 문제

public class A { 
    public static String s = "";  // 정적 문자열 변수 s를 선언하고 빈 문자열로 초기화

    public static void f(int a) {  // f 메서드 정의. 이 메서드는 하나의 정수 매개변수 a를 가지고 있습니다.
        try {
            s += "1";  // s = s + "1"에서 s가 빈 문자열(" ")이므로 s = s + "1" = 1이고, "1" 문자열을 s에 추가
            if (a == 1)  // 만약 a가 1과 같다면 Exception을 발생
                throw new Exception();
            s += "2";  // 그렇지 않으면 "2"를 문자열 s에 추가
        } catch (Exception e) {  // catch 블록은 예외가 발생할 경우 실행
            s += "3";  // "3"을 문자열 s에 추가하고 메서드를 반환
            return;
        } finally {  // finally 블록은 예외 발생 여부와 상관없이 항상 실행
            s += "4";  //  "4"를 문자열 s에 추가
        }
        s += "5";  // try-catch-finally 블록을 빠져나온 후 실행되며 "5"를 문자열 s에 추가
    }

    public static void main(String args[]) {
        f(2);
        f(1);
        System.out.println(s);
    }
}

1. f(2) 호출:

  • 메서드 f(2)가 호출됩니다.
  • 메서드 내에서 s에 "1"이 추가됩니다.
  • 조건문 if(a==1)을 평가하면 a가 2이므로 예외가 발생하지 않고, s에 "2"가 추가됩니다.
  • finally 블록은 항상 실행되므로 s에 "4"가 추가됩니다.
  • 메서드가 종료되기 전에 s에 "5"가 추가됩니다.

2. f(1) 호출:

  • 메서드 f(1)이 호출됩니다.
  • 메서드 내에서 s에 "1"이 추가됩니다.
  • 조건문 if(a==1)을 평가하면 a가 1이므로 예외가 발생하고, catch 블록이 실행됩니다. s에 "3"이 추가됩니다.
  • finally 블록은 항상 실행되므로 s에 "4"가 추가됩니다.
  • 메서드가 예외로 인해 중단되고, 반환됩니다.

3. System.out.println(s); 실행:

  • s의 내용인 "1245134"가 출력됩니다.

<출력>

1245134

 

54번 문제

public class B extends A {
    int a = 20;

    public B() {
        System.out.print("다");
    }

    public B(int x) {
        System.out.print("라");
    }
}

public class A {
    int a = 10;

    public A() {
        System.out.print("가");
    }

    public A(int x) {
        System.out.print("나");
    }

    public static void main(String[] a) {
        B b1 = new B();
        A b2 = new B(1);
        System.out.print(b1.a + b2.a);
    }
}

하위 클래스에서 객체를 생성할 때, 별도의 생성자 호출이 없으면 먼저 상위 클래스의 생성자가 실행됩니다.

1. B b1 = new B();을 호출할 때:

  • 먼저 클래스 A의 기본 생성자 public A()가 호출되므로 "가"가 출력됩니다.
  • 그 다음 클래스 B의 기본 생성자 public B()가 호출되므로 "다"가 출력됩니다.

2. A b2 = new B(1);을 호출할 때:

  • 먼저 클래스 A의 기본 생성자 public A()가 호출되므로 "가"가 출력됩니다.
  • 그 다음 클래스 B의 매개변수를 받는 생성자 public B(int x)가 호출되므로 "라"가 출력됩니다.

3. System.out.print(b1.a + b2.a);를 실행할 때:

  • b1은 B 클래스의 인스턴스이므로 b1.a는 B 클래스의 변수인 20입니다.
  • b2는 A 클래스의 참조로 B 클래스의 인스턴스를 가리키고 있으므로 b2.a도 B 클래스의 변수인 20입니다.
  • 따라서 b1.a + b2.a는 20 + 20으로 40이 됩니다.

<출력>

가다가라30

 

55번 문제

class Super {
    Super() {
        System.out.print('A');
    }

    Super(char x) {
        System.out.print(x);
    }
}

class Sub extends Super {
    Sub() {
        super();
        System.out.print('B');
    }

    Sub(char x) {
        this();
        System.out.print(x);
    }
}

public class Test {
    public static void main(String[] args) {
        Super s1 = new Super('C');
        Super s2 = new Sub('D');
    }
}

<문제 풀기 전에 알아야 할 것>

  1. this나 super 키워드는 하위 클래스에서 객체를 생성할 때, 상위 클래스의 생성자를 호출할 때 사용됩니다. 이 키워드를 사용하면 하위 클래스의 생성자에서 상위 클래스의 생성자를 직접 선택하여 호출할 수 있습니다.
  2. 54번 문제와 현재 문제의 차이점은 this와 super 키워드의 사용 여부입니다. 54번 문제에서는 하위 클래스 생성자에 this나 super가 없었기 때문에, 객체를 만들 때 상위 클래스의 생성자를 디폴트로 호출하고 내려왔습니다.
  3. 현재 문제에서는 super 키워드를 사용하여 명시적으로 상위 클래스의 생성자를 호출하였습니다. 이로 인해 상위 클래스의 생성자부터 호출되어 상위 클래스부터 시작하여 객체가 생성됩니다.

<풀이>

  1. main 함수에서 new Super('C')를 보면, 객체가 Super 클래스에서 생성되었으므로 Super 클래스의 생성자부터 시작됩니다. 따라서 Super(char x)생성자가 호출되어 'C'가 가장 먼저 출력됩니다.
  2. main 함수에서 new Sub('D')로 객체를 생성하면, Sub(char x) 생성자가 호출됩니다. 이 생성자 내에서 this()가 사용되어 Sub() 생성자로 이동합니다. Sub(char x) 생성자에서 this()가 사용되면, 현재 클래스인 Sub 클래스의 다른 생성자인 Sub() 생성자를 호출하는 것입니다. 이렇게 하면 Sub(char x) 생성자 내에서 Sub() 생성자가 먼저 실행되고, 그 다음에 Sub(char x) 생성자의 나머지 부분이 실행됩니다. (참고)
  3. 그런 다음 Sub() 생성자 내에서 super() 명령어가 사용되어 Super() 생성자로 이동합니다. 이로 인해 "A"가 출력되고, Sub(char x) 생성자의 나머지 부분인 "B"가 출력됩니다. 마지막으로 Sub(char D) 생성자로 돌아와서 "D"가 출력됩니다.

<출력>

CABD

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

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

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

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

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

728x90
반응형
LIST