2019년1학기 java프로그래밍
36. 배열을 사용하는 다음 문장 중 올바른 것은?
1번. int[ ] a = new int[10];
2번. int b[ ] = {{1,2,3},{4,5}};
3번. int[ ] c; c ={1,2,3,4};
4반. int [] [] d = new int[10];
문제풀이:
올바른 배열 선언 및 초기화 문장을 선택하기 위해서는 각 문장을 하나씩 살펴보겠습니다.
- int[] a = new int[10];
- 올바름: 배열 a를 선언하고 10개의 정수를 저장할 수 있는 공간을 할당합니다.
- int b[][] = {{1,2,3},{4,5}};
- 올바르지 않음: 2차원 배열 b를 선언하려고 하지만, 각 행의 길이가 일치하지 않아서 올바르지 않습니다. 두 번째 행은 요소가 부족합니다.
- int[] c; c ={1,2,3,4};
- 올바르지 않음: 배열 c를 먼저 선언한 후에 값을 할당하려면 다음과 같이 해야 합니다.
-
자바카피코드int[] c; c = new int[]{1,2,3,4};
- int [][] d = new int[10];
- 올바르지 않음: 2차원 배열 d를 선언하려고 하지만, 각 행에 대한 길이를 명시하지 않았습니다. 2차원 배열을 초기화할 때는 각 행의 길이를 지정해주어야 합니다.
따라서 올바른 문장은 1번이며, 나머지 문장들은 수정이 필요합니다.
37. 아래 인터페이스를 보면 기본 몸체를 가지는 메소드를 볼 수 있다. 밑줄 부분에 들어갈 키워드는 무엇인가?
public interface Test{ ______void aMethod(String aValue) { System.out.println("Hi" + aValue); } } |
1번. public
2번. final
3번. abstract
4번. default
문제풀이: 인터페이스에서 기본 몸체를 가지는 메소드를 정의하려면 default 키워드를 사용해야 합니다. 따라서 올바른 답은 4번인 default입니다.
public interface Test {
default void aMethod(String aValue) {
System.out.println("Hi" + aValue);
}
}
* 다음 프로그램을 보고 물음에 답하시오.(38~39)
class Employee{
int nSalary;
String szDept;
public void doJob( ){System.out.println("do something");}
}
class Salesman _____Employee{
public Salesman( ) { szDept = "Sales.Dept";}
public void doJob( ){System.out.println("do sales");}
}
class Developer _____Employee{
public Developer( ){szDept = "Dev.Dept";}
public void doJob( ){System.out.println("do development");}
}
public class EmployeeTest{
public static void main(String args[]){
Employee emp1, emp2;
emp1 = new Salesman( );
emp2 = new Developer( );
emp1.doJob( );
emp2.dojob( );
}
}
38. 위 프로그램에 관한 설명으로 잘못된 것은?
1번. 클래스 간의 상속 관계가 존재한다.
2번. Employee 클래스를 이용하여 자식 클래스를 정의하였다.
3번. 부모 클래스가 추상 클래스로 정의되어 있다.
4번. 부모 유형의 변수에 자식 객체가 대입되었다.
문제풀이 :
- 클래스 간의 상속 관계가 존재한다. - 옳음: Salesman 및 Developer 클래스가 Employee 클래스를 상속받고 있습니다.
- Employee 클래스를 이용하여 자식 클래스를 정의하였다. - 옳음: Salesman 및 Developer 클래스는 Employee 클래스를 상속받아 자식 클래스로 정의되었습니다.
- 부모 클래스가 추상 클래스로 정의되어 있다. - 잘못됨: Employee 클래스는 추상 클래스가 아니며, 일반적인 클래스로 정의되어 있습니다.
- 부모 유형의 변수에 자식 객체가 대입되었다. - 옳음: Employee 클래스의 변수인 emp1과 emp2가 각각 Salesman 및 Developer 객체를 참조하고 있습니다.
따라서 38번 문제의 답은 "3번. 부모 클래스가 추상 클래스로 정의되어 있다."가 잘못된 설명입니다.
39. 위 프로그램을 실행할 때 출력되는 결과는?
답: do sales /do development
문제풀이 :주어진 코드는 객체 지향 프로그래밍의 개념을 보여주는 간단한 예제입니다. 코드는 직원(`Employee`)과 그에 특화된 역할을 하는 영업사원(`Salesman`) 및 개발자(`Developer`) 클래스로 이루어져 있습니다.
1. `Employee` 클래스:
- 멤버 변수: `nSalary` (급여), `szDept` (부서 이름)
- 메소드: `doJob()` (일을 수행하는 메소드)
2. `Salesman` 클래스:
- `Employee` 클래스를 상속받음.
- 생성자에서 `szDept`를 "Sales.Dept"로 설정.
- `doJob()` 메소드를 오버라이딩하여 "do sales"를 출력.
3. `Developer` 클래스:
- `Employee` 클래스를 상속받음.
- 생성자에서 `szDept`를 "Dev.Dept"로 설정.
- `doJob()` 메소드를 오버라이딩하여 "do development"를 출력.
4. `EmployeeTest` 클래스 (테스트용 클래스):
- `main` 메소드에서 `Employee` 타입의 변수 `emp1`과 `emp2`를 생성.
- `emp1`은 `Salesman` 객체로 초기화되고, `emp2`는 `Developer` 객체로 초기화됨.
- `doJob()` 메소드를 호출하면 각 객체의 특화된 동작이 수행됨.
코드 실행 결과:
- `emp1.doJob()`은 `Salesman` 클래스의 `doJob()` 메소드를 호출하여 "do sales"를 출력합니다.
- `emp2.doJob()`은 `Developer` 클래스의 `doJob()` 메소드를 호출하여 "do development"를 출력합니다.
이 코드는 상속과 메소드 오버라이딩을 통해 다형성(polymorphism)의 예를 보여주며, 부모 클래스의 참조 변수가 자식 클래스의 객체를 참조할 수 있음을 보여줍니다.
*다음 프로그램은 문자열 "abcde"를 1,000번 연결하는 작업을 수행한다. 물음에 답하여라. (40~41)
public class StringTest {
public static void main(String args[]) {
final String aValue = "abcde";
String str = new String( );
for (int i = 0; i <1000; i++)
str = str + aValue;
System.out.println(str);
}
}
주어진 코드에서 `str = str + aValue;` 부분은 반복문을 통해 문자열을 계속 이어붙이는 연산을 수행합니다. 이 때, Java에서 문자열 연산은 `StringBuilder`를 사용하는 것이 효율적입니다. 문자열 연산을 반복할 때마다 새로운 문자열 객체를 생성하게 되면 성능에 부담이 가기 때문입니다.
따라서, `str = str + aValue;` 연산은 각 반복에서 새로운 문자열을 생성하고, 이전 문자열에 새로운 문자열을 더하는 방식으로 이루어집니다.
이러한 문자열 연산은 반복 횟수가 많아질수록 성능 저하가 발생할 수 있습니다. 이를 개선하기 위해서는 `StringBuilder`를 사용하는 것이 좋습니다.
다음은 코드의 설명과 함께 프로그램에서 결과가 `String`이 아닌 수식을 찾아낼 것입니다.
```java
public class StringTest {
public static void main(String args[]) {
final String aValue = "abcde";
String str = new String();
for (int i = 0; i < 1000; i++)
str = str + aValue; // 문자열 연산, 효율적이지 않음
System.out.println(str);
}
}
```
설명:
1. `aValue` 변수에 "abcde"라는 문자열을 할당합니다.
2. 빈 문자열을 가지고 있는 `str`을 선언합니다.
3. 반복문을 통해 1000번 문자열 연산을 수행합니다. 각 연산에서는 현재의 `str`과 `aValue`를 이어붙여 새로운 문자열을 만듭니다.
4. 마지막에는 1000번 연산한 결과를 출력합니다.
이 코드의 주요 문제는 문자열 연산에서 `StringBuilder`를 사용하지 않아 성능에 영향을 미칠 수 있다는 것입니다.
결과가 `String`이 아닌 수식을 찾아보면, 실제로는 모두 `String` 형태입니다. 그러나 성능 상의 이슈 때문에 코드를 개선하는 것이 좋습니다.
40. 프로그램에 등장하는 다음 수식 중 결과가 String 유형이 아닌 것은?
1번. "abcde"
2번. new String( )
3번. i < 10000
4번. str + aValue
41. 위 프로그램에 관한 설명으로 잘못된 것은?
1번. 컴파일 또는 실행 오류는 발생하지 않는다.
2번. for문을 수행할 때마다 새로운 String객체가 생성된다.
3번. immutable 클래스인 String을 사용하여 메모리 낭비가 심하다
4번. 반복횟수가 커질수록 평균 실행 속도는 점점 빨라진다.
문제풀이:
해당 코드에서는 문자열 연산이 반복적으로 수행되기 때문에 반복 횟수가 커질수록 성능이 점점 느려질 가능성이 있습니다. 이는 문자열 연산 시마다 새로운 문자열 객체를 생성하고 기존 문자열에 새로운 문자열을 더하는 방식이기 때문입니다.
문자열은 불변(immutable) 객체이기 때문에 문자열 연산이 수행될 때마다 새로운 문자열 객체가 생성되고, 이에 따라 메모리 할당 및 복사 작업이 발생합니다. 반복 횟수가 증가할수록 메모리 할당 및 복사 작업이 더 많이 발생하게 되어 성능이 저하될 수 있습니다.
성능을 향상시키기 위해서는 StringBuilder를 사용하는 것이 좋습니다. StringBuilder는 가변(mutable)한 문자열을 다룰 때 효율적인 클래스로, 문자열을 직접 수정할 수 있어 문자열 연산에서 발생하는 불필요한 객체 생성 및 복사를 줄일 수 있습니다.
*다음은 파일을 복사하는 프로그램이다. 물음에 답하라. (42~43)