오답노트 만드는방법
1. 틀린이유
2. 문제가 요구하는것
3.풀이
[6] 다음의 코드를 수행했을 때의 결과로 올바른 것을 고르세요.
public static void func(String a) {
System.out.println("로그A");
}
public static void func(String a,String b) {
System.out.println("로그B");
}
public static void func(int num) {
System.out.println("로그C");
}
public static void func(int num1,int num2) {
System.out.println("로그D");
}
public static void main(String[] args) {
func("num1","num2");
}
[ Console ]
① 로그A
② 로그B
③ 로그C
④ 로그D
1. 틀린이유
사실 이건 내가 문제를 대충읽어서 틀린거다 num1 num2 만보고 어 숫자네? 이러고 냅다 4번으로 제출했다 코드를 감각적으로 보는 행동을 고쳐야한다 이 쉬운 문제를 틀리다니 진짜 반성해야된다
2. 문제가 요구하는것은 해당 메서드를 입력했을때 인자의 자료형이 어떤건지 물어보는 문제였다
3. 풀이
func("num1","num2") ""가 들어갔으므로 숫자가 아닌 문자열에 해당한다
따라서 답은
public static void func(String a,String b) {
System.out.println("로그B");
}
문자열인 Srinng가 들어간것으로 2번이다
-----------------------------------------------------------------------------------------------
[7] 다음의 코드를 수행한 결과로 올바른 것을 고르세요.
class A{
A(){
System.out.println("야옹");
}
A(String msg){
System.out.println(msg);
}
}
class B extends A{
B(){
super("어흥");
}
B(String msg){
super(msg);
}
}
class C extends B{
C(){
super("멍멍");
}
C(String msg){
super("삐약");
}
}
public class TEST {
public static void main(String[] args) {
C c=new C();
}
}
[ Console ]
①야옹 ②어흥 ③멍멍 ④삐약
1. 틀린이유
문제에 대한 이해가 부족해서 틀렸다 상속관계를 보면서 풀었어야하는데 클래스 단위로 문제를 풀어서 답이 어흥으로 나왔다
2. 문제가 요구하는것은 상속관계에서 생성자호출 순서와 오버로딩의 개념을 알고있는가? 라고 생각함
3.풀이
이문제는 A에서 생성자 A()와 A(String msg) 두개를 만들었다 이는 함수의 이름은 같지만 기능은 다른 오버로딩으로 B가 A를 상속받고 C가 B를 상속받았다
메인에서 C를 호출했다 C()는 기본생성자이며 C클래스에 멍멍이라는 값을 가지고 있다
C는 B를 상속 받았으므로 C의 기본생성자가 부모인 B의
B(String msg) {
super(msg);
}
을 받아온것이라서 B도 멍멍이된다 B의 기본생성자는 A의
A(String msg) {
System.out.println(msg);
}
을 받은것이기 때문에 최종출력은 멍멍이 된다
-----------------------------------------------------------------------------------------------
서술형문제
1 package test;
2
3 class A {
4 int apple;
5 String banana;
6 void func(int num) {
7 num++;
8 is.apple++;
9 }
10 }
11 public class TEST {
12 public static void main(String[] args) {
13
14 int apple;
15 A a=new A();
16 /////System.out.println(apple);
17 System.out.println(a.apple);
Q1. 16번 라인의 에러 원인은?
1. 틀린이유
16번이 왜 에러가났는지 이해하지 못했다
2. 문제의 의도는 변수의 이름이 같더라도 위치에 따라 값이 다르다는 사실을 알고있냐를 물어본다고 생각한다
// Q2. 16번 라인의 에러를 해결하는 방법은?
3. 풀이
클래스A와 메인함수에 호출된 A는 우연히 이름이 같았을뿐 실질적으로는 같지 않다
16번 System.out.println(apple)은 메인함수에 호출된 객체 A의 것이므로 위에 class A의 apple와는 연관이 없다
이문제는 apple를 초기화 하지 않았기 때문에 발생한 문제이며 에러를해결하는 방법으로는 int apple = 0 ; 으로 초기화
해주면 문제가 해결된다
-----------------------------------------------------------------------------------------------
int num=123;
a.func(num);
System.out.println(num);
System.out.println(a.apple);
Q3. num의 값이 123으로 유지되는 이유는?
1. 틀린이유
문제를 이해하지 못하였다
2. 문제가 원하는것은 자바의 인자 전달 방식(Call by Value) 개념을 정확히 이해했는지 확인하려는 것으로 생각한다
3. 풀이
넘의 값이 123으로 유지되는 이유는 a.func(num); 를 호출시 num의 값 123이 복사되서 func의 인자인 num에 전달된다
따라서 위 클래스A에 있는 func(num)은 메인에서 호출한 func(num)과는 별개이며 func()에서 num++를 했을때 복사본만 바뀌고
원본은 유지된다 이현상을 값의 의한 호출(Call by Value )이라고 한다
Call by Value
int num=123;
a.func(num);
System.out.println(num);
consol
123
Q4. num의 값이 124로 변경되기위한 방법은?
3. 풀이
void func(int num)의 리턴값을 void가 아닌 int로 변경해준다 메인에서 호출할때 num= a.func(num)이라고 수정해주면
값이 123에서 124로 바뀌게 된다 리턴값을 지정하게 되면 Call by Value와 달리 변수의 주소가 메인함수의 a.func(num)에
전달되고 클래스A의 함수안에서 num++ 로 값을 변경하게 되면 원본의 데이터인 123이 +1이 되서 123로 바뀐다
이현상을 참조의 의한 호출(Call by Refernce)라고 한다
Call by Reference
class A {
int func(int num) {
num++;
return num;
}
}
public class TEST {
public static void main(String[] args) {
int num=123;
num = a.func(num);
System.out.println(num);
}
}
--------------------------------------------------------------
28 String str="banana";
29 if(a.banana.equals(str)) {
30 System.out.println("확인 1");
31 }
32 else {
33 System.out.println("확인 2");
}
Q5. 29번 라인의 NullPointerException 에러 원인은?(정답처리해주셧지만 참고용으로 적음)
바나나와 비교할 문자가 없다 = 주어가 없다
정확한 원인은 A.banana가 null이기 때문인데, A는 new를 했으므로 null일 수 없기 때문이다.
Q6. 29번 라인의 에러를 해결하는 방법은?
1. 틀린이유
2. 문제가 원하는 것 NullPointerException 에러 원인을 찾고 해결할수 있는가 ?
3. 풀이
현재 A.banana가 선언만 되어있고 초기화가 되어있지 않은 상태이다 따라서 주어가 없는 상태에서 호출한 셈이되는것인데
banana를 초기화 해주면 정상적으로 수행되는것을 확인할수 있다
class A {
int apple;
String banana;
A(){
this.banana = "banana";
}
}
public class TEST {
public static void main(String[] args) {
A a=new A();
String str="banana";
if(a.banana.equals(str)) {
System.out.println("확인 1");
}
else {
System.out.println("확인 2");
}
}
}
consol
확인 1
--------------------------------------------------------------
42 class B {
43 int b;
44 B(int b){
45 this.b=b;
46 }
47 }
48 class C extends B{
49 int c;
50 C(int c){
51 this.c=c;
52 }
53 }
// Q8. 50번 라인의 에러 원인은?
1. 틀린이유
부모인 b의 멤버변수를 가져오지 않았다라고 작성했는데 역시 문제를 이해하지 못해서 틀렸다
2. 문제가 원하는것은 상속관계에서 부모와 자식간의 생성자를 불러올수 있는지 확인하는것이라고 생각한다
3. 풀이
C는 B를 상속받아서 C의 생성자가 B의 기본생성자를 호출하려고 했지만 B에 기본생성자 B()가 없기때에 오류가 나는것이다
Q9. 50번 라인의 에러를 해결하는 방법은?
3.풀이
자식인 C에 부모인 B의 기본생성자를 호출할 super(c)를 만들어준다 부모에게 기본생성자가 없는 이유가 있을것이므로
자식클래스에서 해결해야한다
class B {
int b;
B(int b) {
this.b = b;
}
}
class C extends B {
int c;
C(int c) {
super(c);
this.c = c;
}
}
느낀점
나름 이해도 했다고 생각하고 복습도 열심히 했다고 생각했는데 시험결과에 진짜 많은 생각이 들었고 충격적이었다 다음 시험은 꼭 잘볼수 있도록 더 공부하고 노력해야겠다
'🐢 꼬부기 LV.1 | 개념•기초 > 💧물대포(핵심개념)' 카테고리의 다른 글
| SQL 기본문법 정리 (0) | 2025.11.01 |
|---|---|
| 데이터베이스(DB) 환경 설정 및 연결 (0) | 2025.11.01 |
| 프로그래밍 언어 시험 오답노트 01 (0) | 2025.10.30 |
| MVC 파트별 내용정리 (0) | 2025.10.26 |
| mvc 디자인 패턴 개념정리 (0) | 2025.10.24 |