728x90

렌즈 #31: 도전의 렌즈

도전은 거의 모든 게임플레이의 핵심이다. 게임은 도전과 목표로 정의된다고도 말할 수 있다. 게임의 도전을 살펴보려면 다음과 같이 자문해보라.

  • 이 게임에는 어떤 도전이 있는가?
  • 도전이 너무 쉽거나 어려운가? 딱 맞나?
  • 이 도전들이 다양한 실력 수준에 부합할까?
  • 플레이어의 성공에 따라 레벨 난이도가 어떻게 증가하는가?
  • 도전에 충분한 다양성이 있는가?
  • 이 게임에서 최고의 도전 난이도는 무엇인가?

 

렌즈 #32: 의미 있는 선택의 렌즈

의미 있는 선택을 하면, 우리가 중요한 일을 하는 것처럼 느껴진다. 이 렌즈를 쓰려면 다음과 같이 자문해보라.

  • 플레이어에게 어떤 선택을 제시하고 있는가?
  • 이 선택들은 의미 있는가? 어떤 의미가 있는가?
  • 플레이어에게 적절한 수의 선택을 제공하는가? 선택이 더 많으면 자신이 강력하다고 느낄까? 더 적으면 게임이 더 명확해질까?
  • 이 게임에 우월 전략은 존재하는가?

 

렌즈 #33: 삼각형의 렌즈

플레이어에게 낮은 보상으로 안전하게 플레이할지, 아니면 위험을 감수하고 큰 보상을 노릴지 선택하게 하는 건 게임을 재미있고 흥분되게 만드는 훌륭한 방법이다. 삼각형의 렌즈를 쓰려면 다음과 같이 자문해보라.

  • 지금 삼각형이 있는가? 없다면 어떻게 만들까?
  • 도전의 삼각형이 균형 잡혀 있는가? 즉 보상과 위험이 등가인가?
    게임의 삼각형을 찾기 시작하면 어디서나 이것을 볼 수 있다. 지루하고 단조로운 게임에 삼각형을 넣기만 해도 금새 흥분되고 가치 있는 게임으로 바뀐다.

 

렌즈 #34: 기술과 우연의 렌즈

게임에 기술과 우연을 밸런싱하는 방법을 결정하기 위해, 다음과 같이 자문해보라.

  • 플레이어는 판정받기 원하는가(기술), 위험을 원하는가(우연)?
  • 기술이 우연보다 진지하기 쉽다. 이 게임은 진지한가, 가벼운가?
  • 이 게임은 지루한가? 그렇다면, 우연적 요소를 넣으면 활기를 줄 수 있을까?
  • 게임에 너무 무작위로 보이는 부분이 있는가? 그렇다면, 우연적 요소를 기술이나 전략의 요소로 대체해 플레이어가 게임을 통제하고 있다고 느끼게 할 수 있는가?

 

렌즈 #35: 머리와 손의 렌즈

야구 선수 요기 베라(Yogi Berra)는 "야구의 90%는 정신적이다. 나머지가 육체적이다" 라는 말을 남겼다. 게임의 정신적 부분과 육체적 부분이 좀 더 현실적으로 밸런싱되도록 머리와 손의 렌즈를 사용하라. 다음과 같이 자문해보자.

  • 플레이어는 정신없는 액션을 원하는가, 아니면 지적인 도전을 원하는가?
  • 퍼즐을 푸는 장소를 추가하면 게임이 더 흥미로워질까?
  • 플레이어가 두뇌를 쉬면서 생각 없이 플레이할 수 있는 장소가 있는가?
  • 플레이어에게 고난도의 조작을 연습해 성공할지, 아니면 최소한의 육체적 기술을 동반한 현명한 전략을 찾음으로써 성공할 것인지 선택권을 줄 수 있는가?
  • '1'이 완전히 육체적인 것을, '10'이 완전히 정신적인 것을 뜻한다고 할 때, 이 게임은 몇 점이겠는가?
    이 렌즈는 특혀 '렌즈 #16: 플레이어의 렌즈'와 결합해 자 동작한다.

 

렌즈 #36: 경쟁의 렌즈

어떤 일에 누가 가장 능숙한지 정하는 것은 인간의 기본적 충동이다. 경쟁형 게임은 이 충동을 만족시킨다. 이 렌즈를 써서 경쟁형 게임을 하는 사람들이 이기고 싶어지게 만드는지 확인하라. 다음과 같이 자문해보자.

  • 이 게임은 플레이어 기술을 공정하게 측정하는가?
  • 사람들은 이 게임에서 이기고 싶어하는가? 왜 그런가?
  • 이 게임을 이기면 사람들이 자랑스러워할 만한가? 왜 그런가?
  • 이 게임에서 초보자도 의미 있는 경쟁을 할 수 있는가?
  • 이 게임에서 숙련자도 의미 있는 경쟁을 할 수 있는가?
  • 숙련자는 일반적으로 초보자를 이기게 되는가?

 

렌즈 #37: 협력의 렌즈

팀으로서의 협동과 성공은 지속적인 사회적 유대를 만들 수 있는 특별한 기쁨이다. 이 렌즈로 게임의 협력적 요소를 살펴보라. 다음과 같이 자문해보자.

  • 협력은 의사소통을 필요로 한다. 이게임의 플레이어는 의사소통을 할 기회가 충분한가? 어떻게 의사소통을 개선할 수 있을까?
  • 이 게임의 플레이어는 원래 친구들일까, 아니면 낯선 사람들일까? 낯선 사람들이라면 어떻게 어색함을 없앨까?
  • 함께 플레이할 때, 게임에 시너지(2 + 2 = 5)나 앤터지(시너지의 반대말. 2 + 2 = 3)가 있는가? 어째서인가?
  • 모든 플레이어가 같은 역할을 하는가, 아니면 특별한 역할이 존재하는가?
  • 혼자서는 임무를 완수할 길이 없을 때, 협업은 엄청나게 강화된다. 이 게임에 그런 임무가 있는가?
  • 의사소통을 강화하는 임무는 협업을 고취시킨다. 의사소통을 강화하는 임무가 있는가?

 

렌즈 #38: 경쟁과 협력의 렌즈

경쟁과 협력은 많은 재미있는 방법으로 밸런싱할 수 있다. 이 렌즈를 써서 게임에서 적절히 밸런싱됐는지 확인하라. 다음과 같이 자문해보자.

  • '1'이 경쟁이고 '10'이 협력일 때, 이 게임은 몇 점인가?
  • 플레이어에게 협력할지 경쟁할지 선택권을 주고 있는가?
  • 고객이 경쟁을 선호하는가, 협력을 선호하는가? 아니면 섞인 것을 좋아하는가?
  • 게임에 뭔가 그럴싸한 팀 경쟁이 있는가? 팀 경쟁이 더 재미있는가, 혼자 경쟁하는 게 더 재미있는가?

 

 

렌즈 #39: 시간의 렌즈

"타이밍이 생명이다"라는 말이 있다. 디자이너의 목표는 경험을 만들어내는 데 있고, 경험은 너무 짧거나 길면 망쳐지기 쉽다. 게임이 딱 좋은 길이가 되도록 다음 질문을 던져라.

  • 게임플레이 활동의 길이를 결정짓는 것은 무엇인가?
  • 게임이 너무 빨리 끝나 플레이어가 좌절하지 않을까? 어떻게 바꿀 수 있을까?
  • 게임이 너무 오래 가서 지겨워질까? 어떻게 바꿀 수 있을까?
  • 시간 제한을 두면 게임플에이가 더 흥분될 수도 있다. 이 게임도 그럴까?
  • 짧은 라운드 몇 개가 모여 큰 라운드가 되는, 시간 구조의 계층화가 이 게임에 도움이 될까?
    제대로 된 타밍을 잡기란 매우 어렵지만, 이것이 게임을 성공시키기도 하고 망치기도 한다. 오래된 보드딜(노래, 춤 등이 섞인 오락연예) 금언대로 '더 원하게 두는' 편이 좋은 경우도 많다.

 

렌즈 #40: 보상의 렌즈

누구나 잘했다는 말을 듣고 싶어한다. 다음 질문들로 게임이 적절한 시간에 적절한 좋은 보상을 주고 있는지 알아보라.

  • 이 게임은 무슨 보상을 주고 있는가? 다른 보상도 줄 수 있을까?
  • 이 게임에서 보상을 받을 때 플레이어들은 흥분할까, 아니면 지루해할까? 어째서일까?
  • 이해하지 못하는 보상을 받는 건 보상을 받지 않는 것과 같다. 플레이어들이 자신이 받는 보상을 이해하고 있을까?
  • 보상이 너무 규칙적으로 주어지지 않나? 좀더 다양한 방식으로 제공될 수 있을까?
  • 이 게임의 보상은 서로 얼마나 관련돼 있는가? 더 잘 결합될 방법이 있을까?
  • 보상은 어떻게 주어지는가? 너무 빠른가, 너무 느린가, 아니면 적절한가?
    보상 밸런스는 게임마다 모두 다르다. 디자이너는 좋은 보상을 주는 것뿐 아니라, 정확한 시간에 올바른 양을 내놓는 것도 고민해야만 한다. 이것은 시행착오를 통해 정해질 수 있지만, 그래도 모든 이에게 적합하지는 않을 것이다. 보상을 밸런싱하고자 할 때 완벽이란 어렵다. 아마도 '괜찮음' 정도에 만족해야 할 것이다.

참고 문헌 : Jesse Schell. The Art of Game Design.  에이콘 출판사, 2010.

728x90
728x90

2.1 프로세스

2.1.1 프로세스의개요

  • 프로그램과 프로세스 차이
    • 프로그램 : 동작을 하지 않는 정적이며 수동적인 개체
    • 프로세스 : 실행중인 프로그램으로, 동작을 하는 능동적인 개체
  • 프로세스에는 실행을 위해 필요한 자원이 할당됨
    • 자원 : CPU, 메모리, 입출력장치, 파일 등
  • 프로세스의 동작 : CPU가 그 프로세스의 명령들을 실행하는 것
  • 운영체제가 처리하는 작업
    • 프로세스를 생성키기고 종료시키기 위한 다양한 작업
    • 프로세스를 실행시키기 위한 스케줄링 작업

