728x90

디렉토리 구조

[Linux Directory Structure Explained for Beginners]

https://linuxhandbook.com/linux-directory-structure/

 

Linux Directory Structure Explained for Beginners

This tutorial explains the Linux directory structure. You'll learn the Linux filesystem hierarchy along with the purpose of the various directories on a Linux system.

linuxhandbook.com

잘 정리된 글을 읽어봅시다

  1. / - Root
  2. /bin - User Binaries
  3. /sbin - System Binaries
  4. /etc - Configuration(설정) Files
  5. /dev - Divice File
  6. /proc - Process Information
  7. /var - Variable Files
  8. /tmp - Temporary Files
  9. /usr - User Programs
  10. /home - Home Directories
  11. /boot - Boot Loader Files
  12. /lib - System Libraries
  13. /opt - Optional add-on Applications
  14. /mnt - Mount Directory
  15. /media - Removable Media Devices
  16. /srv - Service Data

파일 찾는 법

locate & find

locate는 디렉토리를 찾지 않고 미리 정리된 데이터베이스(mlocate)에서 파일을 찾는다.

locate [찾고자 하는 파일명]

find는 직접 디렉토리를 찾는다. locate보다 성능이 떨어질 수 있으나 현재상태를 가져올 수 있고 다양한 사용법이 있다.

https://www.tecmint.com/35-practical-examples-of-linux-find-command/

 

35 Practical Examples of Linux Find Command

The Linux Find Command is one of the most important and frequently used command command-line utilities to search and locate the list of files and directories.

www.tecmint.com

자세한 사용법은 위의 글을 읽어봅시다.

whereis & $PATH

whereis : 파일이 위치한 디렉토리를 보여준다.

$PATH : $PATH에 저장된 디렉토리들을 검색해서 명령어가 있으면 바로 실행할 수 있도록 해준다. 예를 들어 경로 /bin/ls라고 다 치지 않고 ls라고만 쳐도 명령이 실행된다.

728x90

SHELL VS KERNEL

우리가 입력하는 명령은 shell을 대상으로 한다. shell은 이 명령을 해석해서 kernel에게 전달한다. kernel은 이를 다시 해석하여 hardware에 전달한다.
shell과 kernel을 분리함으로써 사용자에게 맞는 shell 사용할 수 있도록 한다.

 

bash vs zsh

ehco $0 을 통해서 사용하는 shell 프로그램을 확인할 수 있다.

  • cd 예시
    • bash : 숨긴 파일까지 표시된다, 아래 zsh에서 제공하는 기능을 사용할 수 없다
    • zsh : 숨긴 파일이 보이지 않는다, 경로 자동 완성 기능이 있다(첫글자만 입력하고 tab), 파일 변경이 용이하다

Shell script

순차적으로 진행되야하는 여러 명령을 저장해둔 파일. shell script를 통해서 여러 자동화된 작업을 수행할 수 있다.

<shell script 예시>

#!/bin/bash
if ! [ -d bak ]; then
        mkdir bak
fi
cp *.log bak

bash를 실행하고, 현재 디렉토리에 bak 디렉토리가 없으면 만들고, 현재 디렉토리에 있는 log 확장자를 가진 모든 파일을 bak에 복사한다.

chmod +x backup

파일을 처음 만들면 기본적으로 실행이 되지 않기 때문에 위 코드를 이용하여 backup 파일에 실행가능한 모드를 추가한다(+x)

728x90

IO Redirection

standard output

출력 되는 방향을 원래(화면)와 다르게 파일로 지정한다

출력형식
standard output : command-line arguments 입력했을 때 실행 결과를 모니터에 출력 / cf. standard error

ls -l > result.txt

>를 활용하여 출력을 redirection하여 결과를 result.txt에 저장한다

standard output을 redirection하는 경우 = 출력값을 파일로 저장

ls -l 1> result.txt

