정보처리기사 공부

すんす·2025년 9월 4일

C언어 연산자 - OR연산일때 앞에 1이 되서 성립되면 뒤는 실행하지 않음

int x=3, y=4, z=2;

while(x-- > 0) {
	if(y++ < 5 || --z > 1 && x > 1)
		z += x;
	else
		y += z;
}
printf("%d, %d, %d\n", x,y,z);
//1회차
/*
첫 while문 조건
3-- > 0
x=2
if문 y=4++<5 true OR연산일때 앞에 1이 되서 성립되면 뒤는 실행하지 않음
y=5
z+=x; 2+2=4 z=4
x=2 y=5 z=4 -
*/
//2회차
/*
while문
x-- > 0
x=1

if문
5++ < 5 false 
y=6
--z > 1 && x > 1
z=3 > 1 && 1 > 1 = 1 && 0 -> 0

y += z;
x=1 y=9 z=3
*/
//3회차
/*
while문
x-- > 0
x=0

if문
9++ < 5 false 
y=10
--z > 1 && x > 1
z=2 > 1 && 0 > 1 = 1 && 0 -> 0

y += z;
x=0 y=12 z=2
*/

//4회차
/*
x-- > 0 x가 0이기에 while 조건이 성립하지 않아서 종료
x=-1 
*/

-1, 12, 2

c언어 재귀 함수 - return

int mystFunc(int x, int y) {
	if(x<2){
		x = y-x;
		return x;
} else {
		int nX = x-2;
		int nY = y-x;
		int ret = mystFunc(nX,nY);
		printf("%d, %d, %d, %d\n", x,y,nX,nY);
		return ret + x;
		}
	}
	
int main() {
	int result = mystFunc(5, 14);
	printf("%d\n", result);
	return 0;
}
x=5 y=14
nX=3
nY=9

ret = mystFunc(3, 9);
x=3 y=9 nX=1 nY=6

ret = mystFunc(1, 6)
x=y-x -> x=6-1
return x -> return 5
ret=5
x=3 y=9 nX=1 nY=6 ret=5
printf("%d, %d, %d, %d\n", x,y,nX,nY); //3, 9, 1, 6 출력

return ret + x; //5+3=8
x=5 y=14 nX=3 nY=9 ret=8
printf("%d, %d, %d, %d\n", x,y,nX,nY); //5, 14, 3, 9 출력

return ret + x; //8+5=13

result=13
printf("%d\n", result); //13 출력

3, 9, 1, 6

5, 14, 3, 9

13

JAVA 오버라이딩

class A{
	int num = 50;
	public A(){
		System.out.print("X");
	}
	public A(int n) {
		System.out.print("Y");
	}
	public voide printNum(){
		System.out.print(num);	
	}
}

class B extends A{
	int num = 100;
	public B() {
		System.out.print("A");
	}
	public B(int n) {
		super(n);
		System.out.print("B");
	}
	public void printNum()
		System.out.print(n);
 }
}

class C extends B{
	int num = 200;
	public C() {
		System.out.print("C");
	}
	public C(int n) {
		super(n);
		System.out.print("D");
	}
	public void printNum() {
		System.out.print(num);
	}
	public void show() {
		System.out.pritnt("E");
	}
	
