본문 바로가기

스터디/웹개발

2022년10월1일 TIL - 정보처리기사 실기 - 프로그래밍 언어 활용(2)

221001 정보처리기사 실기 - 프로그래밍 언어 활용

VI. 프로그래밍 언어 활용

Chapter 01. 기본 문법 활용하기

[2] 변수 활용

(1) 데이터 타입, 기본 저장 공간

  • 변수 선언 초깃값 X : 데이터_타입 변수명;
  • 변수 선언 초깃값 O : 데이터_타입 변수명 = 초깃값;
  • static 변수 : 프로그램이 시작될 때 변수를 초기화하고, 프로그램이 종료되기 전까지 메모리가 유지되는 변수
  • 배열 선언 초깃값 X : 타입 배열명[배열_요소_갯수];
  • 배열 선언 초깃값 O : 타입 배열명[배열_요소_갯수] = {초깃값};
  • 자바 배열 선언 초깃값 X(1) : 타입 []배열명 = new 타입[배열_요소_갯수];
  • 자바 배열 선언 초깃값 X(2) : 타입 배열명[] = new 타입[배열_요소_갯수];
  • 자바 배열 선언 초깃값 O : 타입 []배열명 = {초깃값};
  • 초깃값을 선언하지 않을 경우 정수일 때는 0, 실수일 때는 0.0, 문자열일 때는 NULL 이 저장되어 있다.
  • C언어 2차원배열 선언 초깃값 O : 타입 매열명[행의 갯수][열의 갯수] = {초깃값};
  • 자바 2차원배열 선언 초깃값 O : 타입 [][]배열명 = {{초깃값}, {초깃값}, … };
  • 자바에서 배열의 크기를 구할 때는 length 속성을 사용한다. a.length : a배열의 행의 갯수, a[0].length : a[0] 배열의 갯수