여기서 > 앞에 1을 생략하여 사용하기도 한다

standard error를 redirection하는 경우 = error 메시지를 파일로 저장

rm rename.txt 2> error.log

standard input

실용적이지 않음..

cat [파일이름]

파일의 내용을 출력함
cat : 사용자의 입력값을 출력한다

cat hello.txt

hello.txt를 cat이라는 프로그램에 인자로 전달함

cat < hello.txt

hello.txt를 standard input으로 cat에 전달함

본질적으로는 다르나 출력값은 같음

append

>> : redirection한 결과를 파일에 append한다

ls -al >> result.txt

해당 명령을 여러번 실행하여 확인하면 출력 결과가 덧붙여진다는 것을 알 수 있다

728x90

디렉토리와 파일

GUI 방식 : 아이콘과 같은 것을 이용해서 컴퓨터를 제어
CLI 방식 (command line interface) : 문자를 이용해서 명령, 명령어로 컴퓨터를 제어

명령은 사용자가 현재 위치한 디렉토리를 기준으로 내려진다. -> 어디 디렉토리에 있는지 알아야함!

pwd : 현재 디렉토리가 어디인지 확인하는 명령어
mkdir 디렉토리명 : 새 디렉토리 생성하는 명령어

ls : 현재 디렉토리의 파일 목록을 출력하는 명령어
sl -l : 현재 디렉토리의 파일 목록을 자세히 출력하는 명령어
-l 과 같은 것은 파라미터라고 한다.

cd 이동할 디렉토리 : 디렉토리 이동
cd .. : 부모 디렉토리로 이동
/ : 루트 디렉토리

rm 파일명 : 파일 삭제
rm -r 디렉토리명 : 디렉토리 삭제

--help와 man

명령어 --help : 명령의 사용설명서가 출력 (간단)
man 명령어 : 명령에 대한 사용설명서 표시 (전용페이지에서 상세한 매뉴얼 표시)

특정단어 검색 /특정단어 : n키를 누르면 단어가 다음에 나타나는 곳으로 이동

mkdir --version : 버전 확인

mkdir -p dir1/dir2/dir3/dir4 : 부모디렉토리도 동시에 생성 가능

ls -a or ls --all: 현재 디렉토리의 숨김파일도 보여주는 명령어
ls -al : 숨김파일까지 자세히 출력
ls -alS : 파일 사이즈에 따라서 정렬

sudo

super user do의 약자
permission : 권한. 각각의 사용자마다 할 수 있는 일과 없는 일이 정해짐
super user 또는 root user의 권한은 강력한 것이라 치명적인 실수를 유발할 수 있음
따라서, 필요할 때(프로그램 설치)만 sudo를 사용

file edit (nano)

nano 엔터 : 새 파일 만들기
nano 파일명 : 기존 파일 수정하기

ctrl + O : 저장
ctrl + K : 잘라내기
ctrl + U : 붙여넣기
ctrl + W : 단어 찾기

Package manager

sudo apt-get update; : apt 기능을 사용하고 싶을 때 먼저 목록 최신상태로 업데이트
sudo apt-cache search 이름 : 설치할 프로그램 찾기
sudo apt-get install 이름 : 프로그램 설치
sudo apt-get upgrade 이름 : 프로그램 업그레이드
sudo apt-get remove 이름 : 삭제

(Mac) hoembrew 사용가능

file download - wget

wget 주소 : 주소의 파일이 저장됨
wget -O (저장할 파일 이름) (주소) : 지정한 이름으로 파일이 저장됨

Source download - git

버전관리시스템 :문서나 설계도, 소스 코드 등의 변경 사항을 관리해주는 소프트웨어

Github : 수많은 오픈소스의 아지트

git clone 소스 주소 : 오픈소스를 로컬로 clone 하는 명령

728x90

컴퓨터 구조

: 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고 구성하는 방법

 

컴퓨터의 기능 구조에 대한 설계