	public static void main(String[]{
		A a1 = new C(); 
		B b1 = new C(5);
		A a2 = new B();
		
		a1.printNum();
		b1.printNum();
		a2.printNum();
		}
	}
	A a1 = new C(); //부모를 받음
	B b1 = new C(5);
	A a2 = new B();
	
1. A a1 = new C();
//생성자 C의 부모 B로 갔다 B의 부모 A로 가고 먼저 변수를 미리 저장함 
//A.num = 50 저장
System.out.print("X"); // X 출력
//A가 끝나면 B로 가서 먼저 B의 변수를 미리 저장
//B.num = 100 저장
System.out.print("A"); //A 출력
//B가 끝나면 C로 가서 먼저 C의 변수를 미리 저장 
//C.num = 200 저장
System.out.print("C"); //C 출력 

2. B b1 = new C(5);
//생성자 c에 인자를 보고 간다
public C(int n) {
		super(n);
		System.out.print("D");
	}
//super가 있기에 인자를 가지고 가고 없다면 그냥 인자가 없는 public B()로 간다.
//부모 B로 가서 super가 있기에 부모 A에 간다.
//먼저 A의 변수를 미리 저장
//A.num = 50 저장
System.out.print("Y"); //Y 출력
//A가 끝나면 B로가서 B의 변수를 미리 저장
//B.num = 100 저장
System.out.print("B"); //B 출력
//B가 끝나면 C로 가서 C의 변수를 미리 저장
//C.num = 200 저장
System.out.print("D"); //D 출력

3. A a2 = new B(); 
//생성자 B의 부모 A로 가서 미리 A의 변수를 저장
//A.num = 50
System.out.print("X"); //X 출력
//A가 끝나면 B로 가서 먼저 B의 변수를 미리 저장
//B.num = 100 저장
System.out.print("A"); //A 출력

4. a1.printNum(); //생성자 최종으로 오버라이딩한 printNum
	public void printNum() { //C의 printNum 
		System.out.print(num);
	} 
	//C의 num 200 출력 - 만약 num이 없다면 부모의 num 부모의 num도 없다면 그 부모의 num을 사용
	
5. b1.printNum(); //생성자 최종으로 오버라이딩한 printNum
	//C의 num 200 출력

6.a2.printNum(); //생성자 기준으로 최종으로 오버라이딩한 printNum
	//B의 NUM 100출력

XACYBDXA200200100

class Animal {
    String type = "동물"; // Animal 클래스의 type 변수

    public void eat() {
        System.out.println(type + "이(가) 먹이를 먹습니다.");
    }
}

class Dog extends Animal {
    String type = "개"; // Dog 클래스의 type 변수 (Animal의 type을 숨김)

    // eat 메서드는 오버라이딩하지 않았음
}

class Cat extends Animal {
    String type = "고양이"; // Cat 클래스의 type 변수 (Animal의 type을 숨김)

    @Override
    public void eat() { // eat 메서드 오버라이딩
        System.out.println(type + "이(가) 생선을 먹습니다.");
    }
}

public class FieldHidingExample {
    public static void main(String[] args) {
        // Case 1: Animal 타입으로 선언하고 Dog 인스턴스 할당
        Animal animalRef1 = new Dog();
        System.out.println("animalRef1.type: " + animalRef1.type); 
        // 선언된 타입 Animal의 type에 접근

        // Case 2: Dog 타입으로 선언하고 Dog 인스턴스 할당
        Dog dogRef = new Dog();
        System.out.println("dogRef.type: " + dogRef.type);       
        // 선언된 타입 Dog의 type에 접근

        // Case 3: Animal 타입으로 선언하고 Cat 인스턴스 할당
        Animal animalRef2 = new Cat();
        System.out.println("animalRef2.type: " + animalRef2.type); 
        // 선언된 타입 Animal의 type에 접근

        System.out.println("--- 메서드 호출 ---");
        animalRef1.eat(); // 실제 인스턴스(Dog)에 오버라이딩된 eat이 없으므로 Animal의 eat 호출
        animalRef2.eat(); // 실제 인스턴스(Cat)에 오버라이딩된 eat이 있으므로 Cat의 eat 호출
    }
}
    //변수를 출력할 땐 앞에 타입을 보고 출력함
    Animal animalRef1 = new Dog();
    System.out.println("animalRef1.type: " + animalRef1.type); 
    //animalRef1.type - 선언된 Animal 타입의 type을 출력
    
     Dog dogRef = new Dog();
     System.out.println("dogRef.type: " + dogRef.type);
     //dogRef.type - 선언된 dog 타입의 type을 출력
     
     Animal animalRef2 = new Cat();
     System.out.println("animalRef2.type: " + animalRef2.type);
     //선언된 Animal 타입의 type 출력
    