(2) 포인터

  • (1차원) 포인터 선언 : 데이터타입* 포인터변수명 = &변수명(주솟값);
  • 주소에 해당하는 값을 가리킬 때에는 *를 사용한다. ex) printf(”%d %d”, a, *b)
  • 배열의 주소와 배열의 0번지 값은 같다 ( 배열명 == &배열명[0]; 배열명[0] == *배열명; )
  • 1차원 배열과 1차원 포인터 : 1차원 배열에서 배열명만 단독으로 사용할 경우 1차원 포인터와 동일하다. 배열명[요소], *(배열명+요소), 포인터[요소], *(포인터+요소)일 경우 값을 가리킨다. ex) *a, a[1], *(a+1), *p, p[1], *(p+1)
  • 2차원 배열과 1차원 포인터(int *p = a[1]) : 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일하다. 배열명[요소], *(배열명+요소) 형태는 1차원 포인터와 동일하다. 1차원 포인터에 대해 *과 [ ] 을 이용해야 값을 가리킬 수 있다. ex) **a, **(a+1), *a[1], *p, *(p+1), p[0]
  • 2차원 배열과 포인터 배열(int *p[3] = {a[0], a[1], a[2]) : *표시는 배열이라는 것을 한단계 추가 표시해준다고 생각하면 될듯. ex) a[0][0], *a[0], p[1][0], *p[1]
    • int a[3][2] = { … } 그리고 *p = a[1] 로 선언했으면 *표시로 배열이 한단계 추가되어서 p[0] = a[1][0] 으로 선언한 것과 비슷하다. 그래서 a[1][0] 을 표시하고 싶으면 p[0] 로 표시해도 되는 것 p 만 쓰려면 *을 붙어여서 *p 로 표시해야 배열 단계가 추가되어서 p[0] 처럼 되기때문에 a[1][0] 이 표시된다. 그러면 p[0], *p 로 표시할 수 있다. a는 처음에 a[3][2] 로 배열을 모두 지정해서 선언했으므로, a[0][0], *a[0], **a 로 표시한다.
    • 그렇다면 *p[3] = {a[0], a[1], a[2]} 이렇게 선언했다면? 여기서 [3] 은 p 배열의 크기인 것이고, p[0][0] 처럼 선언한것이고 a는 2차원이므로 a[0] = a[0][0] 이다. 그렇다면 p 는 p[0][0], *p[0], **p 이렇게 표시할 수 있다. a 도 마찬가지로 a[0][0] 형태로 선언되었으므로 표시할때는 a[0][0], *a[0], **a 이렇게 표시해야하는 것이다.
  • 2차원 배열과 2차원 포인터 : 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일하다. 배열명[요소][요소], *배열명[요소], **(배열명+요소) 일 경우 값을 가리킨다. (a[0][0], p[0][0])
    • 2차원 포인터는 2차원 배열에서 한덩어리의 크기를 알 수 없기 때문에 열의 개수를 명시하는 형태로 포인터 변수를 선언한다. 2차원 포인터 변수를 선언할 때 괄호가 없으면 2차원 배열에 대한 포인터가 아닌 앞선 포인터 배열이 된다. : 타입 (*포인터변수)[열의크기];
    • int (*p)[2] = a; 라고 선언했다. 괄호를 사용했고, a는 단독으로 사용하면 2차원 포인터이므로 2차원 포인터 형태로 선언되었다.
    • ex) a[0][0], *a[0], **a, p[0][0], *p[0], **p
  • 1차원 배열과 문자열 : 문자열을 초기화할 때 마지막에 NULL 문자가 삽입되므로 초기화하는 글자수보다 1이상 큰 값으로 배열을 선언한다.(초기화할 때 배열의 크기를 명시하지 않으면 문자열의 문자 수 +1 만큼 자동으로 생성), printf 함수에서 %s 를 이용하여 문자열을 읽고 출력하는데, printf 파라미터로 문자로 읽기 시작할 주소를 알려주면 시작 주소부터 NULL 직전값까지 읽어서 출력한다.
    • ex) char a[7] = “Hello“; printf(”%s\n”, a); → Hello printf(”%s\n”, a+1); → Hell a[4] = NULL; printf(”%s\n”, a+1);
  • 2차원 배열의 문자열 : 문자열을 여러 개 정의할 때 사용, printf 함수에서 %s 를 이용하여 문자열을 읽고 출력하는데, 마찬가지로 NULL 직전값까지 읽어서 출력한다. ex) char a[2][6] = {”Hello”, “Bye”}

(3) 자료형

자바

  • 자바 자료형 : HashSet, ArrayList, LinkedList, HashMap
  • HashSet : Set 의 자식 클래스(하위 클래스; 파생 클래스) 로 중복된 원소를 허용하지 않는 집합을 성질을 가지고 있는 자료형이며 클래스이다.
  • HashSet 선언 : Set 변수명 = new HashSet(); , HashSet 변수명 = new HashSet();
  • HashSet 메서드 : add(값), remove(값), size()
  • ArrayList : List 의 자식 클래스로 크기가 가변적으로 변하는 선형리스트의 성질을 가지고 있는 자료형이며 클래스이다.
  • LinkedList : ArrayList 와 동일하게 선형 구조로 되어있고, 제공하는 기능도 거의 같다. 다만, 데이터 검색 시에 ArrayList 가 빠르고, 삽입/삭제 시에는 LinkedList 가 빠르다.
  • ArrayList 선언 : List 변수명 = new ArrayList() ; , ArrayList 변수명 = new ArrayList();
  • ArrayList 메서드 : add(값), add(인덱스, 값), remove(인덱스), get(인덱스), size()
  • HashMap : 키와 값으로 구성된 객체를 저장하는 구조로 되어 있는 자료구조를 구현한 자료형이며 클래스이다.
  • HashMap 선언 : Map 변수명 = new HashMap() ; , HashMap 변수명 = new HashMap();
  • HashMap 메서드 : put(키, 값), remove(키), get(키), size()

