반응형

 

Ref 키워드와 Out 키워드를 더 잘 이해하기 위해서는 call by refurence , call by value를 알고 보는 게 좋다.

Ref , Out 키워드

정의부터 설명하자면

 Ref Pass by Reference

   ㄴ 얕은 복사 매개변수 지정자

Out Output Parameters

   ㄴ 출력용 매개변수 - 내부에서 값을 할당해주어야 한다.

 

 

사용 방법

 ref out 사용법

 

함수 선언 시

 리턴 값 함수명 (ref & out키워드 매개변수 타입  변수 이름 ) <-함수를 선언 또는 구현 시에도 매개변수 앞에 써줘야 한다.

함수 사용 시

 함수명( ref & out 키워드 변수 ) <- 사용할 때에도 매개변수 앞에다 ref 키워드를 써줘야 한다.

    public void FuncRefB(ref int A) 
    {
        A++;
    }

    public void Func( int A)
    {
        A++;
    }

    public void FuncOutB(out int A)
    {
        A = 10; // 내부에서 값을 대입 하지 않으면 오류가 나온다.
    }
   
       ...
       {
        int A;
        
        FuncOutB(out A);
          Console.WriteLine(A); // 내부에서 생성해서 받는다 Call by Refurence + @  10
        Func(A);
          Console.WriteLine(A); // 늘어나지 않는다 Call by Value   10
        FuncRefB(ref A);
          Console.WriteLine(A); // 값이 늘어난다. Call by Refurence  11
        }

이처럼 c나 c++처럼 포인터 참조형처럼 Call by Reference 형식으로 넘겨줄 수 있다.

 

(참고할 점)

1. Ref 키워드는 할당이 되어있어야 한다.

2. Out 은 Ref처럼 할당이 되어있지 않아도 사용 가능하지만. 내부에서 새로 할당한다.(이전 값은 사라짐)

3. Ref int -> int 오버로드는 가능하나 Out -> Ref , in 오버로드는 불가능하다.

 

 

구조체 같은 경우 기본적으로 call by value 형식이기 때문에 구조체를 ref 키워드로 넘겨주면 
얕은 복사(주소 값)처럼 사용할 수 있다.

 

in 키워드

in : 읽기 전용 매개변수 지정자

 

함수 선언 시

 리턴 값 함수명 ( in 키워드 매개변수 타입  변수이름 ) <-함수를 선언 또는 구현 시에도 매개변수 앞에 써줘야 한다.

함수 사용 시

 함수명(  키워드 변수 ) <-  in은 사용할 때 앞에 붙여 주지 않는다.

 

void FuncIn(in int num)
{
  //num++; 내부 수정불가능
  
}

내부에서 수정이 불가능하기 때문에 혹여나 다른 값을 입력하거나 수정하는 실수를 미연에 방지할 수 있다.

 

 

Ref 와 in 키워드는  복사 비용을 참조로 변경하여 성능 향상을 생각할수 있다.

 

 

--추가--

 

out 키워드 의경우 C#7.0 버전부터는 튜블 반환을 지원했다.

튜플 반환이 있기전에 여러값을 반환 할수 없었기 때문에 out을 주로 사용하였다.

 

(int sum, int product) Calculate(int a, int b) => (a + b, a * b);

 

 

void Calculate(int a, int b, out int sum, out int product)
{
    sum = a + b;
    product = a * b;
}

Calculate(2, 3, out int sum, out int product);

 

out 키워드는 성능이 중요한 코드나 오래된 api, 호환성 때문에 쓰인다.

 

 

 

반복적으로 많이 쓰일때 생성되는것보다 out으로 불필요한 메모리할당과 GC부하를 줄일수있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

'언어 > C#' 카테고리의 다른 글

c# ?? 연산자 (Null 병합 연산자)  (0) 2022.07.12
c# Nullable값 형식  (0) 2022.03.24
c# Tuple  (0) 2022.03.23
반응형

 

 

 

목차

1.인스펙터창 목록

2.인스펙터창 구성