2.1.2 프로세스의 구성

  • 메모리 구조
    • 코드 영역 : 해당 프로세스의 프로그램 자체
    • 데이터 영역 : 상수나 변수의 값, 서브프로그램 호출상태 등
      • 정적 데이터 영역
      • 스택 영역
      • 힙 영역
  • 프로세스 제어 블록(PCB)
    • 프로세스를 관리하기 위해 필요한 정보들로 구성
    • 프로세스 제어 블록에 포함되는 정보
      1. 프로세스 번호(PID) : 프로세스의 구분 기준
      2. 프로세스 상태 : 프로세스의 현재 상태
      3. 프로그램 카운터(PC) : 프로세스 수행을 위해 다음에 실행할 명령의 주소
      4. 레지스터 : CPU의 레지스터 정보
        • 실행상태에서 다른 상태로 전이되는 경우 CPU의 레지스터 정보를 이곳에 저장시킴
      5. 메모리 관리 정보 : 프로세스가 저장된 주소, 가상주소와 실주소의 사상정보, 메모리 경계 정보 등
      6. 프로세스 우선순위 : 스케줄링 시 필요한 프로세스의 우선순위 정보
      7. 회계정보 : CPU 사용시간, 메모리 사용량 등 다양한 정보2.1.3 프로세스 상태 관리
  • 프로세스 상태
    • 생성상태 : 처음 작업이 시스템에 주어진 상태
      • PCB와 메모리 구조가 생성되면 준비상태로 전이
    • 준비상태 : CPU 할당을 기다리는 상태
      • 디스패치 (프로세스에 CPU 할당)되면 실행상태로 전이
    • 실행상태 : CPU가 프로세스의 명령들을 처리하는 상태
      • 스케줄러가 다른 프로세스 선택 : CPU를 회수당하며 준비상태로 전이
      • 입출력 작업, 페이지 교환 요구 등 : CPU를 반납하고 대기상태로 전이
      • 모든 처리 완료 또는 운영체제가 강제 종료 : 종료상태로 전이
    • 대기상태 : 입출력 작업이 끝날 때까지 또는 특정 자원을 할당받을 때 까지 보류되는 상태
      • 재개 조건(입출력 작업 완료, 자원할당 완료 등)이 만족되면 준비상태로 전이
    • 종료상태 : 더이상 실행되지 않도록 끝난 상태
      • 프로세스에 할당되었던 자원 회수2.1.4 부모 프로세스와 자식 프로세스
  • 프로세스 생성 방법
    • 사용자가 프로그램을 직접 실행
    • 한 프로세스가 다른 프로세스 생성
      • 프로세스 생성 시스템 호출 이용
      • 부모 프로세스 : 시스템 호출을 하는 프로세스
      • 자식 프로세스 : 시스템 호출을 통해 새로 생성된 프로세스
  • 프로세스 생성 시스템 호출
    • UNIX, Linux : fork()
      • 자식 프로세스는 부모 프로세스의 복제본(메모리 구조, PCB)
      • PID는 새로 지정
    • Windows: CreateProcess()
      • 자식 프로세스는 새로운 프로그램으로 생성됨
  • 프로세스 종료 방법
    • 프로세스가 모든 처리를 완료하고 정상적으로 종료됨
    • 부모 프로세스에 의해 자식 프로세스가 강제로 종료됨
      • 자식 PID로 프로세스 종료 시스템 호출 이용
      • 부모 프로세스가 종료되는 경우 운영체제가 자식 프로세스 종료

2.2 쓰레드

  • 전통적인 프로세스
    • 자원 소유의 단위 : 하나의 메모리 구조
    • 디스패칭의 단위 : 하나의 제어 흐름
    • 프로세스 내에서 다중처리 불가
  • 쓰레드(thread)
    • 프로세스 내에서의 다중처리를 위해 제안된 개념
    • 프로세스는 자원 소유의 단위, 쓰레드는 디스패칭의 단위로 구분
    • 하나의 프로세스 내에는 하나 이상의 쓰레드 존재
      • 프로세스의 제어 흐름이 하나 이상 가능
  • 쓰레드와 프로세스
    • 쓰레드는 실행에 필요한 최소한의 정보만 가짐
      • PC를 포함된 레지스터 값
      • 스택 영역
      • 상태정보
    • 나머지 정보는 자신이 속해 있는 프로세스에 두고 다른 쓰레드와 공유
  • 다중 쓰레드로 구성된 프로세스
    • 멀티 CPU 또는 멀티코어인 컴퓨터 시스템
      • 다중 쓰레드를 병렬로 처리

참고 문헌 : 김진욱·이인복. 운영체제 워크북. 한국방송통신대학교출판문화원, 2023.

728x90
728x90

1.1 지옥에서 온 관리자, 깃

2005년, 리눅스 토르발스(Linus Torvalds)는 깃(Git)을 처음 세상에 소개

 

깃으로 무엇을 할 수 있을까?

깃의 제공하는 핵심 기능 3 가지

1. 버전 관리(Version Control)

문서를 수정할 때마다 언제 수정했는지, 어떤 것을 변경했는지 편하고 구체적으로 기록하기 위한 버전 관리 시스템

2. 백업하기(Backup)
백업 : 현재 컴퓨터에 있는 자료를 다른 컴퓨터에 복제하는 것

 

3. 협업하기(Collaboration)
깃을 사용하면 팀원들이 파일을 편하게 주고받으면서 일할 수 있음

또한 누가 어느 부분을 어떻게 수정했는지 기록에 남기 때문에 나중에 오류가 생겼을 때도 파악하기 쉬움

 


깃 프로그램의 종류

1. 깃허브 데스크톱(GitHub Desktop)

- 깃 온라인 저장소 서비스인 깃허브에서 제공하는 프로그램

- 복잡한 깃 사용법을 그래픽 사용자 인터페이스(Graphic User Interface, GUI) 구현

- 사용이 쉬워서 누구나 쉽게 배울 수 있다는 장점이 있음

- 자주 쓰는 기본적인 기능 위주로 되어 있기 때문에 깃 고급 사용자가 되면 아쉬울 수 있음

 

2. 토터스깃

- 토터스깃(TortoiseGit)은 윈도우(Window)전용 프로그램으로 윈도우 탐색기의 빠른 메뉴에 추가되는 프로그램

 

3. 소스트리

- 소스트리(SourceTree)는 깃의 기본 기능부터 고급 기능까지 사용할 수 있는 프로그램

- 기능이 많아 사용법은 복잡하지만 어는 정도 익숙해지면 자유롭게 깃을 활용할 수 있음

 

4. 커맨드 라인 인터페이스

- 커맨드 라인 인터페이스(Command Line Interface, CLI)는 터미널 창에 직접 명령을 입력해서 깃을 사용하는 방식

- 소스트리나 깃허브 데스크톱 등 그래픽 사용자 인터페이스로 만들어진 프로그램으로 깃을 사용하는 것보다 어려움

- 기본적인 리눅스 명령을 알아야 하고, 깃 명령도 외워야 함

- 개발자 대부분은 커맨드 라인 인터페이스로 깃을 사용

 

1.2 깃 설치하기

깃을 사용하기 위해서는 먼저 사용자 컴퓨터에 깃을 설치해야 함

깃은 누구나 무료로 내려받아 설치할 수 있음

 

윈도우에 깃 설치하기

깃에서는 리눅스 명령을 사용하기 때문에 윈도우에 깃을 설치하면 리눅스 명령을 사용할 수 있도록 깃 배시(Git Bash)라는 프로그램이 함께 설치됨

 

맥에 깃 설치하기

맥(Mac) 운영 체제에서는 리눅스 명령을 기본으로 사용하기 때문에 깃을 설치한 후 맥에 있는 터미널 기능을 통해 깃을 사용

터미널 창이 나타나면 'git' 을 입력

$ git

깃이 제대로 설치됐다면 git 명령 다음에 쓸 수 있는 여러 옵션들이 나타남

 

깃 환경 설정

깃을 사용하기 전에 먼저 사용자 정보를 입력해야 함

깃은 버전을 저장할 때 마다 그 버전을 만든 사용자 정보도 함께 저장하기 때문

- 운영체제와 상관없이 리눅스 방식의 명령을 사용

$ git config --global user.name "Woomin"
$ git config --global user.email "changwoomin426@gmail.com"

깃에서 사용자 정보를 설정하려면 git config 명령을 사용

여기에 --global 옵션을 추가하면 현재 컴퓨터에 있는 모든 저장소에서 같은 사용자 정보를 사용하도록 설정

 

1.3 리눅스 명령 연습

현재 디렉터리 살펴보기

~(물결표시) : 현재 홈 디렉터리(home directory) 있다는 뜻
- 윈도우 탐색기의 '폴더(folder)를 리눅스에서는 '디렉터리(directory)'라고 부름 

 

$ pwd

'pwd' 명령을 입력하고 Enter 를 누르면 현재 위치의 경로가 나타남

- pwd는 'print working directory'의 줄임말

 

$ ls

현재 디렉터리에 어떤 파일이나 디렉터리가 있는지 확인할 때는 'ls' 명령을 사용

디렉터리와 파일 이름이 나타남

- ls 명령은 list의 줄임말

 

clear

터미널 창을 사용하다 보면 명령과 결과 화면으로 창이 가득 차게 됨

화면을 깨끗이 정리하려면 'clear' 명령을 입력

 

$ ls -la

리눅스 명령에 옵션(Option)을 추가하려면 붙임표(-)와 원하는 옵션을 나타내는 글자를 함께 입력

두 옵션을 함께 사용하려면 '-la' 또는 '-al' 처럼 순서에 상관없이 글자를 붙여서 추가 입력

옵션 설명
-a 숨김 파일과 디렉터리도 함께 표시
-l 파일이나 디렉터리의 상세 정보를 함께 표시
-r 파일의 정렬 순서를 거꾸로 표시
-t 파일 작성 시간 순으로 (내림차순) 표시

 

