반응형

n Nulnud-coalescing operator  

   NULL 병합 연산자

   ??  , ??=

 

특징  : 오른쪽 결합

 

 

null 병합 연산자 라고 부르는 ?? 연산자는

null이 아닌 경우 왼쪽 값을 반환하고 null인 경우 오른쪽 값을 확인 하고 반환하는 연산자다.

만약 왼쪽값이 null 이 아닌경우  오른쪽 값을 확인하지 않는다.

 

 

            int? a = 17;
            int b = 15;
            int? c = null;
            
            Console.WriteLine(a ?? b); // Output :17,  왼쪽값이 null이 아니기때문에 17.
            Console.WriteLine(c ?? b); //Output :15,   왼쪽(null)->오른쪽 값을 확인해 본뒤 b반환
            Console.WriteLine(c ?? c); //Output : ,    둘다 null 이기 때문에 null
            //Console.WriteLine(b ?? c); Err ?? 연산자는 int 및 int? 형식의 피연산자에 적용할수 없다

int? 가 뭔지 모르겠다면 이 블로그의 Nullable 을 보고오는게 좋다.

https://programing-note.tistory.com/entry/c-Nullabe-%EA%B0%92-%ED%98%95%EC%8B%9D

 

 

c#8.0 이상에서 사용할수 있는null 병합 할당 연산자(??=)는  null 병합 연산자 와 비슷하다. 

  왼쪽 값이 null인경우 우측 값을 할당시켜준다. 물론 좌측값이 null이 아닌경우 우측값을 확인하지 않는다.

            int? a = null;
            int b = 15;
            a ??= b; 좌측값이 null 이기때문에 우측b 값을 확인후 a값에 대입한다.
            Console.WriteLine(a); // 15

 이 연산자는 가끔 유용하게 쓰일수있다.

 

 

예시로는 null인지 확인하는 구문을 간단하게 만들수있다.

            if (isNull is null)
            {
                isNull = 10;
            }

이러한 연산을

            isNull ??= 10;

이렇게 간단하게 쓸수 있다.

 

 

 

Null 조건부 연산자 ?. 및 ?[]

C# 6이상부터 사용할수 있는 연산자다.

이는 Null이 아닌것으로 평가되었을 때만 멤버 엑세스 ?. ,또는 요소 엑세스?[], 연산을 피연산자 에게 적용하고

 Null 인것으로 평가되었을경우 Null을 반환한다.

 

  조건부 멤버나 요소 액세스 작업에서 null 을 반환하면 나머지 체인은 실행되지 않는다.

 

A?.B?.c

위 와 같을때 A가 Null일때 B는 평가되지 않는다.

이와 같이 A또는 B가 Null일경우 C는 평가되지 않는다.

 

아래 윈도우 예제 코드를 보면 쉽게 이해할수 있다.

            
            double SumNumbers(List<double[]> setsOfNumbers, int indexOfSetToSum)
            {
                return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
            }

            var sum1 = SumNumbers(null, 0);
            Console.WriteLine(sum1);  // output: NaN
            var numberSets = new List<double[]>
                 {
                     new[] { 1.0, 2.0, 3.0 },
                     null
                  };

            var sum2 = SumNumbers(numberSets, 0);
            Console.WriteLine(sum2);  // output: 6

            var sum3 = SumNumbers(numberSets, 1);
            Console.WriteLine(sum3);  // output: NaN
            
                //var sum4 = SumNumbers(numberSets, 2); 예외발생

위 코드처럼 코드를 짤때 Null 이 들어가 오류가 생기는 상황을 간단하게 처리할수있다.

 

 

주의 할점

a.x 또는 a[x] 가 예외를 던지면 a?.x 또는 a?[x] 는 null이 아닌 예외를 던진다.

위의 예제 마지막줄 처럼 x가 a의 배열의 크기 보다 큰경우 a?[x] 는 IndexOutOFRangeExcption 예외를 던진다.

 

참고

?. 연산자는 왼쪽 연산자를 한번만 계산하고 null이 아닌것을 확인한 후에는 null로 변경할수 없도록 보장한다.

 

또한 스레드를 사용할때도 안전하게 호출할수 있다.

스레드를 호출할때 null인지 확인하고 호출하는 것을

var handler = this.PropertyChanged;
if (handler != null)
{
    handler(…);
}
 
 를 아래처럼 변경할수있다

PropertyChanged?.Invoke(…)

위 상황처럼 간단하게  사용할수있다

 

참고 링크 :docs.microsoft.com;

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