    //생성자 호출은 최종적으로 오버라이딩된 것을 출력
     animalRef1.eat();  
     //dog에서 오버라이딩 되지 않았기에 부모의 eat 출력
     animalRef2.eat();
     //cat에서 최종적으로 오버라이딩 되었기에 cat의 eat출력   

파이썬 - 리스트 컴프리헨션

arr = [1, 2, 3, 4, 5]
result = [arr.pop(0) * i for i in arr if i% 2 == 1]
print(result);
0result = [arr.pop(0) * i for i in arr if i% 2 == 1]

1. i for i in arr if i% 2 == 1
//i는 arr의 값을 가져와야한다.
//첫번째 i가 배열 값 1 - 1 % 2 == 1 
//arr에서 pop(0) = 1을 가져온다. arr = [2, 3, 4, 5]
//1*1 = 1 result = [1]

2. //두번째  2 % 2 = 0 X

3. //세번째  i는 배열 값 3 - 3 % 2 = 1
//arr에서 pop(0) = 2를 가져온다. arr = [3, 4, 5]
//2 * 3 = 6 result = [1, 6]

4. //i가 4일때 4 % 2 = 2

5. //i가 5일때 5 % 2 = 1
//arr에서 pop(0) 가져온다. arr = [4, 5]
//3 * 5 = 15 result = [1, 6, 15]

6. print(result);
//따라서 [1, 6, 15]

C언어 - ~연산자

int a1 = 6;
int a2 = -6;
int b = 5;

int result1 = (a1 & b) | (~a1);
int result2 = (a2 & b) | (~a2);

printf("양수 : %d\n", result1);
printf("음수 : %d\n", result2);

/*
음수 바꾸는 법 
0을 1로 1을 0으로 바꾸고 +1
양수로 바꾸는법
0을 1로 1을 0으로 바꾸고 +1
*/

양수 : -3
음수 : 5

C언어 - union

char i;
union {
	int int_arr[2];
	char char_arr[8]
} endian;

for(i=0; i<8; i++)
	endian.char_arr[i]=i+16;
	
print("%x", endian.int_arr[1]);

union - 멤버들이 같은 메모리 공간을 사용

char1 바이트 char_arr 8바이트
int_arr 4바이트 2개

char_arr
16 17 18 19 20 21 22 23
int_arr[0] = 16 17 18 19 
int_arr[1] = 20 21 22 23

%x = 16진수로 표현 -> 14, 15, 16, 17
print("%x", endian.int_arr[1]);

리틀 엔디안 방식으로 사용하는 시스템 이라면
17161514   

C언어 - 재귀함수

int rec(int n){
	int sum;
	if(n>2) {
		sum = rec(n-1) + rec(n-2);
		printf("%d", sum);
		}
	else
		sum = n;
	return sum;
}
int result;
result = rec(5);
printf("%d", result);
					 r(5)
						/
				   /
		r(4) + r(3)
				/     \
			 /       \
	r(3) + r(2)   r(2) + r(1)
		 /
		/ 
r(2) + r(1)

r(2) + r(1)
s:2    s:1
r(3) -> sum = 2+1 //3 출력 r(3) = 3

r(3) + r(2) //r(3)=3 r(2)=2
r(4) -> sum = 3+2 //5 출력 r(4) = 5

r(4) + r(3) //r(4) = 5 r(3) = 3
오른쪽 r(3)의 sum = 2+1 //3 출력 전반적으로 sum으로 합으로 인해 발생되면 출력해야함
r(4)의 sum = 5+3 //8 출력

printf("%d", result); ///r(5) 8 출력

35388

void func(int a, int b, int c)
{
	if(c!=0)
		fun(b, a+b, c-1);
		printf("%d, %d, %d \n", a,b,c);
		}
}

int i=1, j=1, k=3;
fun(i, j, k);
fun(i, j, k);
a=1, b=1, k=3

fun(b, a+b, c-1);
//fun(1, 2, 2); 1, 1, 3 저장

fun(b, a+b, c-1);
//fun(2, 3, 1); 1, 2, 2 저장

fun(b, a+b, c-1);
//fun(3, 5, 0); //c!=0이라 종료  2, 3, 1 저장

//모든 fun 재귀함수가 끝나서 print 실행
printf("%d, %d, %d \n", a,b,c);
//스택형이라 마지막부터 출력

2, 3, 1
1, 2, 2
1, 1, 3

C언어 - 포인트 1차원 배열

int a[3] = {-3, 14, 5}; //1차원 배열
int *p = &a[1];
printf("%d ", a[1]);
printf("%d ", p[1]); 
a 100
&a 100
&a[0] 100