터미널 창에서 디렉터리 이동

터미널 창에서 디렉터리 사이를 이동할 때는 'cd' 명령을 사용 

- cd 명령은 'change directory'의 줄임말

$ cd ..

현재 위치에서 상위 디렉터리로 이동 cd 명령 다음에 한칸 띄고 마침표 2개를 입력

 

cd 명령을 실행한 후 $ 기호 위에 표시된 경로를 확인

$ cd ..
$ ls

한 단계 더 위인 (root) 폴더 까지 이동

ls 명령을 사용하면 파일과 디렉터리를 확인 가능

 

$ cd User

하위 디렉터리로 이동할 때는 cd 명령 다음에 이동할 하위 디렉터리 이름을 입력

 

$ cd ~

처음에 출발했던 디렉터리 , 즉 홈 디렉터리로 돌아가려면 '~'는 홈디렉터리를 나타냄

리눅스에서 디렉터리를 나타내는 기호

기호 설명
~ 현재 접속 중인 사용자의 홈 디렉터리를 가리킴
사용자 디렉터리라고도 부름
사용자 아이디는 5글자까지만 나타냄
./ 현재 사용자가 작업 중인 디렉터리
../ 현재 디렉터리의 상위 디렉터리

 

 

터미널 창에서 디렉터리 만들기 및 삭제하기

- mkdir 명령은 'make directory'의 줄임말

- 현재 홈 디렉터리가 아닌 다른 위치에 있다면 cd ~/Documents를 입력해서 Docu-ments 디렉터리로 이동한 후 mkdir을 사용

$ cd Documents
$ mkdir test

mkdir 명령을 실행하고 하위 디렉터리가 만들어져도 화면에는 아무것도 나타나지 않음

디렉터리가 제대로 만들어졌는지 확인하기 위해 ls 명령을 입력

 

$ rm -r test
$ ls

디렉터리를 삭제할 때는 'rm' 명령을 사용

이때 -r옵션을 붙이면 디렉터리안에 있는 하위 디렉터리와 파일까지 함께 삭제

- rm은 'remove'의 줄임말

여기서 기억해야 할 것은 삭제할 디렉터리의 상위 디렉터리에서 rm 명령을 입력해야 한다는 것

예를 들어 Documents 디렉터리 안에 있는 test 디렉터리를 삭제하려면 먼저 Documents 디렉터리로 이동한 다음

rm 명령을 입력해야함

 

빔에서 텍스트 문서 만들기

리눅스의 기본 편집기인 빔(Vim)은 터미널에서 사용할 수 있는 대표적인 편집기

- 맥에서는 빔 대신 나노(nano)를 사용하기도 함

$ cd Documents
$ mkdir test
$ cd test

기본적으로 홈 디렉터리부터 시작

Documents 디렉터리로 이동해서 test 디렉터리를 만들고 test 디렉터리로 이동

 

$ vim test.txt

현재 디렉터리에 test.txt을 만들기 위해 다음과 같이 'vim' 을 입력

빔에는 문서를 작성하는 '입력 모드''와 문서를 저장하는 'ex 모드' 가 있음

빔은 처음에 'ex 모드'로 열리기 때문에 키를 눌러도 반응이 없는 것

 

빔에서 텍스트를 입력하려면 ex모드에서 i 또는 a 를 눌러 입력 모드로 바꿔야 함

입력 모드가 되면 화면 왼쪽 맨 아래 '끼워넣기' 라는 단어가 뜨는데, 이때부터 텍스트를 입력 가능

- i 는 insert(삽입)를 의미

- a 는 add(추가)를 의미

텍스트 입력이 끝난 후 파일을 저장할 때는 다시 ex 모드로 돌아가야 함

Esc를 누르면 ex모드로 돌아감

그리고 콜론(:)을 입력하면 원래 '끼워넣기'가 있던 자리에 텍스트를 입력할 수 있음

':wq' 명령을 입력 'w' 는 저장 'q' 종료를 실행하는 명령

파일이 저장하면서 편집기가 종료 터미널 창으로 되돌아감

 

빔 ex 모드 명령 모음

명령 설명
:w 또는 :write 편집 중이던 문서를 저장
:q 또는 :quit 편집기를 종료
:wq (파일) 편집 중이던 문서를 저장하고 종료
파일 이름을 함께 입력하면 그 이름으로 저장
:q! 문서를 저장하지 않고 편집기를 종료
확장자가 .swp인 임시 파일이 생김

ex 모드에서 사용하는 명령은 콜론(:)으로 시작

 

 

깃에서 기본 편집기 변경

깃을 설치할 때 기본적으로 빔을 사용하도록 설정했지만, 자신이 익숙하게 사용하는 편집기가 있다면 깃을 설치한 후에도 다른 편집기로 바꿀 수 있음. 예를 들어 깃의 기본 편집기를 'Notepad++'로 바꾸려면 터미널 창에서 아래와 같이 입력

$ git config --global core.editor "notepad++"

 

 

텍스트 문서 내용 확인

터미널 창에서 간단히 텍스트 문서의 내용을 확인할 때는 리눅스의 cat 명령을 사용

- cat 명령은 concatenate(연쇄하다)의 줄임말

$ cat test.txt

cat 명령과 텍스트 파일 이름을 함께 입력

 

명령 설명
$ cat 파일 파일의 내용을 화면에 표시
$ cat 파일1,파일2 파일n > 새파일 파일 n개를 차례로 연결해서 새로운 파일를 만듬
$ cat 파일>>파일2 파일1의 내용을 파일2 끝에 연결

 

 

 

참고 문헌 : 이고잉 고경희. Do it! 지옥에서 온 문서  관리자 깃&깃허브 입문. 이지스퍼블리싱, 2019

728x90

'전산 > Git' 카테고리의 다른 글

GitHub - 터미널로 GitHub 이용하기  (0) 2024.07.03
728x90

1.1 운영체제란 무엇인가?

1.1.1 운영체제의 정의

컴퓨터 시스템의 구성

 

하드웨어 : CPU, 메모리, 저장장치, 입출력장치, 네트워크 장치 등

- 저장장치 : 하드 디스크, SSD 등

- 입출력장치 : 키보드, 마우스,프린터 등

 

소프트웨어 : 응용 소프트웨어, 시스템 소프트웨어

- 응용 소프트웨어 : 웹 브라우저, 워드프로세서, 게임, 그래픽 소프트웨어 등

- 시스템 소프트웨어 : 운영체제, 컴파일러 등

 

운영체제

대표적인 시스템 소프트웨어

다음을 제공하는 프로그램들의 모음

- 컴퓨터 시스템의 자원 관리

- 컴퓨터 프로그램이 동작하기 위한 서비스 제공

 

1.1.2 운영체제의 역할

컴퓨터 시스템의 자원을 제어 및 관리

자원 : 하드웨어 자원, 소프트웨어 자원, 데이터

- 하드웨어 자원 : CPU, 메모리, 키보드, 마우스, 네트워크 카드 등

- 소프트웨어 자원 : 웹 브라우저, 워드프로세서, 게임 등

컴퓨터 시스템을 효율적으로 운영하는 목적

 

사용자지원

- 사용자가 내린 명령을 해석하여 실행함

- 사용자와 하드웨어 사이의 매개체 역할

- 사용자에게 편의성을 제공하는 목적

 

1.1.3 컴퓨터 시스템과 운영체제

운영체제가 없던 초기의 컴퓨터 시스템

- 응용 프로그램이 직접 컴퓨터 시스템의 자원 제어

- 하나의 하드웨어를 여러 사용자가 공유해서 사용하는 경우 자원을 나눠 쓰기 어려움

 

운영체제가 있는 컴퓨터 시스템

- 하드웨어와 응용 프로그램 사이에 운영체제 위치

- 운영체제가 컴퓨터 시스템의 자원 제어

- 여러 응용 프로그램이 동시에 수행되더라도 운영체제가 자원을 효율적으로 나눔

- 컴퓨터 시스템이 안정적이고 효율적으로 동작하도록 함

 

1.1.4 커널 모드와 사용자 모드

커널 모드(슈퍼바이저 모드)

- 하드웨어를 직접 제어할 수 있는 CPU의 명령어를 사용할 수 있는 모드

- 운영체제의 커널이 동작함

 

사용자 모드(보호 모드)

- 하드웨어를 직접 제어할 수 있는 CPU의 명령어를 사용할 수 없는 모드

- 응용 프로그램이 동작함

 

커널

커널 모드에서 동작하는 운영체제의 핵심 요소

응용 프로그램과 하드웨어 수준의 처리 사이의 가교 역할

 

일체형 커널(monolithic kernel)

- 운영체제의 모든 서비스가 커널 내에 포함됨

- 장점 : 커널 내부 요소들이 서로 효율적으로 상호작용을 함

- 단점 : 한 요소라도 오류가 발생하면 시스템 전체에 장애 발생 가능

- UNIX와 Linux 운영체제

 

마이크로커널(microkernel)

- 운영체제 요소의 대부분을 커널 외부로 분리함

- 커널 내부에는 메모르 관리, 멀티태스킹, 프로세스 간 통신(IPC) 등 최소한의 요소만 남김

- 장점 : 새로운 서비스를 추가하여 운영체제를 확장하기 쉬우며, 유지보수가 용이하여 안정성이 우수함

- 단점 : 커널 외부의 운영체제 요소들 사이는 프로세스 간 통신이 필요하여 성능저하 발생

 

시스템 호출

응용 프로그램이 하드웨어에 대한 제어가 필요한 경우에 필요함

운영체제에 서브스를 요청하는 메커니즘

1. 사용자 모드 : 응용 프로그램이 시스템 호출

2. 모드 변경 : 사용자 모드 -> 커널 모드

3. 커널 모드 : 커널이 동작하며 하드웨어 제어

 

1.2 운영체제의 구성

자원의 성격에 따라 구분

- 프로세스 관리자, 메모리 관리자, 장치 관리자, 파일 관리자

 

각 서브시스템

- 자신의 자원을 모니터링

- 정해 둔 기준에 따라 자원의 배분 및 회수

 

1.2.1 프로세스 관리자

