오늘은 컴퓨터공학에서 꼭 필요하고 알고있어야 하는 용어들을 정리해보려 합니다.
1. 컴퓨팅 사고력
컴퓨팅 사고력은 복잡한 문제를 컴퓨터가 풀 수 있도록 단순화하는 추상화, 문제를 해결하기 위한 절차인 알고리즘 설계, 같거나 유사한 문제를 풀 수 있는 자동화를 할 수 있는 사고체계이다.
+ digital literacy : 다양한 미디어에서 정보를 찾고, 이해, 판단, 재조합 할 수 있는 능력
2. UNIX / LINUX
UNIX는 벨 연구소에서 만든 OS로 멀티유저를 수용한다. 이후에 나온 LINUX는 리누스 토르발스가 제작한 오픈소스 OS로 멀티유저를 수용하고 일반 pc의 server이다.
3. 동적 타이핑
파이썬은 동적 타이핑을 사용한다. 동적 타이핑은 변수를 선언할 때 타입을 지정하지 않아도 할당하는 값에 따라 자동으로 타입이 결정되는 것이다. 이것으로 개발자에게 유연성을 제공한다.
+ 파이썬의 특징: 객체 지향 프로그래밍, 가독성/간결성, 확장성, 다양한 라이브러리, 크로스 플랫폼 지원
4. 모듈
모듈은 함수라고 하며 독립적으로 수행할 수 있는 프로그램 단위이다.
5. ASCII code
아스키 코드는 문자를 7비트 부호체계와 대응시키는 system으로 65는 A, 97은 a, 48은 0이다.
6. 변수
변수는 데이터를 저장할 수 있는 메모리 공간에 이름을 붙인 것이다. 데이터 타입은 int, float, string, list 등 이 있고 파이썬은 동적 타입이기 때문에 변수를 선언하고 값을 할당할 때 자동으로 지정된다. 이때, list/딕셔너리는 가변 변수이고, int/float/tuple은 불변 변수이다. 프로그램 전체에서 사용하는 전역변수와 함수 내에서만 사용하는 지역변수가 있고, 지역변수를 전역변수처럼 사용하려면 global을 사용한다.
7. copy
변수를 복사할 때, Copy 모듈의 copy()를 사용하면 주소가 복사되는 shallow copy가 되고, deepcopy()를 사용하면 전체 값이 복사되는 별도의 주소가 생겨 다른 객체로 인식하는 deep copy가 된다.
8. 가변인수 & 키워드 가변인수
가변인수는 *args로 사용하고 함수에 임의의 개수의 위치 인자를 전달하며 튜플로 처리된다.
키워드 가변인수는 **kwargs로 사용하고 함수에 임의의 개수의 키워드 인자를 전달하고 딕셔너리로 처리된다.
9. 연산자
연산자는 이미 정의된 연산을 수행하는 기호나 키워드이다. 산술연산자에는 +, -, *, / 등이 있고, 관계연산자에는 ==, !=, <, > 등이 있다. 논리연산자는 and, or, not이 있고, 대입연산자는 =이 있다. 이때, 산술연산자와 대입연산자를 결합하여 단순대입연산자로 사용한다.
10. 제어문
제어문은 프로그램의 흐름을 제어하는 문장이다. 조건문에는 if, elif가 있고 반복문에는 for/while, 분기문은 break, continue가 있다.
11. list
list는 여러 요소를 순서대로 저장한다. [ ]로 생성하고 다양한 타입의 요소를 저장할 수 있다. 인덱스나 슬라이싱을 사용하여 값을 불러와 사용한다.
12. tuple
tuple은 여러 개의 요소를 순서대로 저장하지만 변경이 불가해서 읽기 전용이다. ()로 생성하고 인덱스나 슬라이싱으로 값을 불러온다.
13. dictionary
dictionary는 키-값 쌍으로 데이터를 저장한다. { }로 생성하고 다양한 타입의 키와 값으로 구성되며 : 로 구분한다. 요소의 순서가 없고 변경이 가능하다.
14. set
집합은 중복되지 않은 요소를 저장한다.
15. AI
AI는 컴퓨터가 사람처럼 생각, 판단하게 만드는 기술이다. Machine Learning은 AI 분야 중 하나로 인간의 학습능력과 같은 기능을 컴퓨터에 부여하기 위한 기술이다. ML에는 학습의 방법에 따라 지도학습, 비지도학습, 강화학습이 있다. DeepLearning은 ANN을 기반으로한 ML 중 하나로 빅데이터를 기반하여 스스로 학습, 판단하는 기술이다.
16. Computer vision
컴퓨터 비전은 컴퓨터가 이미지나 비디오를 해석, 이해하는 기술과 관련된 인공지능의 하위분야이다.
object detection은 이미지나 비디오에서 의미있는 객체의 종류와 위치를 정확히 찾기위한 기술이다.
object tracking은 비디오에서 움직이는 객체를 식별하고 추적하는 기술이다.
얼굴 인식은 이미지나 비디오에서 얼굴을 인식하고 식별하는 기술이다.
이미지 생성은 텍스트나 다른 이미지를 기반으로 새 이미지를 생성하는 기술이다.
17. NLP
자연어 처리는 컴퓨터가 인간의 언어를 이해하고 생성할 수 있게 하는 기술로, 챗봇, 기계 번역, 텍스트 요약 등이 있다.
18. 정렬
졍렬은 입력된 데이터를 특정한 기준에 따라 오름/내림차순으로 정렬하는 알고리즘이다.
선택 정렬은 최소값을 찾아 맨 앞으로 보내며 정렬한다.
퀵 정렬은 pivot을 기준으로 큰 값, 작은 값을 분활해 재귀적으로 정렬한다.
삽입 정렬은 두 번째 요소부터 시작해 앞의 요소들과 비교하여 삽입할 위치를 찾고 정렬한다.
* 버블정렬은 처음부터 끝까지 인접한 두 요소를 비교하여 큰 값은 오른쪽, 작은 값은 왼쪽으로 정렬하는 것을 반복한다. 다른 정렬보다 비효율적이고 데이터가 클수록 성능이 매우 떨어진다.
19. search
검색은 데이터에서 원하는 데이터를 찾는 방법이다.
binary search는 정렬된 데이터를 검색한다. 중간값을 검사하여 찾는 값이 중간값보다 큰지, 작은지를 판단한 후, 크면 오른쪽, 작으면 왼쪽의 반절에서 다시 검색하는 것을 반복한다.
sequential search는 앞에서부터 하나씩 비교하여 검색한다. 데이터가 정렬되지 않아도 가능하지만 배열이 크면 비효율이다.
20. 재귀함수
재귀함수는 함수가 자기자신을 호출하여 문제를 해결하는 함수이다. 호출 횟루를 제한하는 조건문이 필요하고 코드의 간결성과 문제해결의 용이성이 있지만, 메모리 사용량이 증가하고 실행 속도가 저하된다.
* 하노이
21. TUI & GUI
TUI는 텍스트 기반 인터페이스로 명령어를 입력하고 텍스트로 정보를 표시하며, 키보드로 상호작용한다. 자원소모가 적고 가벼우며 간단하고 빠르게 작성할 수 있다. 콘솔 환경에서도 사용 가능하고 스크립트와 통합이 용이하다. 하지만 명령이나 옵션을 기억해야하고 복잡한 시각 표현이 어렵다.
GUI는 그래픽 요소로 상호작용하는 인터페이스로 마우스를 조작해 작업을 수행한다. 직관적인 환경을 제공하고 복잡한 작업을 간편하게 수행하며, 다양한 입력 방식으로 편의성이 크다. 하지만 자원소모가 많고 용량이 크며 구현 디자인에 시간, 비용이 많이 든다. 또한 다양한 플랫폼에서 동일한 모습을 유지하기 어렵다.
22. List & NumPy
List는 다양한 데이터 타입과 크기가 동적으로 조정되는 유연성, 다양한 내장함수와 메서드로 데이터 조작과 분석이 용이하다. 하지만 연산이 반복문으로 수행되어 큰 데이터는 속도가 느리고 각 요소에 대해 추가적인 메모리 공간을 사용하여 큰 데이터는 비효율이다.
NumPy는 반복문을 사용하지 않고 벡터화된 연산을 수행하여 처리 속도가 빠르고 효율적이다. 연속된 메모리 공간을 사용해 효율적이고, 행렬 연산과 다차원 데이터 처리가 용이하며 다양한 수학 함수가 있다. 하지만 한 가지 타입만 포함하고 크기를 동적으로 조정하지 못하고 추가 기능이 제한적이다.
23. Pandas
Pandas는 데이터 조작과 분석을 위한 라이브러리로 강력한 데이터 구조와 데이터 조작 기능을 제공하여 쉽게 조작하고 분석한다. series는 1차원 배열과 같고 각 요소는 index와 value로 구성된다. index는 요소의 고유한 이름이고 한 가지 타입으로 구성된 열을 나타낸다. dataFrame은 2차원 테이블과 같고 표 형태로 데이터를 저장, 조작한다. series를 모아 열을 구성하고, 각 열은 다른 데이터 타입과 고유한 이름을 가진다. 행은 하나의 데이터 레코드로 index를 가진다.
24. ADT
ADT는 데이터와 연산들의 집합을 묶은 것으로, 어떤 객체와 함수가 있는지만 명시해 놓고 구현 부분을 나타내지 않아 외부에선 데이터나 연산이 무엇인지 알 수 없어도 어떻게 동작하는 지는 알 수 있다.
- 추상화: 복잡한 현실 세계를 객체로 모델링하여 단순화하는 과정으로 핵심 특징을 추출하고 객체의 속성과 메서드로 표현한다.
- 캡슐화: 객체의 필드와 메서드를 하나로 묶고 외부 접근을 제한해 객체를 보호한다. 이를 통해 객체의 내부 구조를 감추고, 외부에 제공하는 인터페이스만 노출한다. 만들어진 캡슐은 클래스라 한다.
- 상속: 이미 존재하는 클래스를 기반으로 새 클래스를 생성하여, 기존 클래스의 속성과 기능을 재사용하고 새 기능을 추가해 코드를 간결하게 한다. 상위클래스를 부모 클래스, 하위 클래스를 자식 클래스라 한다. 메서드 오버라이딩은 상속 받은 메서드를 자식 클래스에서 재정의하는 것이고, 오퍼레이터 오버라이딩은 사용자 정의 클래서에서 필요한 연산자를 내장 타입과 형태와 동작이 유사하게 재정의하는 것이다.
- 다향성: 같은 이름의 메서드가 서로 다른 객체에서 다른 방식으로 동작하는 특성이고 코드의 재사용과 유연성을 높이며 객체 간 상호작용을 쉽게 구현한다.
constructor : 인스턴스를 생성하면 무조건 호출되는 메서드로 __init__()이라는 이름을 가진다.
인스턴스 변수: 인스턴스가 각각 값을 갖는 변수로 self.이름 으로 생성한다.
클래스 변수: 클래스 안에 공간이 할당된 변수로 모든 인스턴스와 값을 공유한다.
25. stack & queue
스택은 후입선출의 구조로 나중에 들어온 항목이 먼저 나간다. (LIFO)
큐는 선입선출로 먼저 들어온 항목이 먼저 나간다. (FIFO)