Skip to content

Cpp Coding Standard

JaeYoung Seon edited this page Mar 9, 2021 · 5 revisions

ํด๋ž˜์Šค ๊ตฌ์„ฑ

ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…์ž์˜ ๋งˆ์Œ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋…์ž๋“ค์€ ํด๋ž˜์Šค์˜ publicํ•œ ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฏ€๋กœ public์ด ๋จผ์ € ๋‚˜์˜ค๊ณ  ๋‚˜์„œ protected, private ์ˆœ์œผ๋กœ ๋‚˜์™€์•ผํ•œ๋‹ค.

์ €์ž‘๊ถŒ ํ‘œ์‹œ

๋ชจ๋“  ์†Œ์ŠคํŒŒ์ผ(.h, .cpp ๋“ฑ)์€ ๋ฐ˜๋“œ์‹œ ์ฒซ๋ฒˆ์งธ ์ค„์— ์ €์ž‘๊ถŒ ํ‘œ์‹œ๋ฅผ ํ•ด์•ผํ•œ๋‹ค:

/*!
 * Copyright (c) 2021 SWTube. All rights reserved.
 * Licensed under the GPL-3.0 License. See LICENSE file in the project root for license information.
 */

๋ช…๋ช… ๊ทœ์น™

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ, ํด๋ž˜์Šค๋“ค์˜ ์ด๋ฆ„์€ ๋ช…ํ™•ํ•ด์•ผํ•˜๊ณ , ๊ตฌ์ฒด์ ์ด๋ฉฐ, ์• ๋งคํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ๋„๋ฆฌ ์“ฐ์ด๋ฉด ์“ฐ์ผ ์ˆ˜๋ก ๋” ์ข‹๊ณ  ๊ตฌ์ฒด์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ. ์ค„์ž„๋ง์€ ๊ฑฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  1. ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ฅธ๋‹ค

    class PlayerManager;
    struct AnimationInfo;
  2. ์ง€์—ญ ๋ณ€์ˆ˜ ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ฅธ๋‹ค

    void SomeMethod(const int someParameter)
    {
        int someNumber;
        int id;
    }
  3. ๋ฉ”์„œ๋“œ ๋˜๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋™์‚ฌ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

    1. public ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์€ ํŒŒ์Šค์นผ ํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ฅธ๋‹ค

      public:
          void DoSomething();
    2. ๊ทธ ์™ธ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์€ ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ฅธ๋‹ค

      private:
          void doSomething();
  4. ์ ˆ์ฐจ(๋ฐ˜ํ™˜๊ฐ’์ด ์—†๋Š” ํ•จ์ˆ˜)๋Š” ๋ฐ˜๋“œ์‹œ ๋ช…ํ™•ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ํƒ€๋™์‚ฌ์™€ ๋ชฉ์ ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋งŒ, ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ๋งฅ์ƒ ํƒ€๋™์‚ฌ์˜ ๋ชฉ์ ์–ด๊ฐ€ ๋ถ„๋ช…ํ•  ๋•Œ๋Š” ์˜ˆ์™ธ๋กœ ํ•œ๋‹ค

  5. ๋ถˆ๋ฆฌ์–ธํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ์งˆ๋ฌธ์„ ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค

    bool IsVisible();
    bool ShouldClearBuffer();
  6. ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์ง€์–ด์•ผํ•œ๋‹ค

    // ์ฒดํฌํ•ด์„œ true๋ฉด ๋ญ” ๋œป์ธ๋ฐ?
    bool CheckTea(FTea Tea);
    
    // ์•„~ true๋ฉด ์ฐจ๊ฐ€ freshํ•˜๋‹จ ๋œป์ด๊ตฐ
    bool IsTeaFresh(FTea Tea);
  7. ์ƒ์ˆ˜ ๋˜๋Š” #define์œผ๋กœ ์ •์˜๋œ ์ƒ์ˆ˜์˜ ์ด๋ฆ„์€ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ํ•˜๋˜ ๋ฐ‘์ค„๋กœ ๊ฐ ๋‹จ์–ด๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค

    	constexpr int SOME_CONSTANT = 1;
  8. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋ชจ๋‘ ์†Œ๋ฌธ์ž๋กœ ์ž‘์„ฑํ•œ๋‹ค

    namespace abc{};
  9. ๋ถ€์šธ(boolean)ํ˜• ๋ณ€์ˆ˜๋Š” ์•ž์— b๋ฅผ ๋ถ™์ธ๋‹ค

    bool bFired;    // ์ง€์—ญ ๋ณ€์ˆ˜์™€ public ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ
    bool mbFired;   // ํด๋ž˜์Šค์˜ private ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ
  10. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” ์•ž์— I๋ฅผ ๋ถ™์ธ๋‹ค

    class ISomeInterface;
  11. ์—ด๊ฑฐํ˜•์„ ์„ ์–ธํ•  ๋•Œ๋Š” ์•ž์— e๋ฅผ ๋ถ™์ธ๋‹ค

    enum class eDirection
    {
        North,
        South
    };
  12. ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ๋ช…์€ ์•ž์— m์„ ๋ถ™์ธ๋‹ค

    class Employee
    {
    protected:
    	int mDepartmentID;
    private:
    	int mAge;
    };
  13. goto ๋ ˆ์ด๋ธ” ๋ช…์€ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ํ•˜๋˜ ๋ฐ‘์ค„๋กœ ๊ฐ ๋‹จ์–ด๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค

    goto MY_LABEL;
    
    // ...
    
    MY_LABEL:
        std::cout << "Magic! << std::endl;
        return 0;
  14. ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ์ง“๋Š”๋‹ค

  15. ๋‹จ์ˆœํžˆ ๋ฐ˜๋ณต๋ฌธ์— ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—” i, e ๊ฐ™์€ ๋ณ€์ˆ˜๋ช… ๋Œ€์‹  index, employee์ฒ˜๋Ÿผ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ˆˆ์— ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•œ๋‹ค.

  16. ๋’ค์— ์ถ”๊ฐ€์ ์ธ ๋‹จ์–ด๊ฐ€ ์˜ค์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ค„์ž„๋ง์€ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ํ‘œ๊ธฐํ•œ๋‹ค

    int OrderID;
    int HttpCode;
  17. ๊ตฌ์กฐ์ฒด๋Š” ์˜ค์ง public ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ตฌ์กฐ์ฒด์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ช…์€ ํŒŒ์Šค์นผ ํ‘œ๊ธฐ๋ฒ•์„ ๋”ฐ๋ฅด๋ฉฐ, ๊ตฌ์กฐ์ฒด ์•ˆ์—์„œ๋Š” ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค

  18. ์žฌ๊ท€ ํ•จ์ˆ˜๋Š” ์ด๋ฆ„ ๋’ค์— Recursive๋ฅผ ๋ถ™์ธ๋‹ค

    void FibonacciRecursive();
  19. ํŒŒ์ผ ์ด๋ฆ„์€ ๋Œ€์†Œ๋ฌธ์ž๊นŒ์ง€ ํฌํ•จํ•ด์„œ ๋ฐ˜๋“œ์‹œ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค

    class PlayerAnimation;
    
    PlayerAnimation.cpp
    PlayerAnimation.h
  20. ์—ฌ๋Ÿฌ ํŒŒ์ผ์ด ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์ด๋ฃฐ ๋•Œ, ํŒŒ์ผ ์ด๋ฆ„์€ ํด๋ž˜์Šค ์ด๋ฆ„์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ , ๊ทธ ๋’ค์— ๋ฐ‘์ค„๊ณผ ์„ธ๋ถ€ ํ•ญ๋ชฉ ์ด๋ฆ„์„ ๋ถ™์ธ๋‹ค

    class RenderWorld;
    
    RenderWorld_load.cpp
    RenderWorld_demo.cpp
    RenderWorld_portals.cpp
  21. Reverse OOP ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๋•Œ, ํ”Œ๋žซํผ ์ „์šฉ ํด๋ž˜์Šค๋Š” ์œ„ ํ•ญ๋ชฉ๊ณผ ๋น„์Šทํ•œ ๋ช…๋ช… ๊ทœ์น™์„ ์‚ฌ์šฉํ•œ๋‹ค

    class Renderer;
    
    Renderer.h			// ๊ฒŒ์ž„์—์„œ ํ˜ธ์ถœ๋˜๋Š” ๋ชจ๋“  Renderer ์ธํ„ฐํŽ˜์ด์Šค
    Renderer.cpp		// ๋ชจ๋“  ํ”Œ๋žซํผ ์šฉ Renderer ๊ตฌํ˜„ ์†Œ์Šค
    Renderer_gl.h		// Renderer๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” RendererGL ์ธํ„ฐํŽ˜์ด์Šค
    Renderer_gl.cpp		// RendererGL ๊ตฌํ˜„ ์†Œ์Šค
  22. ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ ์—ด๊ฑฐํ˜•์€ ์ด๋ฆ„ ๋’ค์— Flags๋ฅผ ๋ถ™์ธ๋‹ค

    enum class eVisibilityFlags
    {
    }
  23. ๋ณ€์ˆ˜ ๊ฐ€๋ฆฌ๊ธฐ(variable shadowing)์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์™ธ๋ถ€ ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด ๋‚ด๋ถ€ ๋ณ€์ˆ˜์—๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•œ๋‹ค

    class SomeClass
    {
    public:
        int32_t Count;
    public:
        void Func(const int32_t Count)
        {
            for (int32_t count = 0; count != 10; ++count)
            {
                // Use Count
            }
        }
    }