3.인스펙터창 어트리뷰트 코드

 

 

 

 

인스펙터 창 우클릭 시

Debug-Normal 모드 : 창 모드 변경

Expand All Components : 세부 정보 펴기

Collapse All Components: 세부 정보 접기

Lock : 현재 component로 계속 보이게 지정

Maximize :  전체 화면

UIElements Debugger & UIToolkit Debugger : 유니티 화면 구성이 나오는 창

 

컴포넌트 우클릭 시

Reset : 초기화 (초기 세팅 값으로 돌아감)

Move Down-UP : 컴포넌트끼리의 위치 조정

Copy Component : 내부 값들 복사

Paste Component As  New : 새로 복사

Paste Component Valuse : 값 복사 

Find References In Scene : 씬에서 찾기

Properties... : 새창으로 보기

Edit Script : 스크립트 창으로 이동

 

 

디버그 모드 사용

사정자 정의 에디터가 표시되고 private 변수가 표시된다.

(Public처럼 수정은 불가능)

 

 

 

 

 

 

 

 

 

 

디버그 모드는 인스펙터 창 마다 설정 가능 하기에

하나만 켜 두고 볼 수 있다.

 

 

 

 

 

그리고 만약 Run 타임때 값을 저장하고싶으면 

컴퍼넌트 우클릭후 copy 
run 타임정지후 Paste 를 사용하여 데이터를 옮길수 있다.

 

 


 

 

 

상단구성

inspector 상단 구성

 

게임 Scene에서 보이는 아이콘 선택

아래 사진처럼 색 모양 또는 직접 아이콘 이미지를 설정할 수 있다

 

 

 

 

Scene에서 이렇게 보인다

 

 

 

 

 

 

Static

 

 

오브젝트 Static 설정

 ㄴ 최적화를 위해서 플레이 도중 오브젝트가 움직일 수 있는지 여부

   오브젝트의 연산을 미리 수행하고 런타임 시 적용하여 런타임 연산을 줄인다.

 

세팅에 따라 활성 비활성화되는 설정이 있다.

&nbsp;위 사진의 왼쪽은 static 설정이 켜진상태 / 오른쪽은 static 설정이 꺼진상태 이다.

사전 연산 설정을 따로 지정할 수도 있다.

이 부분의 자세한 설명은 매뉴얼을 참고하자

https://docs.unity3d.com/kr/2019.3/Manual/StaticObjects.html

 

 

 

 

 

 

Tag

Tag 설정

Tag 설정은 오브젝트를 식별할 때 도움을 준다.

addTag로 태그를 추가할 수 있다.

 

 

 

Layer

Layer&nbsp; 설정

1. 렌더링 설정 (렌더링 순서 또는 카메라에서 렌더링 제외도 가능하다)

 카메라 Culling Mask 레이서 설정으로 렌더링 제외 가능

 

 

 

 

2. 충돌 설정 (레이어끼리 선택적으로 충돌 안 하게 가능하다.)

 Edit->Project Settings -> physics

 

Layer 마다 충돌 설정 가능

 

 

 

 

3. 레이 캐스팅 충돌

  레이 캐스팅 충돌을 할 때 필요 없는 Collider을 걸러낼 수 있다

   https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

 

 

 

 

Add Tag&Layer

 

Tag 추가

 

Sorting Layer (렌더링 순서) 추가

 

Layers 추가

 

 

 

 

 

 이사진처럼 SpriteRenderer에 Sorting Layer가 있다.

 

 

 

 

 

 

 

활성화/비활성화

 

비활성화 시 실행되지 않는다.

오브젝트 비활성화/활성화

비활성화 시 오브젝트 내부 컴포넌트들이 없는 것으로 인식된다.

 

 

Lock 다른 오브젝트를 눌러도 lock 누를때 설정된 오브젝트로 고정시켜준다.

 


코드 설정

 

Reset

데이터 리셋

컴퍼넌트 우클릭시 나오는 창의 상단에 Reset 버튼이 존재한다. 누르면 초기세팅으로 돌아가지만

