Chapter 01. 기본 문법 활용하기

🔊 수제비 2022 정보처리기사 실기 교재로 공부하면서 스스로 좀 더 학습해야되고, 기억해야되는 부분을 개인적으로 정리한 내용입니다.
      (저는 C를 아예 몰라서, C 코드에 대한 내용이 많습니다)

1️⃣ 프로그래밍을 위한 기본 사항

⑴ 진수

1️⃣ 진수(Antilogarithm) 개념

  • 특정 개수의 숫자만을 이용하여 수를 나타내는 수 체계이다.
  • 10진수 이하일 때는 0~9를 사용하지만, 10진수 초과할 경우는 영어 알파벳을 이용한다.
10진수 16진수
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 A
11 B
12 C
13 D
14 E
15 F

2️⃣ 진수 변환

  • ① 10진수를 n진수로 변환
    • 10진수 값을 몫이 n보다 작을 때까지 n으로 나누고 나머지 값들을 표시한 후에 나머지 값들을 읽는다. (교재 예제보기)
  • ② n진수를 10진수로 변환
    • n진수에서 마지막 자리는 자리 숫자에 자릿값인 n0을 곱하고, 마지막에서 두 번째 자리 숫자에 자릿값인 n1을 곱하고, 마지막에서 세 번째 자리는 자리 숫자에 자릿값인 n2를 곱하고, … 자리 숫자와 자릿값을 더해 10진수를 계산한다. (교재 예제보기)

⑵ 아스키 코드

1️⃣ 아스키 코드(ASCII; American Standard Code for Information Interchange) 개념

  • 미국 ANSI에서 표준화한 정보교환용 부호체계이다.
  • 영문 키보드로 입력할 수 있는 모든 기호가 할당된 기본적인 부호체계이다.

2️⃣ 주요 아스키 코드

10진수 부호 10진수 부호 10진수 부호
0 NULL 65 A 97 a
32 ’ ‘ (Space) 66 B 98 b
48 0 67 C 99 c
49 1 68 D 100 d
#include <stdio.h>
void main(){
    char a;
    a = 'A' + 2;
    // 'A'는 65에 2를 더하면 a라는 변수에 67이 저장됨
    
    printf("%d %c", a, a);
    // %d는 10진수 출력이므로 67이 출력,
    // %c는 코드를 출력하므로 'C'를 출력
}
/* 	출력
	67 c
*/

2️⃣ 변수 활용

⑵ 기본 저장 공간

1️⃣ 변수

① 일반 변수

㉮ 변수(Variable)의 개념

  • 변수는 저장하고자 하는 어떠한 값이 있을 때, 그 값을 주기억장치에 기억하기 위한 공간이다.
② static 변수
  • static 변수는 프로그램이 시작될 때 변수를 초기화하고, 프로그램이 종료되기 전까지 메모리가 유지되는 변수이다.
  • 변수를 static으로 생성하면 처음에 한 번만 초기화가 되며, 함수에 의해서 변수 선언 부분이 여러 번 호출되더라도 초기화하지 않는다.
㉮ C 언어의 static 변수
  • C 언어 static 변수 예제

    #include <stdio.h>
    void increase(){
        static int count = 0; // static 정수형 변수 count를 선언과 동시에 0으로 초기화
          
        printf("count=%d\n", count); // count 값을 화면에 출력함
        count++;
    }
      
    void main(){
        increase();
        increase();
    }
    /* 	출력
    	count=0
    	count=1
    */ /*
    - static 변수는 프로그램이 종료하기 전까지 변수가 사라지지 않고 계속 유지된다.
    - increase 함수를 호출할 때 count는 static 변수이므로 처음 한 번만 count 값이 0으로 초기화되고,
      increase 함수를 두 번째 호출할 때 static int count = 0;을 만나더라도 count를 0으로
      초기화하지 않는다.
    */
    

2️⃣ 배열

② 1차원 배열 선언
㉮ C 언어의 1차원 배열 선언
구분 선언
초깃값이 없는 경우 타입 배열명[배열_요소_개수]
초깃값이 있는 경우 타입 배열명[배열_요소_개수] = {초깃값};
  • 배열 요소 개수에 정의된 숫자만큼 같은 타입의 데이터 공간이 할당된다.
  • 초깃값을 선언하지 않을 경우 쓰레깃값이 저장된다.
  • 배열 요소 개수보다 적은 개수만큼 초기화할 경우 초깃값이 명시되지 않은 값들은 자동으로 0으로 초기화된다.
int a[5] = {1, 2};
/* 배열 요소 개수는 5개이므로 5개의 공간이 잡히고, 초깃값은 1, 2로
   두 개만 명시되어 있으므로 나머지 3개의 공간은 0으로 초기화
*/
  • C 언어 배열 선언 및 출력 예제
