반응형

reference 변수

  • 기존 메모리(변수)에 새로운 이름(alias)을 부여하는 것
  • 레퍼런스 변수는 메모리를 할당하지 않는가?
    • 단순한 코드의 경우 메모리를 사용하지 않음
    • 복잡한 경우(함수 인자로 사용되거나...) 상황에 따라 내부적으로 포인터를 사용
    • C++ 표준 문서는 레퍼런스의 동작만 정의 할뿐, 구현은 정의하고 있지 않음
  • 반드시 초기화 되어야 함
int main()
{
    int n = 10; // 일반 변수
    int* p = &n; // 포인터 변수

    int& r = n; // 레퍼런스 변수
}

 

Call By Reference

  • 함수 인자의 값을 변경하게 하려면 포인터 또는 레퍼런스를 사용
void Inc1(int n) { ++n; }
void Inc2(int* p) { ++(*p); }
void Inc3(int& r) { ++r; }

int main()
{
    int a = 10, b = 10, c = 10;

    Inc1(a); // call by value
    Inc2(&b); // call by pointer
    Inc3(c); // call by reference

    std::cout << a << std::endl; // 10
    std::cout << a << std::endl; // 11
    std::cout << a << std::endl; // 11
}
int main()
{
    int n = 0;
    scanf("%d", &n); // 인자를 포인터로 전달(call by pointer)
    std::cin >> n; // 인자를 레퍼런스로 전달(call by reference)
}

 

Call by const Reference

  • 함수의 인자로 사용한 변수의 값을 변경되지 않게 하려면
    • Call by value : 동일한 객체가 메모리에 중복 생성됨
    • Const Reference : 메모리 중복 생성이 되지 않고 생성자, 소멸자의 호출을 차단 할 수 있음
  • 권장 사항
    • primitive type : Call by value // C++에서 기본 제공 타입
    • user defined type : Const reference // 사용자 정의 타입
struct Data // user defined type
{
    char data[1000];
};

void Foo1(int a) {} // primitive type(call by value)

void Foo2(const Data& a) {} // user defined type(call by const reference)

int main()
{
    Data x;

    Foo1(1);
    Foo2(x);
}

 

Reference return

  •  함수 인자
    • call by value : 복사본 생성
    • call by reference : 복사본 미생성
  • 함수 리턴
    • return by value : 복사본(임시 객체)을 리턴(등호 왼쪽에 올 수 없음, lvalue가 될 수 없음)
    • return by reference : 원본 리턴(지역 변수는 참조로 리턴하면 안됨)
struct Point
{
    int x, y;
};

void F1(Point p) {} // 복사본 생성
void F2(Point& r) {} // 복사본 생성X

Point pt;
Point& Goo() { return pt; }

int main()
{
    Goo().x = 20;

    std::cout << pt.x << std::endl; // 20
}

 

rvalue reference

  • lvalue vs rvalue
    • rvalue : 등호(=)의 오른쪽에만 올 수 있는 것
    • lvalue : 등호(=)의 오른쪽과 왼쪽에 모두 올 수 있는 것
  • reference 규칙
    • lvalue reference : lvalue만 가리킬 수 있음
    • const lvalue reference : lvalue, rvalue  모두 가리킬 수 있음
    • rvalue reference : rvalue만 가리킬 수 있음
  • rvalue reference 활용 분야
    • move semantics
    • perfect forwarding
int main()
{
    int v1 = 0, v2 = 0;

    v1 = 10; // ok
    10 = v1; // error
    v2 = v1;

    // lvalue reference
    int& r1 = v1; // ok
    int& r2 = 10; // error

    // const lvalue reference
    const int& r3 = v1; // ok
    const int& r4 = 10; // ok

    // rvalue reference
    int&& r5 = v1; // error
    int&& r6 = 10; // ok

}
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ OOP(Object Oriented Programming)  (0) 2019.05.06
C++ Explicit Casting  (0) 2019.05.06
C++ new  (0) 2019.05.06
C++ 함수 특징 #2  (0) 2019.05.05
C++ 함수 특징 #1  (0) 2019.05.05

반응형