파이썬

  • 파이썬 자료형 : 세트형, 리스트형, 튜플형, 딕셔너리형
  • 세트(Set)형 : 중복된 원소를 허용하지 않는 집합의 성질을 가지고 있는 자료형이다.
  • 세트형 선언 : 세트명 = set([요소1, 요소2, … ]), 세트명 = {요소1, 요소2, … }
  • 세트형 메서드 : add(값), update([값1, 값2, … ]), remove(값)
  • 리스트(List)형 : 크기가 가변적으로 변하는 선형리스트의 성질을 가지고 있는 자료형이다.
  • 리스트형 선언 : 리스트명 = [요소1, 요소2, … ]
  • 리스트형 메서드 : append(값), insert(인덱스, 값), remove(값)
  • 리스트 인덱싱 : 리스트를 이용해서 중간값에 접근할 수 있는데, 리스트가 n개의 값을 가질 때 인덱스는 다음과 같다. 첫번째 요소(0, -n), 두번째(1, -(n-1)), … 뒤에서 두번째 ((n-2), -2), 마지막 ((n-1), -1)
  • 리스트 슬라이싱 : 리스트에서 여러 개의 데이터에 동시에 접근하는 기법이다. 리스트명[시작인덱스 : 종료인덱스 : 스텝]
  • 튜플(Tuple)형 : 초기에 선언된 값에서 값을 생성, 삭제, 수정이 불가능한 형태의 자료형
  • 튜플형 선언 : 튜플명 = (요소1, 요소2, … )
  • 튜플 인덱싱 : 리스트 인덱싱과 같다. ex) a[0], a[-5]
  • 튜플 슬라이싱 : 리스트 슬라이싱과 같다. 시작 인덱스부터 끝 인덱스 바로 전 인덱스까지 스텝 값만큼 건너뛴 값을 접근
  • 딕셔너리(Dictionary)형 : 키와 값으로 구성된 객체를 저장하는 구조로 되어 있는 자료형
  • 딕셔너리형 선언 : 딕셔너리명 = {키1:값1, 키2:값2, … }
  • 딕셔너리형 요소 추가 : 딕셔너리명[키] = 값
  • 딕셔너리형 요소 삭제 : del 딕셔너리명[키]
  • 식별자(Identifier) : 변수, 상수, 함수 등 서로 구분하기 위해서 사용되는 이름이다. 프로그램의 구성요소를 구별하기 위해 사용한다.
  • 식별자 명명 규칙 : 사용 가능 문자(영문 대/소문자, 숫자, 밑줄 사용 가능), 변수 사용 규칙(첫 자리 숫자 사용 불가, 중간에 공백 사용 불가), 변수 의미 부여(데이터값의 의미나 역할 표현, 이미 사용되고 있는 예약어는 사용 불가)
  • 식별자 표기법 : 카멜 표기법(Camel Case,ex) inputFunction), 파스칼 표기법(Pascal Case,ex) InputFunction), 스테이크 표기법(Snake Case, ex)input_function), 헝가리안 표기법(Hungarian Case, 정수형일 경우 ex) nScore)