#include <stdio.h>
void main(){
    int a[4] = {1, 2}; // a 배열의 요소 개수는 4개지만, 초깃값은 1, 2로
                       // 두 개만 명시되어 있으므로 나머지 2개의 공간은 0으로 초기화
    int i;
    
    for(i=0; i<4; i++)
        printf("%d\n", a[i]);
}
/* 	출력
	1
	2
	0
	0
*/
③ 2차원 배열 선언
㉮ C 언어의 2차원 배열 선언
구분 선언
초깃값이 없는 경우 타입 배열명[행의 개수][열의 개수];
초깃값이 있는 경우 타입 배열명[행의 개수][열의 개수] = {초깃값};
  • (행의 개수) x (열의 개수)에 정의된 숫자만큼 같은 타입의 데이터 공간이 할당된다.
  • 초깃값을 선언하지 않으면 쓰레깃값이 저장된다.
  • (행의 개수) x (열의 개수)보다 적은 개수만큼 초기화할 경우 초깃값이 명시되지 않은 값들은 0으로 초기화된다.

  • 2차원 배열의 행과 열
    • 2차원 배열이어도 실제 메모리에는 1차원으로 저장되기 때문에 행과 열은 가상의 개념이다. 그래서 타입 배열명[열의 개수][행의 개수];로 표현하기도 한다. (수제비 책에서는 [행][열] 개념으로 설명한다.)

3️⃣ 포인터

① 포인터(Pointer) 개념

포인터는 변수의 주솟값을 저장하는 공간이다. (교재 그림 참고)

② 포인터 선언
데이터 타입* 포인터_변수명 = &변수명;
  • 데이터 타입 뒤에 *를 붙이면 주소를 저장하는 포인터 변수라는 의미이고,
    일반 변수명에 &를 붙이면 해당 변수명의 주솟값이다.

  • int형 변수를 가리키는 포인터 변수 선언시 int*를, char형 변수를 가리키는 포인터 변수 선언 시 char*를, float형 변수를 가리키는 포인터 변수 선언 시 float*를 사용해야 한다.

  • 주소에 해당하는 값을 가리킬 때에는 *를 사용한다.

    // 예)
    int a = 10;
    int* b = &a;
    printf("%d %d", a, *b);
    // b가 가리키는(*) 값은 a이므로 *b와 a는 값이 같음
    

4️⃣ 배열과 포인터

① 1차원 배열과 1차원 포인터
  • 1차원 배열에서 배열명만 단독으로 사용할 경우 1차원 포인터와 동일하다.
  • 1차원 배열일 때 배열명[요소] 형태, *(배열명+요소), 1차원 포인터일 때 포인터[요소] 형태, *(포인터+요소)일 경우 값을 가리킨다.
  • 데이터_타입 배열명[요소];일 때 다음 코드는 동일하다
배열의 주소와 0번지 값
구분 코드
배열의 주소 배열명 == &배열명[0];
배열의 0번지 값 배열명[0] == *배열명;
int a[4];일 때 a 배열의 주소인 a는 &a[0]와 동일하고, a의 0번지 값인 a[0]은 *a와 동일하다.
C 언어 1차원 배열과 1차원 포인터
#include <stdio.h>
void main(){
    int a[3] = {1, 2}; /* a 배열의 요소 개수는 3개지만, 초깃값은 1, 2만 명시되어 있으므로
                          나머지 1개의 공간은 0으로 초기화 */
    int *p = a;
    
    printf("%d %d %d\n", a[0], a[1], a[2]); // a 배열의 0번지, 1번지, 2번지 값을 출력
    
    printf("%d %d %d\n", *a, *(a+1), *(a+2));
    /* a만 단독으로 쓰면 포인터이므로 a가 가리키는 값,
       a+1이 가리키는 값, a+2가 가리키는 값 출력
    */
    
    
    printf("%d %d %d\n", *p, *(p+1), *(p+2));
    /* p는 a랑 동일하므로 *p, *(p+1), *(p+2)는 각각
       *a, *(a+1), *(a+2)와 동일하게 출력
    */
    
    printf("%d %d %d\n", p[0], p[1], p[2]);
    /* p는 a랑 동일하므로 p[0], p[1], p[2]는
       a[0], a[1], a[2]와 동일하게 출력
    */
}
/* 	출력
	1 2 0
	1 2 0
	1 2 0
	1 2 0
*/

/*
	(a+1)은 a가 가리키고 있는 값에서 1칸 떨어진 곳의 주소라는 뜻
	*(a+1)은 a가 가리키고 있는 값에서 1칸 떨어진 곳의 주소가 가리키는 값이라는 뜻
*/
② 2차원 배열과 1차원 포인터
  • 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일하다.
  • 2차원 배열일 때 배열명[요소] 형태, *(배열명+요소)는 1차원 포인터와 동일하고, 1차원 포인터에 대해 *과 [ ]을 이용해야 값을 가리킬 수 있다.