동적 메모리 할당

  • 동적 메모리 할당이 필요한 이유
    • 실행 시간에 결정된 크기 만큼의 메모리를 할당하고 싶을때
    • 자동으로 메모리를 해지 하지 말고, 사용자가 원할때 명시적인 해제를 위해
  • C 언어
    • malloc으로 할당하고 free로 해지
    • malloc 사용시 주소를 원하는 타입으로 캐스팅 필요
  • C++ 언어
    • new로 할당하고 delete로 해지
    • 원하는 타입의 주소를 리턴하므로 캐스팅 불필요
    • new 배열로 할당한 경우 delete[]로 해지(배열을 delete로 해지 시 동작에 대해서는 알수없음 undefined)
    • malloc은 생성하지 호출하지 않지만 new는 생성자를 호출함
int main()
{
    int cnt = 0;

    std::cout << "학생수 ? >>";
    std::cin >> cnt;

    // 학생수 만큼의 메모리 할당이 필요하다.
    int score[cnt]; // g++ ok, vc++ error

    // C Style
    int* p1 = (int*)malloc(sizeof(int) * 10);
    free(p1);

    // C++ Style
    int* p2 = new int; // int 사이즈 할당(4Byte)
    delete p2; // 

    int* p3 = new int[10]; // int 사이즈 배열 할당(4Byte * 10)
    delete[] p3; // new Array 타입으로 생성 시 delete[]로 해지
}
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ Explicit Casting  (0) 2019.05.06
C++ reference 변수  (0) 2019.05.06
C++ 함수 특징 #2  (0) 2019.05.05
C++ 함수 특징 #1  (0) 2019.05.05
C++ 제어문(if, switch)과 반복문(for)  (0) 2019.01.16

반응형

Delete Function(명시적 삭제)

  • 특정 타입의 함수를 제공하지 않을 경우 인자 형변환으로 호환 가능한 함수를 호출함
  • 특정 타입의 함수를 선언만 하면 해당 함 수 사용시 링크 에러 발생
  • 해당 함수를 명시적 삭제(delete)하면 함수 사용시 컴파일 에러 발생
template<typename T>
T Square(T a)
{
    return a * a;
}

void Foo(int a) {}
void Foo(double a) = delete; // double 타입 파라미터 Foo 함수를 명시적 삭제

double Square(double) = delete; // 템플릿에서 double 타입만 제공하지 싶지 않을때

int main()
{
	Foo(3.4); // 명시적 삭제하지 않았을 경우 형변환 되어 Foo(int a) 함수가 실행됨
    Foo(3.4); // 명시적 삭제 상태일때는 컴파일 에러 발생(deleted function error)
    Square(3.4); // 템플릿 함수이지만 double 타입 함수는 삭제됨 에러 발생
}

 

Suffix Return Type

  • C++11 이상
  • 리턴 타입을 함수() 뒤에 적는 표기법
  • suffix return or trailing return 이라고 함
  • 원래의 리턴 값 위치에는 auto를 표기
  • 람다 표현식이나 함수 템플릿을 만들때 많이 사용
template<typename T, typename U>
auto Add(T a, U b) -> decltype(a + b) // 리턴타입이 함수 정의부 이후에 결정이 필요할 경우
{
    return a + b;
}

int main()
{
    Add(1, 2.2); // 템플릿 함수를 호출 시 인자 타입이 상이할 경우 템
}

 

Constexpr Function

  • C++11 이상
  • 함수 인자로 컴파일 시간에 결정될 수 있는 상수 값이 전달 될 경우 컴파일 시간에 연산을 수행하는 함수
  • 함수 인자가 컴파일 시간에 결정되는 상수가 아닌 경우 일반 함수와 동일하게 동작함
  • 함수 호출 구문을 배열의 크기나 템플릿 인자등 컴파일 시간 상수가 필요한 곳에서 사용 가능
  • 라이브러리 설계에서 많이 사용됨
constexpr int Add(int a, int b)
{
    return a + b;
}

int main()
{
    int n2 = Add(1, 2);
}
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ reference 변수  (0) 2019.05.06
C++ new  (0) 2019.05.06
C++ 함수 특징 #1  (0) 2019.05.05
C++ 제어문(if, switch)과 반복문(for)  (0) 2019.01.16
C++ 변수의 특징(variable) #2  (0) 2019.01.15

반응형

