[1회]
1. 다음은 자바 코드이다. 출력 결과를 쓰시오.
class Static {
public int a = 20;
static int b = 0;
}
public class Soojebi {
public static void main(String[] args) {
int a;
a = 10;
Static.b = a;
Static st = new Static();
System.out.println(Static.b++);
System.out.println(st.b);
System.out.println(a);
System.out.print(st.a);
}
}
1) class Static
① public int a = 20;
- 인스턴스 변수.
- 객체가 생성될 때마다 각각의 객체가 독립적으로 가지는 변수.
- 초기값은 20.
② static int b = 0;
- 정적(static) 변수.
- 클래스에 속하며 모든 객체가 공유하는 변수.
- 초기값은 0
2) main 메서드
① int a; a = 10;
- 정수형 변수 a 선언. 그다음 10으로 초기화.
② Static.b = a;
- Static 클래스의 정적 변수 b에 지역 변수 a의 값 10을 할당.
- 이 때 b의 값은 10으로 바뀜. ③ Static st = new Static();
- Static 클래스의 객체 st 생성.
3) 출력
① Static.b++
- Static 클래스의 정적 변수 b의 값을 출력 후 ++ 연산 실행. 현재 정적 변수 b의 값은 10이므로 10을 출력 후 b의 값은 11로 변경.
② st.b
- 객체 st를 통해 b를 출력. 하지만 b는 클래스에 속하는 정적 변수이므로 st 객체 통해 접근해도 11을 출력.
③ a
- 지역변수 a의 값을 출력. main 메서드에서의 a의 값은 10이므로 10을 출력.
④ st.a
- 객체 st의 인스턴스 변수 a를 출력. - 객체 a는 20으로 초기화되어있으므로 20을 출력.
[출력]
10
11
10
20
2. 다음은 C 코드이다. 출력 결과를 쓰시오.
#include<stdio.h>
int main() {
char a[] = "Art";
char* p = NULL;
int i = 0;
p = a;
printf("%s\n", a);
printf("%c\n", *p);
printf("%c\n", *a);
printf("%s\n", p);
for (i = 0; a[i] != '\0'; i++)
printf("%c", a[i]);
return 0;
}
1) char a[] = "Art";
- 문자형 변수 a 선언하면서 "Art"로 초기화.
2) char* p = NULL;
- 문자 포인터 p를 선언하면서 NULL로 초기화.
3) int i = 0;
- 정수형 변수 i 선언하면서 0으로 초기화.
4) p = a;
- 포인터 p가 배열 a의 첫 번째 요소를 가리킴. 즉 p는 첫 번째 문자인 'A' 가리킴.
5) 출력
① printf("%s\n", a);
- 배열 a 전체를 문자열로 출력하는 것으로 Art를 출력.
② printf("%c\n", *p);
- 포인터 p가 가리키는 값을 문자로 출력하는 것으로 A를 출력.
③ printf("%c\n", *a);
- 배열 a의 첫 번째 요소를 문자로 출력하는 것으로 A를 출력.
④ printf("%s\n", p);
- 포인터 p가 가리키는 문자열을 출력하는 것으로 Art를 출력.
6) for문
- i가 0부터 시작해서 NULL 만나기 전까지 반복문 실행.
- a[0] 요소부터 NULL 전인 a[3]까지 반복문 돌면서 출력하므로 Art를 출력.
[출력]
Art
A
A
Art
Art
3. 다음은 C 코드이다. 출력 결과를 쓰시오.
#include<stdio.h>
void main() {
char* a = "qwer";
char* b = "qwety";
int i, j;;
for (i = 0; a[i] != '\0'; i++) {
for (j = 0; b[j] != '\0'; j++) {
if (a[i] == b[j])
printf("%c", a[i]);
}
}
}
1) char* a = "qwer";
- 문자열 "qwer"을 가리키는 포인터.
2) char* b = "qwety";
- 문자열 "qwety"를 가리키는 포인터
3) for문
- 외부 for문은 i를 사용하여 문자열 a의 각 문자를 순차적으로 탐색.
- 내부 for문은 j를 사용하여 문자열 b의 각 문자를 순차적으로 탐색.
- if문 조건은 a의 i번째와 b의 j번째 문자가 동일할 경우, 그 문자를 출력.
따라서 동일한 문자는 'q', 'w', 'e'를 출력함.
[출력]
qwe
9. 다음은 이진수를 십진수로 변환하는 c언어 코드이다. ⓐ, ⓑ에 적합한 코드를 작성하시오.
#include<stdio.h>
int main() {
int input = 10110;
int di = 1;
int sum = 0;
while (1) {
if (input == 0) break;
else {
sum = sum + (input __ⓐ__ __ⓑ__) * di;
di = di * 2;
input = input / 10;
}
}
printf("%d", sum);
return 0;
}
ⓐ %
ⓑ 10
14. 다음은 자바 코드이다. 빈칸에 들어갈 코드를 쓰시오. (단, 변수명으로 쓰시오.)
public class Soojebi {
static void swap(int[] a, int idx1, int idx2) {
int t = a[idx1];
a[idx1] = a[idx2];
a[__①__] = t;
}
static void Usort(int[] a, int len) {
for(int i=0; i<len; i++) {
for(int j=0; j<len-i-1; j++) {
if(a[j] > a[j+1]) {
swap(a, j, j+1);
}
}
}
}
public static void main(String[] args) {
int[] item = {5, 4, 9, 1, 3, 7};
int nx = 6;
Usort(item, __②__);
for(int data : item) {
System.out.print(data + "");
}
}
}
① idx2 / ② nx
1) swap 메서드 → 배열의 두 요소를 서로 교환하는 함수.
2) main 메서드
① int[] item = {5, 4, 9, 1, 3, 7};
- 정수형 배열 item 선언하면서 초기화.
② int nx = 6;
- 정수형 변수 nx 선언하면서 6으로 초기화.
③ Usort(item, nx);
- Usort 메서드 호출하고, item 배열과 nx 값을 인수로 전달.
▷ 메서드 Usort에 item 배열과 빈칸 2를 넘기기로 하는데, 이미 배열의 이름으로 item을 사용했기 때문에 다른 변수명을 사용해야 함.
현재 main 메서드에 나온 변수명은 nx밖에 없으므로 nx 입력.
- Usort 메서드는 버블 정렬를 구현하는 함수로, 배열 a를 오름차순으로 정렬함.
3) Usrot 메서드
- Usrot 메서드 호출하면서 a에는 item 배열이, len에는 nx 값인 6이 전달.
ㄱ. for문
① i = 0 일 때
j = 0 일 때
if문 조건 확인하면 a[0] > a[1] = 5 > 4는 참이므로 swap 메서드 호출. swap(a, 0, 1)
int t = a[0];
a[0] = a[1];
a[1] = t = a[0]이므로 a[0]과 a[1]의 자리가 바뀜.
이런 식으로 진행하다 보면 배열은 {1,3,4,5,7,9}로 바뀜.
15. 다음은 파이썬 코드이다. 출력 결과를 쓰시오.
a = {'한국', '중국', '일본}
a.add('베트남')
a,add('중국')
a.remove('일본')
a.update({'홍콩', '한국', '태국'})
print(a)
1) a = {'한국', '중국', '일본}
- a 세트형 변수에 '한국', '중국', '일본'을 초기화.
2) a.add('베트남')
- 세트에 '베트남' 추가.
3) a.add('중국')
- 세트에 '중국'이라는 값을 추가하는데 이미 '중국'은 있으므로 무시해도 됨.
4) a.remove('일본')
- 세트에 '일본'이라는 값 제거.
5) a.update({'홍콩', '한국', '태국'})
- update를 통해 '홍콩', '한국', '태국'을 추가하는데 '한국'은 이미 있으므로 '홍콩', '태국'만 추가.
6) 출력하면 {'한국', '중국', '베트남', '홍콩', '태국}
▶ 세트는 순서가 상관없는 컬렉션 자료형이므로 출력 순서는 상관없고, 중복 허용하지 않음.
17. 다음은 자바 코드이다. 출력 결과를 쓰시오.
https://mh030128.tistory.com/27
20년 3회_15번
20. 다음은 자바 코드이다. 출력 결과를 쓰시오.
class Parent {
int x = 100;
Parent() {
this(500);
}
Parent(int x) {
this.x = x;
}
int getX() {
return this.x;
}
}
class Child extends Parent {
int x = 4000;
Child() {
this(5000);
}
Child(int x) {
this.x = x;
}
}
public class Soojebi {
public static void main(String[] args) {
Child obj = new Child();
System.out.println(obj.getX());
}
}
▶ 생성자 오버로딩.
객체 생성 시 생성자 호출하는데 main메서드에서 Child 객체를 생성하였으므로 Child에 생성자 확인.
상속관계에서 하위 객체 생성 시 상위 객체도 생성.
생성자의 특징은 반환값이 없고, 클래스명과 생성자명이 동일.
1) class Parent
① int x = 100;
- 정수형 변수 x 선언하면서 100으로 초기화.
② Parent()
- Parent의 기본 생성자.
- this(500)을 호출하여 x 값을 500으로 초기화하는 생성자 호출.
③ Parent(int x)
- 인자로 받은 값을 this.x에 할당.
④ getX()
- Parent 클래스의 x 값을 반환.
2) class Child
① int x = 4000;
- 정수형 변수 x 선언하면서 4000으로 초기화.
- Parent의 x 변수와는 다른 것.
② Child()
- Child의 기본 생성자.
- this(5000)을 호출하여 x 값을 5000으로 초기화하는 생성자 호출.
③ Child(int x)
- 인자로 받은 값을 this.x에 할당.
- 여기서 this.x는 Child 클래스의 x 필드.
3) class Soojebi
① Child obj = new Child()
- Child 객체 생성 후 obj.getX()를 호출하여 getX() 메서드의 결과 출력.
(실행순서)
① Child obj = new Child();
- new 키워드 사용하여 Child 객체 생성하면서 Child 클래스의 기본 생성자 호출하는데 그 이유는 매개변수가 없기 때문.
② Child() { this(5000); }
- Child의 기본생성자로 이동.
③ this(5000)
- this()는 자기 자신 객체의 다른 생성자를 호출. 즉 생성자 안에서 this() 키워드 사용해서 다른 생성자 호출 가능.
- 따라서 this(5000)은 매개변수가 5000인 Child(int x)로 (매개변수 가지는 생성자) 이동.
④ Child(int x) {
- 매개변수 가지는 생성자로 이동해서 다음 코드를 실행하는 줄 알았지만 우리는 Parent()로 이동함.
⑤ Parent() { this(500) };
- Java의 특성상 상속관계에서 하위객체 생성사면 상위객체도 생성되므로 상위객체로 이동.
- Child(int x) {this.x = x;}에서 이 코드 위에 super();가 생략되었다고 생각하면 됨.
- this(500)이 실행되어 x의 값에 500을 저장. this()는 다른 생성자 호출 가능하므로 매개변수 가지는 생성자로 이동.
⑥ Parent(int x) {this.x = x;);
- this.x = x; 코드를 실행하면 x의 값은 500으로 변경이 됨.
- 우측에 있는 x는 변수의 우선순위를 따라 자기 자신의 블록에 쌓인 변수 x(int x)가 우선순위 되는데, 매개변수도 마찬가지임.
- 여기서 this는 객체 자기 자신을 의미하는 예약어로, 클래스 Parent안에 객체 obj의 x값은 100에서 500으로 변경.
- 부모의 생성자가 모두 실행되었으므로 생성자를 호출한 곳으로 다시 이동.
⑦ Child(int x) { this.x = x; }
- 자식 클래스의 생성자로 다시 이동하여 this.x = x; 코드를 실행.
- 우측에 있는 x의 값은 위에처럼 변수의 우선순위 따라 자기자신 블록 안에 있는 매개변수의 우선순위가 가장 높으므로
클래서 Child 안에 있는 값 5000으로 변경.
- this는 객체 자기자신을 의미하므로 클래스 Child 안에 객체 obj의 x값은 1000에서 5000으로 바뀜.
- Child 생성자도 모두 실행하였으므로 생성자를 실행한 곳, 즉 객체 생성한 main 메서드로 다시 돌아감.
⑧ System.out.println(obj.getX());
- obj는 Child 객체이므로 Child 클래스로 이동하여 getX 함수를 실행하는데 Child 클래스에 없음.
- 상속받고 있는 Parent 클래스로 이동하는데, 상속관계에서 부모클래스의 메서드를 바로 사용할 수 있기 때문임.
- 따라서 Parent 클래스의 getX() 함수를 실행.
⑨ int getX() { return this.x; }
- this는 객체 자기자신을 의미하므로 현재 Parent 클래스의 객체인 obj의 x값은 500이므로 500을 출력하게 됨.
[출력]
500
[2회]
1. 다음 프로그램에서 43215로 출력되도록 밑줄 친 곳에 들어갈 코드를 보기에서 골라 작성하시오.
#include<stdio.h>
int main() {
int n[5] = { 5, 4, 3, 2, 1 };
int i;
for (i = 0; i < 5; i++) {
printf("%d", ________ );
}
return 0;
}
(보기)
n, i, +, +, 1, 5, [, ], (, )
(실행결과)
43215
: n[(i+1)%5]
- 맨 앞에 있는 5가 맨 뒤로 가야 하기 때문에 n[0] = 4, n[1] = 3, n[2] = 2 ... n[4] = 5로 바뀌어야 함.
2. 다음은 C언어 코드이다. 출력 결과를 쓰시오.
#include<stdio.h>
int main() {
int n[3] = { 73, 95, 82 };
int i, sum = 0;
for (i = 0; i < 3; i++) {
sum += n[i];
}
switch (sum / 30) {
case 10:
case 9: printf("A");
case 8: printf("B");
case 7 :
case 6: printf("C");
default: printf("D");
}
return 0;
}
1) int n[3] = { 73, 95, 82 };
- 길이가 3인 정수형 배열 선언하면서 초기화.
2) int i, sum = 0;
- 정수형 변수 i, sum 선언하면서 sum = 0으로 초기화.
3) for문
① i = 0 일 때 sum = sum + n[0] = 0 + 73 = 73.
② i = 1 일 때 sum = sum + n[1] = 73 + 95 = 168.
③ i = 2 일 때 sum = sum + n[2] = 168 + 82 = 250.
④ i = 3 일 때 조건 맞지 않으므로 for문 종료.
4) switch문
- sum / 30 = 250 / 30 = 8이므로 case 8로 감.
- case 구문에 break 없으므로 쭉 실행.
- case 8에서 B출력.
- case 7은 아무것도 없으므로 넘어가고, case 6에서 C 출력.
- default에서 D출력.
따라서 BCD 출력 후 종료.
[출력]
BCD
3. 다음 C 프로그램의 출력 결과를 쓰시오.
#include<stdio.h>
#define MAX_SIZE 10
int isWhat[MAX_SIZE];
int point = -1;
int isEmpty() {
if (point == -1) return 1;
return 0;
}
int isFull() {
if (point == MAX_SIZE - 1) return 1;
return 0;
}
void into(int num) {
if (point >= 10) printf("Full");
isWhat[++point] = num;
}
int take() {
if (isEmpty() == 1) printf("Empty");
return isWhat[point--];
}
int main() {
into(5);
into(2);
while(!isEmpty()) {
printf("%d", take());
into(4);
into(1);
printf("%d", take());
into(3);
printf("%d", take());
printf("%d", take());
into(6);
printf("%d", take());
printf("%d", take());
return 0;
}
}
1) #define MAX_SIZE = 10 - 상수 MAX_SIZE는 배열의 크기를 지정하며, 이 값은 스택의 최대 크기를 의미. 따라서 여기에서는 스택의 크기를 10으로 설정.
2) int point = -1; - point는 스택의 최상위(Top)를 가리키는 인덱스. 초기 값은 -1로 설정되며, 이는 스택이 비어있음을 나타냄.
3) isEmpty() 함수 - 스택이 비어있는지에 대한 여부 확인하는 함수.
- point == -1은 스택이 비어있으면 return 1; 1을 반환함. 즉 스택이 비어있음을 의미.
- return 0;은 스택이 비어있지 않으면 0을 반환.
4) isFull() 함수 - 스택이 가득 찼는지에 대한 여부 확인하는 함수.
- point == MAX_SIZE - 1은 스택이 가득 찾으면 return 1; 1을 반환함. 즉 스택이 가득 찾음을 의미.
(인덱스는 0부터 시작하므로 최대 인덱스는 MAX_SIZE - 1을 의미)
- return 0; 스택이 가득 차지 않았으면 0을 반환.
5) into() 함수 - 스택에 새로운 값을 추가하는 함수.
- isFull()을 호출하여 스택이 가득 찼는지 확인하고 가득 찼으면 Full을 출력 후 더 이상 값을 추가하지 않고 종료.
- 스택이 가득 차지 않았으면 ++point로 point 증가시킨 후, 그 위치에 num 값을 저장.
6) take() 함수 - 스택에서 값을 꺼내오는 함수.
- isEmpty()를 호출하여 스택이 비어있는지 확인하고 비어있으면 Empty를 출력.
- 스택이 비어있지 않으면 isWhat[point--] 실행하여 --point로 point 감소시키며 스택의 최상위 값이 제거됨.
7) main함수
① into(5); into(2)
- 먼저 스택에 5와 2를 차례대로 삽입.
- 스택 상태 [5, 2]
- point : 1 (총 2개가 있으므로)
② while문
- take를 호출하여 스택이 비어있지 않은 동안 스택 요소 꺼내고 출력.
- take() 실행하여 2를 꺼냄. (point = 0)
- into(4) : 스택에 4를 삽입.
- into(1) : 스택에 1을 삽입.
- 스택상태 : [5, 4, 1] / point : 2
- take() 실행하여 1을 꺼냄. (point = 1)
- into(3) : 스택에 3을 삽입.
- 스택상태 : [5, 4, 3] / point : 2
- take() 실행하여 3을 꺼냄. (point = 1)
- take() 실행하여 4를 꺼냄. (point = 0)
- into(6) : 스택에 6을 삽입.
- 스택상태 : [5, 6] / point : 1
- take() 실행하여 6을 꺼냄. (point = 0)
- take() 실행하여 5를 꺼냄. (poiint = -1)
따라서 출력하면 2 1 3 4 6 5
[출력]
213465
5. 다음 C프로그램에 홍길동, 김철수, 박영희 순서로 입력하였다. 프로그램의 출력 결과를 쓰시오.
#include<stdio.h>
char n[30];
char *soojebi() {
gets(n);
return n;
}
int main() {
char *p1 = soojebi();
char *p2 = soojebi();
char *p3 = soojebi();
printf("%s\n", p1);
printf("%s\n", p2);
printf("%s\n", p3);
return 0;
}
(입력)]
홍길동김철수박영희
1) char n[30];
- 길이가 30인 문자열 저장하는 변수 n 선언.
2) soojebi() 함수
- gets(n) : 사용자로부터 문자열을 입력받음. 이 함수는 n 배열에 입력된 문자열 저장 후, n의 주소 반환.
3) main() 함수
① char *p1 = soojebi();
- 첫 번째 입력을 받음. soojebi() 함수는 n의 주소를 반환하므로 p1은 n을 가리킴. 따라서 첫 번째 입력받은 "홍길동"을 n에 저장.
② char *p2 = soojebi();
- 두 번째 입력을 받음. 이때 n의 내용이 "김철수"로 덮어씌워지며, p2 역시 n을 가리킴.
③ char *p3 = soojebi();
- 세 번째 입력을 받음. 이 때 n의 내용이 "박영희"로 덮어씌워지며, p3도 n을 가리킴.
최종적으로 p1, p2, p3는 모두 동일한 배열 n을 가리키고 있으며, 이 배열에는 마지막 입력인 "박영희"만 저장되어 있음.
첫 번째, 두 번째, 세 번째 출력 모두 박영희를 출력함.
[출력]
박영희
박영희
박영희
7. 다음은 잔돈의 개수를 구하는 프로그램이다. a는 1000원 개수, b는 500원 개수, c는 100원 개수, d는 10원 개수이다. 밑 줄 ①, ②, ③, ④에 들어갈 코드를 순서대로 작성하시오. (코드의 길이를 최소화해서 구현해야 한다.)
#include<stdio.h>
int main() {
int m = 4620;
int a, b, c, d;
a = ___①___;
b = ___②___;
c = ___③___;
d = ___④___;
printf("1000원 : %d개\n", a);
printf("500원 : %d개\n", b);
printf("100원 : %d개\n", c);
printf("10원 : %d개\n", d);
return 0;
}
① m / 1000
② (m % 1000) / 500
③ (m % 500) / 100
④ (m % 100) / 10
11. 다음은 선택정렬 코드이다. 밑줄에 알맞은 코드를 쓰시오.
#include<stdio.h>
int main() {
int arr[] = { 64, 25, 12, 22, 11 };
int n = sizeof(arr) / sizeof(arr[0]);
int i = 0, j, tmp;
do {
j = i + 1;
do {
if (arr[i] _____ arr[j]) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
j++;
} while (j < n);
i++;
} while (i < n - 1);
for (i = 0; i <= 4; i++)
printf("%d ", arr[i]);
return 0;
}
(실행결과)
11 12 22 25 64
: >
14. 다음은 C언어 코드이다. 출력 결과를 쓰시오.
#include<stdio.h>
int main() {
int c = 0;
int i;
for (i = 1; i <= 2023; i++) {
if (i % 4 == 0) c++;
}
printf("%d", c);
return 0;
}
1) int c = 0;
- 정수형 변수 c 선언하면서 0으로 초기화.
2) int i;
- 정수형 변수 i 선언.
3) for문
① i = 1 일 때 if문 조건 확인하면 1 % 4 == 0은 거짓이므로 c++ 실행하지 않음.
② i = 2 일 때 if문 조건 확인하면 2 % 4 == 0은 거짓이므로 c++ 실행하지 않음.
③ i = 3 일 때 if문 조건 확인하면 3 % 4 == 0은 거짓이므로 c++ 실행하지 않음.
④ i = 4 일 때 if문 조건 확인하면 4 % 4 == 0은 참이므로 c++ 실행하여 c = 1.
이렇게 반복문을 i = 2023까지 실행하였을 때 조건 만족하면 c++ 실행.
따라서 4의 배수 중 가장 큰 수는 2020이므로 2020 / 4 = 505이므로 c는 505를 출력함.
[출력]
505
18. 다음은 파이썬 코드이다. 출력 결과를 쓰시오.
a = "engineer information processing"
b = a[:3]
c = a[4:6]
d = a[29:]
e = b + c + d
print(e)
1) a = "engineer information processing"
- 변수 a에 문자열 "engineer information processing"이 할당.
2) b = a[ : 3]
- 변수 b에 문자열 a의 0번째부터 2번째까지 가져옴.
- "eng"
3) c = a[4 : 6]
- 변수 c에 문자열 a의 4번째부터 5번째까지 가져옴.
- "ne"
4) d = a[29: ]
- 변수 d에 문자열 a의 29번째부터 마지막까지 가져옴.
- "ng"
5) e = b + c + d
- "eng" + "ne" + "ng" = "engneng"
[출력]
engneng
19. 다음은 자바 소스 코드이다. 출력 결과를 쓰시오.
public class Soojebi {
public static void main(String[] args) {
String str1 = "soojebi";
String str2 = "soojebi";
String str3 = new String("soojebi");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str1.equals(str3));
System.out.println(str2.equals(str3)
);
}
}
- str1과 str2는 리터럴 문자열을 사용하여 선언되며, Java에서는 동일한 리터럴 문자열에 대해 동일한 객체 참조.
- str3는 new 키워드를 사용하여 새로운 문자열 객체를 생성.
▶ == 연산자는 객체의 주소값을 비교하고, eqauls 메서드는 비교하는 두 대상의 값을 비교.
1) str1 == str2
- str1과 str2는 동일한 리터럴을 가리키므로 true.
2) str1 == str3
- str1과 str3는 서로 다른 객체를 참조하므로 false.
3) str1.equals(str3)
- str1과 str3는 같은 문자열을 가지므로 true.
4) str2.equals(str3)
- str2와 str3은 같은 문자열을 가지므로 true.
[출력]
true
false
true
true
[3회]
1. 다음은 자바 코드이다. 출력 결과를 쓰시오.
public class Soojebi {
public static void main(String[] args) {
Parent c = new Child();
c.paint();
c.draw();
}
}
class Parent {
public void paint() {
System.out.print("A");
draw();
}
public void draw() {
System.out.print("B");
draw();
}
}
class Child extends Parent {
public void paint() {
super.draw();
System.out.print("C");
this.draw();
}
public void draw() {
System.out.print("D");
}
}
▶ 오버라이딩 함수
- 하위클래스에서 상위클래스의 메서드를 재정의하는 과정.
- 하위클래스의 오버라이딩 메서드는 상위클래스 메서드보다 우선순위 높음.
▶ 예약어
- super : 상위 클래스를 호출하는 예약어.
- this : 객체 자기 자신을 의미하는 예약어.
▶ 실행
① Parent c = new Child();
- 상위클래스 타입으로 하고, 하위클래스 객체를 생성. 즉 하위클래스가 상위클래스 타입으로 변환.
② c.paint();
- paint메서드는 상위, 하위클래스에 가지고 있음
- 하지만 하위클래스 메서드가 상위클래스 메서드보다 우선순위 높으므로 하위클래스의 paint 메서드를 실행.
③ paint()
- paint() 메서드에 super.draw(); 먼저 실행
- super.draw();는 상위클래스의 draw() 메서드를 실행.
④ draw()
- 상위클래스의 draw() 메서드 실행하면 B를 출력.
- 그러고 draw(); 메서드를 실행하는데 이때 draw도 하위클래스의 메서드 우선순위가 높으므로 하위클래스의 draw() 메서드 실행.
⑤ draw()
- 하위클래스의 draw() 메서드 실행하면 D를 출력.
⑥ paint()
- 상위, 하위 클래스의 draw() 메서드가 끝났으면 호출한 곳으로 이동.
- 그러고 C를 출력.
- this.draw();를 실행하면 객체 자기 자신을 의미하므로 자신의 draw() 메서드로 이동하여 D를 출력.
⑦ c.draw();
- c.paint();가 다 끝났으면 호출한 곳으로 이동하여 다음 코드 실행.
- c.draw();는 하위클래스의 draw() 메서드로 이동하여 D를 출력 후 종료.
[출력]
BDCDD
4. 다음은 C언어 코드이다. 출력 결과를 쓰시오,
#include<stdio.h>
int perfect_number(int n) {
int i, sum = 0;
for (i = 1; i <= n / 2; i++) {
if (n % i == 0)
sum += i;
}
if (n == sum)
return 1;
return 0;
}
int main() {
int i, sum = 0;
for (i = 2; i <= 100; i++) {
if (perfect_number(i))
sum += i;
}
printf("%d ", sum);
return 0;
}
▶ 완전수를 구하여 구 수의 합을 구하는 코드.
1) int i, sum = 0;
- 정수형 변수 i, sum 선언하면서 sum = 0으로 초기화.
2) for문
① i = 2 일 때 if문 조건 확인하면 if(perfect_number(2)) 실행.
perfect_number(2) 함수를 실행하면 n = 1, i, sum = 0
ⓐ i = 1 일 때 if문 조건 확인하면 2 % 2 == 0은 참이므로 sum = sum + i = 0 + 1 = 1.
ⓑ i = 2 일 때 조건이 맞지 않으므로 for문 종료.
다음 문장인 if문 조건 확인하면 2 == 1은 거짓이므로 return 0을 반환.
② i = 3 일 때 if문 조건 확인하면 if(perfect_number(3)) 실행.
perect_number(3) 함수를 실행하면 n = 3, i, sum = 0
ⓐ i = 1 일 때 if문 조건 확인하면 3 % 2 == 0은 거짓이므로 다음 반복문 실행.
ⓑ i = 2 일 때 조건이 맞지 않으므로 for문 종료.
다음 문장인 if문 조건 확인하면 3 == 0은 거짓이므로 return 0을 반환.
이런 식으로 진행하다 보면 완전수인 6, 28의 수를 구할 수 있고 이 두 수의 합을 출력하므로 6 + 28 = 34.
[출력]
34
8. 다음은 자바 코드이다. 출력 결과를 쓰시오,
public class Soojebi {
public static void main(String[] args) {
int sum = fact(7);
System.out.println(sum);
}
public static int fact(int n) {
if (n==1) {
return 1;
}
else {
return n * fact(n-1);
}
}
}
▶ 재귀함수 코드.
1) int sum = fact(7);
- 정수형 변수 sum을 선언하면서 fact(7) 함수의 값을 대입.
2) fact 함수
① n = 7 일 때
- if문 조건 확인하면 7 == 1은 거짓이므로 else문 실행.
- return 7 * fact(6)
② n = 6 일 때
- if문 조건 확인하면 6 == 1은 거짓이므로 else문 실행.
- return 6 * fact(5)
③ n = 5 일 때
- if문 조건 확인하면 5 == 1은 거짓이므로 else문 실행.
- return 5 * fact(4)
④ n = 4 일 때
- if문 조건 확인하면 4 == 1은 거짓이므로 else문 실행.
- return 4 * fact(3)
⑤ n = 3 일 때
- if문 조건 확인하면 3 == 1은 거짓이므로 else문 실행.
- return 3 * fact(2)
⑥ n = 2 일 때
- if문 조건 확인하면 2 == 1은 거짓이므로 else문 실행.
- return 2 * fact(1)
⑦ n = 1 일 때
- if문 조건 확인하면 1 == 1은 참이므로 return 1을 반환.
따라서 차례대로 계산하면 1 * 2 * 3 * 4 * 5 * 6 * 7 = 5040
[출력]
5040
10. 다음은 C언어 코드이다. 출력 결과를 쓰시오.
#include<stdio.h>
int main() {
char* p = "KOREA";
printf("%s\n", p);
printf("%s\n", p + 1);
printf("%c\n", *p);
printf("%c\n", *(p + 3));
printf("%c\n", *p + 4);
return 0;
}
1) char* p = "KOREA";
- 문자열 리터럴 "KOREA"를 가리키는 포인터 p 선언.
2) printf("%s\n", p);
- p가 가리키는 문자열 전체 출력.
- 따라서 KOREA를 출력.
3) printf("%s\n", p + 1);
- p + 1이 가리키는 문자열 전체 출력.
- 현재 p는 K를 가리키고 있고, 그다음 O를 가리키는 문자열 전체를 출력하므로 OREA를 출력.
4) printf("%c\n", *p);
- 현재 p는 K를 가리키고 있으므로 K를 출력.
5) printf("%c\n", *(p + 3));
- 현재 P는 K를 가리키고 있고, p+3하면 p에서 네 번째 문자에 해당하는 값인 E를 출력.
6) printf("%c\n", *p + 4);
- 현제 p는 K를 가리키고 있고, ASCII 값에서 4를 더한 값을 출력.
- K, L, M, N, O이므로 +4 하면 O를 출력.
[출력]
KOREA
OREA
K
E
O
11. 다음은 C언어 코드이다. 출력 결과를 쓰시오.
#include<stdio.h>
int soojebi(int n) {
if (n <= 1) {
return n;
}
else {
return soojebi(n - 1) + soojebi(n - 3);
}
}
int main() {
printf("%d", soojebi(7));
return 0;
}
1) printf("%d", soojebi(7));
- soojebi() 함수를 호출하며 정수값으로 출력.
2) soojebi 함수
① n = 7 일 때
- if문 조건 확인하면 7 <= 1 거짓이므로 else문 실행.
- soojebi(6) + soojebi(4)
② n = 6 일 때
- if문 조건 확인하면 6 <= 1 거짓이므로 else문 실행.
- soojebi(5) + soojebi(3)
③ n = 5 일 때
- if문 조건 확인하면 5 <= 1 거짓이므로 else문 실행.
- soojebi(4) + soojebi(2)
④ n = 4 일 때
- if문 조건 확인하면 4 <= 1 거짓이므로 else문 실행.
- soojebi(3) + soojebi(1)
⑤ n = 3 일 때
- if문 조건 확인하면 3 <= 1 거짓이므로 else문 실행.
- soojebi(2) + soojebi(0)
⑥ n = 2 일 때
- if문 조건 확인하면 2 <= 1 거짓이므로 else문 실행.
- soojebi(1) + soojebi(-1)
⑦ n = 1 일 때
- if문 조건 확인하면 1 <= 1 참이므로 return n을 반환하고, n = 1이므로 1을 반환.
⑧ n = -1일 때
- if문 조건 확인하면 -1 <= 1 참이므로 return n인 -1을 반환.
- 따라서 n = 2일 때 1 + (-1) = 0.
⑨ n = 0 일 때
- if문 조건 확인하면 0 <= 1 참이므로 return n인 0을 반환.
- 따라서 n = 3일 때 0 + 0 = 0.
soojebi(1) + soojebi(-1) + soojebi(0) + soojebi(1) + soojebi(1) + soojebi(-1) + soojebi(1) + soojebi(-1) + soojebi(0) + soojebi(1) + soojebi(-1) + soojebi(0) + soojebi(1) = 1 + (-1) + 0 + 1 + 1 + (-1) + 1 + (-1) + 0 + 1 + (-1) + 0 + 1 = 2
14. 다음은 파이썬 언어이다. 밑줄 친 빈칸에 들어갈 메서드를 쓰시오.
num1, num2 = input()._______()
print(num1)
print(num2)
(입력값)
hello soojebi
(출력값)
hello
soojebi
: split
▶ split은 공백을 구분 하여 문자열을 분할.
'Studying > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기]_2024년 2회 (3) | 2024.10.16 |
---|---|
[정보처리기사 실기]_2024년_1회 (2) | 2024.10.16 |
[정보처리기사 실기]_2023년 3회 (0) | 2024.10.14 |
[정보처리기사 실기]_2023년 2회 (0) | 2024.10.14 |
[정보처리기사 실기]_2023년 1회 (2) | 2024.10.14 |