: 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야 ex) 폰 노이만 구조, 하버드 구조, 수정된 비트 구조 등

  • 폰 노이만 구조
    : 컴퓨터 핵심 기능(연산, 제어, 저장)이 필요하다 생각
    • 중앙처리장치 (CPU) - 연산, 제어
      : 프로그램 연산 처리 및 시스템 관리. 프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 모든 과정 수행
      • 구성
        1. 산술논리장치 (ALU, Arithmetic Logic Unit) : 산술/논리 연산 처리
        2. 제어장치 (Control Unit) : CPU 제어
        3. 레지스터 (Register) : CPU에 필요한 데이터 저장
    • 기억장치 (Memory) - 저장
      : 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용
      1. 주기억장치 : 프로그램 실행 과정에서 필요한 데이터 임시 저장
        ex) 램 (RAM, Random-Access Memory)
      2. 보조기억장치 : 운영체제, 프로그램 등과 같은 데이터 장기간 보관
        ex) 하드 드라이브 (HDD, Hard Disk Drive), SSD (Solid State Drive)
    • 버스 (Bus) - 장치 간 데이터 or 제어 신호 교환
      : 컴퓨터 부품 간 또는 컴퓨터 간 신호 전송 통로
      • 데이터 버스 (Data Bus) : 데이터 이동
      • 주소 버스 (Address Bus) : 주소 지정
      • 제어 버스 (Control Bus) : 읽기/쓰기 제어
      • 랜선이나 데이터 전송 소프트웨어, 프로토콜 등을 포함

 

CPU 기능에 대한 설계

: 명령어 집합구조 (Instruction Set Architecture). CPU가 처리해야 하는 명령어를 설계하는 분야
ex) ARM, MIPS, AVR, 인텔의 x86-64 등

  • 명령어 집합구조 (ISA, Instruction Set Architecture) = CPU 설계도
    : 어떤 구조의 메모리와 호환이 가능한지 명시.
    프로그램 실행 시 기계어 명령어들을 CPU가 읽기 및 처리.
    명령어 집합 / 레지스터 집합 / 메모리 구조 정의
    ISA는 IA-32, x86-64(x64), MIPS, AVR 등 다양하게 존재.
    • Intel x86-64 아키텍처 ( =x64, AMD64, Intel 64)
      : 인텔의 64비트 CPU 아키텍처
      인텔의 32비트 CPU 아키텍처인 IA-32를 64비트 환경에 사용할 수 있도록 확장
      32비트 모델보다 훨씬 더 많은 양의 가상 메모리와 물리적 메모리 지원 → 더 많은 양의 데이터 저장 가능
      • n비트 아키텍처
        → n : CPU가 한번에 처리할 수 있는 데이터 크기
        → WORD : CPU가 이해할 수 있는 데이터 단위 

      • Intel x64의 레지스터
        • 레지스터 : CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용
        1. 범용 레지스터 (General Register) : 주용도는 있으나, 그 외의 다양한 용도로 사용될 수 있는 레지스터
        2. 세그먼트 레지스터 (Segment Register) : cs, ss, ds, es, fs, gs 총 6가지 세그먼트 레지스터 존재
        3. 명령어 포인터 레지스터 (IP, Instruction Pointer Register) : 프로그램을 구성하는 기계어 코드들 중 CPU가 어느 부분의 코드를 시행할지 가리킴
        4. 플래그 레지스터 (Flag Register) : 프로세서의 현재 상태를 저장하고 있는 레지스터

CPU의 하드웨어적 설계

: 마이크로 아키텍쳐(Micro Architecture). 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야

 


 

자료구조(Data Structure)

: 여러 데이터들의 묶음을 저장하고, 사용하는 방법을 정의한 것. 데이터의 효율적인 관리 및 사용을 위해 필요.

 

데이터(Data) : 문자, 숫자, 소리, 그림, 영상 등 실생활을 구성하고 있는 모든 값으로 그 자체만으로 어떤 정보를 가지기 힘듦

