6. 프로그래밍 언어 활용
01. 기본 문법 활용하기
1. 프로그래밍을 위한 기본 사항
a. 진수
- 특정 개수의 숫자만을 이용하여 수를 나타내는 수 체계
- 10진수 이하일 때는 0~9를 사용하지만, 10진수 초과할 경우는 영어 알파벳을 이용함
b. 아스키 코드(American Standard Code for Information Interchange)
- 미국 ANSI에서 표준화한 정보교환용 부호체계
- 영문 키보드로 입력할 수 있는 모든 기호가 할당된 기본적인 부호체계
* 65 => A, 97 => a
2. 변수 활용
a. 데이터 타입
-
개념
- 프로그래밍 언어에서 실수치, 정수 자료형과 같은 여러 종류의 데이터를 식별하는 형태
- 메모리 공간을 효율적으로 사용하고 2진수 데이터를 다양한 형태로 사용하기 위해 존재
* 파이썬은 데이터 타입이 존재 하지만, 명시하지 않아도 값에 맞춰서 선언됨 -
데이터 타입 유형
- 불린(Boolean): 참/거짓, C언어 미지원 (자바-true/false, 파이썬-True/False)
- 문자(Character): 문자 하나, 메모리에 저장은 숫자로 저장됨(char)
- 문자열(String): (C언어-char[], 자바-String)
- 정수 타입(Integer): (int)
- 부동 소수점(Floating Point): 소수점을 포함하는 실숫값을 저장할 때(float, double)
* float-4byte, 소수점6자리 / double-8byte, 소수점15자리
b. 기본 저장 공간
- 변수
-
일반 변수
- 저장하고자 하는 어떤 값이 있을 때, 주기억장치에 기억하기 위한 공간(C언어는 변수 선언 O, 파이썬은 변수 선언 X)
ex. int a = 10; (초깃값이 있는 경우)
ex. int a; (초깃값이 없는 경우) -> a에 쓰레기값 저장됨- static 변수 처음 시작될 때 한번만 초기화하고, 프로그램 종료될 때까지 메모리 유지 (만약, 함수 내에 static 변수가 있다면 그 함수가 여러번 호출되어도 초기화 반복하지 X)
-
- 배열
- 같은 타입 변수들로 이루어진 집합 - 배열 선언- 1차원 배열 (초깃값 없어도 됨)
(c언어) 타입 배열명 [요소_개수] = {초깃값};
(자바) 타입 [ ]배열명 / 타입 배열명[ ] = new 타입[요소_개수];>\- 2차원 배열 (초깃값 없어도 됨) (c언어) 타입 배열명[ 행 ][ 열 ] = {초깃값}; (자바) 타입 배열명[ ][ ] / 배열명[ ][ ] = \{\{초깃값}, {초깃값}...}; \* (자바) 2차원 배열에서 배열명이 a일때, a.length => 행개수, a[0].length => 열개수 - 포인터
- 변수의 주솟값을 저장하는 공간(C언어에서 쓰임)- 포인터 선언
데이터타입* 포인터변수명 = &변수명 -
배열과 포인터
- 1차원 배열과 1차원 포인터
- 1차원 배열에서 배열명만 단독 사용할 경우 1차원 포인터와 동일
- 1차원_배열일 때 배열명[요소], _(배열명+요소), 1차원_포인터일 때 포인터[요소], _(포인터+요소) 같은 값ex.
int a[4] = {1,2,3,4};
int* p = a;
a = 주소 = &a[0]
배열의주소는배열명이고, 배열의첫번째값은(index=0)*a이다 (a+1)==&a[1]
a[0] == *a
a[1] == *(a+1)
p[0] == a[0] == *p - 2차원 배열과 1차원 포인터
- 2차원 배열에서 배열명만 단독 사용할 경우 2차원 포인터와 동일
- 2차원_배열일 때 배열명[요소], *(배열명+요소)는 1차원 포인터와 동일
위의 식에 [] 또는 *를 추가해야 값을 얻을 수 있음ex.
_p = a[1] = a[1][0]
_(p+1) = a[1][1] -
2차원 배열과 포인터 배열
- 2차원 배열과 2차원 포인터
- 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일
- 2차원_배열일 때, 배열명[요소][요소], _배열명[요소], **(배열명+요소)일 경우 값을 가리킴
* 포인터 변수 선언할 때 ()없으면 2차원 배열에 대한 포인터가 아닌 포인터 배열임ex. int (_ p)[2] = a;
-
1차원 배열과 문자열
- 문자열을 초기화할 때 마지막 NULL 문자가 삽입되므로 초기화하는 글자수보다 1이상 큰 값으로 배열을 선언(크기 명시가 없으면 자동으로 글자수 +1)
- printf 함수에서 %s를 이용하여 읽고 출력하는데, 읽기 시작한 주소 알려주면 시작 주소부터 NULL전까지 읽음 - 2차원 배열의 문자열
- 문자열을 여러 개 정의할 때 2차원 배열을 사용
- 1차원 배열과 1차원 포인터
c. 자료형
-
자바
- HashSet
- Set의 자식 클래스로 중복된 원소를 허용하지 않는 집합의 성질을 가지고 있는 자료형이며 클래스Set 변수명 = new HashSet();
HashSet 변수명 = new HashSet();- 메서드 \- add(값): 값을 추가하는 메서드(중복된 값 들어오면 추가하지 X) \- remove(값): 값을 제거하는 메서드 \- size(): 원소의 개수를 얻는 메서드 - ArrayList
- List의 자식 클래스로 크기가 가변적으로 변하는 선형리스트의 성직을 가지고 있는 자료형이며 클래스(검색에 용이)
* ArrayList를 LinkedList로 변경하면 LinkedList처럼 동작List 변수명 = new ArrayList();
ArrayList 변수명 = new ArrayList();- 메서드 \- add(값): 값 추가 \- add(인덱스, 값): 해당 인덱스에 값 추가 \- remove(인덱스): 해당 인덱스에 있는 값 제거 \- get(인덱스): 해당 인덱스에 값을 얻는 메서드 \- size(): 들어있는 원소의 개수 - LinkedList: 데이터를 저장하는 노드가 이전 노드와 다음 노드의 상태를 알고 있는 링크드리스트 자료구조를 구현한 클래스
- HashMap
- 키와 값으로 구성된 객체를 저장하는 구조로 되어 있는 자료구조를 구현한 자료형이며 클래스Map 변수명 = new HaspMap();
HashMap 변수명 = new HashMap();- 메서드 \- put(키, 값): 해당 키에 해당하는 값을 추가 \- remove(키): 해당 키에 해당하는 값을 제거 \- get(키): 해당 키에 해당하는 값을 얻는 메서드 \- size(): 들어있는 원소의 개수
- HashSet
-
파이썬
- 세트형
- 중복된 원소를 허용하지 않는 집합의 성질을 가지고 있는 자료형세트명 = set([요소1, 요소2, …])
세트명 = {요소1, 요소2, …}- 메서드 add(값): 값 추가 update([...]): 여러 개의 값을 한꺼번에 추가 remove(값): 특정 값을 제거 - 리스트형
- 크기가 가변적으로 변하는 선형리스트의 성질을 가지고 있는 자료형리스트명 = [요소1, 요소2,…]
- 메서드 append(값): 리스트 마지막 요소 뒤에 값을 추가 insert(인덱스, 값): 인덱스 위치에 값을 삽입 remove(값): 해당하는 값을 제거, 값이 여러개 있을 경우 맨 앞에 있는 값 제거 \- 리스트 인덱싱 첫번째 요소: 0 / -n 두번째 요소: 1 / -(n-1) 마지막 요소: n-1 / -1 \- 리스트 슬라이싱 >리스트명[시작 인덱스 : 종료 인덱스 : 스텝] \-시작 인덱스: 슬라이싱을 시작할 인덱스, 생략할 경우 처음부터 시작 \-종료 인덱스: 슬라이싱을 종료할 인덱스, 종료 인덱스 -1까지만 슬라이싱, 생략할 경우 마지막까지 슬라이싱 \-스텝: 몇 개씩 끊어서 슬라이싱을 할지 결정, 생략시 1이 기본값 - 튜플형
- 초기에 선언된 값에서 값을 생성, 삭제, 수정이 불가능한 형태의 자료형튜플명 = (요소1, 요소2, …)
\- 튜플 인덱싱, 슬라이싱은 리스트 인덱싱, 슬라이싱과 동일 - 딕셔너리형
- 키와 값으로 구성된 객체를 저장하는 구조로 되어 있는 자료형딕셔너리명 = {키1:값1, 키2:값2, …}
\-요소 추가 : 딕셔너리명[키] = 값 \-요소 삭제 : del 딕셔너리명[키]
- 세트형
d. 식별자
-
개념
- 변수, 상수, 함수 등 서로 구분하기 위해서 사용되는 이름 -
명명 규칙
-
사용 가능 문자 : 영문 대문자/소문자, 숫자, 밑줄(_)
-
변수 사용 규칙
- 첫 자리에 숫자 사용 X
- 변수 이름의 중간에 공백 사용 X -
변수 의미 부여
- 데이터값의 의미나 역할 표현
- 예약어는 변수로 사용 X
-
-
식별자 표기법
- 카멜 표기법(Camel Case): 여러 단어가 이어지면 첫 단어 시작만 소문자로 표시하고, 각 단어의 첫 글자는 대문자로 지정
- 파스칼 표기법(Pascal Case): 여러 단어가 이어지면 각 단어의 첫글자는 대문자로 지정
- 스네이크 표기법(Snake Case): 여러 단어가 이어지면 단어 사이에 언더바를 넣는 표기법
- 헝가리안 표기법(Hungarian Case): 두어에 자료형을 붙이는 표기법, int형은 n / char형은 c / 문자열의 경우 sz
3. 연산자
- 산술 연산자 (+,-,*,/,%)
- 시프트 연산자 («,»)
- 관계 연산자 (<,>,=<,>=,==,!=)
-
논리 연산자 (&&, ) -
비트 연산자 (&, ,^,~) - 대입 연산자 (=,+=,-=,*=,/=,%=)
- 증감 연산자 (++x,x++,–x,x–)
- 삼항 연산자 (조건 ? 참일 때 값 : 거짓일 때 값)
4. 표준 함수
a. 출력 함수
- C언어
- 단순출력 : printf(“”); (stdio.h헤더 선언 필요)
- 변수출력 : C언어만 해당 변수에 저장된 값 출력할 때에는 포맷스트링 이용
-
C++
- 단순출력 : std::cout « 문자열; (iostream 헤더 선언 필요)
- using namespace std; 선언하면 std:: 생략 가능
- 개행 : std::endl;
- 변수출력 : std::cout « 변수명;
- JAVA
- 단순출력 : Systeml.out.println(문자열); ln없으면 개행 X
- 변수출력
- System.out.println(변수명);
- System.out.printf(포맷_스트링, 변수명);
- Python
- 단순출력 : print(문자열), print(문자열, end=’’) => 개행X
- 변수출력 : print(변수명)
b. 입력 함수
- C언어
- 변수값 입력 : scanf(포맷_스트링, &변수명);
- 문자열 입력 : scanf(“%s”, 배열명);
- scanf 사용시 stdio.h 선언 필요
- 문자열 입력받는 경우가 아니라면 변수명 앞에 ‘&’을 붙임
- 문자열 입력받는 경우 배열명을 쓰고 ‘&’ 안붙임
-
C++
- 변수값 입력 : std::cin » 변수명
- iostream 헤더 선언 필요
- JAVA
- Scanner 클래스를 스캐너 변수에 생성
- 스캐너 변수를 이용해 정수형은 nextInt, 실수형은 nextFloat,nextDouble, 문자열은 nextLine을 통해 입력받음
ex.
public static void main(String[] args) {
String s; int i; float f;
Scanner c = new Scanner(System.in);
s = c.nextLine();
System.out.println(s);
i = c.nextInt();
System.out.println(i);
f = c.nextFloat();
System.out.print(f);
}
- Python
- 숫자를 입력받을 때는 문자열로 저장 후 eval 함수를 써서 숫자로 변환
- 변수명 = input()
- 변수명 = eval(변수명)
5. 명령문
6. 사용자 정의 자료형 활용
- 사용자가 상황에 맞게 기존 자료형들을 조합해서 만드는 자료형
-
열거체
- 서로 연관된 정수형 상수들 집합
- 정수형 상수에 이름을 붙여서 이해 쉬워짐 -
구조체
- 사용자가 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 자료형
- 자바와 파이썬에서는 지원하지 X(class를 이용하여 struct 기능을 구현할 수 O)- 포인터
- 일반 구조체 변수로 접근할 때는 .으로 접근
ex. s.gender
- 구조체 포인터로 접근할 때는 ->로 접근ex.
p = &s
s.gender (p).gender p->gender (&s)->gender
- 포인터
7. 사용자 정의 함수
a. main함수
b. 사용자 정의 함수
c. 함수 포인터
d. 매개변수 전달방법
-
call by value
- 변수의 값을 넘겨주고, 이 값은 새로운 공간에 할당되어 사용하는 방식
- 형식 매개변수의 어떠한 변화도 실 매개변수에 아무런 영향을 미치지 않음 -
call by reference
- 변수의 값이 아닌 변수가 사용 중인 메모리 공간의 주소를 넘겨주는 방식
- 실 매개변수의 주소를 형식 매개변수로 보냄
8. 재귀 함수
9. 클래스
- 객체지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 틀 (C언어는 지원X)
- 변수와 메서드 형태로 구성
- 변수는 변수 선언과 동일, 메서드는 사용자 정의함수와 동일 문법
- 파이썬은 별도로 변수 선언 하지 않기 때문에 메서드 형태로 구성
a. 접근제어자
b. 클래스 사용
c. 생성자
d. 소멸자
e. 상속
- 어떤 객체가 있을 때 그 객체의 변수와 메서드를 다른 객체가 물려받는 기능
-
오버로딩
-
오버라이딩
-
상위클래스 접근
f. 추상클래스
- 미구현 추상 메서드를 한개 이상 가지며 자식 클래스에서 해당 추상 메서드를 반드시 구현하도록 강제
g. 인터페이스
-
- - -
02. 언어 특성 활용하기
1. 프로그래밍 언어의 언어별 특성
a. 프로그래밍 언어의 유형 분류
b. 프로그래밍 언어별 특성
c. 객체지향 프로그래밍