๊ฐ€์ด๋“œ๋ผ์ธ

  1. ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ํ•ญ์ƒ setter์™€ getter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

    • ํ‹€๋ฆฐ ๋ฐฉ์‹:

      class Employee
      {
      public:
      	string Name;
      };
    • ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹:

      class Employee
      {
      public:
      	const string& GetName() const;
      	void SetName(const string& name);
      private:
      	string mName;
      };
  2. ์™ธ๋ถ€ ํ—ค๋” ํŒŒ์ผ์„ ์ธํด๋ฃจ๋“œ ํ•  ๋•Œ๋Š” #include <>์„ ์‚ฌ์šฉ, ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋“  ํ—ค๋” ํŒŒ์ผ์„ ์ธํด๋ฃจ๋“œ ํ•  ๋•Œ๋Š” #include ""๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  3. ์™ธ๋ถ€ ํ—ค๋” ํŒŒ์ผ์„ ๋จผ์ € ์ธํด๋ฃจ๋“œํ•œ ๋’ค, ๋‚ด๋ถ€ ํ—ค๋” ํŒŒ์ผ์„ ์ธํด๋ฃจ๋“œ๋ฅผ ํ•  ๋•Œ, ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค

  4. ๋ชจ๋“  ํ—ค๋” ํŒŒ์ผ ์ฒซ ๋ฒˆ์งธ ์ค„์— #pragma once๋ฅผ ๊ธฐ์žฌํ•œ๋‹ค

  5. ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” ๊ทธ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์™€ ๋™์ผํ•œ ์ค„(์Šค์ฝ”ํ”„)์— ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•œ๋‹ค

  6. double์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹Œ ์ด์ƒ ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์— f๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค

    float f = 0.5f;
  7. switch case ๋ฌธ์—๋Š” ํ•ญ์ƒ default๋ฅผ ๋„ฃ๋Š”๋‹ค

  8. switch case ๋ฌธ ๋์— break;๋ฅผ ๋„ฃ์ง€ ์•Š๊ณ  ๊ทธ ๋ฐ”๋กœ ์•„๋ž˜ case ๋ฌธ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘” FALLTHROUGH ๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹จ, case ๋ฌธ ์•ˆ์— ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ์ด๋‹ค. ์ด๋Š” C++17 ์‚ฌ์–‘์—์„œ [[fallthrough]] ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋กœ ๋Œ€์ฒด๋  ๊ฒƒ์ด๋‹ค.

    • C++17 ์ด์ „

      switch (number)
      {
      case 0:
          DoSomething();
          FALLTHROUGH
      case 1:
          DoFallthrough();
          break;
      case 2:
      case 3:
          DoNotFallthrough();
          break;
      default:
          break;
      }
    • C++17 ์ดํ›„

      switch (number)
      {
      case 0:
          DoSomething();
          [[fallthrough]];
      case 1:
          DoFallthrough();
          break;
      case 2:
      case 3:
          DoNotFallthrough();
          break;
      default:
          break;
      }
  9. default case๊ฐ€ ์ ˆ๋Œ€ ์‹คํ–‰๋  ์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ, default case ์•ˆ์— Assert(false);๋ž€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. Assert()๋Š” ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด ๊ทธ ์•ˆ์—์„œ ๋ฆด๋ฆฌ์ฆˆ ๋นŒ๋“œ ์‹œ ์ตœ์ ํ™” ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค

    switch (type)
    {
    case 1:
        ... 
        break;
    default:
        Assert(false, "unknown type");
        break;
    }
  10. ์›์น™์ ์œผ๋กœ ๋ชจ๋“  ๊ณณ์— const๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋„ ํฌํ•จํ•œ๋‹ค

  11. ๊ฐœ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—๋Š” ๋ชจ๋‘ const๋ฅผ ๋ถ™์ธ๋‹ค

    int GetAge() const;
  12. ๊ฐ’(value) ํ˜•์‹์˜ ๋ณ€์ˆ˜๋ฅผ const๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ํฌ์ธํ„ฐ๋‚˜ ์ฐธ์กฐ(reference)๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒฝ์šฐ์—๋งŒ const ๋ฐ˜ํ™˜์„ ํ•œ๋‹ค

  13. ํด๋ž˜์Šค ์•ˆ์—์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ๋“ฑ์žฅ ์ˆœ์„œ๋Š” ๋‹ค์Œ์„ ๋”ฐ๋ฅธ๋‹ค

    1. friend ํด๋ž˜์Šค๋“ค
    2. public ๋ฉ”์„œ๋“œ๋“ค
    3. protected ๋ฉ”์„œ๋“œ๋“ค
    4. private ๋ฉ”์„œ๋“œ๋“ค
    5. protected ๋ณ€์ˆ˜๋“ค
    6. private ๋ณ€์ˆ˜๋“ค
  14. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ”ผํ•œ๋‹ค

    • ํ‹€๋ฆฐ ๋ฐฉ์‹

      const Anim* GetAnim(const int index) const;
      const Anim* GetAnim(const char* name) const;
    • ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹

      const Anim* GetAnimByIndex(const int index) const;
      const Anim* GetAnimByName(const char* name) const;
  15. const ๋ฐ˜ํ™˜์„ ์œ„ํ•œ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์€ ํ—ˆ์šฉํ•œ๋‹ค

    Anim* GetAnimByIndex(const int index);
    const Anim* GetAnimByIndex(const int index) const;
  16. const_cast๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  const์ธ ๊ฐœ์ œ์ธจ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค

  17. ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ๋œ ์†Œ์Šค ํŒŒ์ผ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋‹จ, ์ž‘์€ ํด๋ž˜์Šค ๋ช‡ ๊ฐœ๋ฅผ ํ•œ ํŒŒ์ผ์— ๊ฐ™์ด ๋„ฃ์–ด ๋‘๋Š” ๊ฒƒ์ด ์ƒ์‹์ ์ผ ๊ฒฝ์šฐ ์˜ˆ์™ธ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค

  18. ํ‘œ์ค€ C assert ๋Œ€์‹ ์— ์ž์‹ ๋งŒ์˜ Assert ๋ฒ„์ „์„ ๊ตฌํ˜„ํ•œ๋‹ค

  19. ํŠน์ • ์กฐ๊ฑด์ด ๋ฐ˜๋“œ์‹œ ์ถฉ์กฑ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •(assertion)ํ•˜๊ณ  ์ง  ์ฝ”๋“œ ๋ชจ๋“  ๊ณณ์— assert๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Assert๋Š” ๋ณต๊ตฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด์ด๋‹ค. Assert๋Š” ๋ฆด๋ฆฌ์ฆˆ ๋นŒ๋“œ์—์„œ [__assume](https://docs.microsoft.com/en-us/cpp/intrinsics/assume?view=msvc-160) ํ‚ค์›Œ๋“œ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ์— ์ตœ์ ํ™” ํžŒํŠธ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค

  20. ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€ ์ง์ ‘ ๊ตฌํ˜„ํ•œ New, Delete ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•œ๋‹ค

  21. memeset, memcpy, memmove์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์—ฐ์‚ฐ ์—ญ์‹œ ์šฐ๋ฆฌ ๊ณ ์œ ์˜ MemSet, MemCpy, MemMove ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค

  22. ์–ด๋–ค ์ด์œ ๋กœ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ nullptr๊ฐ€ ๋„˜์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํฌ์ธํ„ฐ ๋Œ€์‹  ์ฐธ์กฐ์ž(&)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ํ•œ๋‹ค (์˜ˆ์™ธ๋Š” ๋‹ค์Œ ํ•ญ๋ชฉ์„ ์ฐธ๊ณ )

  23. ํ•จ์ˆ˜์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ(out ๋งค๊ฐœ๋ณ€์ˆ˜)๋Š” ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์— out์„ ๋ถ™์ธ๋‹ค

    • ํ•จ์ˆ˜

      void GetScreenDimension(uint32_t* const outWidth, uint32_t* const  outHeight)
      {
      }
    • ํ˜ธ์ถœ

      uint32_t width;
      uint32_t height;
      GetScreenDimension(&width, &height);
  24. ์œ„ ํ•ญ๋ชฉ์˜ out ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ null์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค (ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ if๋ฌธ ๋Œ€์‹  assert๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ)

    void GetScreenDimension(uint32_t* const outWidth, uint32_t* const  outHeight)
    {
        Assert(outWidth);
        Assert(outHeight);
    }
  25. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ €์žฅ๋  ๋•Œ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

    void AddMesh(Mesh* const mesh)
    {
        mMeshCollection.push_back(mesh);
    }
  26. ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ void ํฌ์ธํ„ฐ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

    void Update(void* const something)
    {
    }
  27. ํŠน์ • ํฌ๊ธฐ(์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„์˜ ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•œ ํฌ๊ธฐ)๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ•œ ์—ด๊ฑฐํ˜•์— ํฌ๊ธฐ ์ง€์ •์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค

    enum class eDirection : uint8_t
    {
        North,
        South
    }
  28. ๋””ํดํŠธ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋Œ€์‹  ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ์„ ํ˜ธํ•œ๋‹ค

  29. ๋””ํดํŠธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, nullptr๋‚˜ false, 0 ๊ฐ™์ด ๋น„ํŠธ ํŒจํ„ด์ด 0์ธ ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค

  30. ๊ฐ€๋Šฅํ•œ ๊ณ ์ •๋œ ํฌ๊ธฐ(size)์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

  31. ๋™์  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฏธ๋ฆฌ `reserve()``๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  32. #define์œผ๋กœ ์ •์˜๋œ ์ƒ์ˆ˜๋Š” ํ•ญ์ƒ ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์ค€๋‹ค

    #define NUM_CLASSES (1)
  33. ์ƒ์ˆ˜๋Š” #define๋ณด๋‹ค const ์ƒ์ˆ˜ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ๋‹ค

  34. ํด๋ž˜์Šค๋ฅผ ์ƒํ˜ธ ์ฐธ์กฐํ•  ๋•Œ๋Š” #include๋ณด๋‹ค ์ „๋ฐฉ์„ ์–ธ(forward declaration)์„ ์ตœ๋Œ€ํ•œ ์ด์šฉํ•œ๋‹ค

  35. ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋Š” ๋ฐ˜๋“œ์‹œ ๊ณ ์นœ๋‹ค

  36. ํ•œ ์ค„์— ๋ณ€์ˆ˜ ํ•˜๋‚˜๋งŒ ์„ ์–ธํ•œ๋‹ค

    • ํ‹€๋ฆฐ ๋ฐฉ์‹

      int counter = 0, index = 0;
    • ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹

      int counter = 0;
      int index = 0;
    • ์ด๋ž˜์•ผ ๊ฐ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ฃผ์„์„ ๋‚จ๊ฒจ ์ด ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

  37. ์ง€์—ญ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ NRVO์˜ ์ด์ ์„ ํ™œ์šฉํ•œ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜ ๋‚ด์— ํ•˜๋‚˜์˜ return๋ฌธ ๋งŒ ์“ด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๊ฒƒ์€ ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งŒ ์ ์šฉ๋œ๋‹ค.

  38. struct๋‚˜ class์—์„œ ์ดˆ๊ธฐํ™” ํ›„ ๊ฐ’ ๋ณ€๊ฒฝ์„ ๋ง‰์œผ๋ ค๊ณ  const ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค. ์ฐธ์กฐ(&) ๋ฉค๋ฒ„๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

  39. ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ๋Š” ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค

๋ชจ๋˜ C++ ๊ฐ€์ด๋“œ๋ผ์ธ

  1. ์ปดํŒŒ์ผ ๋„์ค‘ assertion์ด ํ•„์š”ํ•˜๋‹ค๋ฉด static_assert๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

  2. override์™€ final ํ‚ค์›Œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•œ๋‹ค

  3. ํ•ญ์ƒ enum class๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

    enum class eDirection
     {
         North,
         South
     }
  4. ๊ฐ€๋Šฅํ•œย Assertย ๋Œ€์‹ ย static_assertย ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  5. ํฌ์ธํ„ฐ์—ย NULLย ๋Œ€์‹ ย nullptrย ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  6. ๊ฐœ์ฒด์˜ ์ˆ˜๋ช…์ด ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐย unique_ptrย ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (์ฆ‰, ๊ฐœ์ฒด ์ƒ์„ฑ์€ ์ƒ์„ฑ์ž์—์„œ, ๊ฐœ์ฒด ํŒŒ๊ดด๋Š” ์†Œ๋ฉธ์ž์—์„œ)

  7. ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณณ์ด๋ผ๋ฉด ๋ฒ”์œ„๊ธฐ๋ฐ˜ for ๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  8. ๋ฐ˜๋ณต์ž๋‚˜ย newย ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฐ™์€ ์ค„์— ์žˆ์–ด์„œ, ์–ด๋–ค ๊ฐœ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉดย autoย ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  9. std::move๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์ตœ์ ํ™”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ,ย ์ž๋™ NRVO ์ตœ์ ํ™”๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  10. ์ด๋™ ์ƒ์„ฑ์ž(move constructor)์™€ ์ด๋™ ๋Œ€์ž… ์—ฐ์‚ฐ์ž(move assignment operator)๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

  11. ๋‹จ์ˆœ ์ƒ์ˆ˜ ๋ณ€์ˆ˜์—๋Š”ย constย ๋Œ€์‹ ย constexprย ์„ ์‚ฌ์šฉํ•œ๋‹ค.

    ์ ์šฉ ์ „:

    const int DEFAULT_BUFFER_SIZE = 65536;
    
    

    ์ ์šฉ ํ›„:

    constexpr int DEFAULT_BUFFER_SIZE = 65536;
    
  12. ๋žŒ๋‹ค ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ sort ๋“ฑ์˜ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ๋“ฑ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๊ธธ์ด๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ๊ธธ์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค

์ฝ”๋“œ ํฌ๋งทํŒ…

  1. include ์ „์ฒ˜๋ฆฌ๋ฌธ ๋ธ”๋ก๊ณผ ์ฝ”๋“œ ๋ณธ๋ฌธ ์‚ฌ์ด์— ๋ฐ˜๋“œ์‹œ ๋นˆ ์ค„์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค

  2. ํƒญ(tab)์€ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์‹œ ๋„์–ด์“ฐ๊ธฐ 4์นธ์„ ํƒญ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  3. ์ค‘๊ด„ํ˜ธ( { )๋ฅผ ์—ด ๋•Œ๋Š” ์–ธ์ œ๋‚˜ ์ƒˆ๋กœ์šด ์ค„์— ์—ฐ๋‹ค.

  4. ์ค‘๊ด„ํ˜ธ ์•ˆ( { } )์— ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„๋งŒ ์žˆ๋”๋ผ๋„ ๋ฐ˜๋“œ์‹œ ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

     if (bSomething)
     {
         return;
     }
  5. if - else ๋ธ”๋ก์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ else๋Š” if์˜ ์ค‘๊ด„ํ˜ธ ๋‹ค์Œ ์ค„์—์„œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•œ๋‹ค

    if (bHaveUnrealLicense)
    {
        InsertYourGameHere();
    }
    else
    {
        CallMarkRein();
    }
  6. ํฌ์ธํ„ฐ๋‚˜ ์ฐธ์กฐ ๊ธฐํ˜ธ๋Š” ์ž๋ฃŒํ˜•์— ๋ถ™์ธ๋‹ค.

     int& number;
     int* number;
  7. ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํฌ๋งท์„ ๋”ฐ๋ผ ํ•œ ์ค„์— ๋ณ€์ˆ˜ ํ•˜๋‚˜์”ฉ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

    • ํ‹€๋ฆฐ ๋ฐฉ์‹:
     MyClass::MyClass(const int var1, const int var2)
       :mVar1(var1), mVar2(var2), mVar3(0)
     {
    • ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹:
     MyClass::MyClass(const int var1, const int var2)
       : mVar1(var1)
       , mVar2(var2)
       , mVar3(0)
     {

๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ๊ด€๋ จ

  1. Visual C++: ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ํ•ญ์ƒ ์†์„ฑ ์‹œํŠธ(property sheets)์—์„œ ๋ณ€๊ฒฝ ํ•œ๋‹ค.
  2. ํ”„๋กœ์ ํŠธ ์„ค์ •์—์„œ ์ปดํŒŒ์ผ ๊ฒฝ๊ณ ๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ๋Œ€์‹ , ์ฝ”๋“œ์—์„œย #pragmaย ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํ™•์žฅ์„ฑ ๊ด€๋ จ

<stdint>์— ์ •์˜๋œ C++11 ์ดํ›„ ์ถ”๊ฐ€๋œ ํ˜•๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค

  • boolย : ๋ถˆ๋ฆฌ์–ธํ˜• (bool์˜ ํฌ๊ธฐ๋ฅผ ์ ˆ๋Œ€๋กœ ์ถ”์ •ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค).
  • TODO(์บ๋ฆญํ„ฐ ๊ด€๋ จ ์ถ”๊ฐ€ ํ•„์š”)
  • uint8_tย : ๋ฌด๋ถ€ํ˜ธ ๋ฐ”์ดํŠธ (1 ๋ฐ”์ดํŠธ).
  • int8_tย : ์œ ๋ถ€ํ˜ธ ๋ฐ”์ดํŠธ (1 ๋ฐ”์ดํŠธ).
  • uint16_tย : ๋ฌด๋ถ€ํ˜ธ "๋‹จ์ •์ˆ˜short" (2 ๋ฐ”์ดํŠธ).
  • int16_tย : ์œ ๋ถ€ํ˜ธ "๋‹จ์ •์ˆ˜short" (2 ๋ฐ”์ดํŠธ).
  • uint23_tย : ๋ฌด๋ถ€ํ˜ธ ์ •์ˆ˜ (4 ๋ฐ”์ดํŠธ).
  • int32_tย : ์œ ๋ถ€ํ˜ธ ์ •์ˆ˜ (4 ๋ฐ”์ดํŠธ).
  • uint64_tย : ๋ฌด๋ถ€ํ˜ธ "4๋ฐฐ ๋‹จ์–ดquad word" (8 ๋ฐ”์ดํŠธ). (Microsoft์˜ Window.h์— WORD๋ผ๋Š” 16๋น„ํŠธ ๋ฌด๋ถ€ํ˜ธ ์ •์ˆ˜์˜ 4๋ฐฐ ํฌ๊ธฐ๋ฅผ ๊ฐ–์Œ์„ ์˜๋ฏธ)
  • int64_tย : ์œ ๋ถ€ํ˜ธ "4๋ฐฐ ๋‹จ์–ดquad words" (8 ๋ฐ”์ดํŠธ).
  • floatย : ๋‹จ์ •๋ฐ€๋„ ๊ณ ์ • ์†Œ์ˆ˜์  (4 ๋ฐ”์ดํŠธ).
  • doubleย : 2๋ฐฐ์ •๋ฐ€๋„ ๊ณ ์ • ์†Œ์ˆ˜์  (8 ๋ฐ”์ดํŠธ).

์ฃผ์„ ๊ฐ€์ด๋“œ๋ผ์ธ

  1. ์• ์ดˆ์— ์ฝ”๋“œ ์ž์ฒด๊ฐ€ document๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜๋ผ

    // Bad:
    t = s + l - b;
    
    // Good:
    TotalLeaves = SmallLeaves + LargeLeaves - SmallAndLargeLeaves;
  2. ์˜๋ฏธ์žˆ๋Š” ์ฃผ์„์„ ์ž‘์„ฑํ•˜์ž

    // Bad:
    // increment Leaves
    ++Leaves;
    
    // Good:
    // we know there is another tea leaf
    ++Leaves;
  3. ์ฝ”๋“œ๋ฅผ ์ œ๋Œ€๋กœ ๋ชป ์ง  ๊ฑฐ์— ์ฃผ์„์„ ๋„ฃ์–ด์ฃผ์ง€ ๋ง๋ผ. ์ฐจ๋ผ๋ฆฌ ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ์งœ๋ผ.

    // Bad:
    // total number of leaves is sum of
    // small and large leaves less the
    // number of leaves that are both
    t = s + l - b;
    
    // Good:
    TotalLeaves = SmallLeaves + LargeLeaves - SmallAndLargeLeaves;
  4. ์ฝ”๋“œ์™€ ๋‚ด์šฉ์ด ์ƒ๋ฐ˜๋˜์–ด์„œ๋Š” ์•ˆ๋œ๋‹ค

    // Bad:
    // never increment Leaves!
    ++Leaves;
    
    // Good:
    // we know there is another tea leaf
    ++Leaves;