프로세스의 생성 및 삭제

CPU 할당을 위한 스케줄 결정

프로세스의 상태를 관리하며 상태 전이 처리

 

1.2.2 메모리 관리자

메모리(주기억장치) 공간에 대한 요구의 유효성 체크

메모리 할당 및 회수

메모리 공간 보호

 

1.2.3 장치 관리자

컴퓨터 시스템의 모든 장치 관리

시스템 장치의 할당, 작동, 반환

 

1.2.4 파일 관리자

컴퓨터 시스템의 모든 파일 관리

파일의 생성, 열기, 수정, 닫기, 삭제

파일 관리를 위한 저장장치의 공간 관리

파일의 접근 제한 관리

 

1.3 운영체제의 유형

1.3.1 일괄처리(batch processing) 운영체제

작업을 모아서 순서대로 처리하는 방식

사용자와 상호작용 없이 순차적으로 실행

나중에 들어온 작업은 앞선 작업들이 모두 끝날 때까지 아무런 상호작용 없이 기다려야만 함

 

1.3.2 시분할(time-sharing) 운영체제

대화형(interactive) 운영체제라고도 함

여러 프로그램에 대해 각 프로그램을 한 번에 조금씩 수행하는 방식

사용자들은 마치 혼자 컴퓨터를 사용하는 듯한 느낌을 받음

응답시간이 일괄처리 운영체제보다 크게 단축됨

- 응답시간 : 요청한 시점부터 반응 시작되는 시점까지의 소요시간

 

1.3.3 실시간(real-time) 운영체제

원하는 시간 내에 프로그램의 결과를 얻을 수 있는 방식

처리결과가 현재의 결정에 영향을 주는 환경에서 사용됨

- 미사일 제어 시스템, 증권거래 관리 시스템 등

 

1.3.4 분산 운영체제

분산 시스템을 관리하기 위한 운영체제

- 분산 시스템 : 2개 이상의 컴퓨터 시스템이 네트워크로 서로 연결되어 서로의 자원을 이용하는 시스템

다른 컴퓨터 시스템은 자원을 이용하는 것이 마치 자신의 컴퓨터 시스템에 있는 자원을 이용하는 것처럼 가능해야 함

 

 


참고 문헌 : 김진욱·이인복. 운영체제 워크북. 한국방송통신대학교출판문화원, 2023. 5-9

728x90
728x90

렌즈 #21: 기능적 공간의 렌즈

이 렌즈를 사용하려면, 모든 표피적인 요소를 걷어냈을 때 게임이 진정 어떤 공간에서 이뤄질지 생각해 보라.

다음과 같이 자문해 보자.

- 게임 공간은 연속적인가, 불연속적인가?

- 게임 공간은 몇 차원인가?

- 게임의 경계는 무엇인가?

- 하위 공간이 있는가? 그것은 어떻게 연결돼 있는가?

- 게임의 공간을 추상화할 수 있는 모델이 몇 개나 있는가?

 

렌즈 #22: 동적 상태의 렌즈

이 렌즈를 사용하려면 게임에서 어떤 정보가 변화하는지, 누가 그것을 알 수 있는지 생각하라.

다음과 같이 자문해 보자.

- 게임에서 객체는 무엇인가?

- 객체의 속성은 무엇인가?

- 각 속성은 어떤 상태가 있는가? 각 속성의 상태를 변화시키는 요인은 무엇인가?

- 게임만 아는 상태는 무엇인가?

- 모든 플레이가 아는 상태는 무엇인가?

- 일부, 혹은 한 플레이어만 아는 상태는 무엇인가?

- 누가 어떤 상태를 알 수 있는지 여부를 알면 게임이 더 좋아질까?

게임플레이는 의사결정이다. 의사결정은 정보에 따라 내려진다. 다양한 속성과 그 상태, 누가 그 정보를 아는지 결정하는 것이 게임 메커니즘의 핵심을 정하는 일이다. 누가 어떤 정보를 알 수 있는지를 살짝만 바꿔도 게임은 크게 바뀔 수 있는데, 어떨 때는 좋은 방향으로, 어떤 때는 나쁜 방향으로 변화한다. 누가 어떤 속성을 아는지는 게임의 방향도 크게 바꿀 수 있다. 게임에 멋진 드라마를 넣는 좋은 방법은 숨겨진 적에 관한 중요한 정보를 공개적으로 갑자기 드러내는 것이다.

 

렌즈 #23: 창발설의 렌즈

게임에 흥미로운 창발성을 확보하려면, 다음과 같이 자문해 보라.

- 플레이어에게 얼마나 많은 동사를 줄 것인가?

- 동사마다 얼마나 많은 객체가 대응되도록 할 것인가?

- 목적을 달성하는 방법을 얼마나 다양하게 줄 것인가?

- 얼마나 많은 개체를 플레이어가 다룰 수 있게 해 줄 것인가?

- 부가 효과가 제약을 어떻게 변화시킬 수 있는가?

 

렌즈 #24: 액션의 렌즈

이 렌즈를 사용하려면, 플레이가 무엇을 할 수 있는지, 하지 못하는지, 왜 그런지 생각해 보라.

다음과 같이 자문해 보자.

- 게임의 활동적 액션은 무엇인가?

- 결과적 액션은 무엇인가?

- 어떤 결과적 액션을 넣고 싶은가? 그렇게 하려면 게임을 어떻게 바꾸면 될까?

- 결과적 액션과 활동적 액션의 비율은 만족스러운가?

- 플레이어가 게임에서 기대하는 액션임에도 할 수 없는 것은 무엇일까? 활동적, 조작적 액션으로 가능하게 할 수 있을까?

액션이 없는 게임은 동사 없는 문장과 같다. 아무 일도 일어나지 않는다. 게임의 액션을 결정하는 일은 게임 디자이너로서 내리는 가장 근본적인 의사결정이다. 이 액션을 살짝만 바꿔도 엄청난 파급 효과가 발생해서 놀랄 만한 창발적 게임플레이를 만들 수도, 뻔하고 지루한 게임을 만들 수도 있다. 액션을 신중하게 결정하라. 그리고 그 선택이 무엇을 가능하게 하는지 게임과 플레이어를 경청하는 방법을 배워라.

 

렌즈 #25: 목적의 렌즈

게임의 목적이 적절하고 밸런스가 잘 잡혀 있는지 확인하려면, 다음과 같이 자문해 보라.

- 게임의 궁극적 목적은 무엇인가?

- 그 목적은 플레이어가 보기에 명료한가?

- 목적이 여러 개 있는 경우 플레이어가 그것을 이해하고 있는가?

- 각 목적은 서로 유의미한 방법으로 연결돼 있는가?

- 목적은 분명하고, 달성 가능하고, 보람 있는가?

- 단기, 장기 목적을 잘 배분했는가?

- 플레이어가 스스로 목적을 정할 기회가 있는가?

 

렌즈 #26: 규칙의 렌즈

이 렌즈를 사용하려면, 가장 기본적인 구조를 만들 수 있을 때까지 게임을 깊이 살펴봐야 한다. 다음과 같이 자문해 보라.

- 게임의 근본 규칙은 무엇인가? 그것은 조작적 규칙과 어떻게 다른가?

- '규정'이나 '하우스 룰'이 게임 개발을 하는 도중에 생겨나는가? 이것을 게임에 직접 적용할 수 있을까?

- 게임에 다른 모드가 있는가? 이런 모드로 인해 내용이 단순해지거나 더 복잡해지는가?

- 모드를 늘리거나 줄이면 게임이 더 좋아질까?

- 규칙을 강제하는 것은 무엇인가?

- 규칙을 이해하기 쉬운가, 혼란스러운가? 혼란스럽다면 규칙을 바꾸거나 설명을 더 잘하면 고칠 수 있을까?

디자이너가 가만히 앉아서 규칙을 써 내려가며 게임을 만든다는 오해가 생기곤 한다. 보통은 전혀 그렇지 않다. 게임의 규칙은 점진적으로, 실험적으로 도출된다. 디자이너의 마음은 일반적으로 '조작적 규칙'의 영역에 있다가, 게임을 개선할 방법을 모색할 때 '기본 규칙'의 관점으로 바꾸기도 한다. '명문 규칙'은 일단 게임이 플레이 가능해져야 만들어진다. 디자이너의 임무는 모든 상황을 고려한 규칙을 만드는 것이다. 플레이테스트 때는 주의 깊게 메모해두는 게 좋은데, 이런 테스트 과정에서 구멍들이 드러나기 때문이다. 문제를 때워버리고 기록하지 않는다면, 그 구멍은 언젠가 다시 나타날 것이다. 게임은 규칙 자체다. 마땅한 시간과 주의를 투자해야 한다.

 

렌즈 #27: 기술의 렌즈

이 렌즈를 사용하려면, 게임을 보는 것을 멈추고 플레이어에게 어떤 기술을 요구하고 있는지 살펴보라.

다음과 같이 자문해 보자.

- 게임은 플레이어에게 어떤 기술을 요구하는가?

- 게임이 빠뜨린 기술이 있는가?

- 어떤 기술이 절대적으로 좋은가?

- 이 기술들이 원하는 경험을 만들어내는가?

- 어떤 플레이어는 다른 사람보다 이 기술이 뛰어난가? 그로 인해 게임이 불공정해지는가?

- 플레이어가 연습하면 기술을 향상할 수 있는가?

- 이 게임은 적적한 수준의 기술을 요구하는가?

기술을 연습하는 건 즐거울 수 있다. 그것이 사람들이 게임을 좋아하는 이유 중 하나다. 물론, 그 기술이 재미있고 보람 있어야 하며, 도전의 수진이 '너무 쉬움'과 '너무 어려움' 사이의 이상적인 정도에 있을 때만 즐거울 것이다. 허탈한 기술(버튼 누르기 같은)도 가상 기술과 적절한 도전을 더하면 재미있을 수 있다. 이 렌즈를 플레이어가 느끼는 경험을 보는 창이라고 생각하라. 기술은 경험의 많은 부분을 정의하므로, 기술의 렌즈는 '렌즈 #1: 경험의 정수의 렌즈'와 매우 잘 어울린다.

 