c# Nullable값 형식  (0) 2022.03.24
c# Tuple  (0) 2022.03.23
C# Ref,Out 키워드 와 in 키워드  (0) 2022.03.16
반응형

Nullable 값 형식 : 기본 값 형식의 모든 값과 추가 null 값을 나타낼수 있다.

 

예시로 

 bool 변수는 true false 두가지를 나타내는게 가능하고 Null은 표현불가능하다.

하지만 null 이 필요할수 있기때문에  자료형 뒤에 ? 를 붙이면 null 표현이 가능해진다.

 

사용 방식 

값 타입 자료형 ? 변수명

    int? a = 10;
    int? b = null;
   // int c = null;  null을 허용하지 않는 값 형식
   
   class A{}
  // A a?; null 을 허용하지 않는  값 형식 이여야 한다.
  
  int?[] arr = new int?[10];
  //배열 선언방법

 

 

Nullable 값 형식에서 기본 형식으로 변환 

   int? a = 10;
   int b = 0;
   b = a ?? -1;
   // a가 null 이면 -1이 들어가고  null이 아닐경우 a값이 그대로 들어가 10이 들어간다.

 

?? 연산자는 왼쪽 값이 null 이면  오른쪽 값을 사용하고 null이 아닐경우 왼쪽 값을 사용하는 

일종의 null 을 검사하는 연산자다. 

 

 

 

 

 

is

is 연산자로는 Nullable 형식인지 아닌지 구분 불가하다

마소 예제코드

int? a = 1;
int  b = 2;

if ( a is int )
{
  Console.WriteLine(int? instance is compatible with int);
}
if (b is int?)
{
    Console.WriteLine("int instance is compatible with int?");
}

// Output:
// int? instance is compatible with int
// int instance is compatible with int?

 

 

 

GetType 

Object.GetType은 Null 허용값 형식의 boxing으로 기본형식 값의 boxing과 동일하게 나온다.

GetType은 기본형식 Type 인스턴스를 반환한다.

int? a = 17;
Type typeOfA = a.GetType();
Console.WriteLine(typeOfA.FullName);
// Output:
// System.Int32

 

그럼으로 아래 코드 처럼 구분할수 있다

마소코드

Console.WriteLine($"int? is {(IsNullable(typeof(int?)) ? "nullable" : "non nullable")} value type");
Console.WriteLine($"int is {(IsNullable(typeof(int)) ? "nullable" : "non-nullable")} value type");

bool IsNullable(Type type) => Nullable.GetUnderlyingType(type) != null;

// Output:
// int? is nullable value type
// int is non-nullable value type

 

 

 

참고 링크 :docs.microsoft.com;

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

c# ?? 연산자 (Null 병합 연산자)  (0) 2022.07.12
c# Tuple  (0) 2022.03.23
C# Ref,Out 키워드 와 in 키워드  (0) 2022.03.16
반응형

c# 튜플 : 간단한 데이터 구조로 여러 데이터 요소를 그룹화 할수있다.

 

튜플 변수 선언

(원하는 자료형 , 원하는 자료형 , ... ) 변수명;

// 선언과 동시에 초기화
(double,int) t = ( 1.1 , 3 );
 t.Item1 = 10;

(string name , int age) t2;
t2 = (name: "Mok", age: 5);
t2.age = 20;

이런식으로 간단하게 그룹화 할수있다

또한 튜플은 함수의 반환형식 에서도 사용할수 있다.

 

 

튜플 함수 사용

(원하는 자료형 , 원하는 자료형 , ... ) 함수명 (매개변수s..) { 내부구현...  retrun(반환값,...) };

  
   (int min, int max) FindMinMax(int[] input)
        {
         //... 내부구현
            return (min, max);
        }

위 함수처럼 자료형 클래스 말고도 묶어서 사용이 가능하다.

 

 

c# 에서 제공한 튜플의 사용 사례를 보면 더욱 쉽게 알수있다.

       //마소 c# 튜플 사용 사례
       var ys = new[] { -9, 0, 67, 100 };
        var (minimum, maximum) = FindMinMax(ys);
        // Output:
        // Limits of [-9 0 67 100] are -9 and 100

        (int min, int max) FindMinMax(int[] input)
        {
            if (input is null || input.Length == 0)
            {
            }

            var min = int.MaxValue;
            var max = int.MinValue;
            foreach (var i in input)
            {
                if (i < min)
                {
                    min = i;
                }
                if (i > max)
                {
                    max = i;
                }
            }
            return (min, max);
        }

위 사용 사례에서 보이는것 처럼 minimum 과 maximum 을 따로 구하지 않고 한번의 묶음으로 처리하여