C 언어 2차원 배열과 1차원 포인터 예제
#include <stdio.h>
void main(){
    int a[3][2] = {1, 2, 3, 4, 5, 6}; // 2차원 배열 선언
    int *p = a[1]; /* a 배열의 1번지 주소(1차원 포인터)를
    p라는 1차원 포인터 변수에 저장 */
    
    printf("%d %d %d\n", *a[0], *a[1], *a[2]);
    // a[] 형태는 1차원 포인터와 같으므로 *을 붙이면 값을 가리킬 수 있음
    
    printf("%d %d %d\n", **a, **(a+1), **(a+1));
    // a 형태는 2차원 포인터와 같으므로 *을 두 번 붙여야 값을 가리킬 수 있음
    
    printf("%d %d\n", *p, *(p+1)); /* p는 a[1]이라고 초기화를 했으므로
    *p는 각각 a[1]이 가리키는 값인 a[1][0]을 출력하고, *(p+1)는 a[1]이 가리키는
    &a[1][0]에서 한 칸 뒤의 값인 a[1][1]의 값을 출력 */
    
    printf("%d %d\n", p[0], p[1]); /* *p와 p[0]는 동일하고
    *(p+1)은 p[1]과 동일하므로 a[1][0], a[1][1] 값이 출력됨 */
}
/*	출력
	1 3 5
	1 3 5
	3 4
	3 4
*/	
③ 2차원 배열과 포인터 배열
C 언어 2차원 배열과 포인터 배열
#include <stdio.h>
void main(){
    int a[3][2] = {1, 2, 3, 4, 5, 6};
    int *p[3] = {a[2], a[0], a[1]};
    
    
    printf("%d %d %d\n", a[0][0], a[1][0], a[2][0]);
    
    printf("%d %d %d\n", *a[0], *a[1], *a[2]);
    
    
    printf("%d %d %d\n", p[1][0], p[2][0], p[0][0]);
    /*	p[1]은 a[0]이므로 p[1][0]은 a[0][0]를 출력,
    	p[2]는 a[1]이므로 p[2][0]은 a[1][0]를 출력,
    	p[0]는 a[2]이므로 p[0][0]은 a[2][0]를 출력 */
    
    
    printf("%d %d %d\n", *p[1], *p[2], *p[0]);
    /* 	p[1][0]과 *p[1]과 동일하고,
    	p[2][0]과 *p[2]와 동일하고,
        p[0][0]과 *p[0]이 동일 */
}
/*	출력
	1 3 5
	1 3 5
	1 3 5
	1 3 5
*/	
④ 2차원 배열과 2차원 포인터
  • 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일하다.
  • 2차원 배열일 때 배열명[요소][요소], *배열명[요소], **(배열명+요소)일 경우 값을 가리킨다.
C 언어 2차원 배열과 2차원 포인터 예제
#include <stdio.h>
void main(){
    int a[3][2] = {1, 2, 3, 4, 5, 6};
    int (*p)[2] = a;
    		
    int (*q)[2] = a+1;
    /* 	p, q라는 2차원 배열 변수에 a 배열의 0, 1번지 주소를
        2차원 포인터 변수에 저장(a는 2차원 배열로 
        a만 단독으로 사용하면 2차원 포인터이므로
        2차원 포인터 형태로 선언) */
    
    // a를 2차원 배열 형태로 출력
    printf("%d %d %d\n", a[0][0], a[0][1], a[1][0]);
    
    // p는 2차원 포인터로 a랑 같으므로 2차원 배열처럼 사용 가능
    printf("%d %d %d\n", p[0][0], p[0][1], p[1][0]);
    
    // q는 2차원 포인터로 a[1][0] 번째를 시작점으로 2차원 배열과 동일하게 사용 가능
    printf("%d %d %d\n", q[0][0], q[0][1], q[1][0]);
}
/*	출력
	1 2 3
	1 2 3
	3 4 5 
*/
⑤ 1차원 배열과 문자열
  • 문자열을 초기화할 때 마지막에 NULL 문자가 삽입되므로 초기화하는 글자 수보다 1 이상 큰 값으로 배열을 선언한다.(초기화할 때 배열의 크기를 명시하지 않으면 문자열의 문자 수 +1만큼 자동으로 생성)
  • printf 함수에서 %s를 이용하여 문자열을 읽고 출력하는데, printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL 직전 값까지 읽어서 출력한다.