렌즈 #28: 기댓값의 렌즈

이 렌즈를 사용하려면, 게임에서 다양한 사건이 발생할 가능성을 생각해 보고 그것이 플레이어에게 어떤 의미가 있는지를 고찰하라.

다음과 같이 자문해 보자.

- 특정한 사건이 발생할 실질적 가능성은 얼마인가?

- 유저가 인지하는 가능성은 얼마인가?

- 그 사건이 발생한 결과 값은 무엇인가? 그 값을 수치화할 수 있는가? 고려하지 않은 막연한 부분이 있는가?

- 플레이어가 하는 모든 행동의 모든 가능한 결과를 더해서 각각의 기댓값을 정할 수 있다. 그 값이 만족스러운가? 그것이 플레이어에게 흥미로운 선택지를 제공하는가? 그 보상이 너무 과하거나 벌이 너무 심하지 않은가?

기댓값은 게임 밸런스를 분석하는 가장 중요한 도구다. 이것을 사용함으로써, 플레이어에게 발생하는 모든 일을 수치적으로 표현하는 방법을 찾는다. 돈을 따거나 잃는 건 쉽게 나타낼 수 있다. 그러나 빨리 달리게 하는 '가속'이나 다른 레벨로 뛰어넘을 수 있는 '워프 게이트'의 수치 값은 얼마일까? 이런 것들은 완벽하게 수치화할 수는 없지만, 그렇다고 해서 어림할 수 없는 것도 아니다. 11장에서 보겠지만, 여러 번 게임 테스팅을 수행하고, 파라미터와 값을 조절해서, 또한 동시에 다양한 결과의 가치에 대한 평가값도 조정하게 될 것이다. 좀 더 불명료한 요소들을 수치화하면서 많은 걸 깨닫게 된다. 그렇게 함으로써 어떤 것이 플레이어에게 중요하고 왜 그런지 생각하게 되기 때문이며, 이런 명확한 지식은 게임 밸런싱을 용이하게 해 준다.

 

렌즈 #29: 운의 렌즈

이 렌즈를 사용하려면 게임에서 랜덤과 위험을 수반하는 부분에 집중하라. 두 가지는 같지 않다는 점에 주의하라.

다음과 같이 자문해 보자.

- 게임의 어떤 부분이 진정 랜덤 한가? 어떤 부분이 랜덤 하게 느껴지기만 하는가?

- 랜덤이 플레이어에게 긍정적인 느낌과 흥분과 도전감을 주는가, 부정적 감정과 무력감과 조정할 수 없음을 느끼게 하는가?

- 확률 분포 곡선을 바꾸면 게임이 더 나아질까?

- 플레이어가 게임에서 흥미로운 위험을 감수할 기회가 있는가?

- 운과 기술이 어떤 관계가 있는가? 랜덤 요소가 기술을 연습하는 것처럼 느껴지게 할 방법이 있을까? 기술을 연습하는 것이 위험을 감수하는 것처럼 느껴지게 할 수 있을까?

위험과 랜덤은 양념과 같다. 전혀 없으면 게임이 재미없지만, 너무 많이 주어지만 다른 것들을 압도해 버린다. 그러나 적절히 주어진다면 게임의 기타 요소를 북돋아준다. 불행하게도 게임에 사용하는 것은 요리 위에다 뿌리는 것처럼 단순하지 않다. 게임을 잘 살펴서 위험 요소와 랜덤 요소가 자연스럽게 드러나도록 하고, 그것을 어떻게 조련해서 활용할 수 있을지 결정해야 한다. 운의 요소가 주사위 굴림이나 난수로부터 발생한다는 함정에 빠져서는 안 된다. 반면 플레이어가 모르는 것을 만날 때 운의 요소를 찾을 수 있을 것이다.

 

렌즈 #30: 공평함의 렌즈

공평함의 렌즈를 사용하려면 각 플레이어의 관점에서 게임을 주의 깊게 생각해봐야 한다.

플레이어의 숙련도를 고려해서, 플레이어들이 공평하다고 느끼도록 승리의 기회를 줄 방법을 찾아야 한다.

다음과 같이 자문해 보라.

- 이 게임은 대칭적이어야 하는가? 왜 그런가?

- 이 게임은 비대칭적이어야 하는가? 왜 그런가?

- 이 게임의 목표는 누가 더 실력이 있는지를 확실하게 측정하는 것인가, 아니면 모든 플레이어에게 흥미로운 도전을 제시하는 것인가? 무엇이 더 중요한가?

- 실력이 다른 플레이어들이 함께 게임을 하길 원할 때, 게임이 모든 이에게 의미 있고 도전적이 되려면 어떤 방법을 써야 할까?

공평함이란 애매한 주제일 수 있다. 한쪽이 다른 쪽보다 분명히 유리해도 여전히 게임은 공평한 경우도 있다. 이는 실력이 다른 플레이어가 함께 게임을 하기 위해서인 경우도 있지만, 다른 이유도 있다. 예를 들어 에일리언 대 프레데터 게임에서는 멀티플레이를 하면 일반적으로 프레데터가 에일리언보다 유리하다고 알려져 있었다. 하지만 플레이어는 이것을 불공평하다고 여기지 않았다. 왜냐하면 에일리언 대 프레데터의 세계관에 부합하기 때문이고, 에일리언을 플레이하는 플레이어는 자신이 불이익을 받을 것이며 더 실력이 좋아야 이를 보완할 수 있음을 받아들였기 때문이다. 플레이어 사이에서 에일라언으로 플레이해서 승리할 수 있다는 건 자랑스럽게 여겨졌다.

 

 

 

 

 

참고 문헌 : Jesse Schell. The Art of Game Design.  에이콘 출판사, 2010.

728x90
728x90

렌즈 #11: 끝없는 영감의 렌즈

경청하는 법을 알면, 모든 사람이 스승이다. - 람다스(Ram Dass)

이 렌즈를 사용하려면 게임을 보는 것을 멈추고, 비슷한 게임을 보는 것도 멈춰라. 그리고 그 밖의 모든 것을 보라.

다음과 같이 자문해 보자.

- 스스로의 삶에서 겪은 경험 중 어떤 것을 타인과 공유하고 싶은가?

- 그 경험의 정수를 잡아내고 그것을 게임에 넣을 수 있는 방법은 작게라도 어떤 것이 있을까?

이 렌즈를 사용하려면 열린 마음과 큰 상상력이 필요하다. 스스로를 탐색해서 감정을 찾아내고 주변의 모든 것을 관찰해야 한다.

불가능에 도전해야 한다. 왜냐하면 주사위 몇 개를 굴리는 것으로 칼싸움의 흥분을 잡아낸다거나, 비디오 게임으로 플레이어에게 어둠 속의 공포를 전달하는 건 분명 불가능한 일이기 때문이다. 그렇지 않은가? 이 렌즈를 활용해서 게임의 영감을 불러일으킬 게임 아닌 경험을 찾아내라. 4대 요소(기술, 메커니즘, 이야기, 미적 요소) 하나하나가 하나의 영감으로, 혹은 각 요소에 대한 영감으로 발현되어 완전히 새로운 무언가가 될 수도 있다. 실생활을 바탕으로 한 굳건한 비전이 의사결정을 뒷받침한다면, 경험은 무시무시한 권력과 힘, 독특함을 얻게 될 것이다.

이 렌즈는 '렌즈 #1: 경험의 정수의 렌즈'와 함께 작동한다. 무한한 영감의 렌즈를 이용해 훌륭한 경험을 찾아내고, 경험의 정수의 렌즈를 써서 게임에 도입하라.

 

렌즈 #12: 문제 명세의 렌즈

이 렌즈를 사용하려면, 게임을 문제의 해답이라고 생각하라.

다음과 같이 자문해보자.

- 어떤 문제를 해결하려는 것인가?

- 게임의 진정한 용도와는 관계없는 추측을 하고 있진 않은가?

- 이 게임이 진정 최선의 해답인가? 왜 그런가?

- 그 문제가 해결됐다고 말할 수 있으려면 어떻게 해야 하는가?

게임의 제약사항과 목표를 정의하면 선명한 게임 디자인을 더 빠른 시간 내에 해내는 데 도움이 된다. 

 

렌즈 #13: 8가지 필터의 렌즈

이 렌즈를 쓰려면 디자인이 만족시켜야 하는 많은 제역을 고려해야만 한다. 변경 없이도 8가지 필터를 모두 통과할 때만 디자인이 완료됐다고 말할 수 있다.

8가지 핵심 질문을 자문해 보라.

- 이 게임은 옳게 느껴지는가?

- 의도한 고객층이 이 게임을 충분히 좋아해 줄까?

- 잘 디자인된 게임일까?

- 이 게임은 충분히 참신한가?

- 이 게임이 팔릴까?

- 이 게임을 만드는 것이 기술적으로 가능할까?

- 게임이 우리의 사회적 혹은 커뮤니티 목표에 부합할까?

- 플레이테스터가 충분히 게임을 즐기는가?

경우에 따라 더 많은 필터가 필요할 수도 있다. 예를 들어 교육적 게임은 "이 게임은 의도한 바를 가르치는가?" 같은 질문에 답해야만 한다. 더 많은 필터가 필요한 디자인이라면 이를 무시해서는 안 된다.

 

렌즈 #14: 위험 완화의 렌즈

이 렌즈를 쓰려면 긍정적으로 생각하는 것을 그만두고 게임에 심각한 잘못이 될 수 있는 일들을 진지하게 고민하기 시작하라.

다음과 같이 자문해 보자.

- 이 게임이 훌륭해지지 못하는 이유는 무엇인가?

- 그런 일이 생기는 것을  어떻게 막을 수 있을까?

위험 관리는 어렵다. 피하고만 싶은 문제점에 맞서서 즉시 해결해야 함을 뜻한다. 하지만 훈련만 된다면 더 많이, 더 유용하게 순환해 결국 더 나은 게임을 만들 수 있다. 잠재적 문제점은 무시하고 가장 자신 있는 부분만 작업하고 싶은 유혹이 들 것이다. 이런 유혹을 뿌리치고 게임의 위험한 부분에 집중하라.

 

