스터디 기록 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++ 소프트웨어 디자인(존 라코즈)
- 코딩 규칙은 일관될 것
- 한번 정한 규칙은 일관되고 철저하게
- 오류를 스스로 들어내는 코드를 작성할 것
- 흔히 저지르는 실수 및 오류를 쉽게 볼 수 있도록