1차원 배열과 문자열
#include <stdio.h>
void main(){
    // 1차원 char 배열 선언
    char a[7] = "Hello";
    
    // 시작점 a에 해당하는 값인 a[0]부터 NULL값 전인 a[4]까지 출력
    printf("%s\n", a);
    
    // 시작점 a+1에 해당하는 값인 a[1]부터 NULL값 전인 a[4]까지 출력
    printf("%s\n", a+1);
    
    a[4] = NULL; // a[4]의 값을 NULL로 변경
    printf("%s\n", a+1); /* 시작점 a+1에 해당하는 값인 a[1]부터
    NULL값 전인 a[3]까지 출력(a[4]가 NULL로 바뀌었으므로 a[3]까지 출력)
}
/*	출력
	Hello
	ello
	ell
*/	
⑥ 2차원 배열의 문자열
  • 문자열을 여러 개 정의할 때 2차원 배열을 사용한다.
  • printf 함수에서 %s를 이용하여 문자열을 읽고 출력하는데, printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL 직전 값까지 읽어서 출력한다.
2차원 배열과 문자열
#include <stdio.h>
void main(){
    // 2차원 char 배열 선언 a[0]에는 "Hello"가, a[1]에는 "Soojebi"가 저장
    char a[2][8] = {"Hello", "Soojebi"};
    
    // 시작점 a[0]에 해당하는 값인 a[0][0]부터 NULL 값 전인 a[0][4]까지 출력
    printf("%s\n", a[0]);
    
    // 시작점 a+1에 해당하는 값인 a[1][0]부터 NULL 값 전인 a[1][7]까지 출력
    printf("%s\n", a[1]);
    
    a[0][4] = NULL; // a[0][4]의 값을 NULL로 변경
    // 시작점 a[0]+2에 해당하는 값인 a[0][2]부터 NULL 값 전인 a[0][3]까지 출력
    printf("%s\n", a[0]+2);
    
    // 시작점 a[1]+3에 해당하는 값인 a[1][3]부터 NULL 값 전인 a[1][6]까지 출력
    printf("%s\n", a[1]+3);
}
/*	출력
	Hello
	Soojebi
	ll
	jebi
*/	

⑷ 식별자

① 식별자(Identifier) 개념

  • 식별자는 변수, 상수, 함수 등 서로 구분하기 위해서 사용되는 이름이다.
  • 프로그램의 구성요소를 구별하기 위해 사용한다.

② 식별자 명명 규칙

식별자 규칙
구분 규칙 사용 가능 예시 사용 불가능 예시
사용 가능 문자 영문 대문자/소문자, 숫자, 밑줄(‘_‘)의 사용이 가능 a, A, a1, _, _hello ?a, <a
변수 사용 규칙 첫 자리에는 숫자를 사용할 수 없음 _1, a1, a100 1, 1a,1A, 1234
변수 사용 규칙 변수 이름의 중간에는 공백을 사용할 수 없음 my_student my student
변수 의미 부여 데이터값의 의미나 역할을 표현 age, student  
변수 의미 부여 이미 사용되고 있는 예약어의 경우에는
변수로 사용할 수 없음
For, If, While int, short, long, for,
while, do, continue,
break, if, else

③ 식별자 표기법

변수 설정 기법
표기법 설명
카멜 표기법
(Camel Case)
+ 식별자 표기 시에 여러 단어가 이어지면 첫 단어 시작만 소문자로 표시하고,
각 단어의 첫 글자는 대문자로 지정하는 표기법
예) inputFunction
파스칼 표기법
(Pascal Case)
+ 식별자 표기 시에 여러 단어가 이어지면 각 단어의 첫 글자는 대문자로
지정하는 표기법
예) InputFunction
스네이크 표기법
(Snake Case)
+ 식별자 표기 시에 여러 단어가 이어지면 단어 사이에 언더바를 넣는 표기법
예) input_function
헝가리안 표기법
(Hungarian Case)
+ 식별자 표기 시 두어에 자료형을 붙이는 표기법
+ 식별자 표기 시에 int형일 경우 n, char형일 경우 c, 문자열일 경우 sz를 붙임
예) nScore → 정수형

3️⃣ 연산자

⑴ 연산자(Operator) 개념

  • 연산자는 프로그램 실행을 위해 연산을 표현하는 기호이다.
  • 연산자에는 산술 연산자, 시프트 연산자, 관계 연산자, 논리 연산자 등이 있다.

⑵ 연산자 종류

연산자 연산자
증감 연산자 ++x, x++, –x, x–
산술 연산자 +, -, *, /, %
시프트 연산자 «, »
관계 연산자 >, <, >=, <=, ==, !=
비트 연산자 &, |, ^, ~
논리 연산자 &&, ||, !d
삼항 연산자 (조건식)? a : b
대입 연산자 =, +=, -=, *=, /=, %=

연산자 우선순위 문제 종종 출제됨!

일반적으로 “증산시 관비 논삼대” 순서대로 우선순위가 높으나, 논리 연산자 중 단항 연산자인 !, 비트 연산자 중 단항 연산자인 ~가 증감 연산자와 산술 연산자 사이에 우선순위가 위치해 있다.

항의 개수에 따른 연산자 우선순위는 단항 연산자 → 이항 연산자 → 삼항 연산자 → 대입 연산자 순입니다.

연산자 우선순위
[증산시 관비 논삼대]
증감 연산자 / 산술 연산자 / 시프트 연산자 / 관계 연산자 / 비트 연산자 / 논리 연산자 / 삼항 연산자 / 대입 연산자

⑷ 연산자 종류 상세