렌즈 #15: 장난감의 렌즈

이 렌즈를 쓰려면 게임을 플레이할 때 재미있을지에 대해 생각하기를 멈추고, 갖고 놀기 재미있을지를 생각해 보라.

다음과 같이 자문해 보자.

- 이 게임에 목표가 없어도 재미있을까? 아니라면 어떻게 바꾸면 될까?

- 사람들이 게임을 보고 무엇을 하면 될지 알지 못해도 갖고 놀고 싶어 할까? 아니라면 어떻게 고치면 될까?

장난감의 렌즈를 쓰는 데는 두 가지 방법이 있다. 하난은 이미 존재하는 게임에 적용해, 어떻게 장난감적 특징(어떻게 더 접근이 용이하게 만들지, 조작하기 재미있을지)을 붙일 수 있을지 찾아보는 것이다. 두 번째는 더 과감한 방법이다. 게임을 플레이하면 어떨지를 생각하기 전에,

새로운 장난감을 발명하고 창조하는 것이다. 일정이 꽉 짜여 있다면 위험한 방법이다. 하지만 그렇지 않다면, 다른 방법으론 찾아낼 수 없었을 멋진 게임을 찾아내도록 도와줄 훌륭한 '계시'가 될 수 있다.

 

렌즈 #16: 플레이어의 렌즈

이 렌즈를 사용하려면 게임에 대해 생각하는 것을 멈추고, 게임의 플레이어에 대해 생각하라.

누가 게임을 플레이할 것인지 아래 내용을 자문해 보라.

- 일반적으로, 그들은 무엇을 좋아하는가?

- 무엇을 싫어하는가? 왜 그런가?

- 그들은 게임에서 무엇을 보고 싶어 하는가?

- 내가 그들이라면, 게임에서 무엇을 보고 싶은가?

- 게임에서 그들은 특히 무엇을 좋아하거나 싫어할까?

훌륭한 게임 디자이너는 언제나 플레이어를 생각해야 하고, 플레이어의 대리인이 돼야 한다.

능숙한 디자이너는 플레이어의 렌즈와 홀로그래픽 디자인의 렌즈를 동시에 들고서, 플레이어와 게임의 경험과 게임의 역할구조를 동시에 생각한다. 플레이어의 행위를 관찰할수록, 그들이 무엇에 즐거워하는지 예측하기 용이해질 것이다.

 

렌즈 #17: 쾌락의 렌즈

이 렌즈를 사용하려면, 게임이 어떤 쾌락을 제공하는지, 제공하지 않는지 생각해 보라.

다음과 같이 자문해 보자.

- 게임이 플레이어에게 어떤 쾌락을 주는가? 그것을 발전시킬 수 있을까?

- 주고 싶은 경험에서 어떤 쾌락이 빠져 있는가? 더할 수 있을까?

궁극적으로, 게임은 즐거움을 주기 위한 것이다. 알려진 쾌락을 목록화하고, 게임이 그것을 얼마나 잘 전해주고 있는지 생각해 봄으로써 플레이어의 즐거움을 더할 수 있도록 게임을 바꿀 수 있다. 그러나 언제나 다른 게임에서 찾아볼 수 없는 독특하고 분류되지 않은 재미를 찾을 필요가 있다. 그래야 해당 게임이 독특한 우수성을 확보할 수 있기 때문이다.

 

렌즈 #18: 플로우의 렌즈

이 렌즈를 사용하려면 무엇이 플레이어를 집중하게 하는지 생각하라.

다음과 같이 자문해 보자.

- 이 게임의 목표는 명확한가? 아니라면, 어떻게 고칠 수 있을까?

- 플레이어의 목표는 내가 의도한 목표와 일치하는가?

- 플레이어가 목표를 잊게 만드는 산만한 부분이 게임에 있는가? 있다면 이 산만함을 어떻게 줄일까? 혹은 게임 목표와 부합시킬까?

- 플레이어의 실력이 꾸준히 증가할 것을 고려하여, 너무 쉽지도, 너무 어렵지도 않은 꾸준한 흐름을 제공하는가?

- 의도한 대로 플레이어의 실력이 증가할까? 그렇지 않다면 어떻게 바꿀 수 있을까?

 

렌즈 #19: 욕구의 렌즈

이 렌즈를 사용하려면 게임에 대한 생각을 멈추고 인간의 어떤 기본 욕구를 충족시킬지를 생각하라.

다음과 같이 자문해 보자.

- 매슬로 위계 구조의 어떤 단계에서 이 게임이 동작할까?

- 게임이 지금보다 더 기본적 욕구를 충족시키려면 어떻게 해야 할까?

- 게임이 현재 동작하는 욕구 수준에서 더 잘 충족시키려면 어떻게 해야 할까?

게임이 인간의 기본적 욕구를 만족시킨다는 게 이상하게 들릴 수 있지만, 인간의 모든 행위는 어떻게든 이런 욕구를 만족시키려는 시도다. 또한 어떤 게임은 다른 게임보다 욕구를 잘 만족시킴을 명심하라. 게임이 그 욕구를 기대하게 하는 것만으론 부족하며, 그런 요구를 충족시켜줘야 한다. 게임을 통해 플레이어가 자신을 더 잘 느끼게 된다거나 친구들을 더 잘 알게 되랄 기대했는데 게임이 그 욕구를 충족시키지 못한다면, 플레이어는 그런 것이 가능한 다른 게임으로 옮겨갈 것이다.

 

렌즈 #20: 평가의 렌즈

자신의 게임이 플레이어를 잘 평가하도록 다음과 같이 자문해 보라.

- 플레이어의 무엇을 평가하는가?

- 평가를 어떻게 전달하는가?

- 플레이어가 공정한 평가라고 느끼는가?

- 플레이어가 평가에 신경 쓰는가?

- 평가로 인해 플레이어가 더 나아지고 싶어 하는가?



 

참고 문헌 : Jesse Schell. The Art of Game Design.  에이콘 출판사, 2010.

728x90
728x90

렌즈 #01: 경험의 정수의 렌즈

이 렌즈를 사용하려면, 게임에 대한 생각을 접고 플레이어의 경험을 생각해야 한다. 다음과 같이 자문해 보라.

- 어떤 경험을 플레이어가 느끼게 하고 싶은가?

- 그 경험의 정수는 무엇인가?

- 게임은 어떻게 그 정수를 포착하는가?

만들고 싶은 경험과 실제로 만들고 있는 경험의 차이가 크다면 게임을 바꿔야 한다. 주고 싶은 경험의 정수를 명확하게 서술하고, 그 정수를 게임에 주입시키는 방법을 최대한 찾아내야 한다.

 

렌즈 #02: 놀라움의 렌즈

놀라움은 너무 기본적이어서 자칫 잊어버리기 쉽다. 이 렌즈를 사용해 게임을 재미있는 놀라움으로 채워보자. 다음과 같이 자문해 보라.

- 무엇이 게임을 하는 플레이어를 놀라게 할까?

- 게임의 이야기는 놀라운가? 게임의 규칙은? 아트웍은? 기술은 어떤가?

- 게임 규칙이 플레이어가 서로를 놀라게 할 방법을 제공하는가?

- 게임 규칙이 플레이어가 스스로를 놀라게 할 방법을 제공하는가?

놀라움은 모든 엔터테인먼트의 핵심적인 부분이다. 놀라움은 유머와 전략, 문제 해결의 근원에 있다. 우리의 뇌는 놀라움을 즐기도록 짜여 있다. 한 실험에서 설탕물과 맹물을 입 안에 뿌렸을 때, 같은 양의 설탕을 먹더라도 정해진 패턴대로 뿌릴 때보다 무작위로 뿌렸을 때 실험을 더 즐겁게 느꼈다고 한다. 또 다른 두뇌 스캔 실험에서는 유쾌하지 않은 놀라움을 느끼는 동안에도, 뇌의 즐거움 중추가 켜짐을 밝혀냈다.

 

 

렌즈 #03: 재미의 렌즈

재미는 때론 분석할 수조차 없지만, 거의 모든 게임에서 요구된다. 게임의 재미를 극대화하기 위해, 다음과 같이 자문해 보라.

- 내 게임의 어떤 부분이 재미있을까? 왜 그럴까?

- 어떤 부분이 더 재미있어야 할까?

 

렌즈 #04: 호기심의 렌즈

이 렌즈를 쓰기 위해, 게임에 놓여 있는 목표들이 아니라 왜 이 목표를 이루려 하는지 플레이어의 진짜 동기를 생각해 보자. 다음과 같이 자문해 보라.

- 게임이 플레이어의 마음에 어떤 질문을 던지는가?

- 플레이어가 이 질문들에 신경 쓰게 하는 일은 무엇인가?

- 플레이어가 더 많은 질문을 하도록 무엇을 할 수 있을까?

예를 들어 미로 찾기 식 비디오 게임은 각 판에 시간제한을 둬서, 플레이어에게 "내가 이 미로에서 30초 내에 길을 찾을 수 있을까?" 같은 질문에 답하게 할 수 있다. 좀 더 플레이에 집중하도록 각 미로를 풀었을 때 재미있는 애니메이션을 보여주고 "다음 애니메이션은 뭘까?"라고 플레이어가 스스로 질문을 던지게 할 수도 있다.

 

렌즈 #05: 내생적 가치의 렌즈

 

이 렌즈를 사용하려면 게임 내 아이템, 물건, 점수에 대한 플레이어의 느낌을 생각해야 한다.

- 이 게임엣서 플레이어에게 가치 있는 건 무엇인가?

- 어떻게 더 가치 있게 만들 수 있을까?

- 게임 내 가치와 플레이어의 동기 사이의 관계는 무엇인가?

게임 내 아이템과 점수의 가치는 플레이어가 게임에서의 성공을 얼마나 중요시하는지에 대한 직접적인 반영임을 명심하라. 플레이어가 정말로 무엇을 그리고 왜 중요시하는지 생각함으로써, 게임의 개선점에 대한 통찰을 얻을 수 있다.

 

