스터디 기록 1

2024-04-04

스터디 그룹

스터디 한 것

게임엔진 아키텍처 3판 3장 - “게임을 위한 소프트웨어 엔지니어링 기초” 중

C++

  • 게임 업계에서 가장 널리 쓰이는 언어
  • 객체지향적 프로그래밍 가능
  • 이 외에 다양함
  • 프로그래머라면 고급언어 2개와 일정 수준의 어셈블리 언어 지식 가지는게 좋음

객체지향

클래스와 객체

  • 여러개의 데이터와 그 것을 처리 하기 위한 코드 들의 모음
  • 클래스는 명세서, 객체는 명세서를 가지고 만든 실체 : 개(클래스) -> 스누피(객체)

캡슐화

  • 일부 인터페이스만 공개하고 내부의 구체적인것은 가림

상속

  • 기존의 클래스를 확장하는 개념
  • 상속 받은 클래스는 기존의 인터페이스를 추가 하거나 동작을 변경
  • 대략 ‘is-a’ 관계가 성립
다중 상속
  • 그냥 하지마
  • 단, 인터페이스는 가능

다형성

  • 서로 다른 타입의 객체를 하나의 공통된 인터페이스로 다룰 수 있는 기능
  • 도형::그리기 - 원::그리기, 삼각형::그리기, 사각형::그리기

합성과 집합

  • ‘has-a’, ‘use-a’ 관계
  • 자동차 has 엔진, 바퀴, 좌석..
  • 이를 이용하면 개별 클래스는 좁 더 단순해지고 특화된 형태를 가짐
  • 보통은 상속 보다는 합성과 집합 방식이 더 나음

디자인 패턴

  • 같은 문제에 비슷한 해결법 - 설계적인 패턴 발생
  • 대표 서적 : GoF 의 설계패턴
  • 흔히 사용되는 패턴
    • 싱글턴 : 특정 클래스의 객체가 오직 하나만 생성 되도록 보장
    • 반복자 : 집합의 세부구현 몰라도 공통된 인터페이스로 요소에 접근 및 제어
    • 추상 팩토리 : 연관 및 의존 클래스들의 계열 만들때 구현 클래스를 직접 지정 안해도 되는 인터페이스 제공
RAII
  • 획득 동시에 초기화 하기
  • 일정 Scope 내에 생성 즉시 초기화(ex:메모리 할당, Mutex) 후 Scope 벗어나면 즉시 해제

C++ 표준화

  • C++ 언어를 강력하고 사용하기 쉬우면서 명료하게
  • ISO 가 표준 기관

언어의 어떤 기능을 쓸까?

  • 최신 기능을 당장 써야만 하는건 아님
  • 너티독은 보수적으로 접근
    • 완전한 기능 지원 부족 : 컴파일러 종류 및 버전에 따라 지원 여부가 다름
    • 표준 간 전환 비용 : 프로젝트 진행도에 따라 표준 변경에 따른 비용 및 리스크 발생
    • 위험과 이득 : 일부 기능은 적극권장 이지만 일부 기능은 게임 엔진에서는 독
    • nullptr, auto, 템플릿 메타 프로그래밍
    • “손에 망치가 있으면 모든게 못으로 보인다”

코딩 규칙

  • 코딩 규칙은 천차만별
  • 그럼에도 최소한이라도 해야 하는 이유
    • 코드의 가독성
    • 실수 방지
  • 코딩 규칙에 중요한 것들 - 작가 개인의 의견
    • 인터페이스를 제일 중시 할 것
    • 간결
    • 단순
    • 최소한의 것만
    • 쉬운 이해
    • 주석
  • 이름 잘 지을 것
    • 가독성
    • 목적에 맞는 직관적인 이름
    • 기능의 의미를 알아내기 위해 분석하지 않도록
  • 전역 네임스페이스를 깔끔하게 유지할 것
    • 이름 충돌하지 않도록
    • 과용은 금물
  • 널리 알려진 C++ 사용법을 따를 것
    • Effect C++(스콧 마이어스)
    • Effect STL(스콧 마이어스)
    • C++ 소프트웨어 디자인(존 라코즈)
  • 코딩 규칙은 일관될 것
    • 한번 정한 규칙은 일관되고 철저하게
  • 오류를 스스로 들어내는 코드를 작성할 것
    • 흔히 저지르는 실수 및 오류를 쉽게 볼 수 있도록