[3] 연산자

  • 언어들에서 동일한 연산자 기호를 사용하나, 증감 연산자는 파이썬에서 지원하지 않는다.
  • 연산자 종류 : 증감 연산자(++x, x++, --x, x--), 산술 연산자(+,-,*,/,%), 시프트 연산자(<<, >>), 관계 연산자(>, <, >=, <=, ==, !=), 비트 연산자(&, |, ^, ~), 논리 연산자(&&, ||, !), 삼항 연산자( (조건식)? a : b ), 대입 연산자(=, +=, -=, *=, /=, %=)
  • 연산자 우선순위: 0( 괄호 ( ) ), 1( x++, x-- ), 2( ++x, --x, !, ~ ), 3( *, /, % ), 4( +, - ), 5( <<, >> ), 6( <, <=, >, >= ), 7( ==, != ), 8( & ), 9( ^ ), 10( | ), 11 ( && ), 12( || ), 13( (조건식)? a : b ), 14( =, +=, -=, *=, /=, %= )
  • 시프트 연산자(Shift Operator) : 비트를 이동시키는 연산자이다. ( ex) (3<<2) 10진수 3을 2진수로 변환하면 0011 이 되는데, 2만큼 왼쪽으로 비트를 이동시키면 1100 이 된다. 그럼 시프트 연산 결과로 12가 된다. (8>>3) 을 연산하면 1 )
  • 관계 연산자(Relation Operator) : C언어(1, 0), 자바(true, false), 파이썬(True, False) 로 결과가 출력된다.
  • 비트 연산자(Bit Operator) : &(AND), |(OR), ^(XOR), ~(NOT) 연산. 숫자를 2진수로 변환한 다음 각 자릿수를 연산한다. (13 ^ 10): 7
  • 삼항 연산자(Ternary Operator) : 조건식 ? 참일때값 : 거짓일때값;
  • 대입 연산자(Assignment Operator) : 오른쪽에 있는 값을 연산해 왼쪽의 변수에 값을 대입한다. ,(Swap 연산자) : 동시에 여러 개의 값을 대입하는 연산자, 파이썬에서만 제공한다. (a, b = 10, 20 코드는 a에 10을 대입, b에 20을 대입한다)

[4] 표준 함수

(1) 출력 함수

C 언어

  • 단순 출력 : printf(문자열); 사용하기 위해 stdio.h 헤더를 선언해야 한다.
  • 개행 : printf(”\n”);
  • 변수 출력 : printf(포맷스트링, 변수명); 문자형(%c : 문자, %s : 문자열), 정수형(%d : 10진수, %[-][0][전체자리수]d : 10진수 출력 [-]를 붙이면 왼쪽 정렬 [0]을 붙이면 전체 자릿수에서 앞에 빈공간만큼 0을 채움 [전체자리수]만큼 공간이 확보됨 ex)”%-05d\n”, %x : 16진수, %o : 8진수), 실수형 (%f, %[전체자리수].[소수점자리수]f : 실수), C언어에서 2진수를 출력하는 포맷스트링은 없다

자바

  • 단순 출력 : System.out.printf(문자열); : 포맷 스트링 사용 가능, System.out.print(문자열); : 출력 후 개행하지 않음.
  • 개행 : System.out.print(”\n”); , System.out.println(문자열); : 출력 후 개행
  • 변수 출력 : System.out.print(변수명); , System.out.println(변수명); , System.out.printf(포맷_스트링, 변수명);

파이썬

  • 단순 출력 및 개행 : print(문자열) : 출력 후 개행, print(문자열, end=’ ‘) : 출력 후 개행하지 않음.
  • 변수 출력 : print(변수명)

(2) 입력 함수

C 언어

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

자바

  • Scanner 클래스를 스캐너 변수에 생성한 후 ( Scanner 스캐너변수명 = new Scanner(System.in); ) 스캐너 변수를 이용해 입력 받는다.
  • 정수형 입력 : 입력받을변수명 = 스캐너변수명.nextInt();
  • 실수형 입력 : 입력받을변수명 = 스캐너변수명.nextFloat();
  • 문자열 입력 : 입력받을변수명 = 스캐너변수명.nextLine();

파이썬

  • 정수형과 실수형과 같은 숫자를 입력받을 때는 문자열로 저장한 후에 eval 함수를 써서 숫자로 변환해줘야 한다. eval 매개변수를 숫자로 변환할 수 없는 형태일 경우 에러가 발생한다.
  • 문자열 입력 : 변수명 = input()
  • 숫자 입력 : 변수명 = input() (으로 입력받은 이후에), 변수명 = eval(변수명)