118. 데이터 입출력 (A)
//C
int result, a = 100, b = 200, c = 300;
result = a < b ? b++ : --c;
printf("%d, %d, %d\n", result, b, c);
200, 201, 300
a < b 이므로 result = b++이 된다.
b++은 후위계산이므로 result = 200, b = 201이 된다.
//C
int i, j;
scanf("%o#%x", &i, &j);
printf("%d %d", i, j);
입력
15#22
13 34
%o - 8진수
%x - 16진수
15 = $ 1 * 8^1 + 5 * 8^0 $ = 8 + 5 = 13
22 = $ 2 * 16^1 + 2 * 16^0 $ = 32 + 2 = 34
//C
int j = 024, k = 24, L = 0x24, hap;
hap = j + k + L;
printf("%d, %d, %d, %d\n", j, k, L, jap);
20, 24, 36, 80
024 - 8진수
0x24 - 16진수
j = $ 2 * 8^1 + 4 * 8^0 $ = 20
L = $ 2 * 16^1 + 4 * 16^0 $ = 36
//Java
public class Main {
public static void main(String[] args) {
int w = 3, x = 4, y = 3, z = 5;
if( (w == 2 | w == y) & !(y > z) & (1 == x ^ y != z) ) {
w = x + y;
if(7 == x ^ y != w)
System.out.println(w);
else
System.out.println(x);
} else {
w = y + z;
if(7 == y ^ z != w)
System.out.println(w);
else
System.out.println(z);
}
}
}
7
w = x + y = 7
결과 : 7
119. 제어문 (A)
public class Main {
public static void main(String[] args) {
int c = 1;
switch(3) {
case 1: c += 3;
case 2: c++;
case 3: c = 0;
case 4: c += 3;
case 5: c -= 10;
default: c--;
}
System.out.println(c);
}
}
-8
위의 코드는 break가 없기 때문에 case 3부터 switch가 종료될 때 까지 모든 문장을 실행한다.
120. 포인터 (A)
* 만약 char형 배열이면 주소는 1씩 증가 (1byte)
#include <stdio.h>
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);
}
KOREA
EA
K
E
M
#include <stdio.h>
int main() {
int* array[3];
int a = 12, b = 24, c = 36;
array[0] = &a;
array[1] = &b;
array[2] = &c;
printf("%d", *array[1] + **array + 1);
}
37
결론 : 24 + 12 + 1 = 37
121. 구조체 (A)
구조체 정의
struct sawon {
char name[10];
char jikwi[10];
int pay;
};
구조체 변수 선언
struct sawon ansan, *seoul;
sawon ansan : sawon 구조체 타입의 ansan 변수
*seoul : 구조체 포인터 변수, struct sawon *seoul; 로 선언도 가능
구조체 멤버 지정
ansan.name = "김한국";
ansan.jikwi = "대리";
ansan.pay = 40;
seoul->name = "홍길동";
seoul->jikwi = "과장";
seoul->pay = 50;
(*seoul).name = "홍길동";
(*seoul).jikwi = "과장";
(*seoul).pay = 50;
구조체 일반 변수에 '.' 을 찍어 사용하거나
구조체 포인터 변수에 '->'를 사용하거나
구조체 포인터 변수에 *를 사용하여 일반 포인터 변수처럼 사용할 수 있다.
#include <stdio.h>
struct jsu {
char nae[12];
int os, db, hab, hhab;
}
int main() {
struct jsu st[3] = { {"데이터1", 95, 88},
{"데이터2", 84, 91},
{"데이터3", 86, 75} };
struct jsu* p;
p = &st[0];
(p+1)->hab = (p+1)->os + (p+2)->db;
(p+1)->hhab = (p+1)->hab + p->os + p->db;
printf("%d", (p+1)->hab + (p+1)->hhab);
}
nae | os | db | hab | hhab | |
st[0] | 데이터1 | 95 | 88 | ||
st[1] | 데이터2 | 84 | 91 | 159 (p+1)->os = 84 (p+2)->db = 75 84 + 75 = 159 |
342 p->os = 95 p->db = 88 159+95+88 = 342 |
st[2] | 데이터3 | 86 | 75 |
(p+1)->hab + (p+1)->hhab = 159 + 342 = 501
122. 사용자 정의 함수 (A)
#include <stdio.h>
int factorial(int n);
main() {
int (*pf) (int);
pf = factorial;
printf("%d", pf(3));
}
int factorial(int n) {
if (n <= 1)
return 1;
else
return n * factorial(n-1);
}
int (*pf) (int)
-> 정수형 인수 한 개를 받는 정수형 함수 포인터 pf를 선언
- (*pf) : 함수가 저장된 곳의 위치를 저장하는 함수 포인터
- (int) : 함수가 전달받을 인수의 자료형
#include <stdio.h>
char n[30];
char* getname() {
printf("이름입력 : ");
gets(n);
return n;
}
main() {
char* n1 = getname();
char* n2 = getname();
char* n3 = getname();
printf("%s\n", n1);
printf("%s\n", n2);
printf("%s\n", n3);
}
"홍길동", "김철수", "박영희" 가 차례로 입력 될 때 출력은?
박영희
박영희
박영희
n 이 전역변수임
gets(n) -> n을 갱신시킴 (홍길동 -> 김철수 -> 박영희)
char* n1 = getname() 은 char* n1 = &n과 같음
즉, n1->n, n2->n, n3->n 을 가르킴
n1 = n2 = n3 = &n
그리하여 마지막으로 갱신된 n값 박영희가 3번 나옴
123. Java의 클래스 (A)
생성자
- 객체 변수를 생성하면서 초기화를 수행하는 메소드
class ClassA {
ClassA() {
System.out.print('A');
this.prn();
}
void prn() {
System.out.print('B');
}
}
class ClassB extends ClassA {
ClassB() {
super();
System.out.print('D');
}
void prn() {
System.out.print('E');
}
void prn(int x) {
System.out.print(x);
}
}
public class Main{
public static void main(String[] args) {
int x = 7;
ClassB cal = new ClassB();
cal.prn(x);
}
}
AED7
- ClassB()의 생성자로 이동
- super()를 통해 ClassB의 부모인 ClassA로 이동
- ClassA에서 'A' 출력
- this.prn()으로 ClassB의 prn()으로 이동하여 'E' 출력 -> ClassA의 prn이 있으나 ClassB에서 prn이 재정의 되었음
- super()밑의 'D'출력
- cal.prn(x)로 오버로딩된 prn(int x)로 이동하여 7 출력
class Parent {
int x = 1000;
Parent() {
this(3000);
}
Parent(int x) {
this.x = x;
}
}
class Child extends Parent {
int x = 4000;
Child() {
this(5000);
}
Child(int x) {
this.x = x;
}
int getX() {
return this.x;
}
}
public class Main {
public static void main(String[] args) {
Child c = new Child();
System.out.println(c.getX());
}
}
5000
- Child c = new Child() 를 통해 Child()로 이동한다.
- this(5000)을 통해 Child(int x)로 가는 것이 아닌, Parent()로 간다. -> 자식 생성자는 super()가 없어도 생략된 것. 그러므로 부모에게 한번 다녀온다.
- Parent() 안의 this(3000)을 통해 Parent.x = 3000이 된다.
- 부모 클래스가 종료되었으므로 다시 Child()로 이동한다
- Child()안의 this(5000)으로 넘어간다.
- Child(int x)의 x는 5000이므로 Child.x = 5000이 된다
- c.getX()는 Child.x를 리턴받아서 5000을 출력
124. Java의 활용 (A)
추상 메소드는 자식 클래스에서 재정의해야만 사용할 수 있는 메소드
abstract class ClassName { ... } 과 같이 사용
위와 같은 메소드를 포함하는 클래스를 추상 클래스라 함
이렇게 재정의한 메소드를 부모 클래스의 객체 변수를 통해 사용하려면
부모 클래스의 객체 변수를 선언할 때 자식 클래스의 생성자를 이용해야함
이것을 클래스의 형 변환이라 함
abstract class Animal { //추상 클래스, 만약 Animal a = new Animal(); 을 선언 시 오류 발생
String a = " is animal";
abstract void look(); // 추상 메소드 look()을 정의함
void show() {
System.out.println("zoo");
}
}
class Chicken extends Animal { // Animal을 부모 클래스로 지정하여 Animal에 속한 변수와 메소드를 상속 받음
public Chicken() {
look();
}
void look() { // Animal의 추상 메소드 look()을 재정의한 것
System.out.println("Chicken" + a);
}
void display() {
System.out.println("tow wings");
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Chicken();
a.show();
}
}
Chicken is animal
Zoo
abstract class Vehicle {
String name;
abstract public String getName(String val);
public String getName() {
return "Vehicle name : "+name;
}
}
class Car extends Vehicle {
private String name;
public Car(String val) {
name = super.name = val;
}
public String getName(String val) {
return "Car name : "+val;
}
public String getName(byte[] val) {
return "Car name : "+val;
}
}
public class Main {
public static void main(String[] args) {
Vehicle obj = new Car("Spark");
System.out.println(obj.getName());
}
}
Vehicle name : Spark
- Vehicle obj = new Car("Spark")를 통해 먼저 Car(String val)로 간다.
- name = super.name = val은 Car.name = "Spark", Vehicle.name = "Spark"가 된다.
- obj.getName()은 파라미터가 없다. 즉 Vehicle의 getName()을 호출한다.
class Parent {
int compute(int num) {
if(num <= 1) return num;
return compute(num-1) + compute(num-2);
}
}
class Child extends Parent {
int compute(int num) {
if(num <= 1) return num;
return compute(num-1) + compute(num-3);
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child();
System.out.println(obj.compute(4));
}
}
1
- Parent obj = new Child()로 인해 형 변환이 이루어짐
- obj.compute(4)는 Parent의 compute()가 아닌 Child에서 재정의된 compute()를 호출함
125. Python의 활용 1(A)
range
range(최종값)
range(초기값, 최종값)
range(초기값, 최종값, 증가값)
slice
a[초기위치:최종위치]
a[초기위치:최종위치:증가값]
생략할 경우
a[:] or a[::]
a[초기위치:]
a[:최종위치]
a[::증가값]
리스트 관련
- pop(위치)
- 위치 값 출력, 해당 값 삭제
- [10, 11, 12].pop(1) -> 11출력 후 [10, 12]
- index(값)
- 값이 지정된 요소의 index를 반환
- [10, 11, 12].index(12) -> 2
- count(값)
- 값과 같은 개수를 반환
- [1, 0, 1, 0, 0].count(0) -> 3
- extend(리스트)
- 리스트 뒤에 리스트를 붙임
- [1, 2].extend([3, 4]) -> [1, 2, 3, 4]
- reverse()
- 역순으로 뒤집음
- [1, 2, 3].reverse() -> [3, 2, 1]
- sort()
- copy()
세트 관련
- pop()
- 랜덤 값을 출력하고, 그 값을 삭제함
- {1, 2, 3}.pop() -> 2 출력, 2삭제
- add(값)
- 세트에 값을 추가함
- {1, 2, 3}.add(4) -> {1, 2, 3, 4}
- update(세트)
- 세트에 세트를 추가하여 확장함
- {1, 2, 3}.update({2, 3, 4, 5}) -> {1, 2, 3, 4, 5} (set는 중복을 허용하지 않음)
- remove(값)
a = 100
result = 0
for i in range(1, 3):
result = a >> i
result = result + 1
print(result)
26
100을 2진수로 표현하면 1100100
result = 으로 초기화하고 있으므로 i = 2일 때의 경우만 생각하면 됨.
result = a >> 2 : a 를 오른쪽으로 2번 쉬프트 = 11001
result = result + 1 : 11001 + 1 = 11010 = 26
a = "REMEMBER NOVEMBER"
b = a[0:3] + a[12:16]
c = "R AND %s" % "STR"
print(b+c)
REMEMBER AND STR
b = REM + EMBE
c = R AND STR
b+c = REMEMBER AND STR
%s 는 %뒤의 STR로 대응됨
126. Python의 활용 2 (A)
a = [1, 2, 3, 4, 5]
a = list(map(lambda num : num+100, a))
print(a)
a의 각 요소에 100씩 더하는 lambda 식을 적용한 후, 100씩 더해진 값들을 다시 리스트로 구성
lambda 변수명 : 수학식
def func(x):
return x * x - 3
print(func(10))
func = lambda x : x * x - 3
print(func(10))
위의 두 방식은동일한 방법
127. 절차적 프로그래밍 언어 (D)
일련의 처리 절차를 정해진 문법에 따라 순서대로
- C
- 시스템 프로그래밍 언어
- 고급과 저급 모두 가능
- ALGOL
- 수치 계싼, 논리 연산을 위한 과학 기술 계산용 언어
- PASCAL, C의 모체
- COBOL
- 사무 처리용
- 영어 문장 형식으로 구성
- FORTRAN
- 과학 기술 계산용
128. 객체지향 프로그래밍 언어 (D)
객체를 조립해서 프로그램을 작성
- JAVA
- 분산네트워크에 적용
- 멀티스레드 기능
- C++
- C언어에 객체지향 개념을 적용
- Smalltalk
- 최초의 GUI 제공
- 1세대 객체지향 프로그래밍 언어
129. 스크립트 언어
HTML 문서 안에 직접 프로그래밍 언어를 삽입하여 사용하는 언어
- 자바 스크립트
- VB 스크립트 (Visual Basic)
- MS에서 제작
- Active X를 사용
- ASP
- MS 제작
- Window에서만 사용 가능
- JSP
- Java로 만들어진 서버용 스크립트 언어
- PHP
- C, Java와 유사함, 웹 페이지 제작에 많이 사용
- Python
- 객체지향 기능을 지원하는 대화형 인터프리터언어
- 쉘 스크립트
- 유닉스/리눅스 계역 쉘에서 사용
- 선택형 : if, case
- 반복형 : for, while, until
- Basic
- 절차지향 지원하는 대화형 인터프리터 언어
- 쉬움
130. 라이브러리 (B)
자주 사용하는 함수나 데이터들을 미리 만들어 모은 집합체
2. C언어 라이브러리
- stdio.h
- 데이터 입출력 기능 제공
- printf, scanf, fprintf, fscanf, fclose, fopen 등
- math.h
- 수학 함수 제공
- sqrt, pow, abs 등
- string.h
- 문자열 처리 기능 제공
- strlen, strcpy, strcmp
- stdlib.h
- 난수 발생, 메모리 할당 기능 제공
- atoi, atof, srand, rand, malloc, free 등
- time.h
- 시간 처리 기능 제공
- time, clock 등
2. Java 라이브러리
- java.lang
- 자바기본 인터페이스, 자료형, 등
- import 문 없이도 사용 가능
- String, System, Process, Runtime, Math, Error 등
- java.util
- 날짜 처리, 난수 발생, 문자열처리 등 기능 제공
- Date, Calendar, Random, StringTokenizer 등
- java.io
- 파일 입출력 기능
- InputStream, OutputStream, Reader, Writer 등
- java.net
- 네트워크 관련 기능
- Socket, URL, InetAddress 등
- java.awt
- 사용자 인터페이스 관련
- Frame, Panel, Dialog, Button, Checkbox 등
4. Python 라이브러리
- 내장함수
- abs(), slice(), pow(), print() 등
- os
- 운영체제와 상호작용 기능
- getcwd(), chdir(), system()
- re
- 고급 문자열 처리
- findall(), sub() 등
- math
- 복잡한 수학 연산 기능
- cos(), log() 등
- random
- 무작위 선택 기능
- choice(), sample(), random(), randrange() 등
- statistics
- 통계값 산출 기능
- mean(), median(), variance() 등
- datetime
- 날짜와 시간 조작 기능
- today(), date(), strftime() 등
'정보처리기사 > 실기' 카테고리의 다른 글
정보처리기사 실기 11장 - 응용 SW 기초 기술 활용 (5) | 2024.07.22 |
---|---|
10장 오답 (1) | 2024.07.22 |
정보처리기사 실기 9장 - 소프트웨어 개발 보안 구축 (3) | 2024.07.15 |
정보처리기사 실기 8장 - SQL 응용 (0) | 2024.07.13 |
정보처리기사 실기 7장 - 애플리케이션 테스트 관리 (0) | 2024.07.09 |
댓글