1️⃣ 증감 연산자(Increment & Decrement Operator)

  • 증감 연산자는 피연산자를 1씩 증가 혹은 1씩 감소시킬 때 사용하는 연산자이다.
증감 연산자의 종류
연산자 내용
++x 변수의 값을 1 증가시킨 후에 해당 변수를 사용하는 연산자
x++ 변수를 사용한 후에 변수의 값을 1 증가시키는 연산자
–x 변수의 값을 1 감소시킨 후에 해당 변수를 사용하는 연산자
x– 변수를 사용한 후에 변수의 값을 1 감소시키는 연산자
C 언어 switch 문 증감 연산자 예제
#include <stdio.h>
void main(){
    int x=3, y=3;
    switch(x++){
        case 3: printf("A: %d\n", x); break;
        case 4: printf("B: %d\n", x);
    } /* x++일 경우 x의 값인 3에 해당하는 case 3으로 이동한 후에
    	x를 1 증가시키므로 case 3 안에 있는 printf를 출력하고 있는
    	x는 4가 출력
     */
    
    switch(++y){
        case 3: printf("C: %d\n", y); break;
        case 4: printf("D: %d\n", y);   
    } /* ++y일 경우 y를 1 증가시킨 후에 y의 값인 4에 해당하는
    	case 4로 이동한 후에 case 4 안에 있는 printf를 출력하고 있는
    	y는 4가 출력 
     */
}
/* 	출력
	A: 4
	D: 4
*/

3️⃣ 시프트 연산자(Shift Operator)

시프트 연산자는 비트를 이동시키는 연산자이다.

연산자 내용
« 왼쪽 값을 오른쪽 값만큼 비트를 왼쪽으로 이동하는 연산자
» 왼쪽 값에 오른쪽 값만큼의 부호 비트를 채우면서 오른쪽으로 이동하는 연산자
시프트 연산자 자바 코드 예제
public class soojebi{
    public static void main(String[] args){
        System.out.print(3<<2); // 12를 출력함
        System.out.print(8<<3); // 1을 출력함
    }
}
/* 출력
   121
*/
/* 시프트 연산은 왼쪽 시프트 연산인 경우에는 '변수<<이동할비트수'이고,
   오른쪽 시프트 연산은 '변수>>이동할비트수' 형태로 사용하며, 이동할 비트 수만큼 0 채운다.
   
    예제 코드에서 System.out.print(3<<2);에서 3 2진수로 변환하면 0011이고,
   왼쪽으로 2만큼 시프트를 하면 아래와 같이   있다.
   
   0011    (10진수 3 2진수로 변환)
      << 2 (왼쪽으로 2만큼 시프트)
   --------------------------------
   1100 (2진수 왼쪽 시프트 연산 결과)
   왼쪽 시프트한 결과는 2진수 1100이고 10진수로 변환하면 12 된다.
   
   마찬가지로 System.out.print(8<<3);에서 8 2진수로 변환하면 1000이고,
   오른쪽으로 3만큼 시프트 하면 아래와 같이   있다.
   
   1000    (10진수 8 2진수로 변환)
      << 3 (오른쪽으로 3만큼 시프트)
   --------------------------------
   0001 (2진수 왼쪽 시프트 연산 결과)

4️⃣ 관계 연산자(Relation Operator)

관계 연산자는 두 피연산자 사이의 크기를 비교하는 연산자이다.

C 언어 관계 연산자
#include <stdio.h>
void main(){
    // 관계 연산 결과가 참일 때 출력
    printf("%d\n", 3==3);
    // 관계 연산 결과가 거짓일 때 출력
    printf("%d\n", 5==3);
}
/* 	출력
	1
	0
*/	
자바 관계 연산자
class Soojebi{
    public static void main (String[] args){
        System.out.print(3==3);
        System.out.print(5==3);
    }
}
/* 	출력
	true
	false
*/	
파이썬 관계 연산자
print(3==3)
print(5==3)
#  출력
#  True
#  False

C는 참일 때 1, 거짓일 때 0.
자바와 파이썬은 참/거짓을 출력하는데, 자바는 true/false가 소문자로만 이루어져 있고,
파이썬은 True/False에서 앞글자가 대문자라는 것을 꼭 기억해두기!

5️⃣ 비트 연산자(Bit Operator)

비트 연산자는 0과 1의 각 자리에 대한 연산을 수행하는 연산자이다.