자료구조의 종류

  1. 단순 구조 : 자료 값 사용을 위해 컴퓨터가 기본적으로 제공하는 자료형 ex) 2진수, 정수, 실수, 문자, 문자열
  2. 선형 구조 : 자료를 구성하는 데이터를 순차적으로 나열시킨 형태로 자료들 간의 관계가 1:1인 자료 ex) 배열, 연결 리스트, 텍, 스택, 큐
  3. 비선형 구조 : 하나의 자료 뒤에 여러 개의 자료가 존재할 수 있는 것 ex) 그래프, 트리
  4. 파일 구조 : 서로 관련 있는 필드로 구성된 레코드 집합인 파일에 대한 자료구조. 보조 기억 장치에 데이터가 실제로 기록되는 형태로 메모리에 한 번에 올릴 수 없는 대용량을 다룸. ex) 순차 파일, 색인 파일, 직접 파일

선형자료구조

  • 스택 (Stack)
    : 데이터 삽입과 추출이 한쪽방향만 가능한 구조 (stack = 쌓다, 한쪽만 뚫림)
    • 푸시 (push) : 스택에 데이터를 넣는 작업
    • 팝 (pop) : 스택에서 데이터를 꺼내는 작업
    • Top : 스택의 가장 윗부분
    • Bottom : 스택에 가장 아랫부분
    • 후입선출 (LIFO, Last In First Out) 방식
  • 큐 (Queue)
    : 데이터 삽입과 추출이 양방향으로 가능한 구조 (양쪽 모두 뚫림)
    • 선입선출(FIFO, First In First Out) 방식
  • 리스트 (List)
    : 선형리스트. 항목 간의 순서를 정한 데이터가 나열된 자료구조. 구현 방법에 따라 순차 리스트와 연결 리스트로 구분.
    • 순차 리스트 (Array List)
      : 순차적인 메모리 공간을 할당하여 구현하는 리스트로 보통 배열로 구현
    • 연결 리스트 (Linked List)
      : 데이터가 불연속 공간에 흩어져 있는 상태에서 다음 데이터의 위치 정보를 보유하게 하는 자료구조로 메모리 동적 할당 기법을 이용하여 구현
      • 다른 여러 자료구조 (스택, 큐, 트리, 그래프) 구현시 활용

비선형자료구조

  • 트리 (Tree)  
    : 계층적인 구조를 나타냄. 하나의 루트 노드를 가지고 있으며, 각 노드는 0개 이상의 자식 노드를 가질 수 있음.
    • 노드(Node) : 트리의 기본 단위, 데이터를 저장하는 요소
    • 루트(Root) : 트리의 맨 위에 있는 노드
    • 부모(Parent) : 다른 하나 이상의 노드(자식 노드) 가리키는 노드
    • 자식(Child) : 부모 노드가 가리키는 노드
    • 조상(Ancestor) : 특정 노드에서 루트까지 이어지는 경로 상의 모든 노드
    • 자손(Descendant) : 특정 노드에서 아래 쪽으로 이어지는 모든 노드
    • 형제(Sibling) : 같은 부모 노드를 가진 자식 노드들
    • 잎(Leaf) : 자식 노드를 가지지 않는 노드, 트리의 가장 하위에 위치
    • 서브트리(Subtree) : 특정 노드와 그 하위 자손들로 이루어진 부분 트리

알고리즘

정렬 알고리즘