Default Parameters

  • 함수 호출시 인자 전달을 생략하면 기본값이 적용된다.
  • 주의 사항
    • 함수의 마지막 파라미터부터 역순으로만 지정 가능
    • 헤더파일로 분리된 함수의 경우 선언에만 기본값을 정의 한다.(구현부
// 선언부, 구현부 분리 시 선언부에만 기본 파라미터 정의
void func1(int x, int y = 0, int z = 0);

// 구현부 가독성을 위해서 필요시 주석으로 표현
void func1(int x, int y /*= 0 */, int z /*= 0 */)
{
}

int main()
{
    func1(1, 1, 1); // 파라미터 기본값 사용 안함
    func1(1, 1); // 파라미터 기본값 z 사용
    func1(1); // 파라미터 기본값 y, z 사용
}

 

Function Overloading

  • 인자의 개수나 타입이 다르면 동일 이름의 함수를 2개 이상 만들 수 있음
  • 사용자 입장에서 일관된 함수를 제공 가능
  • 주의사항
    • 디폴트 값이 있는 함수에서는 주의 필요
    • 리턴 타임만 다른 경우는 오버로딩 불가
int square(int a)
{
    return a * a;
}

double square(double a)
{
    return a * a;
}

int main()
{
    square(1); // 정수 파라미터 함수 호출
    square(1.1); // 실수 파라미터 함수 호출
}

 

Inline Function

  • 함수 호출 시 실제 함수로 이동하지 않고 함수의 기계어 코드로 치환함
    • 장점 : 빠름
    • 단점 : 치환되는 함수가 클 경우 목적코드(실행파일)이 커질 수 있음
  • 인라인 상태 확인 방법
    • cl : 이름.cpp /FAs /Ob1 -> 이름.asm
    • g++ : 이름.cpp -S -02 -> 이름.s
  • 헤더파일에 구현부를 제공하여야 함
int add1(int a, int b)
{
    return a + b;
}

inline int add2(int a, int b)
{
    return a + b;
}

int main()
{
    int a = 1, b = 2;
    int n1 = add1(a, b); // 어샘블리어로 변환 시 함수 호출
    int n2 = add2(a, b); // 어샘블리어로 변환 시 함수자체로 치환
}

 

Template Function

  • 실제 함수가 아닌 함수를 만들어 내는 틀(template)
  • 사용자가 템플릿을 호출하는 코드를 보고 컴파일러가 필요한 타입의 함수를 생성
  • 템플릿 인자 표기는 "typename" 또는 "class"를 사용
  • 함수 뿐 아니라 구조체(or 클래스)도 템플릿으로 만들수 있음
  • 잘못 사용시 코드 메모리가 커질 수 있음(Code Bloat 현상)
// 함수를 만들어 내는 틀
template<typename T>
T square(T a)
{
    return a * a;
}

int main()
{
    square<int>(3); // int square(int) 함수 생성
    square<double>(3.3); // double square(double) 함수 생성
    
    square(3); // 생략시 타입 추론으로 int square(int) 함수 생성
    square(3.3); // 생략시 타입 추론으로 double square(double) 함수 생성
}
template<typename T>
struct Point
{
    T x;
    T y;
};


int main()
{
    Point<int> p1; // 멤버가 int인 Point 구조체 생성
    p1.x = 3;

    Point<double> p2; // 멤버가 double인 Point 구조체 생성
    p2.x = 3.3;
}
반응형

'프로그래밍 언어 > C++' 카테고리의 다른 글

C++ new  (0) 2019.05.06
C++ 함수 특징 #2  (0) 2019.05.05
C++ 제어문(if, switch)과 반복문(for)  (0) 2019.01.16
C++ 변수의 특징(variable) #2  (0) 2019.01.15
C++ 변수의 특징(variable) #1  (0) 2019.01.14

반응형
폴더블 폰을 접었을 때 앱은 작은 화면(Cover Display)에서, 펼치면 큰 화면(Main Display)에서 실행 됩니다.

이 때, 안드로이드 폴더블 폰에서는 Configuration에 대한 변경이 발생되며, 해당 변경으로 인해 앱의 상태가 변하게 됩니다.

기본적으로 아무런 조치를 하지 않은 앱은 activity가 종료가 되었다가 다시 생성되게 되며, 이 경우 사용자는 현재 화면에 대한 정보를 잃게 됩니다.

즉, folding / unfolding 시 발생되는 이벤트는  smallestScreenSize, screenSize, screenLayout 이며, 이 이벤트들에 대한 별도 처리를 하지 않은 앱에서는 activity가 종료되었다 재실행되는 현상을 겪게 됩니다.

따라서, 사용자가 폴더블 폰에서 앱의 연속성을 갖고 사용할 수 있도록 하기 위해, 앱의 activity를 확인하여 configuration 변경에 따른 처리를 해 주셔야 합니다.
 
특히, 원스토어 결제화면이 노출되어 있는 상황에서 configuration 변경이 발생하고, 앱이 이에 대한 적절한 처리가 되어 있지 않을 경우 사용자는 결제완료 후 아이템을 받지 못하는 상황이 발생되므로, 앱 연속성(App continuity) 제공은 필수입니다.

제공 방법은 두 가지가 있는데, 원스토어 결제 화면을 호출하는 activity에서 onSaveInstancesState 방식 보다 AndroidManifest의 configChanges를 이용하여 activity가 종료되는 것을 막는 방식으로 적용해 주시기 바랍니다.
 
자세한 사항은 폴더블 폰이 최초 출시될 것으로 예상되는 삼성전자의 아래 Technical Document를 참고하시기 바랍니다.









출처 : 원스토어 공지사항(https://dev.onestore.co.kr/devpoc/support/news/noticeView.omp?noticeId=31899)


반응형

반응형

Gradle 빌드시에 이런 에러가 뜬다면

com.crashlytics.tools.gradle.CrashlyticsPlugin.findObfuscationTransformTask


fabric 1.28.0 버그인것 같다.
아래와 같이 최신버전을 사용하도록 해놓았다면
classpath 'io.fabric.tools:gradle:1.+'

아래 버전인 1.27.1로 명시해서 사용하면 해결된다.

classpath 'io.fabric.tools:gradle:1.27.1'


반응형

반응형

타임존 옵셋으로 호출시 정상 동작 하지만

SELECT CONVERT_TZ('2008-05-15 12:00:00','+00:00','+10:00');


아래와 같이 타임존으로 호출시 에러가 난다면 MariaDB or MySQL 기본 타임존 설정 후 Timezone 테이블의 데이터 셋팅이 필요하다.

SELECT CONVERT_TZ('2008-05-15 12:00:00','UTC','Asia/Seoul');


https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html


Linux 계열의 OS는 가이드에 나와있는 시스템 타임존 정보를 이용하여 셋팅이 가능하고

Windows OS라면 별도의 SQL 파일을 받아서 교체하는 방식으로 적용이 가능한데, 아래의 URL에서

POSIX 표준(timezone_2018i_posix.zip)으로 받으면 된다.


https://dev.mysql.com/downloads/timezones.html



반응형

반응형

namespace ENamedThreads

{
    enum Type
    {
        UnusedAnchor                     = -1,
        RHIThread,
        AudioThread,
        GameThread,
        ActualRenderingThread            = GameThread + 1,
        AnyThread                        = 0xff,
        MainQueue                        = 0x000,
        LocalQueue                       = 0x100,
        NumQueues                        = 2,
        ThreadIndexMask                  = 0xff,
        QueueIndexMask                   = 0x100,
        QueueIndexShift                  = 8,
        NormalTaskPriority               = 0x000,
        HighTaskPriority                 = 0x200,
        NumTaskPriorities                = 2,
        TaskPriorityMask                 = 0x200,
        TaskPriorityShift                = 9,
        NormalThreadPriority             = 0x000,
        HighThreadPriority               = 0x400,
        BackgroundThreadPriority         = 0x800,
        NumThreadPriorities              = 3,
        ThreadPriorityMask               = 0xC00,
        ThreadPriorityShift              = 10,
        GameThread_Local                 = GameThread | LocalQueue,
        ActualRenderingThread_Local      = ActualRenderingThread | LocalQueue,
        AnyHiPriThreadNormalTask         = AnyThread | HighThreadPriority | NormalTaskPriority,
        AnyHiPriThreadHiPriTask          = AnyThread | HighThreadPriority | HighTaskPriority,
        AnyNormalThreadNormalTask        = AnyThread | NormalThreadPriority | NormalTaskPriority,
        AnyNormalThreadHiPriTask         = AnyThread | NormalThreadPriority | HighTaskPriority,
        AnyBackgroundThreadNormalTask    = AnyThread | BackgroundThreadPriority | NormalTaskPriority,
        AnyBackgroundHiPriTask           = AnyThread | BackgroundThreadPriority | HighTaskPriority,
    }
}


반응형

+ Recent posts