원하는 리셋 설정을 해줄수있다.

 

 

 

 

 

 

AnimationCurve

 

데이터를 직접 보며 지정하여 사용할수있다.

 

특정위치마다 key를 넣거나 선의 곡률을 지정한뒤 에니메이션 이나  시간에따른 작업 같은 여러상황에 사용할수있다

 

 

 

 

 

 

 

 

[SerializeField]

priavte 함수를 inspector 창에서 값을 변경할수 있다.

위의 TextArea의 최대줄수와 최소줄수 역시 설정가능

 

 

 

[Space]

사용자가 보기쉽게 중간중간 공간을 띄워줄수있다.

 

 

 

 

[Header]

 

헤더 이름으로 중간에 이름만 넣을수있다.

 

 

[Range]

숫자의최소 최대값을 설정할수있다. 

 

 

[TooltipAttribute]

마우스를 올렸을때 설명을 설정할수있다.

 

 

[HideInInspector]

public 함수를 인스펙터에서 숨길수 있다.

 

[HelpURL]

inspector의 ? 부분의 URL을 설정할수 있다.

 

 

 


 

'엔진 > 유니티' 카테고리의 다른 글

Unity Spline 기능 추가!  (1) 2023.06.01
Unity Simulator  (0) 2023.01.20
Unity ObjectPool Api  (0) 2022.11.02
unity Redis  (0) 2022.07.13
unity _Prefab Variants  (0) 2022.03.17
반응형

 

 

 

함수 포인터 는?

함수 포인터 는 함수에 포인터를 달아서 다른 함수들을 교체해가면서 사용할 수 있는 방법이다.

 

 그럼 어디 쓰이냐? 

간단하게 생각하면 스킬 변경이나 같은 값으로 다른 효과를 내고 싶을때 사용한다.

 

사용

{

 선언은 함수와 비슷해 [ 자료형 (* 함수명)(매개변수) ]처럼 사용한다.

 

	void (*Point_func)();
	void (*Point_func_mg)(int &a ,int &b);

 

void pointFuncTest1() {	printf("1번작동");}

 void pointFuncTest2() { printf("2번작동");}
    
    C->Point_func = pointFuncTest1;
	C->Point_func();
	C->Point_func = pointFuncTest2;
	C->Point_func();

	B->Point_func_mg = swap_reference;
	B->Point_func_mg(x, y); // x =10, y=5
	printf("\n\n\n%d , %d", x, y);

}

처럼 사용한다.

 

결과를 한번보자

{

 

 

 

}

 

처럼 작동한다.

 

또 함수포인터 를 매개변수로 받아 줄수 있는 방법도있다.

 

//선언
D3DXVECTOR3(*Shootting)(Ani_spriteActor _Bullet, D3DXVECTOR3 _BulletPos,int _speed);
void SETBulletTiype(  D3DXVECTOR3(_Funce(Ani_spriteActor _Bullet, D3DXVECTOR3 _BulletPos, int _speed))=Shutting_Under);
inline static D3DXVECTOR3 Shutting_Under(Ani_spriteActor _Bullet, D3DXVECTOR3 _BulletPos, int _speed);


//함수를 넣어주는 함수
void BulletBase::SETBulletTiype( D3DXVECTOR3(_Funce(Ani_spriteActor _Bullet, D3DXVECTOR3 _BulletPos, int _speed)))
{
      this->Shootting = _Funce;
}

넣어주는방법
this->SETBulletTiype(Shutting_Under);

 

 

 

'언어 > C++' 카테고리의 다른 글

cpp 전처리기  (0) 2023.09.05
c++ std::function 사용하기  (0) 2023.01.10
인라인 함수(Inline Function)  (0) 2021.06.15
네임스페이스  (9) 2021.05.18
bit연산! 또는 bit Flag  (0) 2021.05.05
반응형

 

인라임 함수가 뭘까?

 

 

 

일반함수 : 사용시 함수 호출

인라인 함수 : 컴파일러 수행 단계에서 이루어진다, - 컴파일러가 함수를 사용할때 코드를 복사해서 사용해