연산자 내용
& 두 값을 비트로 연산하여 같은 비트의 값이 모두 1이면 해당 비트 값이 1이 되고,
그렇지 않으면 0이 되는 연산자 (AND 연산자)
| 두 값을 비트로 연산하여 같은 비트의 값이 하나라도 1이면 해당 비트 값이 1이 되고,
그렇지 않으면 0이 되는 연산자 (OR 연산자)
^ 두 값을 비트로 연산하여 같은 비트의 값이 서로 다르면 해당 비트 값이 1이 되고,
그렇지 않으면 0이 되는 연산자 (XOR 연산자)
~ 모든 비트의 값을 반대로 바꾸는 반전 기능을 하는 연산자 (NOT 연산자)
#include <stdio.h>
void main(){
    printf("%d\n", 13 & 10);
    
    printf("%d\n", 13 | 10);
    
    printf("%d\n", 13 ^ 10);
    
    printf("%d\n", ~13);
}
/*	출력
	8
	15
	7
	-14
*/
  • 13을 2진수로 변환하면 1101, 10을 2진수로 변환하면 1010이다.
AND 연산 OR 연산 XOR 연산
1101
& 1010
———–
1000
10진수로 변환하면 8
1101
| 1010
———–
1111
10진수로 변환하면 15
1101
& 1010
———–
0111
10진수로 변환하면 7
같은 자리의 비트의 값이 둘 다
1인 것만 1이고, 나머지는 0
같은 자리의 비트의 값이 둘 다
0인 것만 0이고, 나머지는 1
같은 자리의 비트의 값이
같으면 0이고, 다르면 1
  • NOT 연산은 부호를 반대로 바꾼 값(-13)에 1을 뺀 값인 -14가 출력된다.

NOT 연산은 2진수로 변환했을 때 각 자릿수에 대해 0이면 1로, 1이면 0으로 변환시키면 되는데,
컴퓨터 구조에 관한 내용을 알고 있어야 하므로…
그냥 부호를 반대로 바꾼 값에 1을 뺀 값이라고 기억해두는게 좋다.

7️⃣ 삼항 연산자(Logic Operator)

삼항 연산자는 조건이 참일 경우 물음표(?)와 콜론(:) 사이의 값을 반환하고, 조건이 거짓일 경우 콜론(:)과 세미콜론(;) 사이의 값을 반환하는 연산자이다.

조건식 ? 참일때 값 : 거짓일때 값;

4️⃣ 표준 함수

⑴ 출력 함수

1️⃣ C 언어

① 단순 출력
printf(문자열);

printf를 사용하기 위해서는 stdio.h 헤더(stdio는 표준 입출력인 Standard Input Output의 약자)를 선언해야 한다.

C 언어 단순 출력 예제
#include <stdio.h>
void main(){
	printf("Hello C World");
}
/* 	출력
	Hello C World
*/	
② 개행
printf("\n");

printf 큰따옴표 안에 \n이라는 키워드를 만나면 개행을 한다.

#include <stdio.h>
void main(){
    printf("Hello\nC\nWorld");
}
/*	출력
	Hello
	C
	World
*/	
③ 변수 출력
printf(포맷_스트링, 변수명);
  • C 언어에만 해당하는 사항으로 변수에 저장된 값을 출력할 때는 printf라는 함수를 쓰고, printf 내에서 포맷 스트링을 통해 변수를 출력하는 방식을 결정한다.
포맷 스트링
유형 포맷 스트링 설명
문자형 %c 문자 출력
  %s 문자열 출력
정수형 %d 10진수 출력
  %[-][0][전체자리수]d 10진수 출력
[-]를 붙이면 왼쪽 정렬
[0]을 붙이면 전체 자릿수에서 앞에 빈 공간만큼 0으로 채움
[전체자리수]만큼 공간이 확보됨
  %x 16진수 출력
  %o 8진수 출력
실수형 %f
%[전체자리수].[소수점자리수]
실수 출력
  • C 언어에서 2진수를 출력하는 포맷 스트링은 존재하지 않는다.
C 언어 변수 출력 예제
#include <stdio.h>
void main(){
    char a = 'A';
    int b = 10;
    printf("%c %d\n", a, b); // a를 %c라는 포맷으로, b를 %d라는 포맷으로 출력
    printf("%5d\n", 4);
    printf("%05d\n", 4);
    printf("%-5d\n", 4);
    printf("%-05d\n", 4);
}
/*	출력
	A 10
        4
    00004
    4
    4
*/    
C 언어 실수형 변수 출력 예제
#include <stdio.h>
void main(){
    float a = 1.2;
    // 가공하지 않고 출력(float는 소수 6자리 출력)
    printf("%f\n", a);
    // 소수점 2자리만 출력
    printf("%.2f\n", a);
    /* 소수점 포함 7글자 출력, 소수점 3자리 출력
       (1,200은 총 5글자이므로 앞에 2글자 공백) */
    printf("%7.3f\n", a);
}
/*	출력
	1.200000
	1.20
	  1.200
*/	  

2️⃣ 자바

① 단순 출력
System.out.printf(문자열); C 언어처럼 포맷 스트링을 사용하여 변수를 출력할 수 있는 출력 함수
System.out.print(문자열); 출력 후에 개행을 하지 않는 함수
② 개행
System.out.print(“\n”); 큰따옴표 안에 \n을 만나면 개행
System.out.println(문자열); 출력 후에 개행을 하는 함수
③ 변수 출력
System.out.print(변수명);
System.out.println(변수명);
System.out.printf(포맷_스트링, 변수명);