int *p = &a[1];//a[1] 104 주소 값을 받는다.
printf("%d, ", a[1]); //14,
printf("%d ", p[1]); //5
//첫번째 시작하는 것이 0번 인덱스이다.
//따라서 p 입장에서 104주소값을 가진 14가 0 인덱스가 된다.
14, 5

C언어 - 포인트 2차원 배열

int a[2][3] = {{-3, 14, 5} , {1, -10, 8}};
int *p = &a[1];
printf("%d, ", a[1][1]);
printf("%d " , p[1]);
-3 14 5
1 -10 8

a[0] -3 14 5 //-3이 주소가 100이라고 함
a[1] 1 -10 8 // 1의 주소가 112라고 함 
//-3이 a[0]의 대표 주소 100, 1이 a[1]의 대표 주소 112

int *p = a[1]; //a[1]의 주소 값을 112 저장

printf("%d, ", a[1][1]); //-10 출력
printf("%d " , p[1]); //p[1]은 112 주소를 저장 대표인 a[1]의 위치의 1번 인덱스 -10 출력

-10, -10
int a[2][3] = {{-3, 14, 5} , {1, -10, 8}};
int *b[] = {a[0], a[1]};
int *p = b[1];
printf("%d, ", *b[1]);
printf("%d, ", *(++p));
printf("%d", *(--p-2));
a[0] -3 14 5 //-3이 주소가 100이라고 함
a[1] 1 -10 8 // 1의 주소가 103라고 함 
//-3이 a[0]의 대표 주소 100, 1이 a[1]의 대표 주소 103

int *b[] = {a[0], a[1]};
//b에 100번지, 103번지 저장
int *p = b[1];
//p의 a[1]의 103번지 저장

printf("%d, ", *b[1]); //103번지 1 출력 
printf("%d, ", *(++p)); //103번지의 전위 연산자는 p의 내에도 대입 된다.
//p: 103 -> 104 104번지 -10 출력, p 104

printf("%d", *(--p-2));
//p 104 --p하면 103이 되지만 -2는 대입이 되지않는다. 101번 14 출력 되며 p의 주소는 103

1, -10, 14 

C언어 - 구조체

#include<studio.h>
int main(){
	struct list{
		int *fp;
	} data, *p //data - *fp 구조체 변수 선언
	//*p 포인터 변수 선언
	int x[] = {100, 200, 300 ,400};
	p = &data;
	p -> fp = x + 1
	printf("%d", *(++p->fp));
	return 0;
}	
data - *fp //2000번지
*p //3000번지

int x[] = {100, 200, 300 ,400};
100 - 1000번지
200 - 1001번지
300 - 1002번지
400 - 1003번지

p = &data; //p에 data의 주소값 2000번을 넣는다. p는 포인터 변수 위에 선언했기 때문    
p->fp = x+1; //data가 가지고있는 fp에 x+1 1000+1 1001번지를 저장
//일반 변수는 p.fp 포인터 변수는 p->fp

printf("%d", *(++p->fp));
//data의 fp가 1002번지 300 출력 

300

C언어 - 더블 포인터

int x = 5, y = 10;
int *p1 = &x;
int *p2 = &y;
int **dptr = &p1;

**dptr += 2;
*dptr = p2;
**dptr *= 3;

printf("%d, %d, %d, %d\n", x, y, *p1, *p2);
 x의 주소값 100 = 5
 y의 주소값 200 = 10
 
 100 x 5
 200 y 10
 300 p1 100
 400 p2 200
 500 dptr 300
 
 int *p1 = &x; //p1에 100번 저장 p1의 주소값은 300
 //why? p1 포인터 변수가 메모리상으로 올라가기에
 int *p2 = &y; //p2에 200번 저장, p2는 400번지
 int **dptr = &p1; //dptr에 p1의 주소값 300번지 저장 dptr의 주소값은 500
 
**dptr += 2; //*300 - 300번지의 값 - *100 - 100번지의 값 -> 5+2=7 x=7
*dptr = p2; //*300 - 300번지의 값에다가 p2의 값을 넣는다. 
//300 p1 200 - p2를 200을 넣는다 
**dptr *= 3; //*300 -> *200 -> 10*3 = 30 y = 30

printf("%d, %d, %d, %d\n", x, y, *p1, *p2);
7, 30, 30, 30

언어 별 true false

C언어

1

0

자바

true

false

파이썬

True

False