: 목록 안에 저장된 요소들을 특정한 순서대로 재배치하는 알고리즘. 입력 데이터는 보통 배열과 같은 데이터 구조.

  • 선택정렬 (Selection Sort) : 선택된 값과 나머지 데이터 중에 비교하여 알맞은 자리를 찾는 알고리즘 (안전성 보장되지 않음)
  • 삽입정렬 (Insertion Sort) : 데이터 집합을 순회하면서 정렬이 필요한 요소를 뽑아내어 이를 다시 적당한 곳으로 삽입하는 알고리즘 (버블정렬보다 좋은 성능)
  • 버블정렬 (Bubble Sort) : 인접한 두 수 를 비교하여 오름차순/내림차순으로 정렬하는 알고리즘 (안전성 보장되지 않음)
  • 병합정렬 (Merge Sort) : 둘 이상의 부분 집합으로 가르고, 각 부분 집합을 정렬한 다음 부분 집합들을 다시 정렬된 형태로 합치는 알고리즘 (분할정복법(Divide and Conquer), 안전성 보장됨)
  • 힙 정렬 (Heap Sort) : 트리 기반으로 최대 힙 트리/최소 힙 트리를 구성해 정렬하는 알고리즘 (안전성 보장되지 않음, 내림차순 정렬-최대 힙, 오름차순 정렬-최소 힙)
  • 퀵 정렬 (Quick Sort) : 데이터 집합 내에 임의의 기준(pivot) 값을 정하고 해당 피봇으로 집합을 두 개의 부분 집합(pivot보다 큰 부분과 작은 부분)으로 나누어 정렬하는 알고리즘 (안전성이 보장되지 않음)

 

728x90

기초

  • c 언어 : 컴퓨터 프로그래밍 언어 중 하나, 절차지향 언어(위에서 아래로만 컴파일 진행됨)
  • 헤더파일 : c언어의 문법을 가진 프로그램으로 코드의 맨처음에 불러와야 함. #include <헤더파일 이름> (ex. #include <stdio.h>)와 같이 불러옴.
  • 세미콜론 (;) : 문장 하나가 끝날 때 입력해줘야 함.
  • 주석 : 설명을 달 때 사용. //(한 줄), /* */(여러 줄).
  • 변수 선언 : (변수형) (변수이름) 형식 (ex. int a, float b)으로 선언.
    • int : 정수, unsigned int : 자연수, float : 실수, char : 문자 한 개, string : 문자열, double, long : 큰 실수
  • 매크로 상수 : #define (매크로 상수 이름) (숫자) 형식. 상수를 정의.

 

 

 입출력

  • printf( ) : 화면에 수나 문자를 출력하는 함수. printf(”출력할 내용”); , printf(”변환문자”, 변수); 형식으로 사용.
    • 변환 문자 : %d (int, 정수), %f (float, 실수 소수점 아래 6자리), %g (float, 실수 소수점 아래 1자리), %c (char, 문자 1개), %s (string, 문자열)
    • 기호 문자 : \n (줄바꿈), \t (tab) 등
  • scanf( ) : 변수에 값을 입력하는 함수. scanf(”변환문자”, &변수); 형식으로 사용.
  • cast 연산자 : 변수형을 임시로 변환하는 함수. (ex. printf(”%c”, (char)a); → int형의 변수 a를 char형으로 임시 변환)

 

 