하나의 함수로 처리하는것을 볼수있다.

 

 

또다른 사용 예시로는 비교문에서 알수있다.

//튜플 비교문


(int a, byte b) left = (5, 10);
(long a, int b) right = (5, 10);
Console.WriteLine(left == right);  // output: True
Console.WriteLine(left != right);  // output: False

var t1 = (A: 5, B: 10);
var t2 = (B: 5, A: 10);
Console.WriteLine(t1 == t2);  // output: True
Console.WriteLine(t1 != t2);  // output: False

보이는것 처럼 두개의 묶음으로 비교하여 비교문을 줄일수 있다.

 

 

튜플은  Dictionary 에서도 사용이 가능하다.

var limitsLookup = new Dictionary<int, (int Min, int Max)>()
{
    [2] = (4, 10),
    [4] = (10, 20),
    [6] = (0, 23)
};

if (limitsLookup.TryGetValue(4, out (int Min, int Max) limits))
{
    Console.WriteLine($"Found limits: min is {limits.Min}, max is {limits.Max}");
}
// Output:
// Found limits: min is 10, max is 20

이처럼 쉽게 저장하고 사용하는것을 볼수있다.

 

 

참고

 1. 지금 사용한 튜플 형식사용은 기존 Tuple class 와는 다르다.

    ㄴ 지금 사용한 형식은 System.ValueTuple 이고 Tuple class는 System.Tuple 이다.

 2.  System.ValueTuple 형식은 데이터 멤버는 필드이다.

 2.1  System.Tuple 형식은 데이터 멤버는 속성이다.

 

3. anonymous type 과 비교도 가능하다.

var apple = new { Item = "apples", Price = 1.35 };
(string,double) appe = ( "apples", 1.35 );

if(appe == appe)
{
Console.WriteLine("true"); //true
}

 

 

익명 타입, 튜플, vlaueTuple 들의 주요 차이점은 다음과 같다

이름 액세스 한정자 형식 사용자 지정 멤버 이름 분해 지원 식트리 지원
anonymous type internal o x o
Tuple public x x o
ValueTuple public o o x

 

참고자료 : docs.microsoft.com

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

c# ?? 연산자 (Null 병합 연산자)  (0) 2022.07.12
c# Nullable값 형식  (0) 2022.03.24
C# Ref,Out 키워드 와 in 키워드  (0) 2022.03.16
반응형

 

 

 

2018버전부터 Prefab Variants 라는것을 지원한다.

Prefab Variants 는 프리펩의 자식 계념이라 생각하면 쉽다.

 

왼쪽이 Variants  ,오른쪽이 Original

 

아래 그림처럼 기존 프리팹을 바꿔서 Original 프리팹을 재생성 하게되었을때 

 

 

 

 

 

 

 

 

두개로 나뉘어버린 프리팹에 같은걸 추가하고 싶을땐

둘다 다시작업을 해주는 경우가 생긴다

이런경우 Variants 프리팹을 사용하면

 

 

아래 사진처럼 부모 프리팹을 수정하면 자식 프리팹도 수정이 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

왼쪽이 기존 프리팹 예시이고 오른쪽이 variants 예시다.

프리팹을 새로 만든후, 붉은 네모를 원본에 넣었을때 아래 예시처럼 작동한다.

 

 

 

 

 

 

 

 

 

 

 

 

모두 붉은 박스를 넣어주려고 할때

왼쪽이미지 처럼 복사 하여 생성한 프리팹은 붉은 박스를 전부 넣어주는 시간이 들어간다.

하지만 프리팹을 부모로 두고 variants로 작업할경우 쉽게 변형 시키고 추가 할수 있다.

 

 

 

 

 

 

variant 생성방법은

 

아래 사진처럼     Original 프리팹 우클릭->Create->Prefab Variant 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

또는  Hierarchy 창에서 오리지널 프리팹을 Project 창으로 드래그시 

 어떤식으로 저장할지 Create Prefab 창이 뜬다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참고한 링크 :https://www.youtube.com/watch?v=pv30sE_Vsis

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

ChatGPT-Unity에서-사용하기  (5) 2023.03.22
Unity Simulator  (0) 2023.01.20
Unity ObjectPool Api  (0) 2022.11.02
unity Redis  (0) 2022.07.13
Unity Inspector 창 정리  (2) 2022.02.24
반응형

 

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을 설정할수 있다.

 

 

 


 

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

ChatGPT-Unity에서-사용하기  (5) 2023.03.22
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

+ Recent posts