JAVA - 객체 생성시 변수 초기화

class Parent {
	public Parent(){
		System.out.println("1");
		display();
	}
	public void display(){
		System.out.println("Super");
	}
}

class Child extends Parent {
	private String info = "Child Info";
	private int count = 100;
	public Child(){
		System.out.println("2");
	}
	public void display(){
		System.out.println(info);
		System.out.println(count);
		}
}

public static void main(String[] args){
	Parent obj1 = new Parent();
	Parent obj2 = new Child();
}
1. main의 Parent obj1 = new Parent(); //생성자 생성
//부모 메모리 초기화
//부모 생성자 실행
2. public Parent(){ //생성자가 실행 된다.
	System.out.println("1"); //1 출력
	display(); //display 메서드 실행
}
3. Parent()의 display
	public void display(){
		System.out.println("Super"); //Super 출력
	}
}
4. main의 Parent obj2 = new Child(); //생성자 실행
public Child(){ //super가 없기에 부모의 default 생성자 자동 호출
		System.out.println("2");
}
5.
public Parent(){
		System.out.println("1"); //1 출력
		display(); //생성자 Child의 최종적으로 오버라이딩한 메서드를 호출
	}
6.	Child의 display 메서드
public void display(){
		System.out.println(info);  //null 출력
		System.out.println(count); //0 출력
//아직 부모의 메서드가 끝나지 않아서 아직 
//자식 생성자가 생성되지않아 멤버 변수가 메모리상에 저장되지 않았다.
} 

7. public Child(){ 
//obj2의 멤버 변수를 초기화 메모리상에 저장 
//obj2 생성자 실행
		System.out.println("2"); //2출력
1
Super
1
null
0
2

C언어 주요 함수

malloc - 동적으로 메모리 할당

calloc - 할당된 메모리 공간을 0으로 초기화

realloc - 이미 할당된 메모리 크기를 변경

free() - 동적으로 할당된 메모리 해제

문자열 처리 함수 <string.h>

strcpy(dest, src) - src 문자열을 dest로 복사

strncpy(dest, src, n) - src 문자열의 처음 n개 문자를 dest로 복사

strcat(dest, src) - src문자열을 dest 뒤에 붙임

strncat(dest, src, n) - src문자열의 처음 n개 문자를 dest 뒤에 붙임

strcmp(s1, s2) - 두 문자열 s1과 s2 비교 → 같으면 0, s1이 크면 양수, s2가 크면 음수 출력

strncmp(s1, s2, n) - 두 문자열의 처음 n개 문자를 비교

strlen(s) - 문자열 s의 길이 반환

수학 함수 <math.h>

sqrt(x) - x의 제곱근을 반환

pow(base, exp) - base의 exp 제곱을 반환

fabs(x) - x의 절대값 반환

union - 여러 자료형의 변수들이 메모리 공간을 공유하는 자료형

python

chr(i) - 정수 값 i에 해당하는 문자를 반환 ex) chr(65) → A

ord(c) - c에 해당하는 ASCII 정수 값으로 반환 → 67

len(s) - 길이 반환

str.upper() - 대문자

str.lower() - 소문자

str.strip() - 공백 제거

str.split() - 문자열을 특정 구분자를 기준으로 분리하여 리스트로 반환

str.join(list) - 리스트의 문자열을 특정 구분자로 연결하여 하나의 문자열로 만듬

수학 함수

abs(x) - 절대값 반환

max() - 최대값 반환

min() - 최솟값 반환

sum() - 합

round(x, n) - x를 n번째 소수점 자리에서 반올림

divmod(a, b) - a를 b로 나눠 (몫, 나머지) 반환

컬렉션 함수

append() - 리스트 끝에 요소 추가

insert(index, item) - 리스트의 특정 위치에 요소를 삽입

pop() - 리스트의 마지막 요소 또는 특정 인덱스의 요소를 제거하고 반환

remove(item) - 리스트에서 특정 값을 가진 첫 번째 요소를 제거

sort() - 리스트 정렬

sorted(iterable) - iterable 객체를 정렬한 새로운 리스트를 반환

keys() - 딕셔너리의 모든 키를 반환

values() 딕셔너리의 모든 값을 반환

items() - 딕셔너리의 모든 키- 값 쌍을 반환

0개의 댓글