본문 바로가기

Computer

Computer Science and Engineering

컴퓨터 과학과 공학이란?

Computer Science and Engineering (이하 CSE)은 계산, 자동화 및 정보를 연구하는 학문이다.

컴퓨터 과학은 알고리즘, 계산 이론, 정보 이론, 자동화 등의 이론적 분야부터 하드웨어 및 소프트웨어의 설계와 구현 등의 실용적 분야까지 포괄한다.

 

CSE에 포함되는 여러 가지 분야 중에 다음 분야를 보통 중요하게 다룬다.

  1. Basic Concepts of Programming Language + 특정 언어 하나(C, Java, Python)
  2. Data Structure and Algorithms → 코딩 테스트
  3. Computer Architecture → 컴퓨터의 하드웨어와 시스템 대한 과목 (Architecture 같은 단어는 건축학에서 빌려왔다고 한다.)
  4. Operating System → Windows, macOS, Linux,... (많은 전공 학부생들이 좌절을 겪는다는 과목...)
  5. Computer Network → Ethernet, Wi-fi
  6. Database System → 데이터를 관리하는 시스템 과목. (Data Engineering 트랙 간다면 주목)
  7. Software Engineering → 개발 방법론

CSE는 두 가지의 영역으로 나눌 수 있다.

 

“Computational Thinking” 과 “Problem Solving”

 

“Computational Thinking” 

현실의 문제를 컴퓨터가 이해할 수 있게 문제를 정의하는 것

 

컴퓨팅 사고는 다음 4가지의 과정으로 이루어진다. (영어를 억지로 번역하면 의미가 어색해져 단어 그대로 사용)

  1. Decomposition : 전체 문제를 작은 여러가지 문제로 나누는 과정 (하나의 큰 문제를 작게 작게 분해하는 과정)
  2. Pattern Recognition : 주어진 문제의 반복적으로 나타나는 패턴을 찾는 과정 (반복적인 일은 컴퓨터가 가장 잘하는 작업)
  3. Abstraction : 문제에서 해결해야할 주요한 정보를 구체적으로 수치화(또는 계산 가능하게)하는 과정
  4. Algorithmic Thinking : 추천을 수행하는 과정을 step-by-step으로 만드는 과정

 

“Problem Solving”

정의된 문제를 컴퓨터가 효율적으로 계산할 수 있도록 명령을 내리는 과정

자료구조나 알고리즘을 사용하여 주어진 문제에 대한 풀이법을 코드로 작성하는 과정을 말한다.

 

Problem Solving Example.

  • 주어진 2개의 정수 list가 있을 때, 두 개의 list가 공통으로 포함하고 있는 모든 원소를 출력하는 코드를 작성하세요.

위와 같은 문제를 해결하는 과정이다.

 

Basic Programming Concepts

1. Programming Language (프로그래밍 언어)

Programming Language(이하 PL)이란 컴퓨터 프로그램을 작성하기 위한 언어이다.

PL은 언어로써 정의되기 때문에 문법(syntax)과 의미론(semantics)을 가진다.

PL은 다음과 같은 특징을 가진다.

  1. 사람이 목적을 가지고 언어 체계를 만든다.
  2. 언어를 번역하는 프로그램에 의해 기계어(Machine Instruction)로 번역된다. 이때 어떤 프로그램을 사용하느냐에 따라 컴파일 언어와 인터프리터 언어로 구분된다.
  3. 여러 패러다임이 있다. Procedure-based Programming, Object-Oriented Programming, Functional Programming 등이 있으며 하나의 언어가 여러 패러다임을 채택할 수 있다. (내가 배우는 파이썬은 절차 지향 언어이자 객체 지향 언어인 멀티 패러다임 언어이다.)
  4. 컴퓨터가 이해하기 좋은 Low-level Language (Assembly, C)와 사람이 이해하기 편한 High-level Language (Python, JAVA, JavaScript, Go, Swift 등)로 크게 구분된다.

2. Variables (변수)

컴퓨터 프로그램이 값을 저장하고 있는 메모리 공간을 부르는 이름이다.

변수는 코드에 의해 쓰여지는 것을 선언(declaration)되었다고 한다. 선언된 변수는 개념만 존재하다가, 코드가 컴파일되거나 실행되면 메모리 상에 올라가게 된다.

 

3. Data Types (데이터 타입)

변수를 선언할 때, 숫자나 문자열 또는 이 외의 것들을 변수에 저장하는 데이터 종류를 말한다.

PL마다 데이터 타입이 다르기 때문에 Python을 기준으로 정리하겠다. () 안의 단어는 Python에서 쓰이는 명령어

  1. Integer(Int) - 정수를 나타낸다. 양수, 음수 모두를 표현하며 언어마다 숫자의 표현 범위가 정해져 있다.
  2. Floating-Point(float, double) - 소수를 나타낸다. 여기서 소수는 실수를 나타내기 위해서 사용하는 개념이며, 컴퓨터는 무한소수를 표현하지 못한다.
  3. String(str) - 문자, 단어 등으로 구성된 문자들의 집합을 의미한다.
  4. Boolean(bool, True, False) - 참/거짓을 나타낸다. 2가지 값만 가진다.
  5. List(list) - 여러 개의 데이터를 묶어서 사용할 수 있는 자료형이다. 문자열, 정수, 리스트, 튜플 등을 원소로 가질 수 있다. [ ]로 표현
  6. Tuple(tuple) - 리스트와 달리 값을 수정할 수 없다는 것이 큰 차이점, 외에는 리스트와 비슷한 자료형이다. ( )로 표현 
  7. Dictionary(dict) - key, valu를 쌍으로 가지는 자료형이다. { }로 표현
  8. Set(set) - 중복, 순서가 없는 집합 형태의 자료형이다. { }로 표현

