1. 자료 구조의 개념

  1. 자료구조의 개념

    1. 컴퓨터 시스템
      1. 시스템의 정의
        1. 컴퓨터
          = Electronic Data Processing System(EDPS)
          = 전기 신호에 의해 자료가 처리되는 시스템
        2. 자료의 효율적인 처리 위해 자료형(data type) 개념 사용
        3. 문자, 정수, 실수, 복소수, 레코드, 구조체 등
      2. 시스템의 구성 요소
        1. 입력(input)
          1. 처리할 자료
          2. 처리 방법
        2. 처리(processing) → 자료 가공
        3. 출력(output) → 처리 결과 출력
        4. 제어(control)
        5. 귀환(feed back) → 처리 결과를 다시 입력 자료로 사용
    2. 자료와 정보
      1. 정의
        1. 데이터(D) → 처리기(P) → 정보(I)
          I = P(D)[I(Information), P(Process), D(Data)]
        2. 정보가 유용성을 갖기 위해서는 다음 두 가지를 갖춰야 함
          1. 정확성
          2. 현재성
      2. 자료
        1. 개념
          1. 현실 세계로부터 단순 관찰 또는 측정 통해서 수집된 사실이나 값
          2. 인식 및 처리에 알맞는 형태로 존재하며 평가되지 않음
        2. 데이터의 성격
          1. 데이터의 성격에 따라 다르게 분류하고 관리
            1. 이름, 소유자, 날짜, 생성자 → 음악
            2. 색깔, 길이, 범주 등 → 상품
      3. 자료구조
        1. 목적
          1. 정렬(배열)
          2. 관리
        2. 목적 달성 위해 특정 구조체의 형태로 관리 → search, sort 등 가능
        3. 데이터를 컴퓨터 메모리 상에 체계적으로 형성하는 방법을 배운다
        4. 종류
          1. array
          2. stack
          3. queue
          4. list
          5. heap
          6. tree
          7. graph
      4. 정보
        1. 자료가 프로그램에 의해 처리된 원하는 결과
        2. 어떤 상황에 대해
          적절한 의사결정 할 수 있게 하는
          데이터의 유효한 해석 또는 상호관계
        3. 발전단계
          Data → Information → Knowledge → Intelligence
        4. 알고리즘? 자료를 이용하여 정보를 구하기 위한 논리를 기술한 것
          프로그램? 알고리즘을 프로그래밍 언어를 이용하여 실행논리로 구현한 것
    3. 자료의 단위
      1. 개요
        1. 자료 단위
          bit → byte → word → record → block → file → db → data bank
          bit → byte → field(item) → record → file → db → data bank
        2. 용량 단위
          bit → byte → KB → MB → GB → TB
        3. 연산속도 단위
          ms → us → ns → ps → fs → as
        4. 기본 자료
          1. 수치(정수, 실수)
          2. 문자
          3. 논리
          4. 포인터
        5. 파일
          1. 순차 파일 구조
          2. 직접 파일 구조
          3. 인덱스된 순차 파일 구조
        6. DB
          1. 계층 구조
          2. 네트워크 구조
          3. 관계 구조
          4. 객체 지향 구조
      2. 비트(binary digit)
        1. 자료의 최소단위로 0 또는 1로 표현되는 2진수 한 자리를 기억시킬 수 있는 공간
        2. 컴퓨터는 내부적으로 2진수로 데이터 처리
      3. 니블
        1. 4비트 의미. 10진수 한 자리 표현하는 단위로 사용 가능
      4. 바이트
        1. 8비트  의미. 1문자 나타냄.
        2. 하나의 문자를 나타낼 수 있는 단위로 일반적으로 8개 비트가 연속된 것
          0 = 0000 0000, 17 = 0001 0001, 3 = 0000 0011
      5. 워드
        1. CPU에서 처리되는 명령의 단위
          1. half word = 2바이트
          2. full word = 4바이트
          3. double word = 8바이트
        2. 컴퓨터에서 자료가 연산되는 단위. 컴퓨터가 한꺼번에 처리할 수 있는 자료의 양
        3. 컴퓨터의 모든 명령은 기본적으로 워드 단위로 수행.
          → 워드 길이 = CPU 구성하는 레지스터 크기
          ex. 64비트 컴퓨터 = CPU가 한꺼번에 64비트씩 처리할 수 있음 의미
      6. 필드 또는 항목
        1. 레코드를 구성하는 항목으로 파일을 구성하는 단위 중 최소의 논리적 단위.
        2. 같은 종류의 data가 기록되는 항목으로 최소한의 문자집합
      7. 레코드
        1. 서로 관련된 필드 또는 항목의 집합. 프로그램 상에서 자료의 처리 및 기록의 단위
          → 논리적 단위, 내부에서 처리되는 단위
        2. 필드의 집합으로 DB에서 실제로 정보를 처리할 때 기본이 되는 단위
        3. 배열 → 데이터 원소의 크기와 데이터 타입이 동일
          레코드 → 데이터 원소의 크기와 데이터 타입이 서로 다름
      8. 파일
        1. 물리적인 구조가 같은 레코드의 집합
        2. 기억매체에 저장되는 단위
      9. 데이터베이스
        1. 여러 응용분야에서 여러 사람들이 공동으로 사용할 수 있도록  조직 및 관리되고  있는 자료의 모임
    4. 데이터 구조
      1. 정의
        1. 데이터 객체에 적용될 연산의 종류와 기능 결정 → 실제로 어떻게 이뤄지는가 기술 → 데이터 구조가 정의된다
        2. 수학적인 모델 또는 논리적 모델을 컴퓨터 내부에 표현
        3. 컴퓨터 기억공간에서 자료처리를 위한 데이터 표현법, 자료간의 상호관계를 파악하여 작업을 수행하기 위한 알고리즘을 연구
      2. 분류
        1. 선형구조
          1. 배열
            1. 물리적 연속성 있음
            2. 검색 연산, 기록밀도, 수정연산 높다
            3. 삽입, 삭제 연산 낮다
            4. 정적구조
            5. 외부단편화 발생
          2. 연결
            1. 논리적 연속성 있음
            2. 검색연산, 기록밀도, 수정연산 낮다
            3. 삽입, 삭제 연산 높다
            4. 동적구조
            5. 외부단편화 미발생
        2. 비선형구조
          1. 트리
            1. 그래프의 특수한 구조.
            2. 사이클 허용하지 않음
          2. 그래프
            1. 사이클 허용
      3. 자료구조 선택시 고려사항
        1. 데이터 양, 접근빈도, 접근시간
        2. 데이터의 성격
          1. 잦은 변경?
          2. 일정 형태 유지?
        3. 사용되는 컴퓨터의 메모리 허용도
        4. 프로그램 작성의 용이성
        5. 데이터의 사용 빈도 및 저장 방식
      4. 데이터 객체
        1. 자료형의 실체를 구성하는 원소의 집합 ex. 자연수 N의 데이터 객체 = {1, 2, 3, 4, … } ex. 정수형 D의 데이터 객체 = { … , -3, -2, -1, 0, 1, 2, 3, … }