렌즈 #06: 문제 풀이의 렌즈

이 렌즈를 사용하려면, 플레이어가 당신의 게임에서 성공하기 위해 풀어야 할 문제를 생각해봐야 한다. 다음과 같이 자문해 보라.

- 게임은 플레이어가 풀어야 할 어떤 문제를 제시하는가?

- 게임플레이를 하면서 발생하는 숨겨진 문제가 있는가?

- 플레이어가 다시 게임을 하게 만드는 새로운 문제를 만들어내려면 어떻게 해야 할까?

 

렌즈 #07: 4대 요소의 렌즈

이 렌즈를 사용하려면 게임이 정말 무엇으로 이뤄져 있는지 잘 판단해라. 각 요소를 각각, 그리고 전체를 한꺼번에 숙고하라.

다음과 같이 자문해 보자.

- 게임이 네 가지 요소를 모두 활용하고 있는가?

- 게임 요소의 질을 높이면 게임 디자인이 더 좋아질 수 있을까?

- 네 가지 요소가 조화를 이루고 서로를 보조하며 상호작용해서 공통의 주제로 합일되는가?

 

렌즈 #08: 홀로그래픽 디자인의 렌즈

이 렌즈를 사용하려면, 게임의 모든 면을 동시에 봐야 한다. 네 가지 기본 요소와 플레이어의 경험, 그리고 그 관계까지도, 주의력을 살갗에서 뼈대로 왔다 갔다 이동시키는 것도 괜찮지만, 게임과 경험을 입체영상을 보듯이 하는 방법이 훨씬 낫다.

다음과 같이 자문해 보라.

- 게임의 어떤 요소가 게임 경험을 즐겁게 하는가?

- 게임의 어떤 요소가 경험을 손상시키는가?

- 경험을 발전시키려면 어떤 게임 요소에 변화를 줘야 할까?

 

렌즈 #09: 통합의 렌즈

이 렌즈를 쓰려면 모든 것에 이유를 생각하라. 다음과 같이 자문해 보자.

- 무엇이 테마인가?

- 테마를 강화하기 위한 모든 방법을 사용하고 있는가?

통합의 렌즈는 4대 요소의 렌즈와 잘 동작한다. 통합된 테마의 관점에서 좀 더 쉽게 연구할 수 있도록 게임의 요소를 4대 요소로 분해하라.

 

렌즈 #10: 공명의 렌즈

공명의 렌즈를 쓰려면 숨겨진 힘을 바라봐야 한다. 다음과 같이 자문해 보라.

- 게임에서 강력하고 특별하게 느껴지는 건 무엇인가?

- 사람들에게 게임을 설명하면, 무엇이 그들을 흥분시킬까?

- 아무런 제약도 없다면, 이 게임은 어떠할 것인가?

- 게임이 어때야 할지에 대한 직관이 있다. 무엇이 이 직관을 이끌어내는가?

공명의 렌즈는 고요하고 섬세한 기구이며, 자신과 다른 사람을 경청하는 도구다. 우리는 가슴속에 중요한 것들을 묻어두고 있고, 뭔가가 그것을 울리면 중심부터 흔들려온다. 이 중요한 것들이 숨겨져 있다는 사실이 그것에 힘을 주지만, 또한 그것을 찾기 어렵게 만들기도 한다.

 

 

 

참고 문헌 : Jesse Schell. The Art of Game Design.  에이콘 출판사, 2010.

728x90
728x90

24-05-13 (월) 게임수학 수업내용

1. 카메라

- 3차원 공간에서 월드를 관찰하는 시점이다.

- 3차원 게임에세 물체들은 캐릭터의 시점에서 표현한다.

 

1.1 카메라 변환

3D 공간에서 물체가 사용자의 화면에 보이기 까지 과정을 렌더링 파이프라인이라 한다.

물체를 이루는 정점(Vertex) -> 2차원 변환 -> 2차원 이미지 변환 -> 화면 출력

 

/ / 참고 책

3D Game Programming 

With DirectX 11 750쪽

 

최종적으로 사용자에게 보여줄 2차원화면이 만들어지기까지 변환 과정은 아래와 같다

- 모델공간

- 전역 공간

- 시점 공간

- 절단 공간

- 정규화된 장치 좌표계

- 윈도우 좌표계

 

1.1.1 모델 좌표계 (Model Space)

물체가 가지고 있는 좌표계를 표현할 때 모델 공간(혹은 LocalTransform)이라 불리는 하나의 좌표계에서 정점의 위치를 지정한다.

 

이때 물체의 기준이되는 좌표를 피봇(Pivot)이라 한다.

 

1.1.2 전역 공간(World Space)

- 3차원 공간상의 최종적인 원점의 좌표계를 말하며, 게이머의 화면에 보여질 모든 물체들을 // PPT 참고

 

1.1.3 시점 공간(Eye Space)

- 카메라를 추가하여 어떤 어떤 특정 시점으로부터 월드상의 특정 공간을 바라보고 있는 좌표계를 말하며,

시점은 그 공간 좌표계의 원점이 된다.

 

1.1.4 절단 공간(Clip Space)

- 시점 공간이 주어지면 이후 , 어떤 물체가 보여지는 위치에 있는지 아닌지를 판단해야 한다.

- 이것은 시야 절두체를 통해 수행한다.

- 이러한 공간을 절단 공간이라 하며, 이때 사용되는 좌표계는 절단 좌표계라 한다.

 

1.1.4 시야 절두체

- 3차원 공간상에서 카메라에 의해 보일 수 있는 것들은 담는 범위를 말한다.

- Near 와 Far로 최소 거리와 최대 거리를 정의한다

( 근평면 Near Plane , 원평면 Far Plane)

 

1.1.5 정규화된 이미지 좌표계

- 카메라가 물체를 바라보면 렌더링 이미지를 얻을 수 있다.

- 하지만 초기 시야 절두체를 어떻게 설정하느냐에 따라, 화면이 찌그러져 보일 수 있다.

- 일반적으로 시야 절두체의 비율은, 실제 윈도우 비율과 같도록 설정하기 때문에 절단 공간의 육면체를 정규화하여

윈도우의 실제 크기를 곱하면 찌그러지지 않은 랜더링 이미지를 구할 수 있다.

 

1.1.6 윈도우 좌표계

정규화된 좌표계를 실제 모니터상의 x,y 좌표계로 변환하는 단계이다.이 단계를 뷰포트 변환 이라고 하며, 정규화된 장치 좌표계에 게이머가 설정한 뷰포트 크기를 곱하여 실제 윈도우의 x,y 좌표를 얻게 된다.

 

1.1.7 투영

- 투영은 3차원 장면을 2차원 모니터에 그리기 위해, 물체들의 각 정점을 2차원 좌표로 변환 하기 위해 사용한다.- 투영의 방법은 원근 투영과 직교 투영이 존재한다.

 

Left 근평면 좌측 x좌표RightBottomTopNearFar

 

load of detail (LOD)

 

 

원근 투영

- 시야 절두체를 동차 절단 공간이라는 정육면체로 사상하는 투영방법- 원근 투영에서 시야 절두체는소실점을 갖기 때문에 가까운 물체는 크게, 먼 물체는 작게 그려지는 원근감을 갖는다.

 

직교 투영

- 원근감을 갖지 않는 투영 방법으로, 화면에 어떤 화면에 어떤 물체가 그려질 때 원근에 의한 왜곡이 발생하지 않아야 하는 경우 사용한다. (2D 게임에 많이 쓴다)

 

1인칭 카메라

- 캐릭터의 눈에 카메라를 놓고 3차원 공간을 관찰하는 카메라(1인칭 카메라 시점) 

 

3인칭 카메라

- 제 3자의 입장에서 내려다보는 시점을 제공하기 위해 사용되는 카메라

Third Person Movement in 11 minutes - unity tutorial

 

Cinemachine 

- Unity에서는 별도로 구현할 필요 없이 Cinemachine을 제공하고 있다.

 

카메라 캘리브레이션 

 

 

2. 조명

2.1 빛 

빛은 입자와 파동의 성질을 동시에 가지고 있는 물질이다.

 

2.2 광원

3D 그래픽에서 광원은 방향광(Directional Light) , 점광(Point Light), 집중광(Spot Light) 등이 있다.

 

재질

- 우리가 어떤 물체를 볼 수 있는 것은 광자가 그 물체의 표면에 부딪혀 튕겨나와 우리 눈에 도달하기 때문이다.

- 물체의 표면에서 튕겨나올 때의 광자의 속성은 물체 표면의 재질에 따라 달라진다.

- 3D 그래픽스 이론에서 재질은 주변 재질, 난반사 재질, 전반사 재질, 방사 재질 등이 존재한다.

 

주변 재질

- 다른 물체에 의해

 

난반사 재질

 

전반사 재질

 

방사 재질

- 발광체인 물체를 표현할 때 사용되는 재질이다.

- 방사 재질의 물체는 입체감을 갖지 않는다.

 

 

- 물체의 기하학적 형상 및 재질과 광원간의 상호작용에 따라 조명이 미치는 효과는 다르다.

- 이러한 조명을 수학적으로 모델링 한 것을 조명 모델이라 한다.

- 조명 모델은 분

 

2. 분산 성분

- 어떤 방향 광원으로부터 빛이 입사되었을 때,

- 모든 방향으로 똑같은 양을 반사하는 완전 난반사체를 모델링한 것이다.

- 이러한 빛의 이상적인 분산을 수학적으로 모델링 한 것을 램버트 법칙이라 한다.

 

전반사 성분

 

주변광 성분

주변광 성분은 광원의 주변광 특성과 주변광 재질간의 상호관계를 표현하기 위한 성분이다.

 

그래픽스에서는 3가지로 작동한다.

 

조명 작동식

 

조명 방정식

 

 

셰이더 프로그래밍 입문

유니티 쉐이더 스타트업

세이더 그래프

 

 

3. 가시성 판단

평면의 방정식

- 화면에 보이지 않는 데이터는 크게 세 가지 종류로 구별된다

) 메시의 뒷면

)) 시야 절두체에 포함되지 않는 메시 나 면

))) 다른 메시에 가려진 메시 나 면

 