매크로 함수 : 선행처리기 수행 단계에서 이루어진다, - 또한 계산식이 다르고 복잡하여 힘들어 

 

함수 호출 과정이 없어서 속도가 조금더 빠르다

 

why?

왜 복사보다 호출이 느리지? 라고 생각할수있어

하지만 함수가 호출 되는 과정은 생각보다 복잡해

그렇기 때문에 간단한 식은 오히려 복사하는게 빠른거지

그래서 간단한 식을 인라인 함수로 사용하는거야

 

 

우선 인라인 함수의  기본적인 사용법은

inline 자료형 이름(매개변수){ 내용 } 이야

 //인라인함수
 inline int SUM_INLINE(int a, int b) {
	 return a + b;
 }

 int main()
 {

	 int INLINE_NUM = SUM_INLINE(5, 5);
	 std::cout << INLINE_NUM << std::endl;//10입니다.
  }

코드가 컴파일되면 

 

 //인라인함수
 inline int SUM_INLINE(int a, int b) {
	 return a + b;
 }

 int main()
 {

	 int INLINE_NUM = inline int SUM_INLINE(5, 5){ return 5 + 5 }
	 std::cout << INLINE_NUM << std::endl;//10입니다.
  }

이처럼 함수가 실행되는 부분에 복제되어 작동하지!

 

주의할점

하지만 인라인 함수를 사용하면 프로그램 속도는 빨라져도 남용하게 된다면

복제되는 것이기 때문에 프로그램의 크기가 커저버려

 

 

 

 

재미있는점은 컴파일러판단해서 인라인화를 안할수도 있고,

선언을 안해도 자동으로 인라인화를 하는 경우도있어

          visual studio 의 경우 구성속성 -> c/c++ -> 최적화 -> 인라인 함수 확장[...]

          에서 설정을 해줄수도 있어 (사용한함처럼) 기본값은 적합한 것 모두 확장이야.

 

 

'언어 > C++' 카테고리의 다른 글

c++ std::function 사용하기  (0) 2023.01.10
함수 포인터! (Function Pointer)!  (0) 2021.07.13
네임스페이스  (9) 2021.05.18
bit연산! 또는 bit Flag  (0) 2021.05.05
call by reference/call by value/call by address  (0) 2021.05.03

반응형

 

네임스페이스(namespace)를 알아보자!

 

네임스페이스를 모르더라도 C++ 공부를 하면서 이미 알고 사용하고 있어

std::cout 다들 많이 써봤지? 

 

            std                                 ::                                   cout

 (네임스페이스 이름) (스코프 연산자) (사용할 변수 또는 함수등)  

 

이러한 구조로 이루어 져있어서 스코프 연산자를 사용해 접근하여 사용해

 

그래서 이게 왜필요한데;;

 

 

그건 우리가 팀프로젝트나 다른 라이브러리를 추가할때 이름이 겹칠 확률이 늘어나

이러한 이름 충돌 문제를 네임스페이스로 해결할수 있는거지!

 

네임스페이스 안에는 여러가지를 선언하여 사용할수 있지.

사용 하는걸 한번보자!

 

<기본 예시+class>

 namespace TestCode { //선언

	 int testint; //변수
	 
     void testFunc() {//함수
		printf("My Namespace");
	 }
     
	class NamespaceClass//클래스
    {
    public:
    	void static classfunc() {}
 	};
	
 }
 
  namespace TestFunc { 
  	void testFunc(){}
  }
 
int main()
{
	TestCode::NamespaceClass::classfunc();
	TestCode::testint = 1;
    
     TestCode::testFunc();
     TestFunc::testFunc();

}

처럼 사용할수 있지!

 

 

 

과연 네임 스페이스 안에 네임스페이스를 선언하여 사용할수 있을까?

 

<중첩 네임스페이스>

 namespace TestCode {
	 namespace Names {
		 int b;
	 }
 }

int main()
{
	TestCode::Names::b = 0;
	std::cout << TestCode::Names::b;
}

