안녕하세요 성조입니다.
개인 학습 후 주관적인 내용으로 진행된 포스팅이므로 100% 확실한 정답이 아닐 수 있습니다.
문제 해결에 있어서 의문점이나 문제점이 있는 경우 댓글 부탁드리겠습니다!
1. import에 대한 다음 질문에 답하라.
(1) import 문은 언제 사용하며, import 문이 의미하는 바는 무엇인가?
(2) import java.util.Random;과 import java.util.*;의 의미는 각각 무엇인가?
(3) import 문을 사용하지 않고도 자바 프로그램을 작성할 수 있는가?
(4) 어떤 패키지에 속한 클래스는 import 문 없이도 사용할 수 있는가?
정답 And 해설
(1) import 문은 클래스 경로와 경로명을 알려줄 수 있다.
(2)
import java.util.Random;
util 패키지에서 Random 클래스만 갖고 온다.
import java.util.*;
util 패키지에 포함되는 모든 클래스를 갖고오는 것을 의미한다.
(3) 작성이 가능하다. 완전 경로를 통해서 작성할 수 있다.
(4) java.lang 패키지가 있다. 이 패키지는 자주 사용되는 기능은 String, System.out, Math등이 있다.
2. 패키지에 대한 설명 중 잘못된 것은?
① package 키워드를 이용하여 패키지를 선언한다.
② 서로 관련된 클래스와 인터페이스들을 하나의 디렉터리에 묶어 놓은 것이다.
③ 패키지는 컴파일된 클래스 파일들을 저장하는 위치를 지정한다.
④ 자바 JDK는 클래스들을 모두 하나의 패키지에 담아 제공한다.
정답 ④ 자바 JDK는 클래스들을 모두 하나의 패키지에 담아 제공한다.
해설
하나의 패키지에 담기지 않고 연관 기능별로 여러 개의 패키지에 나눠 담긴다.
여담으로 모든 클래스를 하나의 패키지에 담아서 제공하면 불필요한 클래스들을 모두 갖고 있기 때문에 자원 낭비가 된다.
[3-4] 다음은 코드와 실행 결과이다.
1
2
3
4
5
6
7
8
9
|
import java.util.StringTokenizer;
public class Example {
public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("a=3,b=5,c=6", ",");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
}
|
3. import 문을 사용하지 않도록 Example 클래스를 다시 작성하라.
정답
1
2
3
4
5
6
7
8
9
10
|
public class Example {
public static void main(String[] args) {
java.util.StringTokenizer st = new java.util.StringTokenizer("a,3,b,5,c,6", ",");
int sum=0;
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
System.out.println(sum);
}
}
|
해설
import에 있는 java.util.StringTokenizer를 완전 경로로 표기하여 풀이할 수 있다.
4. 다음과 같이 출력되도록 코드를 수정하라.
1
2
3
4
5
6
7
|
a
3
b
5
c
6
합은 14
|
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.util.StringTokenizer;
public class Example {
public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("a=3,b=5,c=6", ",=");
int sum=0;
while (st.hasMoreTokens()) {
String tk = st.nextToken();
System.out.println(tk);
try {
sum += Integer.parseInt(tk);
}catch(NumberFormatException e){
}
}
System.out.println(sum);
}
}
|
해설
예외 처리 없이 그냥 합을 구하면 다음과 같은 에러가 발생한다.
NumberFormatException 에러가 발생했으므로 try~catch 문을 활용하여 에러를 처리한다.
그렇다면 다음과 같이 코드가 짜여진다.
정답에 있는 코드를 실행하면 문제가 요구한 방식대로 출력되는 것을 알 수 있다.
5. 다음 물음에 답하라.
(1) 다음 클래스를 device 패키지에 속하게 하고자 한다. 빈칸에 적합한 코드를 작성하라.
1
2
3
4
5
6
|
_____________________;
public class TV{
private int size;
public TV(int size) { this.size = size; }
}
|
(2) 앞에서 작성한 TV 클래스를 활용하는 Home 클래스를 작성한다. Home 클래스를 app 패키지에 저장하고자 할 때 빈칸에 적합한 코드를 작성하라.
1
2
3
4
5
6
|
_____________________;
_____________________;
public class Home{
public Home() { Tv myTv = new TV(65); }
}
|
(3) TV 클래스와 Home 클래스를 컴파일한 TV.class와 Home.class의 경로명은?
정답
(1) pakage device
(2) -1 pakage app
(2)-2 import device.TV
(3) device.TV.class와 app.Home.class이다.
해설
(1) device 패키지에 속하게 하고자 할 때 pakage device를 명시하여 경로와 의미를 작성한다.
(2)-1 app 패키지에 속한다 = pakage app
(2)-2 device에 저장된 TV.class를 import 하여 불러온다. = import device.TV
(3) TV 클래스를 컴파일 하면 device 패키지에서 후에 클래스명과 .class 파일명이 온다.
동일한 원리로 Home 클래스를 컴파일 하면 app.Home.class가 온다.
6. Wrapper 클래스에 대한 질문이다. 다음 물음에 답하여라.
(1) 정수 20을 문자열 변수 s1에 "20"으로 저장하는 코드를 작성하라.
(2) 문자열 "35.9"를 double 타입 변수 d에 실수 값 35.9로 저장하는 코드를 작성하라.
(3) "true" 문자열을 boolean 타입 변수 b에 불린 값 true로 저장하는 코드를 작성하라.
(4) 정수 30을 이진수의 문자열로 변환하여 s2에 저장하는 한 줄의 코드를 작성하라.
(5) 문자 'c'를 문자열 "c"로 변환하여 변수 c에 저장하는 한 줄의 코드를 작성하라.
정답
(1) String s1 = Integer.toString(20);
(2) double d = Double.parseDouble("35.9");
(3) boolean b = Boolean.parseBoolean("true");
(4) String s2 = Integer.toBinaryString(30);
(5) String c = Character.toString('c');
해설
검토를 위해서 359 page를 참조했다.
이 문제를 풀어낼 때는 문법에 대한 암기가 필요하다.
7. 다음 코드의 실행 결과와 실행 결과의 이유를 말하라.
1
2
3
4
|
String a = "가나다라";
System.out.println(a == "가나다라");
String b = new String(a);
System.out.println(a == b);
|
정답
1
2
|
true
false
|
해설
2번 라인의 a == "가나다라"는 a라는 객체가 "가나다라"라는 값을 비교하는 것이다. 그러므로 a의 값이 "가나다라"를 갖고 있기 때문에 true가 나온다.
4번 라인의 a == b의 경우 b 변수에 어떤 값이 들어있는지 확인한다.
new String(a)로 b 변수의 값을 대입했을 때 새로운 객체가 생성되면서 b 객체는 a와 별개로 새로운 "가나다라"를 메모리에 할당하기 때문에 다른 메모리 영역에 존재하게 된다.
다시 정리하면 같은 메모리 영역을 참조하는 a와 b가 아니기 때문에 false가 정답이 된다.
만약 String b = new String(a)가 아닌 String b = a;로 선언 한 경우. b는 a 객체의 메모리 값을 참조하고 있기 때문에 true 값이 나온다.
8. 다음 코드가 실행된 후 a, b, c 문자열은 무엇인가?
1
2
3
|
String a = new String(" Oh, Happy ");
String b = a.trim();
String c = b.concat(" Day.");
|
정답
1
2
3
|
Oh, Happy
Oh, Happy
Oh, Happy Day.
|
해설
a의 경우 변수가 변화가 없기 때문에 new String("내용")에 선언된 Oh, Happy가 공백을 포함하여 그대로 저장된다.
b의 경우 trim 함수는 좌우 측 공백을 제외하는 함수이다. a에서 공백을 제외하고 저장된다.
c의 경우 b에서 공백이 사라진 이후 concat 함수는 연결을 의미한다. 즉 Oh, Happy로 저장된 b 변수에 Day. 값을 추가한다.
9. 다음 코드에 대해 물음에 답하여라.
1
2
3
4
5
6
|
String a = "Hello";
String b = "Hello";
String c = "Java";
String d = new String("Hello");
String e = new String("Java");
String f = new String("Java");
|
(1) a와 == 연산을 수행했을 때 true가 되는 문자열을 b~f 중 모두 골라라.
(2) f와 equals() 연산을 수행하였을 때 true가 되는 문자열을 a~e 중 모두 골라라.
정답
(1) b
(2) c, e
해설
(1) b가 정답인 이유는 같은 메모리 영역에 Hello를 찾는다.
d가 정답이 아닌 이유는 new String은 heap 메모리에서 개별 객체로 취급하기 때문이다.
(2) equals() 메서드는 객체의 메모리 영역을 검사하는 것이 아닌 값 그 자체를 검사하는 것이므로 Java라는 단어를 갖는지 비교한다. 즉 c와 e는 객체의 내용이 Java이므로 true가 나온다.
10. 다음 중 자동 박싱과 자동 언박싱이 있는 부분을 파악하라.
(1) Double PI = 3.14;
(2) double pi = PI;
(3) System.out.println(3 + Integer.valueOf(5));
(4) if( 'c' == Character.valueOf( 'c' ))
정답
(1) 자동 박싱
(2) 자동 언박싱
(3) 자동 언박싱
(4) 자동 언박싱
해설
(1) 3.14를 Double의 pi변수로 값을 자동 박싱한다.
자동 박싱인 이유는 변수에 값을 대입하는 형식이다.
즉, Double.valueOf(값)과 같은 모습이 된다.
(2) double pi = PI;는 pi를 PI로 자동 언박싱하는 것이다.
값을 대입해서 진행한 선언 방식이 아닌 변수를 참조하여 사용된 값이므로 PI는 PI.doubelValue()가 된다.
다시 말해서 2번은 자동 언박싱이 된다.
(3) System.out.println(3 + Integer.valueOf(5));는 -> Wrapper 클래스와 정숫값의 조합이므로 자동 언박싱 된다.
(4) c와 Wrapper(Character.valueOf()) 클래스의 비교이므로 자동 언박싱 된다.
11. 100에서 255까지(255 포함)의 난수를 10개 발생시키는 코드이다.
1
2
3
4
|
for(int i=0; i<10; i++){
System.out.print(________________________________________);
System.out.print(" ");
}
|
(1) Math 클래스를 활용하여 빈칸에 적절한 코드를 작성하라.
(2) Random 클래스로 난수를 발생시키도록 코드 전체를 재작성하라.
정답
(1)
1
2
3
4
5
6
7
8
|
public class ex {
public static void main(String[] args) {
for(int i=0; i<10; i++) {
System.out.print((int)(Math.random()*156)+100);
System.out.print(" ");
}
}
}
|
(2)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.util.Random;
public class ex {
public static void main(String[] args) {
Random r = new Random();
for(int i=0;i<10;i++) {
int n = r.nextInt(156)+100;
System.out.print(n + " ");
}
}
}
|
해설
(1) Math.random() 함수를 활용하여 작성한다. Math.random 함수는 기본 정수형이 아닌 실수형이므로 앞에(int)를 붙여서 정수형으로 변환 후 값을 출력한다. 0부터 시작하는 랜덤 함숫값은 255까지 포함하므로 +1를 256이며, 100부터 255까지이므로 +100을 추가하여 조건을 맞춰준다.
(2) 위 설명과 동일하게 한다. 단 다른 점으로는 Random 클래스를 호출 받아서 main 메서드에서 객체 선언 이후에 반복문에 값을 넣어서 출력한다.
12. 다음은 2020년 12월 25일의 약속을 저장하기 위해 Calender 클래스를 활용하는 코드이다. 주석문에 맞도록 코드를 작성하라.
1
2
3
4
5
6
7
|
Calendar date = _______________; // Calendar 객체 생성
date. _________________________; // 현재 Calendar 객체에 저장된 정보를 모두 지운다.
date. _________________________; // Calendar 객체에 2020년의 년도 저장
date. _________________________; // Calendar 객체에 12월의 달 저장
date. _________________________; // Calendar 객체에 25일의 날짜
System.out.println("약속 날짜는 " + date. ________ + "년 " +
(date. ___________ + 1) + "월 " + date. _________ + "일");
|
cs |
정답
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import java.util.Calendar;
public class ex {
public static void main(String[] args) {
Calendar date = Calendar.getInstance();
date.clear();
date.set(date.YEAR, 2020);
date.set(date.MONTH, 12);
date.set(date.DATE, 25);
System.out.println("약속 날짜는 " + date.get(date.YEAR) + "년 " + date.get(date.MONTH+1)+ "월 "
+ date.get(date.DATE) + "일");
}
}
|
해설
정답과 같은 코드를 작성할 수 있다.
우선 import 하여 java.util의 Calendar 클래스를 불러온다.
이후 5번 라인에서 Calendar.getInstance()를 활용하여 Calendar를 선언한다.
set을 활용하여 Calendar로 선언된 date에 연도, 월, 일을 모두 저장한다.
이후 get을 활용하여 값을 호출하여 출력한다.
앞에 언급된 것과 같이 문제에 대해서 궁금증이나 이상하다고 느끼시는 경우 댓글 부탁드리겠습니다!
짧은 포스팅 읽어주셔서 감사드립니다.
다음 포스팅 때 뵙겠습니다!
'개인 학습용 해설 > 명품 Java Programming' 카테고리의 다른 글
명품 JAVA Programming 4판 5장 연습문제 - 실습문제 (0) | 2021.12.09 |
---|---|
명품 JAVA Programming 4판 5장 연습문제 - 이론문제 (0) | 2021.12.04 |
명품 JAVA Programming 4판 4장 연습문제 - 실습문제 (0) | 2021.11.18 |
명품 JAVA Programming 4판 4장 연습문제 - 이론문제 (4) | 2021.11.15 |
명품 JAVA Programming 4판 3장 연습문제 - 실습문제 개인 풀이 (0) | 2021.11.08 |