연습 문제 (6)
25분 분량
시험 안내
문제 유형 (총 3가지)
- 코드 읽기 (오류 판별 / 출력 예측)
- 코드 작성하기 (예: Animal 상속하여 Dog 클래스 작성, 클래스 3~4개 규모의 간단한 시스템 설계 및 구현)
- 어떤 개념에 대한 설명하기 (예: OOP의 장점은 무엇인가?)
중간고사에 대비해서 공부해야 할 주제들 (COMP2500 폴더 000 ~ 007, 1주 ~ 7주에서 배운 내용 전부)
- Java 언어의 기본 문법 (정수형/리터럴, char/bool/String, final, 캐스팅(자동 형변환), 조건문/switch, 반복문, 열거형(enum))
- 참조형과 포인터, 참조형 인자 전달, 참조 공유
- 개체지향 프로그래밍(OOP)의 필요성
- OOP의 4대 특성
- 클래스와 개체(인스턴스)의 차이, 인스턴스와 메모리, 멤버 변수 기본값
- 생성자, 생성자 오버로딩, this() 체이닝
- 접근 제어자(access modifier), private 메서드의 용도
- getter/setter 메서드, setter 베스트 프랙티스 (유효성 검사)
- 캡슐화, 데이터 추상화
- 클래스 다이어그램, 모델링
- 유연성과 재사용성
- 정적(static) 멤버 변수 및 메서드
- 싱글턴, 정적 vs 싱글턴
- 내포(nested) 클래스
- 상속, 생성자 호출 순서, 부모 멤버 접근(super), 부모 클래스의 독립성, 중복 코드 분리
- 개체의 명시적/암시적 캐스팅
- instanceof, RTTI(run time type identification)
- Object 클래스, getClass()
- 다중 상속과 인터페이스
- 상속 vs 컴포지션 (is-a / has-a), 메모리 관점
1
아래에 있는 각 코드를 읽고 다음 질문에 답하세요. a) 이 코드에 오류가 있나요? 경우에 따라 아래처럼 답안지에 써주세요
- 컴파일 오류가 있다면: ‘컴파일 오류’
- 실행 중 오류가 있다면: ‘런타임 오류’
- 아무 문제 없다면: ‘문제 없음’
b) a)에서 오류가 있었다고 답했으면 그 문제를 어떻게 고칠지 설명하세요. 설명은 문장으로 하셔도 되고 코드를 직접 수정하셔도 됩니다. 코드를 직접 수정하실 경우 아래 형식을 따라주세요.
예: 전) a = p; 후) a = p + 11;
c) a)에서 ‘문제 없음’이라고 답했으면 코드 실행 후 출력되는 결과를 적으세요.
1-a)
// Box.java
package academy.pocu.comp2500;
public class Box {
private String label;
public int getLabelLength() {
return this.label.length();
}
}
// Program.java
package academy.pocu.comp2500;
public class Program {
public static void main(String[] args) {
Box box = new Box();
System.out.println(box.getLabelLength());
}
}1-b)
// Program.java
package academy.pocu.comp2500;
public class Program {
public static void main(String[] args) {
int i = 10;
long l = i;
double d = l;
System.out.println(d);
}
}1-c)
// Program.java
package academy.pocu.comp2500;
public class Program {
public static void main(String[] args) {
System.out.println(addOne(5));
}
private static int addOne(final int x) {
x = x + 1;
return x;
}
}2
다음 코드를 실행하면 무엇이 출력되나요?
// Timer.java
package academy.pocu.comp2500;
public class Timer {
protected int seconds;
public Timer(int seconds) {
this.seconds = seconds;
}
public int getSeconds() {
return this.seconds;
}
}
// Stopwatch.java
package academy.pocu.comp2500;
public class Stopwatch extends Timer {
public Stopwatch(int seconds) {
super(seconds);
}
public void tick() {
super.seconds += 5;
}
}
// Program.java
package academy.pocu.comp2500;
public class Program {
public static void main(String[] args) {
Stopwatch sw = new Stopwatch(10);
sw.tick();
sw.tick();
System.out.println(sw.getSeconds());
}
}3
클래스(class)와 개체(object, 인스턴스)는 어떻게 다른가요? 예/비유를 들어 설명하세요.
4
상속(inheritance)과 컴포지션(composition)은 메모리 관점에서 어떻게 다른가요? 그리고 그 차이가 성능에 어떤 영향을 주나요?
5
다음과 같은 열거형(enum)이 있습니다.
// Grade.java
package academy.pocu.comp2500;
public enum Grade {
A(4),
B(3),
C(2);
private int point;
Grade(int point) {
this.point = point;
}
public int getPoint() {
return this.point;
}
}아래에 있는 각 코드를 읽고 다음 질문에 답하세요. a) 이 코드에 오류가 있나요? 경우에 따라 아래처럼 답안지에 써주세요
- 컴파일 오류가 있다면: ‘컴파일 오류’
- 실행 중 오류가 있다면: ‘런타임 오류’
- 아무 문제 없다면: ‘문제 없음’
b) a)에서 오류가 있었다고 답했으면 그 문제를 어떻게 고칠지 설명하세요. 설명은 문장으로 하셔도 되고 코드를 직접 수정하셔도 됩니다. 코드를 직접 수정하실 경우 아래 형식을 따라주세요.
예: 전) a = p; 후) a = p + 11;
c) a)에서 ‘문제 없음’이라고 답했으면 코드 실행 후 출력되는 결과를 적으세요.
5-a)
Grade g = Grade.B;
System.out.println(g.getPoint());5-b)
Grade g = new Grade(5);
System.out.println(g.getPoint());5-c)
Grade g = Grade.A;
switch (g) {
case A:
System.out.println("excellent");
break;
case B:
System.out.println("good");
break;
default:
System.out.println("ok");
}6
다음 코드를 실행하면 무엇이 출력되나요?
// Counter.java
package academy.pocu.comp2500;
public class Counter {
private int value;
public void increase() {
++this.value;
}
public int getValue() {
return this.value;
}
}
// Worker.java
package academy.pocu.comp2500;
public class Worker {
private Counter counter;
public Worker(Counter counter) {
this.counter = counter;
}
public void work() {
this.counter.increase();
}
}
// Program.java
package academy.pocu.comp2500;
public class Program {
public static void main(String[] args) {
Counter shared = new Counter();
Worker w1 = new Worker(shared);
Worker w2 = new Worker(shared);
w1.work();
w2.work();
w2.work();
System.out.println(shared.getValue());
}
}7
다음 코드를 실행하면 무엇이 출력되나요?
// Person.java
package academy.pocu.comp2500;
public class Person {
protected String role;
public Person() {
this.role = "person";
}
public String getRole() {
return this.role;
}
}
// Student.java
package academy.pocu.comp2500;
public class Student extends Person {
public Student() {
this.role = "student";
}
}
// Program.java
package academy.pocu.comp2500;
public class Program {
public static void main(String[] args) {
Person p = new Person();
Student s = new Student();
System.out.println(p.getRole());
System.out.println(s.getRole());
}
}8
다음 두 클래스에는 중복된 코드가 있습니다. 공통 부분을 부모 클래스 Animal로 분리하고, Dog와 Cat이 이를 상속하도록 다시 작성하세요. (패키지는 academy.pocu.comp2500)
// Dog.java
package academy.pocu.comp2500;
public class Dog {
private String name;
public Dog(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void eat() {
System.out.println(this.name + " is eating");
}
public void bark() {
System.out.println("Bark!");
}
}
// Cat.java
package academy.pocu.comp2500;
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void eat() {
System.out.println(this.name + " is eating");
}
public void meow() {
System.out.println("Meow!");
}
}9
private 메서드는 언제, 왜 사용하나요? 용도를 설명하세요.
10
Java의 모든 클래스는 어떤 클래스를 상속하나요? 또한 getClass() 같은 RTTI(run time type identification) 기능이 무엇이며, 어떤 단점이 있는지 설명하세요.
11
다음 코드를 실행하면 무엇이 출력되나요?
// Stat.java
package academy.pocu.comp2500;
public class Stat {
private int[] scores;
public Stat(int[] scores) {
this.scores = scores;
}
private int sum() {
int total = 0;
for (int s : this.scores) {
total += s;
}
return total;
}
public int getTotal() {
return sum();
}
public int getAverage() {
return sum() / this.scores.length;
}
}
// Program.java
package academy.pocu.comp2500;
public class Program {
public static void main(String[] args) {
Stat stat = new Stat(new int[] { 10, 20, 30 });
System.out.println(stat.getTotal());
System.out.println(stat.getAverage());
}
}