System.out.printf는 변수를 출력하고자 할 때 매개변수로 포맷 스트링과 변수명을 넣어주어야 된다.

자바 변수 출력 예제
public static void main(String[] args){
    int a = 5;
    // a 값을 %d(10진수)로 출력
    System.out.printf("%d", a);
}
/*	출력
	5
*/	

3️⃣ 파이썬

① 단순 출력 및 개행
print(문자열, end=’ ‘) 출력 후에 개행을 하지 않음
print(문자열) 출력 후에 개행 (무조건 개행)

print 함수를 쓰면 함수가 종료된 후에 기본으로 개행이 된다.

⑵ 입력 함수

1️⃣ C 언어

변수값 입력 : scanf(포맷_스트링, &변수명);
문자열 입력 : scanf("%s", 배열명);

  • scanf를 사용하기 위해서는 stdio.h 헤더(stdio는 표준 입출력인 Standard Input Output의 약자)를 선언해야 한다.
  • 문자열을 입력받는 경우가 아니라면 변수명 앞에 &를 붙인다.
  • 문자열을 입력받는 경우 배열명을 쓰고 &는 안 붙인다.
포맷 스트링
유형 포맷 스트링 설명
문자형 %c 문자 입력 (char)
  %s 문자열 입력
정수형 %d 10진수 입력
  %x 16진수 입력
  %o 8진수 입력
실수형 %f 실수 입력
C 언어 입력 예제
#include <stdio.h>
void main(){
    char a;
    int b;
    /* a를 %c라는 포맷으로,
       b를 %d라는 포맷으로 입력 */
    scanf("%c %d", &a, &b);
    printf("%c %d", a, b);
}
/*	출력
	(입력을 A 10으로 할 경우)
	A 10
*/	

3️⃣ 파이썬

  • 파이썬에서는 정수형과 실수형과 같은 숫자를 입력받을 때는 문자열로 저장한 후에 eval 함수를 써서 숫자로 변환해 주어야 한다.

    (그냥 형변환 해줘도 되지 않나?… 굳이;)

  • eval 매개변수를 숫자로 변환할 수 없는 형태의 문자열일 경우 에러가 발생한다.

문자열 입력 변수명 = input()
숫자 입력 변수명 = input()
변수명 = eval(변수명)
파이썬 입력 예제
s = input() # s 변수에 값 입력(문자로 저장)
s = eval(s) # s 변수를 숫자로 변환
            # (만약 입력값을 숫자로 변환할 수 없을 경우 에러가 발생)

# 입력 :: Hello
# 출력 :: 에러 발생

5️⃣ 명령문

명령문은 프로그램을 구성하는 문장으로, 지시 사항을 처리하는 단위로 조건문과 반복문이 있다.

⑴ 조건문

  • 조건문은 조건의 참, 거짓 여부에 따라 실행 경로를 달리하는 if 문과 여러 경로 중의 하나를 선택하는 switch 문으로 구분한다.
  • if 문은 산술 또는 논리적으로 비교가 가능하나, switch는 조건이 동일한지의 여부만 확인한다.

1️⃣ if 문

조건이 참인지 거짓인지에 따라 경로를 선택하는 명령문이다.

① C, 자바에서 사용하는 if 문
if (조건문) {
    명령문;
}
else if (조건문) {
    명령문;
}
else {
    명령문;
}
C 언어 if 문 사용 예제
  • 숫자가 짝수일 경우에는 짝수라는 글자를 출력하고, 홀수일 경우 홀수라는 글자가 출력한다.
#include <stdio.h>
void main(){
    // 입력받을 변수 생성
    int score; 
    // score 변수에 정숫값 입력
    scanf("%d", &score);
    // score를 2로 나눈 나머지가 0일 경우 "짝수"를 출력
    if(score % 2 == 0){
        printf("짝수");    
    }
    else{
        printf("홀수");
    }
}
/*	출력
	(입력값이 6일 경우)
	짝수
*/	

2️⃣ switch 문

  • 조건에 따라 여러 개의 선택 경로 중 하나를 취하고자 할 때 사용하는 명령어이다.
  • 파이썬 언어에서는 switch 문이 존재하지 않는다.
  • switch 문에서는 조건에 해당하는 case로 이동을 한다.
  • 해당하는 case가 종료되었을 때 break가 있으면 switch 문을 빠져나온다.
  • break가 존재하지 않을 경우 break를 만날 때까지 switch 문에 있는 다른 문장을 실행한다.
