Embedded/QT

Qt - Signal & Slot (Lambda) (함수 포인터)

잇(IT) 2025. 11. 10. 00:32

- Lambda : 람다(lambd)는 이름 없는 함수를 그 자리에서 바로 정의해서 사용하는 기능이다.

 

  • [] : 캡처 절 - 외부 변수를 람다 안에서 어떻게 사용할지 지정
  • () : 매개변수 - 일반 함수의 파라미터와 동일
  • {} : 함수 본문 - 실행할 코드


- 참조형(reference)은 C++에서 지원하는 세번째 변수 타입이다. 참조형은 다른 객체 또는 값의 별칭으로 사용되는 C++ 타입이다.

 

1. non-const 값 참조형

2. const 값 참조형

3. r-value 참조형

C++는 위 세가지 종류의 참조형을 지원한다.

 

int value = 5;
int& ref = value;

위 코드에서 &는 주소(address)를 의미하지 않고 참조(reference)를 의미한다.

 



C++은 메모리를 직접 관리한다.

// C++ - 스택에 생성
QLabel label1;                 // 스택
label1.setText("Hello");       // . 사용

// C++ - 힙에 생성
QLabel *label2 = new QLabel(); // 힙
label2->setText("Hello");      // -> 사용
delete label2;                 // 직접 메모리 해제!

C++의 &는 문맥에 따라 4가지 다른 의미로 쓰인다.

 

1. 주소 연산자 (Address-of)

int x = 10;
int* ptr = &x;  // x의 주소를 가져옴
cout << &x;     // 주소 출력: 0x7fff1234

 

2. 참조 타입 선언

int x = 10;
int& ref = x;   // ref는 x의 별명 (참조 변수)

void func(int& param);  // 참조로 받는 함수

 

3. 비트 AND 연산자

int a = 5;   // 0101
int b = 3;   // 0011
int c = a & b;  // 0001 = 1

 

4. 멤버 함수 포인터

&QSlider::valueChanged  // QSlider 클래스의 멤버 함수 포인터
&Widget::changeText     // Widget 클래스의 멤버 함수 포인터

- 상황별 & 사용

 

1. 변수 앞의 &

int x = 10;

// 선언 시 → 참조 타입
int& ref = x;         // ref는 x의 별명

// 사용 시 → 주소 연산자
int* ptr = &x;        // x의 주소
cout << &x;           // 주소 출력

// 람다 캡처 → 참조로 캡처
auto lambda = [&x](){  // x를 참조로 캡처
    x = 20;
};

 

2. 클래스::함수 앞의 &

// 멤버 함수 포인터
connect(ui->button, &QPushButton::clicked,    // 함수 포인터
        this, &Widget::changeText);           // 함수 포인터

 

* Callback 즉, 나중에 실행할 함수를 등록하기 위해서 &(함수명)을 사용한다.

connect(ui->button, &QPushButton::clicked,
        this, &Widget::changeText);

// 이게 하는 일:
// 1. changeText 함수의 주소를 저장해둠
// 2. 버튼 클릭 시 저장된 주소로 함수 호출
// 3. 즉, "나중에 호출할 함수"를 등록하는 것

 

C++에서 멤버 함수는 일반 함수와 다르게 취급되기 때문에 &로 호출해야 한다.

// 일반 함수
void func() {}
func;      // 자동으로 포인터로 변환
&func;     // 명시적 포인터

// 멤버 함수
class MyClass {
    void method() {}
};

MyClass::method;   // ❌ 이건 의미 없음 (객체 없이는 호출 불가)
&MyClass::method;  // ✅ 포인터로 만들 때만 의미 있음

 

void playSound() { cout << "Beep!" << endl; }
void showMessage() { cout << "Message!" << endl; }

// 사용자 설정에 따라 다른 함수 실행
void (*notification)();  // 함수 포인터

if (userPreference == "sound") {
    notification = &playSound;  // 소리 함수 선택
} else {
    notification = &showMessage;  // 메시지 함수 선택
}

notification();  // 선택된 함수 실행
728x90

'Embedded > QT' 카테고리의 다른 글

Qt - Dialogs  (0) 2025.11.13
Qt - 프로젝트 생성 관련 및 기본 참고 내용  (0) 2025.11.09