이처럼 사용할수 있지

 

네임스페이스를 쓸때 전부 std:: 처럼 사용하기 싫지?

그럴때 맨위에 using namespace <이름> 을 사용하면 앞에 붙이지 않아도 사용할수 있지

<using>

 namespace TestCode {
	 namespace Names {
		 int b;
	 }
 }

int main()
{
	using namespace TestCode::Names;
	b = 0;
 }

 

 

그리고 이건 조금 중요해

 

 

<네임스페이스 함수 구현>

namespace TestCode {
	 void TestFunc();
 }
 
 using namespace TestCode;
 void TestCode::TestFunc() { printf("a"); };
int main()
{
	TestFunc();
}

함수를 구현할때는 using을 써도 네임스페이스 이름을 붙여서 사용해야해 

 

 

그리고 우리가 사용하는 전역변수와 함수는 암시적으로 전역 네임스페이스에 추가되지

전역 네임스페이스를 한정할때는 :: (함수이름) 처럼 이름없이 사용하면 구분해줄수 있지!

 

<전역 네임스페이스 코드>

int a =10; 
 
int main()
{
int a =0;

  ::a //전역변수
  a //지역변수

}

이렇게 말이야

::a 를 출력하면 10 이 나오고 a 를출력하면 0이 나오는 거야!

 

 

 

 

 

'언어 > C++' 카테고리의 다른 글

c++ std::function 사용하기  (0) 2023.01.10
함수 포인터! (Function Pointer)!  (0) 2021.07.13
인라인 함수(Inline Function)  (0) 2021.06.15
bit연산! 또는 bit Flag  (0) 2021.05.05
call by reference/call by value/call by address  (0) 2021.05.03
반응형

오버로딩과 오버라이딩

 

오버로딩(overloading) 은 같은이름의 함수를 선언해두고 매개변수 변경및 추가하여 사용하는 기법이야.

	void overloading(int a);
	void overloading(int a,int b);
	 void overloading(int a,char b);

이처럼 같은 이름으로 선언하고 매개변수를 바꿔 사용하지.

 

이게 왜? 필요한데 overloading2 나 3으로 이름 바꿔 쓰는것과 같지 않아? 

 

그렇게도 사용할수 있지만

사용할때 하나의 이름으로  간단하게 사용하는게 장점이야!

 

실제로 사용할때는 2나 3이 아닌 이름을 붙여 사용하게 될텐데

overloading_int(A),overloading_string(B), 으로 사용하는것보다

overloading(A),overloading(B) 동일된 형태로 사용하는게 편하다 이거야

 

 

오버라이딩(overriding) 은 부모 클레스에서 사용된 메서드를 재정의 해서 사용하는거지

 

하지만 동작만을 재정의 하는것이라 매개변수와 매서드의 이름은 부모 클레스와 같아야해

코드로 보자!

class MyClass
{
public:
	virtual void A();
};

class MyClass1 :MyClass 
{
public:
	 void A()override; 
};

void MyClass::A(){
    std::cout<<"MyClass";
 }

 void MyClass1::A(){ 
   std::cout<<"MyClass1";
 }

이처럼  같은 A 라는 메서드에 내용을 바꿔 사용할수있는거야

 

'언어' 카테고리의 다른 글

그냥 내가 자주 쓰던 visual studio 단축키  (0) 2024.11.20
증감연산자  (0) 2021.05.31
메서드 와 함수가 다른가?  (0) 2021.05.15
반응형

 

메서드는 함수에 포함되어 있는 계념이다.

class A
{
	void M(){std::cout << "메소드";}
};

void F(){std::cout << "함수";}

class 안에 있는걸 메소드 라고 칭해

 

다른거 라고 하면 함수는 독립적이고

메소드는 class 에 종속적인것 정도야

'언어' 카테고리의 다른 글

그냥 내가 자주 쓰던 visual studio 단축키  (0) 2024.11.20
증감연산자  (0) 2021.05.31
오버로딩과 오버라이딩  (0) 2021.05.15

+ Recent posts