언리얼
- #pragma once는 C++ 프로그래밍에서 자주 사용되는 전처리 지시자(preprocessor directive)입니다. 이 지시자는 헤더 파일을 중복으로 포함(include)되는 것을 방지하기 위해 사용됩니다.
헤더 파일이 필요한 코드들을 전부 include했을 때, 컴파일러가 동일한 헤더 파일을 여러 번 포함하게 되면 변수나 함수 정의의 중복으로 인한 컴파일 오류가 발생할 수 있습니다. #pragma once는 이러한 문제를 방지하기 위해 사용되며 해당 지시자가 있는 헤더 파일을 이미 포함한 경우에는 무시하게 됩니다.
파일이 다른 헤더 파일이나 소스 파일에 여러 번 포함되더라도 #pragma once로 인해 중복 포함 문제로 인한 컴파일 오류가 발생하지 않습니다.
그러나 이 방법은 C++ 표준이 아니라 사용할 수 없는 컴파일러도 있습니다. 표준 방법으로는 헤더 가드(header guard)를 사용하는 방법이 있으며 다음과 같이 작성해줄 수 있습니다:
C++
- Virtual 함수는 다형성을 구현하는 데 사용됩니다. C++에서 하나의 객체가 다양한 형태로 사용될 수 있는 기능을 다형성(Polymorphism)이라고 합니다. Virtual 함수는 이 다형성을 구현하기 위해 사용됩니다.
기본 클래스에서 Virtual 함수를 선언하면 해당 함수를 상속한 하위 클래스들은 Virtual 함수를 필요한 대로 재정의할 수 있습니다. 이렇게 하면 같은 이름의 함수를 호출해도 다른 결과를 도출할 수 있게 됩니다. 이와 같은 다형성은 유연성(Flexibility)과 확장성(Extensibility)을 높이는 데에 도움을 줍니다.
또한, Virtual 함수는 동적 바인딩(즉, 실행 시점에 해당 함수를 찾아오는 것)을 가능하게 해줍니다. 따라서, 프로그램이 실행 중에 포인터 또는 참조를 사용하여 Virtual 함수를 호출할 수 있습니다. 이렇게 하면 실행 시점에 포인터가 실제로 가리키는 객체 타입에 맞게 함수 호출이 결정되어, 프로그램의 다형성이 구현됩니다.
더불어 Virtual 함수를 사용하면 Polymorphic 계층구조를 생성할 수 있어, 다양한 객체를 처리하는 함수를 개발하거나 이들 객체를 담는 container를 구현하는 데 사용될 수 있습니다.
즉, 객체 지향적인 C++의 기본 요소 중 하나인 다형성을 강력하게 지원하는 키워드 중 하나인 Virtual 함수를 사용하여, 하나의 클래스에서 다양한 타입의 객체를 처리하고, 확장성과 유연성을 높이는 데에 도움을 줄 수 있습니다.
- Virtual 함수와 abstract 함수 모두 다형성을 구현하는 데 사용되는 C++의 기능입니다. 하지만 둘의 차이점은 구현 여부의 유무입니다.
Virtual 함수는 상위 클래스에서 이미 구현이 된 함수를 하위 클래스에서 다시 구현할 때, 함수에 Virtual 키워드를 붙이는 것입니다. 하지만 Abstract 함수는 상위 클래스에는 구현을 하지 않습니다. 하위 클래스에서 반드시 구현을 해야하는 함수입니다. 하위 클래스에서 Abstract 함수를 구현하지 않으면 해당 클래스는 추상 클래스가 됩니다.
추상 클래스는 사용자에게 객체를 생성하여 사용하라고 제공하지 않는 추상 클래스로 객체를 생성할 수 없습니다. 추상 클래스를 상속받아 하위 클래스에서 해당 함수를 오버라이딩하여 구현하고 나면 하위 클래스에서 객체를 생성하여 사용할 수 있습니다.
- 오버라이딩(Overriding)과 오버로딩(Overloading)은 객체 지향 프로그래밍에서 사용되는 두 가지 다른 개념입니다.
오버라이딩은 상위 클래스의 메소드를 하위 클래스에서 재정의하여 사용하는 것을 의미합니다. 즉, 하위 클래스에서 상위 클래스의 메소드 구현을 변경하고, 다형성을 구현할 때 사용합니다. 오버라이딩은 상위 클래스에서 선언된 메소드와 같은 이름, 같은 매개 변수 목록 및 같은 반환 타입을 가지는 메소드를 하위 클래스에서 다시 구현한다는 점에서 중요합니다.
오버로딩은 같은 이름의 메소드를 여러 형태로 만들어서 사용하는 것을 의미합니다. 즉, 동일한 이름의 메소드를 인자의 개수, 타입이나 순서 등을 이용하여 다르게 만들 수 있습니다. 오버로딩은 주로 함수의 인자 타입이나 개수가 달라지는 경우에 사용합니다.
- C++에서 인터페이스(Interface)란 클래스의 구현부가 없는 순수 가상 함수로만 이루어진 추상 클래스(Abstract class)를 말합니다. 인터페이스 클래스는 함수의 명세만 가지며, 이것이 클래스의 인터페이스로서 기능합니다. 그리고 다른 클래스에서 이 인터페이스를 상속받아 구현하여 사용할 수 있습니다. 인터페이스 클래스는 반드시 순수 가상 함수만 가지고 있으므로, 객체 생성이 불가능하며, 구현부 없이 인터페이스만을 제공합니다. 이러한 구조로 인해, C++에서 인터페이스를 인터페이스 기반 프로그래밍(Interface-based Programming)이라고도 합니다. 인터페이스를 사용하면 코드의 재사용성이 증가하고, 결합도(Coupling)를 낮출 수 있어 유지보수성을 높일 수 있습니다. 또한, 인터페이스의 다양성을 이용하여 다형성(Polymorphism)을 구현할 수 있습니다. 인터페이스를 선언하는 방법은 일반 추상 클래스를 선언하는 방법과 유사합니다. 추상 클래스와의 차이점은 모든 멤버 함수가 순수 가상 함수이며, 클래스 선언부에서 구현부를 작성하지 않는다는 것입니다. 간단한 예시를 살펴보겠습니다. ``` class Interface { public: virtual void doSomething() = 0; virtual void doAnotherThing() = 0; }; ``` 위 예제에서는 doSomething과 doAnotherThing이라는 순수 가상 함수를 가지는 인터페이스 클래스를 선언하고 있습니다. 이를 상속받는 클래스는 반드시 이 두 함수를 구현해야 합니다.
- 인터페이스(Interface) 클래스와 추상 클래스(Abstract Class)는 모두 클래스의 추상화(abstraction)를 위해 사용되는 객체지향 프로그래밍의 개념입니다. 이 두 개념의 공통점과 차이점은 아래와 같습니다. 공통점: - 객체를 직접 생성할 수 없다. - 순수 가상 함수(pure virtual function)를 가진다. - 다형성(polymorphism)을 구현할 수 있다. 차이점: - 선언된 함수 중에서 구현을 갖고 있는 함수가 있느냐 없느냐의 차이 - 인터페이스 클래스: 선언된 모든 함수가 구현을 갖고 있지 않다. 인터페이스 클래스는 오로지 함수에 대한 명세(specifications)만 가지고 있다. 파생 클래스에서 인터페이스를 상속 후 오버라이딩(overriding)을 통해 각 함수들을 구현해야 한다. - 추상 클래스: 모든 함수가 정상적인 구현을 갖고 있다. 단지 소멸자(destructor)만 가상(각 파생 클래스의 소멸자가 엉뚱한 객체를 해제하는 것을 방지하기 위한)으로 정의되어있다. 따라서 추상 클래스의 구현에서는 파생 클래스에서 구현하지 않아도 되는 함수들도 포함될 수 있다. 쉽게 말해, 인터페이스는 필요한 메서드의 명세만 제공하고 각 사용자별로 필요한 구현이 달라질 수 있는 경우 사용되며, 추상 클래스는 하나의 기본 클래스를 정의해놓고 각 사용자들이 해당 클래스의 구현을 바탕으로 본인만의 프로그램을 작성할 경우 사용됩니다.
- 추상 클래스(Abstract class)는 객체를 직접 생성할 수 없으며, 파생 클래스에서 반드시 구현해야 하는 순수 가상 함수(pure virtual function)를 가지는 클래스입니다. 추상 클래스는 C++에서 인터페이스(interface)와 유사한 기능을 제공하며, 다음과 같은 경우에 사용합니다. 1. 다형성(polymorphism)을 구현해야 할 경우 추상 클래스는 객체를 직접 생성할 수 없지만 추상 클래스 타입의 포인터를 사용하여 파생 클래스 객체에 접근할 수 있습니다. 이로 인해, 다형성을 구현하는 경우에 주로 사용됩니다. 2. 일관성 있는 디자인을 유지하려는 경우 추상 클래스는 인터페이스의 역할을 하므로, 파생 클래스에서 구현해야 할 순수 가상 함수를 가지고 있습니다. 이로 인해, 파생 클래스의 작성자들은 일관성 있는 디자인을 유지할 수 있습니다. 3. 컴파일 타임 에러를 방지하려는 경우 추상 클래스는 객체를 직접 생성할 수 없으므로, 추상 클래스 타입의 객체를 인자로 받는 함수를 호출할 경우 컴파일 타임 에러를 방지할 수 있습니다. 따라서, 추상 클래스는 다형성을 구현하고 일관성 있는 디자인을 유지하며, 컴파일 타임 에러를 방지하는 경우에 사용됩니다. 그러나 다형성 등의 기능을 사용하지 않는 단순한 클래스의 경우에는 추상 클래스보다는 일반 클래스를 사용하는 것이 의미가 없을 수 있습니다.
- C++에서 인터페이스 상속과 일반 상속의 주요한 차이점은 다음과 같습니다. 인터페이스 상속 (Interface Inheritance) - 인터페이스 상속은 클래스의 구현을 완전히 숨기고 인터페이스만 노출시키는 것을 목적으로 합니다. - 인터페이스는 순수 가상 함수(pure virtual function)로만 이루어져 있습니다. 즉, 함수의 명세만 있고 구현은 없습니다. - 인터페이스는 다중 상속이 가능합니다. - 파생 클래스는 인터페이스의 모든 순수 가상 함수를 구현해야 합니다. 예시: ``` class Interface { public: virtual void Func() = 0; // 순수 가상 함수 }; class Derived : public Interface { public: void Func() override { // 인터페이스의 함수를 구현 // ... } }; ``` 일반 상속 (Implementation Inheritance) - 일반 상속은 클래스의 구현을 상속받아 새로운 클래스를 정의하는 것을 목적으로 합니다. - 모든 멤버 변수와 멤버 함수를 노출시키고, 구현을 변경할 수 있습니다. - 단일 상속만 가능합니다. 예시: ``` class Base { public: void Func() { // 멤버 함수 구현 // ... } }; class Derived : public Base { public: void Func() override { // 부모 클래스의 멤버 함수를 재정의 // ... } }; ``` 요약하면, 인터페이스 상속은 인터페이스의 순수 가상 함수를 상속받아 구현을 완전히 숨기고 인터페이스만 노출시키는 것을 목적으로 합니다. 반면, 일반 상속은 클래스의 멤버 변수와 멤버 함수를 노출시켜 구현을 상속받아 새로운 클래스를 정의하는 것을 목적으로 합니다.
유니티
Unity에서 파이프 라인(Pipeline)은 렌더링 엔진이 그래픽스를 처리할 때, 그래픽스의 여러 단계들을 실행하는 순서 및 과정을 의미합니다. 파이프 라인은 일련의 단계를 거쳐 입력 데이터를 처리하여 출력 데이터를 생성합니다. 유니티에서는 다양한 종류의 파이프 라인을 제공하며, 각 파이프 라인에 따라 입력 및 출력 데이터의 형식과 자료 처리 방식이 크게 다를 수 있습니다.
유니티에서는 현재 Universal Render Pipeline(URP) 및 High Definition Render Pipeline(HDRP) 두 가지 파이프 라인을 제공하고 있습니다.
- URP(Universal Render Pipeline) URP는 모바일 및 경량 게임 개발용으로 만들어진 파이프 라인입니다. 경량 환경에 최적화되어 있으며, 그래픽 성능이 중요한 모바일 기기에서의 빠른 렌더링을 지원합니다. 또한, 사용자 정의 가능한 렌더링 패스(Custom rendering pass)를 지원하여 파이프 라인의 확장성을 높일 수 있습니다.
- HDRP(High Definition Render Pipeline) HDRP는 높은 그래픽 퀄리티를 필요로 하는 고사양 게임, VR 및 아트웍 시장을 위해 제작된 파이프 라인입니다. 최신 그래픽 기술을 지원하고 있으며, 다양한 렌더링 기능 및 렌더링 기술을 사용할 수 있습니다. 유니티에서는 최근에 HDRP에 추가된 Ray Tracing, Volumetric Lighting, Decal 옵션 등이 그 예입니다.
- 각각의 파이프 라인은 자체적으로 매우 다양한 기능을 제공하며, 사용자의 요구 사항에 맞춰 선택적으로 구성하거나 사용자 정의하여 사용할 수 있습니다.
'공부 > 여러가지 공부들' 카테고리의 다른 글
연출에 도움되는 영상 - 대사 없이 애니 연출하기 (0) | 2024.02.06 |
---|---|
더 좋은 블로그 운영을 위해 참고할 것 (0) | 2023.07.26 |
공부한 것들 정리 (0) | 2023.03.23 |