레스터라이징

더블사이드 레더링

매쉬를 양쪽으로

 

법선 벡터와 카메라 벡터의 관계

- 삼각형은 반드시 앞면과 뒷면을 구별하기 위해 법선 벡터를 갖는다

법선벡터 (N) * 카메라벡터(C)의 내적값 판단
N*C=0 메시의 윤곽선면
N*C>0 메시의 앞면
N*C<0 메시의 뒷면

 

 

시야 절두체(Viewing Frustum)

결과값 의미
ax+by+cz+d=0 점이 평면 위에 있다
ax+by+cz+d>0 점이 평면 앞에 있다
ax+by+cz+d<0 점이 평면 뒤에 있다

 

평면의 방정식

- 평면의 방정식

 

절두체 컬링의 원리

- 절두체 내부에 점이 포함되는지 

 

경계 입체

- 경계구 (많이 쓴다)

- 경계 상자 

- 경계 실린더 (잘 안쓴다)

 

절투체 컬링

- ax + by + cz + d = 0 가 r 보다 작다면 평면과 중심점의 거리가 바닞름보다 작은 것이므로 경계구 평면이 포함되는 것으로 판단한다.

- 경계 상자 컬링의 경우 8회 연산이 필요하므로,7회의 오버헤드가 있는 셈이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
728x90
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


// 11. AddComponentMenu(string)
// 해당 스크립트를 AddComponent 메뉴에 추가하는 속성
[AddComponentMenu("MyScript")]

// 10. RequireComponent(Type)
// 해당 컴포넌트를 필수로 추가해야 하는 속성
[RequireComponent(typeof(Rigidbody))]
public class InspectorAttribute : MonoBehaviour
{
   // 1. Header (string)
   // 인스펙터 내에 타이틀을 달 수 있는 속성
   [Header("Header")] 
   public int num1;
   
   // 2. Space(float)
   // 필드 사이에 여백을 주는 속성
   [Space(10f)] 
   public float num2;
   
   // 3. Range(float , float)
   // 변수의 값을 슬라이더 형식으로 표시 , 최소 및 최대 값을 정해주는 속성
   [Range(0.5f, 1.5f)] 
   public float num3;
   
   // 4. Multiline(int)
   // 문자열을 작성하기 편하도록 라인의 수를 늘려주는 속성
   [Multiline(3)] 
   public string str1;
   
   // 5. TextArea(int , int)
   // MultiLine과 비슷하지만, 라인의 수를 정해주는 것이 아닌, 가로 및 세로의 크기를 정해주는 속성
   [TextArea(3, 5)] 
   public string str2;
   
   // 6. SerializeField
   // private 변수도 인스펙터에 노출시키는 속성
   [SerializeField]
   private int num4;
   
   // 7. Tooltip(string)
   // 변수에 마우스를 올렸을 때 설명을 보여주는 속성
   [Tooltip("This is a tooltip")]
   public string str3;
   
   // 8. HideInInspector
   // 변수를 인스펙터에 노출시키지 않는 속성
   [HideInInspector]
   public bool isShow;

   
   // 9. System.Serializable
   // 클래스 혹은 구조체를 인스펙터에 노출시키는 속성
   [System.Serializable]
   struct Stats
   {
      public int health;
      public int damage;
   }

   // 12. ContextMenu(string)
   // 해당 함수를 인스펙터에 노출시키는 속성
   [ContextMenu("Do Something")]
   void Func()
   {
      
   }
   

}
728x90

'게임엔진 > Unity' 카테고리의 다른 글

Unity - OnMouseDown  (0) 2024.07.02
Unity - GetAxis  (0) 2024.07.02
Unity - 선형 보간  (0) 2024.07.02
Unity - Coroutine  (0) 2024.07.01
유니티 게임 프로그래밍 패턴 - SOLID 원칙  (0) 2024.06.19
728x90

1.1 자료구조와 알고리즘

자료구조란?

 

자료구조(data structure)

자료들을 정리하여 보관하는 여러 가지 구조

 

알고리즘(algorithm)

주어진 문제를 처리하는 절차

또는

문제를 풀기 위한 단계적인 절차

 

특정한 일을 수행하는 명령어의 집합

 

프로그램 = 자료구조 + 알고리즘

 

정의 1.1 알고리즘

입 력 : 0개 이상의 입력이 존재하여야 한다.

출 력 : 1개 이상의 출력이 존재하여야 한다.

명백성 : 각 명령어의 의미는 모호하지 않고 명확해야 한다.

유한성 : 한정된 수의 단계 후에는 반드시 종료되어야 한다.

유효성 : 각 명령어들은 종이와 연필 , 또는 컴퓨터로 실행 가능한 연산이어야 한다.

 

 

 

// 프로그램 1.1 cal_scores.c

#defube MAX_ELEMENTS 100
int scores[MAX_ELEMENTS]; // 자료구조

int get_max_score(int n) // 학생의 숫자는 n
{
	int i, largest;
    largest = scores[0]	// 알고리즘
    for(i = 1; i < n ; i++)
    {
    	if(scores[i] > scores[i];
        {
        	largest = scores[i];
        }
    }
    return largest;
}

 

알고리즘을 기술하는 4가지 방법

1. 한글이나 영어 같은 자연어

2. 흐름도(flowchart)

3. 의사 코드(pseudo-code)

4. 프로그래밍 언어

 

가장 많이 쓰이는 방법은 

3. 의사코드

4. 프로그래밍 언어

 

 



1.2 추상자료형

자료형(data type)

데이터의 종류

 

(정수, 실수, 문자열 등 기초적인 자료형의 예)

(스택, 큐, 리스트, 트리 등 새로운 자료형)

 

- 배열

동일한 자료형아 여러 개 모인 것

 

- 구조체

다른 자료형이 여러 개 모인 것

 

연산(operation)

정수 간의 덧셈, 뺄샘, 곱셈, 나눗셈, 나머지 연산 ,==,> , <

 

추상 자료형(ADT : abstract data type)

추상적, 수학적으로 자료형을 정의

실제적인 구현으로부터 분리되어 정의된 자료형

 

ADT 안에는 객체(objects) 와 함수(functions) 들이 정의

 

추상화

어떤 시스템의 간략화된 기술

또는

명세로서 시스템의 정말 핵심적인 구조나 동작에만 집중하는 것

 

객체지향언어에는 "클래스"개념을 사용하여 ADT가 구현

private나 protected 키워드를 이용하여 내부 자료의 접근을 제한

클래스는 계층구조(상속 개념 사용)로 구성 될수 있음

1.3 알고리즘의 성능 분석

수행시간 측정방법

// 방법 #1
#include <time.h>

start = clock();

...

stop = clock();
double duration = (double)(stop - start) / CLOCKS_PER_SEC;
// 방법 #2
#include <time.h>

start = time(NULL);

...

stop = time(NULL);
double duration = (double) difftime(stop,start);

 

clock() 함수

호출 프로세스에 의하여 사용된 CPU 시간을 계산

 

time() 함수

초 단위로 측정된 시간을 반환

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
	clock_t start, stop;
    double duration;
    start = clock();	// 측정 시작
    
    for(int i = 0; i < 1000000; i++)	// 의미 없는 반복 루프
    ;
    stop = clock();	// 측정 종료
    duration = (double)(stop - start) / CLOCKS_PER_SEC;
    printf("수행시간은 %f초입니다.\n",duration);
    return 0;
 }
 
 // 실행 결과
 // 수행 시간은 0.002000초 입니다.

 

알고리즘의 복잡도 분석방법

알고리즘 복잡도 분석(complexity)

구현하지 않고도 모든 입력을 고려하는 방법

실행 하드웨어나 소프트웨어 환경과는 관계없이 알고리즘의 효율성을 평가할 수 있다.

 

시간 복잡도 함수

시간 복잡도(time complexity)
알고리즘의 수행시간 분석

 

공간 복잡도(space complexity)

알고리즘이 사용하는 기억공간 분석

 

알고리즘의 비교

  알고리즘 A 알고리즘 B 알고리즘 C
대입연산 1 n n * n
덧셈연산   n n * n
곱셈연산 1    
나눗셈연산      
전체연산수 2 2n 2n^2

 

빅오 표기법

빅오 표기법을 사용하면 시간 복잡도 함수의 증가에 별로 기여하지 못하는 항을 생략함으로써 시간복잡도를 간단하게 표시할 수 있다.

 

O(1) 상수형
O(logn) 로그형
O(n) 선형
O(nlogn) 선형로그형
O(n^2) 2차형
O(n^3) 3차형
O(2^n) 지수형
O(n!) 팩토리얼형

 

알고리즘이 지수형이나 팩토리얼형의 시간복잡도를 가지면 사실상 사용할 수 없다.

입력의 개수가 30을 넘으면 현재의 가장 강력한 수퍼 컴퓨터를 동작시켜도 우주가 탄생되어 지금까지 흘러온 시간보다 더 많은 수행 시간을 요구할 수도 있다.

 

빅오표기법 이외의 표기법

빅오메가(big omega) Ω

어떤 함수의 하한을 표시하는 방법

 

빅세타(big theta) Θ

 

3개의 표기법 중에서 가장 정밀한 것은 

빅세타

 

통상적으로 빅오 표기법을 많이 사용

 

최선, 평균, 최악의 경우

최악의 경우(worst case)

자료집합 중에서 알고리즘의 수행시간이 가장 오래 걸리는 경우

 

최선의 경우(best case)

수행시간이 가장 적은 경우

 

평균적인 경우(average case)

알고리즘의 모든 입력을 고려하고 각 입력이 발생하는 확률을 고려하여 평균적인 수행시간을 의미

 

 

참고문헌 : 천인국 · 공용해 · 하상호. C언어로 쉽게 풀어쓴 자료구조. 생능출판사, 2005

728x90

'전산 > 자료구조' 카테고리의 다른 글

자료구조 - 자료구조, 데이터 구조  (1) 2024.07.05
자료구조 - 스택(Stack)  (0) 2024.07.01

+ Recent posts