4. Operators (연산자)

  1.  Arithmetic Operator(산술 연산자) : 사칙연산과 같은 산술연산자를 의미한다. +, -, x, /, % 등이 있다.
  2. Comparison Operator(비교 연산자) : 두 개의 변수 사이의 크기 관계를 결정하는 비교연산자를 의미한다. ==, !=, <=, >=, <, >가 있다.
  3. Logical Operator(논리 연산자) : 어떤 두 개의 표현식의 논리 관계를 결정하는 논리연산자를 의미한다. AND, OR, NOT이 있다.
  4. Assignment Operator(할당 연산자) : 변수에 값을 할당하는 할당연산자를 의미한다. 과거에는 ← 로 사용되기도 하였으나, 내부 동작 원리를 이해하고 나면 오히려 혼선을 주는 경우가 있어 현대 PL에서는 대부분 =로 사용된다.

5. Control structures (제어 구조): if-else statements (조건문), loops (for, while) (반복문)

프로그램을 구현할 때 로직을 설계하기 위해서 사용하는 표현식이다.

if-else statements(조건문)로 조건에 따른 판단이 가능하다.

for, while statements(반복문)로 조건에 따른 반복 수행이 가능하다.

조건과 반복은 프로그램의 로직을 구성하는 데에 아주 중요하다.

 

6. Functions and modules (함수와 모듈)

Function

코드의 재사용성을 올리고, 기능 단위 코드를 분리해서 구현할 수 있는 개념이다. Function을 잘 사용하게 되면, 깔끔하고 유지보수하기 좋은 코드를 작성할 수 있다. 보통 프로그램 개발에서는 어떤 단위로 기능 구현을 할지 디자인을 하게 되는데, 이때 기본이 되는 단위가 Function이 된다.

  1. Function Definition (함수 정의): 정의하는 함수의 이름과 arguments의 개수와 이름, 함수 내부에 사용할 코드를 모두 정의하는 단계
  2. Parameters or Arguments (매개변수, 인자) : 함수 내부에서 사용할 (매개)변수. interface의 역할을 하며, 함수 외부에서 데이터를 받아오고 내부에서 처리하는 대리인의 역할을 한다. Parameter를 통해서 함수는 외부와 독립적으로 구현될 수 있다.
  3. Calling (호출) : 정의된 함수는 함수 외부에서 불러와서 사용할 수 있다. 불러올 때는 함수에 정의된 arguments에 처리할 value들을 함께 전달해야 한다.
  4. Return value (반환 값) : 함수의 내부 코드가 모두 실행되면 함수를 호출한 대상에게 결괏값을 돌려준다. 이때 어떤 값을 돌려줄지는 함수 내부에서 정의할 수 있다. (필요에 따라 정의하지 않아도 된다.)
  5. Scope (스코프) : 함수는 구현의 편의성을 위해서 함수 내부에서 사용한 변수들은 외부와 별개의 독립적인 변수로 관리한다. 이런 변수들을 local variable (지역 변수)이라고 하며, local variable들은 함수 외부에서 사용 및 참조가 불가능하다. (global variable (전역 변수)는 어디서든 참조 가능)

Module

Module(= library = package)이란 프로그램을 특정 기능과 관련된 함수, 변수, 특정 자료구조 등과 함께 묶어서 관리하는 단위를 말한다. Module을 사용하면 프로그램을 체계적으로 관리할 수 있으며, 여러 명의 개발자가 협업하여 프로그램 개발을 할 때도 전체적인 디자인을 하기가 편하다.

  1. Organization (조직화) : 어떤 코드들이 함께 구성되어 있어야 하는지를 결정하는 개념이다. 좋은 코드는 비슷한 기능을 하는 코드들이 함께 구현되어 있어, 유지보수를 편하게 해 준다.
  2. Reusability (재사용성) : Module 단위로 구현하는 가장 큰 이유는 역시 해당 Module들을 재사용하는 것에 있다. 여러 프로젝트를 수행할 때 구현해 둔 Module을 그대로 가져와서 편의에 맞게 활용할 수 있어야 좋은 Module이라고 할 수 있다.
  3. Namespace (네임스페이스) : 보통 Module 구현을 할 때, 코드의 각 영역들을 명시적으로 나눠야 한다. 이때 사용하는 것이 Namespace라는 명시적인 구분을 통해서 해당 코드가 어떤 코드 파일에서 정의되었는지를 알 수 있다.
  4. Importing (임폴팅) : 프로그래밍을 할 때, 특정 Module에 구현된 함수나 변수를 사용하기 위해서는 해당 Module을 불러와야 한다. 불러오는 과정은 해당 Module의 코드들을 메모리에 load 하고 현재 프로그램과 연결하는 작업이라고 볼 수 있다.

이어드림 스쿨의 김용담 강사님의 컴퓨터 공학 개론 자료를 출처로 하고 있습니다.

'Computer' 카테고리의 다른 글

Operating System  (0) 2023.04.03
Computer Architecture  (0) 2023.03.31
Algorithm  (0) 2023.03.30
Data Structure  (0) 2023.03.29
인공지능에 관하여  (0) 2023.03.27