1. 리눅스 개념


  1. 리눅스 개념
    1. 리눅스
      1. 개념
        1. 컴퓨터 운영체제
        2. 애플리케이션이 실행되는 환경
      2. 기능
        1. 하드웨어 감지 및 준비
        2. 프로세스 관리
        3. 메모리 관리
          1. 요청된 메모리의 처리 방식을 결정.
        4. 사용자 인터페이스 제공
          1. 사용자 계정 생성 및 사용자 간 경계 설정
          2. 사용자 간 및 그룹 간 계정 분리
            → 사용자가 자신의 파일과 프로세스 제어할 수 있는 토대
        5. 파일시스템 제어
          1. 파일시스템 구조는 리눅스 운영체제와 한 몸(모듈로 로드되기도 함)
          2. 각종 파일과 디렉터리에 대해 그 소유권과 접근 권한 제어
        6. 사용자 접근 권한 및 인증 방식 제공
        7. 관리용 유틸리티 제공
        8. 서비스 시작
          1. 웹 페이지를 볼 수 있는 웹 브라우저가 포함됨과 동시에 리눅스 자체가 웹 페이지를 다른 시스템에 제공하기 위한 서버 컴퓨터가 되기도 함
        9. 프로그래밍 도구 제공
      3. 대기업에서 주로 사용하는 리눅스의 고급 기능
        1. 클러스터링
          1. 다수의 시스템이 외부에서 하나의 시스템처럼 보이도록 클러스터 구성
          2. 서비스는 클러스터 노드들이 주고받을 수 있도록 구성
          3. 클러스터 노드에서는 서비스가 방해받지 않고 지속적으로 실행되는 것처럼 보임
        2. 가상화
          1. 가상화 호스트에서는 다른 리눅스 시스템을 비롯하야 마이크로소프트 윈도우, BSD 등 다른 운영체제까지도 가상 게스트로 실행 가능
          2. 외부에서는 가상 게스트가 개별 컴퓨터로 보임
          3. KVM과 젠(Xen)
        3. 클라우드 컴퓨팅
          1. 대규모 가상화 환경 관리
          2. 오픈 스택(OpenStack) 또는 레드햇 엔터프라이즈 가상화
            1. 다수의 가상화 호스트
            2. 가상 네트워크
            3. 사용자 및 시스템 인증
            4. 가상 게스트
            5. 네트워크 기반 스토리지
        4. 실시간 컴퓨팅
          1. 우선순위 높은 프로세스들을 빠르고 예측 가능하도록 실행하기 위해
        5. 전문 저장소
          1. 전문화된 로컬 및 네트워크 스토리지 인터페이스 사용 가능
          2. 공유 스토리지 장치
            ex. Ceph와 GusterFS
      4. 차이점
        1. 운영체제를 만들 때 사용했던 코드 볼 수 있다
        2. 사용 목적에 부합하지 않을 경우 가장 기본적인 수준에서 변경할 수 있고 운영체제를 직접 빌드하여 사용할 수 있다.
        3. 코드를 통해 버그를 찾는다거나 보안 취약점을 찾아서 확인하고 무슨 일을 하는지 알 수 있다.
        4. 필요한 소프트웨어를 운영체제에 직접 끼워넣을 수 있다.
      5. OSI(Open Source Initiative) 오픈 소스 정의
        1. 기본 목적: 소스 코드를 함께 사용
        2. 규칙 for 오픈 소스 코드의 자유와 무결성 보호
          1. 자유 배포
          2. 소스 코드
          3. 파생 작업
          4. 저작자의 소스 코드 무결성
          5. 개인 또는 단체에 대한 차별 금지
          6. 연구 분야에 대한 차별 금지
          7. 라이선스 배포
          8. 라이선스는 특정 제품으로만 국한되어서는 안 된다
          9. 라이선스는 다른 소프트웨어를 제한해서는 안 된다
          10. 라이선스는 기술 중립적이어야 한다
      6. 리눅스 배포판
        1. 슬랙웨어
          1. 디스크 포맷
          2. 스왑 공간 활성화
          3. 사용자 계정 만들기
        2. 크노픽스
        3. 젠투
        4. 맨드레이크 → 맨드리바
        5. 레드햇 → 기업용(레드햇 엔터프라이즈 리눅스, RHEL) 및 개인용(페도라)
          1. 초기 배포판 특징
            1. RPM 패키지 관리
              1. 소프트웨어 패키지에 파일 및  패키지 정보 함께 넣음
                ex. 누가 만들었는지, 문서화 파일인지 설정파일인지 등
              2. 소프트웨어 패키지 정보가 로컬 RPM 데이터베이스에 저장
              3. 설치, 검색, 업데이트, 제거 편리
            2. 단순 설치
            3. 그래픽 기반 시스템 관리
          2. RHEL
            1. 빠른 트랜잭션 처리
            2. 클러스터나 가상호스트로 배치될 수 있는 시스템
            3. JBoss → 자바 기반 애플리케이션을 인터넷이나 기업 인트라넷에 배포하기 위한 미들웨어 제품
            4. 레드햇 엔터프라이즈 가상화
              → 가상화 호스트 + 각종 관리자 + 게스트 컴퓨터
              → 사용자가 직접 거대한 가상 컴퓨팅 환경을 설치, 실행, 관리, 마이그레이션, 서비스 해제 등 가능
            5. 레드햇 클라우드폼 → 클라우드 관리 플랫폼
            6. 도커(Docker) 형태의 리눅스 컨테이너와 RHEL 아토믹
              → 클라우드용 애플리케이션 컨테이너화 방법 제공
          3. 페도라
        6. 데비안 GNU/리눅스 배포판
          1. 리눅스 민트
          2. elemetary OS
          3. 조린(Zorin)
          4. LXLE
          5. 칼리(Kali)
          6. 우분투
            1. 단순하고 사용하기 쉬운 그래픽 기반 인스톨러와 도구 채용
            2. 서버 패키지 제공
            3. 완전한 데스크톱 시스템
      7. 레드햇 공인 전문가
        1. RHCSA → 기본적인 시스템 관리 기술
          1. 기본적인 도구 이해
            1. 셸(bash)에 대한 실무 지식
            2. 설명에 대한 올바른 명령 문법 사용하고 입출력 리디렉션(<, >, >>) 수행
            3. 원격 및 로컬 시스템 로그인
            4. 파일의 권한이나 소유권 생성, 이동, 복사, 링크, 삭제, 변경
            5. man 페이지와 /usr/share/doc에서 원하는 정보 찾을 수 있어야 함
          2. 실행 시스템 운영
            1. 리눅스 부팅 프로세스 이해
            2. 단일 사용자 모드 진입
            3. 시스템 종료
            4. 재부팅
            5. 타깃(=런레벨, runlevel에 해당하는 새로운 용어) 변경 수행
            6. 프로세스 식별하고 값을 변경하거나 요청을 받으면 프로세스 죽일 수 있어야 함
            7. 가상 머신 및 네트워크 서비스 시작 및 중지
            8. 로그 파일 찾아 해석 가능
          3. 로컬 저장소 구성
            1. 디스크 파티션 설정에서 물리적 볼륨의 생성
            2. LVM(논리적 볼륨 관리)구성
            3. 암호화(LUKS)
            4. 파티션을 파일시스템이나 스왑 공간으로 설정하여 마운트하거나 부팅 시 활성화할 수 있어야 함
          4. 파일시스템 생성 및 구성
            1. 여러 파일시스템을 만들고 자동으로 마운트 할 수 있어야 함
            2. 정규 리눅스 파일시스템(ext2, ext3, ext4 등),
              LUKS 암호화 파일시스템,
              네트워크 파일시스템(NFS 및 CIFS) 등을 다룰 수 있어야 함
            3. set group ID 비트 기능과 ACL(Access Control List) 사용하여 협업 디렉터리 만들 수 있어야 함
            4. LVM 사용하여 논리 볼륨 크기 늘릴 수 있어야 함
          5. 시스템 배포 및 구성, 유지 관리
            1. 네트워크 구성, cron 작업 생성, 기본 런레벨 설정, RHEL 시스템 설치 등
            2. 간단한 HTTP 및 FTP 서버 구성 능력
            3. 레드햇 네트워크 / 원격 보관소(repository )/ 로컬 파일시스템에서 소프트웨어 패키지를 가져다 설치할 수 있는 능력
            4. 새로운 커널을 올바로 설치할 수 있어야 함
            5. 시스템 시작 시 여러 커널 중 하나를 선택하여 부팅시키는 능력
          6. 사용자 및 그룹 관리
            1. 사용자 및 그룹 계정을 추가, 삭제, 변경
            2. change 명령을 사용한 암호 기간 설정 반드시 숙지
            3. LDAP 디렉터리 서버로 연결하여 시스템 인증할 수 있도록 구성하는 능력
          7. 보안 관리
            1. 기본적인 방화벽(firewalld 또는 system-config-firewall, iptables) 설정 방법과 SELinux 사용 방법 이해
            2. 키 입력 기반 인증 위한 SSH 설정 능력
        2. RHCE
          1. 시스템 구성과 관리에 필요한 넓은 범위의 주제
            1. 본딩(bonding)
              1. 네트워크 링크 종합 능력
            2. IP 트래픽 라우팅
              1. 특정 네트워크 주소의 정적 라우트 설정 능력
            3. 방화벽
              1. 웹, FTP, NFS 등의 서비스를 제공하는 시스템에서 특정 포트의 트래픽을 차단하거나 허용할 수 있어야 함
              2. 접속자의 IP 주소에 따라 특정 서비스를 차단하거나 허용할 수 있어야 함
            4. 커널 turnable 파라미터
              1. /etc/sysctl.conf파일과 sysctl 명령으로 커널 turnable 파라미터 설정할 수 있어야 함
              2. /etc/sysctl.conf 파일을 활용하여 /proc/sys에서 IP 포워딩 설정 변경할 수 있어야 함
            5. 커버로스(Kerberos) 인증
              1. 커버로스 방식을 사용하여 RHEL 시스템 사용자를 인증할 수 있어야 함
            6. iSCSI(internet Small Computer System Interface)
              1. iSCSI는 컴퓨팅 환경에서 데이터 스토리지 시설을 이어주는 IP 기반의 스토리지 네트워킹 표준
              2. 부팅 시 iSCSI 타깃을 마운트하는 iSCSI 타깃 및 이니시에이터로 시스템을 설정할 수 있어야 함
            7. 시스템 보고
              1. sar 등의 기능을 사용하여 시스템의 메모리, 디스크 액세스, 네트워크 트래픽, 프로세서 활용 등에 관한 보고서 작성 능력
            8. 셸 스크립팅
              1. 입력을 받고 이를 다양한 방법으로 출력하는 셸 스크립트를 만들 수 있어야 함
            9. 원격 로그 처리
              1. 로그 메시지를 수집하여 이를 원경 로깅 서버에 분배할 수 있도록 rsyslogd 기능을 구성할 수 있어야 함
              2. 로깅 클라이언트에서 로그 메시지를 수집할 수 있도록 원격 로깅 서버 기능을 구성할 수 있어야 함
            10. SELinux
              1. 모든 서버 구성의 보안이 SELinux로 올바르게 유지되고 있는지 강제(Enforcing) 모드의 보안 강화 리눅스(Security Enhanced Linux)를 사용하여 확인할 수 있어야 함
          2. 네트워크 서비스 설치하기와 구성하기
            1. 목표
              1. 모든 네트워크 서비스에 대해 정해진 단계를 밟아 각 서비스에 필요한 패키지를 설치하고 액세스를 허용할 수 있도록 SELinux를 설정할 수 있어야 함
              2. 부팅 시 서비스가 시작하도록 설정하고, 호스트나 사용자가 제공하는 서비스의 보안을 유지할 수 있어야 함
            2. 구체적인 서비스
              1. 웹 서버
                1. 아파치 서버(HTTP/HTTPS) 구성 능력
                2. 가상 호스트를 설정하고 CGI 스크립트를 배포할 수 있어야 함
                3. 사설 디렉터리를 사용하고 특정 리눅스 그룹에서 콘텐츠를 관리할 수 있도록 해야 함
              2. DNS 서버
                1. DNS 쿼리를 다른 DNS 서버로 전달할 수 있는 캐시 전용 이름 서버로 동작할 수 있도록 DNS 서버(bind 패키지)를 설정할 수 있어야 함.
                2. 마스터나 슬레이브 영역까지 구성할 필요 없음
              3. NFS 서버
                1. 특정 디렉터리를 특정 클라이언트 시스템과 공유하여 그룹 간 협업에 사용될 수 있도록 NFS 서버를 구성할 수 있어야 함
              4. Windows 파일 공유 서버
                1. 특정 호스트 및 사용자에게 SMB 공유 기능을 제공할 수 있도록 리눅스(삼바, samba)를 설정할 수 있어야 함
                2. 이를 통해 그룹 간 협업을 구현
              5. 메일 서버
                1. 로컬 호스트 외부에서 보낸 메일을 수신할 수 있도록 postfix와 sendmail을 구성할 수 있어야 함
                2. 스마트 호스트(smart host)로 메일을 전달(릴레이)할 수 있어야 함
              6. 보안 셸 서버
                1. 로컬 시스템에 대한 원격 로그인
                2. 키 입력 기반 인증을 허용할 수 있도록 SSH 서비스(sshd)를 설정할 수 있어야 함
                3. sshd.conf 파일을 필요에 따라 구성하는 능력
              7. 네트워크 시간 서버
                1. NTP(Network Time Protocol) 피어들과 시간을 동기화할 수 있도록 NTP 서버(ntpd)를 구성할 수 있어야 함
              8. 데이터베이스 서버
                1. 마리아DB 데이터베이스를 구성하고 다양한 관리방법을 이해하여 MariaDB.org 사이트로부터 마리아DB를 구성할 수 있어야 함

3. 추상 데이터 타입