C, 자바에서 사용하는 switch 문
switch (){ // switch 문에 식을 계산해서 일치하는 값을 가진 case문을 실행
    case : 
        명령문;
        break; /* break를 만나면 switch~case를 탈출, break를 만나지 않으면
        	     break를 만날 때까지 순차적으로 실행 */	
    default:
        명령문; /* switch 문에 식이 어떠한 case의 값도 만족하지 않으면
                  default로 진입해 명령문 실행 */
}
C 언어 switch 문 예제
  • 90점 이상이면 A를 출력, 80점 이상이면 B를 출력, 그렇지 않으면 F를 출력한다.

    #include <stdio.h>
    void main(){
        int score;
        scanf("%d", &score);
          
        switch(score/10){ 
        /*  score/10이 10이면 case 10에 break가 없으므로
            case 9까지 내려와 A를 출력 */
            case 10:
            // score를 10으로 나눴을 때 9이면 A를 출력    
            case 9:
                printf("A"); break;
            // score를 10으로 나눴을 때 8이면 B를 출력    
            case 8:
                printf("B"); break;
            /* score를 10으로 나눴을 때 10, 9, 8이 아니면
               F를 출력 */
            default:
                printf("F");
        }
    }
    /*	출력
    	(101을 입력할 경우)
    	A
    */	
    

⑵ 반복문

  • 반복문 종류
    • while 문
      • 시작과 종료 조건을 지정하면 참인 동안에는 해당 문장을 반복해서 실행하는 명령문
    • for 문
      • 초기식, 조건식, 증감식을 지정하여 반복을 실행하는 명령문

1️⃣ while 문

  • 조건이 참인 동안에 해당 분기를 반복해서 실행하는 명령문이다.
① C, 자바 언어에서의 while 문
  • 조건이 참인 동안 반복해서 명령을 수행한다.

  • C, 자바에서 사용하는 while 문

    while (조건문){
        명령문;
    }
    
C 언어 while 문 예제
#include <stdio.h>
void main(){
    int i=0;
    int sum = 0;
    
    while (i<10){
        i++;
        sum = sum + i; /* i 값을 sum에 더함(i는 1부터 10까지 변하므로
        			     while이 돌고 난 후에 sum은 55가 됨) */
    }
    printf("%d\n", sum); // sum을 출력
}
/*	출력
	55
*/	
③ do while 문

do while문은 참, 거짓과 관련 없이 무조건 한 번은 실행하고, 그다음부터는 조건이 참인 동안에 해당 분기를 반복해서 실행하는 명령문이다.

C, 자바의 do while 문
do{
    명령문; // 참, 거짓과 관련 없이 무조건 한 번은 실행
}while(조건문); /* 조건문이 참이면 해당 분기를 반복해서 실행하고,
				 조건문이 거짓이 되면 while 문을 탈출 */				
자바 do while 문 예제
  • 다음은 1부터 2까지 숫자를 더하는 예제이다.
class Soojebi{
    public static void main(String[] args){
        int i = 1;
        int sum = 0;
        // do 문을 만나면 먼저 무조건 실행
        do{
            sum = sum + i;
            /* sum = sum + i;에 의해 i=1, sum = 0이므로
               sum = 0+1;이 됨 */
            i++; // i++;에 의해 i 값이 1 증가하여 i=2가 됨
        }while(i<0); /* while 문을 만났을 때 i=2이기 때문에
                        i<0은 거짓이므로 while 문을 탈출 */
        
        System.out.print(sum);
    }
}
/*	출력
	1
*/	

3️⃣ for each 문

for each 문은 배열이나 리스트의 크기만큼 반복하는데, 반복할 때마다 배열이나 리스트의 항목을 순차적으로 변수에 대입하는 반복문이다.

① 자바 for each 문
for( 제어변수 : 배열 ) {
    문장;
}
자바 for each 반복문 예제
class Soojebi{
	public static void main(String[] args){
    	int[] arr = {10, 20, 30, 40};
        
        for(int num : arr){
            System.out.println(num);
        }
    }
}
/*	출력
	10
	20
	30
	40
*/	
② 파이썬 for each 문
for 변수 in 리스트:
    문장
파이썬 for each 반복문 예제
li = [1, 2, 3, 4, 5]
for a in li:
    print a
# 출력
# 1
# 2
# 3
# 4
# 5

⑶ 루프 제어 명령어

  • 반복문에서 무한 루프를 방지하기 위해 break와 continue 명령어를 사용한다.

루프 제어 명령어 종류

종류 설명
break 반복문을 중지하도록 하는 명령어
continue 다음 반복으로 넘어갈 수 있도록 하는 명령어
② continue 문
  • 반복문에서 다음 반복으로 넘어갈 수 있도록 하는 명령어이다.
C 언어 continue 문 사용 예시
  • 다음 예시는 i가 7일 때 다음 반복으로 넘어가는 예시이다.

    #include <stdio.h>
    void main(){
        int i=0;
        while ( i < 10 ){
            i++;
            // i가 7일 경우 수행
            if ( i == 7 )
                continue; // continue를 만나면 다음 반복 수행
            printf("%d", i); // i 값을 출력
        }
    }
    /*	출력
    	1234568910
    */
    

맨 위로 이동하기

Leave a comment