조건문

  • 조건식
    • 1 : 조건식이 참, 0 : 조건식이 거짓
    • == (같다), != (다르다), <,>,<=,>= (부등호)
    • (조건식)&&(조건식) : and, 두 조건식 모두 만족하면 참
    • (조건식)||(조건식) : or, 두 조건식 중 하나라도 만족하면 참
    • !(조건식) : not, 참이면 거짓, 거짓이면
  • 조건 연산자 : (조건식) ? (참일 때) : (거짓일 때)
  • if 문
    • 형식 :
    • if (조건식) { 실행문; }
    • 실행 : 조건식이 참일 때 실행문으로 수행하고 거짓이면 다음으로 넘어감.
    • if - else 문 : if 문의 조건식이 거짓이면 else 문이 실행.
    • if - else if - else 문 : else if 문의 수는 제한이 없음. 여러개의 조건문을 위에서부터 읽어가며 가장 먼저 참이 되는 블록이 실행. 모든 조건식이 거짓인 경우 else 문이 실행.
  • switch-case 문
    • 형식 :
    • switch (판단할 변수) { case 숫자 : 실행문 ; break; default: 실행문; }
    • 실행 : 판단할 변수의 값이 n일 경우 case n의 실행문을 수행함. 해당하는 case가 없다면 default의 실행문을 수행함.
  • 반복문
    • for 문
      • 형식 :
      • for ( 초기화식; 조건식; 증감식 ){ 실행문; }
      • 실행 : 조건식이 참일 때 실행한 후 증감식을 실행하고 다시 조건식 평가, 거짓이 되면 종료.
    • while 문
      • 형식:
      • while (조건식) { 실행문; }
      • 실행 : 조건식이 참이면 실행문을 수행하고 다시 조건식 평가, 거짓이 되면 종료.
    • do-while 문
      • 형식 :
      • do { 실행문 ; } while (조건식) ;
      • 실행 : 실행문을 수행한 후 조건식 평가. 참이면 조건식을 수행하고, 거짓이 되면 종료.
    • break : break를 만나면 반복문에서 빠져나감.
    • continue : continue를 만나면 이하 실행문은 수행되지 않고 반복문의 처음으로 돌아감.

 

 

배열

  • 여러 개의 변수를 한꺼번에 선언
  • 형식 : 자료형 변수이름[갯수];
  • int, float 배열은 중괄호를 써서 변수의 값을 정함, {0, }을 쓰면 변수들이 0으로 초기화됨. char 배열은 “…” 형식으로 선언 가능.
  • 다차원 배열 : 2차원 - 자료형 변수이름[가로][세로], 3차원 - 자료형 변수이름[가로][세로][높이]
  • char 배열 (문자열 배열)
    • 배열의 마지막 값으로 반드시 NULL 값을 배정해줘야함
    • gets(), puts()
    • string.h
      • strcpy(char* s1, const char* s2) : s1에 s2의 모든 원소를 복사함
      • strcat(char* s1, const char* s2) : s1에 s2를 이어붙임
      • strchr(const char* s, int c) : s 배열에서 c라는 특정문자를 찾음
      • strlen(const char* s) : s 배열에서 NULL을 제외한 길이를 셈

 

 

함수

  • 형식 : 반환형 함수이름 (매개변수) { … }
  • 함수 반환형 : int (반환값이 정수형), void (반환값이 없음) 등
  • 함수 정의 : 함수를 실제 코드로 만드는 것
  • 함수 선언 : 어떤 함수를 만들어서 쓸 것이라고 미리 컴파일러에 정보를 주는 것
  • 매개변수 : 함수가 처리할 데이터를 저장하는 변수. 배열도 입력가능. (배열의 길이 비워둠. 다차원의 경우 첫 번째만 비워둠)
  • 재귀함수 : 함수 안에서 자신을 호출하는 함수

 

 

포인터

  • 메모리 주소를 저장하는 변수, 다른 변수의 메모리 주소를 저장하고 해당 변수에 대한 간접적인 접근을 제공
  • 형식 : 데이터형태* 포인터이름 (ex. int* ptr, char* str)
  • 동적 메모리 할당, 함수 호출, 배열 등 다양한 용도로 사용
  • 포인터 연산자 : * (역참조), & (주소 연산자)

 

 

구조체

  • 서로 다른 데이터 형식을 포함하는 사용자 정의 데이터 형식. 하나의 구조체 변수 안에 여러 데이터를 그룹화하여 관리.
  • 형식: struct 구조체 이름 { 자료형 변수명; 자료형 변수명; }
  • 구조체 멤버 접근 : . 연산자를 사용
  • 구조체 변수는 단일 변수처럼 전달, 함수의 인수로 전달되거나 반환될 수 있음

 


포인터랑 구조체는 다음에 자세히 정리하는 것으로-!

+ Recent posts