[1회]
12.
#include<stdio.h>
void main() {
int i, j;
int temp;
int a[5] = { 75, 95, 85, 100, 50 };
for (i = 0; i < 4; i++) {
for (j = 0; j < 4 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for (i = 0; i < 5; i++) {
printf("%d ", a[i]);
}
}
1) int i, j; int temp;
: 정수형 변수 i, j, temp 선언.
2) int a[5] = { 75, 95, 85, 100, 50 };
: 길이가 5인 정수형 배열 선언하면서 초기화.
3) for문
① i = 0 일 때
j = 0 일 때
if (a[0] > a[1]) = if (75 > 95)는 거짓이므로 if문 아래 실행하지 않고 다음 반복문 진행.
j = 1 일 떄
if (a[1] > a[2] = if (95 > 85)는 참이므로 if문 실행.
temp = a[1] = 95;
a[1] = a[2] = 85;
a[2] = temp = 95;
a[1]과 a[2]의 자리가 바뀌어서 { 75, 85, 95, 100, 50 }
j = 2 일 때
if (a[2] > a[3]) = if (95 > 100)은 거짓이므로 if문 아래 실행하지 않고 다음 반복문 진행.
j = 3 일 때
if (a[3] > a[4]) = if (100 > 50)은 참이므로 if문 실행.
temp = a[3] = 100;
a[3] = a[4] = 50;
a[4] = temp = 100;
a[3]과 a[4]의 자리가 바뀌어서 { 75, 85, 95, 50, 100}
j = 4 일 때 조건 만족하지 않으므로 안쪽 for문 빠져나옴.
② i = 1 일 때
j = 0 일 때
if (a[0] > a[1]) = if (75 > 85)는 거짓이므로 if문 아래 실행하지 않고 다음 반복문 진행.
j = 1 일 때
if (a[1] > a[2]) = if (85 > 95)는 거짓이므로 if문 아래 실행하지 않고 다음 반복문 진행.
j = 2 일 때
if (a[2] > a[3]) = if (95 > 50)은 참이므로 if문 실행
temp = a[2] = 95;
a[2] = a[3] = 50;
a[3] = temp = 95;
a[2]와 a[3]의 자리가 바뀌어서 { 75, 85, 50, 95, 100 }
j = 3 일 때 조건 만족하지 않으므로 안쪽 for문 빠져나옴.
이런식으로 진행하면 오름차순으로 정렬하는 버블 정렬 알고리즘이어서 출력 결과는 50 75 85 95 100이 나옴.
[출력]
50 75 85 95 100
13.
public class Soojebi {
public static void main(String[] args) {
int i;
int a[] = {0, 1, 2, 3};
for(i=0; i<4; i++) {
System.out.print(a[i] + " ");
}
}
}
1) int i;
: 정수형 i 선언
2) int a[] = {0, 1, 2, 3};
: 정수형 배열 선언하면서 초기화
3) for문
: for문 돌리면서 배열을 출력.
[출력]
0 1 2 3
14.
public class Soojebi {
public static void main(String[] args) {
int i = 3;
int k = 1;
switch (i) {
case 0:
case 1:
case 2:
case 3: k = 0;
case 4 : k += 3;
case 5 : k-= 10;
default : k--;
}
System.out.println(k);
}
}
1) int i = 3;
: 정수형 i 선언하면서 3으로 초기화.
2) int k = 1;
: 정수형 k 선언하면서 1로 초기화.
3) switch문
: i는 3이므로 case 3으로 가서 k값을 계산하면 되는데 case 3만 계산하는 것이 아닌 default까지 k값 계산해야 함.
그 이유는 break문이 없어서 아래 모든 case가 연속적으로 실행되기 때문.
따라서 k = 0 → k += 3하면 k = 3 → k -= 10하면 k = -7 → k-- 하면 k = -8
[출력]
-8
[2회]
02.
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({'홍콩', '한국', '태국})
: {'홍콩', '한국', '태국'}을 추가하는데 '한국'은 이미 있으므로 '한국' 제외하고 '홍콩', '태국'만 추가.
출력할 때 집합은 순서가 없으므로 출력 순서는 다를 수 있음.
[출력]
{'중국', '태국', '베트남', '홍콩', '한국'}
19.
class A {
private int a;
public A(int a) {
this.a = a;
}
public void display() {
System.out.println("a=" + a);
}
}
class B extends A {
public B(int a) {
super(a);
super.display();
}
}
public class Soojebi {
public static void main(String[] args) {
B obj = new B(10);
}
}
1) class A
① private int a : 정수형 변수 a 선언했는데 접근제어자인 private로 선언. private는 외부에서 직접 접근 불가능.
② public A(int a) : 매개변수로 받은 값을 this.a에 저장.
③ display() 메서드 : 필드 a의 값을 출력하는 역할
2) class B
① B는 A를 상속받음. A의 생성자를 호출하는 방식으로 필드 a를 초기화.
② super(a) : 부모 클래스의 생성자를 호출.
③ super.display() : 부모클래스의 display() 메서드 실행
3) main
① B obj = new B(10) : B 클래스의 객체 obj를 생성하고, 생성 시 B(10) 생성자가 호출되면서 A 클래스의 생성자와 display() 메서드 호출.
② 즉, B클래스 생성자가 호출되고, super(a)로 부클래스 A의 생성자가 호출되면서 this.a = 10이 됨.
③ super.display()가 실행되며, A 클래스의 display() 메서드가 호출되어 a = 10이 출력.
[출력]
a=10
[3회]
02.
#include<stdio.h>
void main() {
int i = 0, c = 0;
while (i < 10) {
i++;
c *= i;
}
printf("%d", c);
}
1) int i = 0, c = 0;
: 정수형 변수 i, c 선언하면서 각각 0으로 초기화.
2) while (i < 10)
: i가 10이 되기 전까지 반복문 실행.
3) i++;, c *= i;
: i는 ++연산 만나면서 증가하지만 c는 0이어서 어떠한 값을 곱해서 0이 됨.
[출력]
0
13.
#include<stdio.h>
int r1() {
return 4;
}
int r10() {
return (30 + r1());
}
int r100() {
return (200 + r10());
}
int main() {
printf("%d\n", r100());
return 0;
}
1) main 함수에서 r100() 호출.
2) r100() 함수로 가면 return 값은 200 + r10().
3) r10() 함수로 가면 return 값은 30 + r1().
4) r1() 함수로 가면 return 값은 4.
5) 따라서 4 + 30 + 200 = 234
[출력]
234
15.
abstract class Vehicle {
private String name;
abstract public String getName(String val);
public String getName() {
return "Vehicle name: " + name;
}
public void setName(String val) {
name = val;
}
}
class Car extends Vehicle {
public Car(String val) {
setName(val);
}
public String getName(String val) {
return "Car name: " + val;
}
public String getName(byte val[]) {
return "Car name: " + val;
}
}
public class Soojebi {
public static void main(String[] args) {
Vehicle obj = new Car("Spark");
System.out.println(obj.getName());
}
}
1) abstact class Vehicle
① Vehicle은 추상 클래스로 인스턴스화할 수 없음.
② name 필드는 private 접근 제어자로 선언되었으며, 이를 수정하고 가져올 수 있는 setName과 getName 메서드 제공.
③ getName(String val)는 추상 메서드로 선언되어 자식 클래스에서 반드시 구현해야 함.
④ getName() 메서드는 이름을 반환하는 기본 메서드로, 필드 name 사용.
2) class Car
① Car는 Vehicle을 상속받음(부모가 가진 private한 것 빼고는 모든 것을 가지고 와서 사용 가능).
public Car(String val) : 부모 클래스의 setName 메서드를 호출하여 name 필드를 설정하는 생성자 가지고 있음.
② 추상 메서드 getName(String val)를 구현하여 Car의 이름을 변환하는 기능 제공.
③ getName(byte[] val) : String val과는 다른 시그니처를 가지고 있는 오버로딩된 메서드.
3) main 메서드
① Vehicle obj = new Car("Spark") : Car 클래스 객체 생성 후, 이를 Vehicle 타입의 참조 변수 obj로 가리킴.
② System.out.println(obj.getName()) ; Vehicle 클래스에서 구현된 getName() 메서드를 호출 후 name 필드의 값을 반환.
③ 따라서 new Car("Spark")가 호출되면 Car 클래스의 생성자가 실행되어 setName("Spark")이 호출 후 name 필드가 "Spark"로 설정.
④ obj.getName()은 부모 클래스인 Vehicle의 getName() 메서드를 호출 함. 이 메서드는 필드 name 값을 사용하여 "Vehicle name: "을 출력.
주의할 점)
: Vehicle obj = new Car("Spark") 이것을 보면 아버지가 날 낳은 형태로 아버지가 가지고 있는 것만 사용 가능.
즉 Vehicle의 메서드인 getName만 사용가능하고, Car가 가지고 있는 getName은 사용할 수 없다는 것.
따라서 obj.getName('a')라고 작성하면 오류남.
[출력]
Vehicle name: Spark
17.
package information;
public class Soojebi {
public static void main(String[] args) {
int i = 0;
int sum = 0;
while(i < 10) {
i++;
if(i % 2 == 1)
continue;
sum += i;
}
System.out.println(sum);
}
}
1) int i = 0; int sum = 0;
: 정수형 변수 i, sum 선언 후 각각 0으로 초기화.
2) while문
① i = 0 일 때
- i++로 i = 1.
- if문 조건 확인 : 1 % 2 == 1은 참이므로 continue로 인해 다시 반복문 처음으로 감.
② i = 1 일 때
- i++로 i = 2.
- if문 조건 확인 : 2 % 2 == 1은 거짓이므로 아래 문장 실행.
- sum = sum + i = 0 + 2 = 2. (sum = 2)
③ i = 2 일 때
- i++로 i = 3.
- if문 조건 확인 : 3 % 2 == 1은 참이므로 continue로 인해 다시 반복문 처음으로 감.
④ i = 3 일 때
- i++로 i = 4;
- if문 조건 확인 : 4 % 2 == 1은 거짓이므로 아래 문장 실행.
- sum = sum + i = 2 + 4 = 6. (sum = 6)
이렇게 반복문 진행하면 i가 2, 4, 6, 8, 10일 때 sum += i가 실행하므로 2 + 4 + 6 + 8 + 10 = 30을 출력.
[출력]
30
[4회]
05.
[출력결과]
00001010
public class Soojebi {
public static void main(String[] args) {
int []a = new int[8];
int i=0; int n=10;
while ( ① ) {
a[i++] = ② ;
n /= 2;
}
for (i=7; i>-0; i--) {
System.out.println(a[i]);
}
}
}
① n > 0
② n % 2
06.
[출력 결과]
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15
public class Soojebi {
public static void main(String[] args) {
int [][]a = new int[①][②];
for(int i=0; i<3; i++) {
for(int j=0; j<5; j++) {
a[i][j] = j*3+(i+1);
System.out.print(a[i][j] + " ");
}
System.out.println();
}
}
}
① 3
② 5
09.
lol = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
print(lol[0])
print(lol[2][1])
for sub in lol :
for item in sub :
print(item, end = '')
print()
1) lol = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] : lol 리스트 선언하면서 초기화.
1 lol[0][0] |
2 lol[0][1] |
3 lol[0][2] |
|
4 lol[1][0] |
5 lol[1][1] |
||
6 lol[2][0] |
7 lol[2][1] |
8 lol[2][2] |
9 lol[2][3] |
2) 출력
① print(lol[0]) : 첫 번째 행이 모두 출력. [1, 2, 3]
② print(lol[2][1]) : 위에서 메모리에 할당된 값은 7.
3) for문
① for sub in lol : sub라는 변수에 lol이라는 행들을 반복해서 저장.
② for item in sub : sub라는 요소만큼 반복하고, sub라는 요소들이 차례대로 item에 저장.
[출력]
[1, 2, 3]
7
123
45
678
18.
#include<stdio.h>
void main() {
char *p = "KOREA";
printf("%s\n", p);
printf("%s\n", p + 3);
printf("%c\n", *p);
printf("%c\n", *(p + 3));
printf("%c\n", *p + 2);
}
1) 포인터 변수 p 선언하면서 "KOREA" 저장.
P | K | O | R | E | A |
p는 100번지로 가정.
2) 출력
① printf("%s\n", p); → 포맷 스트링이 %s로 문자열을 출력하라는 의미. p주소부터 Null 만나기 전까지의 값을 출력하므로 KOREA.
② printf("%s\n", p + 3); → p+3은 p가 현재 100번지이므로 +3하면 103번지부터 Null 만나기 전까지의 값을 출력. EA
③ printf("%c\n", *p); → 포맷 스트링이 %c로 문자를 출력하라는 의미. p는 현재 100번지이므로 100번지인 K값 출력.
④ printf("%c\n", *(p + 3)); → p + 3의 값을 출력하므로, p는 100번지이고 +3하면 103번지의 값을 출력하므로 E를 출력.
⑤ printf("%c\n", *p + 2); → p의 값에서 +2한 문자를 출력 p는 현재 100번지이므로 K값에 +2한 K, L, M인 M을 출력.
[출력]
KOREA
EA
K
E
M
19.
class Parent {
public int compute(int num) {
if (num<=1) return num;
return compute(num-1) + compute(num-2);
}
}
class Child extends Parent {
public int compute(int num) {
if (num<=1) return num;
return compute(num-1) + compute(num-3);
}
}
public class Soojebi {
public static void main(String[] args) {
Parent obj = new Child();
System.out.println(obj.compute(4));
}
}
- 오버라이딩(Overriding) : 상위클래스로부터 상속받은 메서드를 하위클래스에서 재정의 → 매서드이름, 매개변수, 반환 타입은 동일해야 함.
- 오버로딩(Overloaing) : 메서드 이름은 동일하나 매개변수 개수 또는 타입을 다르게 지정.
▶ 메서드 오버라이딩의 형태(인자값의 개수가 같이 때문)
아버지가 날 낳은 형태로, 아버지가 가진 메서드만 사용가능하지만 자식이 메서드를 재정의 했으므로 자식이 재정의한 메서드를 사용해야 함.
1) obj.compute(4)
- 자식 클래스의 compute 메서드가 실행.
① compute(4) 호출 : 4 > 1이므로, compute(3) + compute(1)을 계산.
② compute(3) 호출 : 3 > 1이므로, compute(2) + compute(0)을 계산.
③ compute(2) 호출 : 2 > 1이므로, compute(1) + compute(-1)을 계산.
④ compute(1) 호출 : 1 <= 1이므로 1을 반환.
⑤ compute(0) 호출 : 0 <= 1이므로 0을 반환. ⑥ compute(-1) 호출 : -1 <= 1이므로 -1을 반환.
따라서 compute(4) = compute(3) + compute(1) = (compute(2) + compute(0)) + 1 = ((1 + (-1)) + 0 ) + 1 = 1
[출력]
1
'Studying > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기]_2021년 2회 (4) | 2024.10.10 |
---|---|
[정보처리기사 실기]_2021년 1회 (2) | 2024.10.10 |
[정보처리기사 실기]_2020년 4회 (3) | 2024.10.07 |
[정보처리기사 실기]_2020년 3회 (2) | 2024.10.05 |
[정보처리기사 실기]_2020년 2회 (0) | 2024.10.05 |