본문 바로가기
0805 QT C++ 다양한 ui, 시그널 • QT 시작qt console app 으로 프로젝트 시작cmake 빌드 -프로젝트 생성해서 디버그 찍어보기#include int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); qDebug("Hello Qt"); qDebug()  - 온클릭 이벤트#include #include #include int main(int argc, char *argv[]){ QApplication a(argc, argv); QWidget w; QLabel hello(" Hello Qt! ",&w); hello.resize(75,35); QPushButton quit("quit",&w); quit.move(10,40.. 2024. 8. 5.
modern c++ • constexpr C++에서는 매크로보다 constexpr 상수로 사용하는 걸 권장한다#define SIZE 10 // C-styleconstexpr int size = 10; // modern C++ • 초기화중괄호 안에 다 박을 수 있다#include #include using namespace std;struct S { string name; float num; S(string s, float f) : name(s), num(f) {}};int main() { S s1("Norah", 2.7); S s2("Frank", 3.5); S s3("Jeri", 85.9); // Basic initialization vector v; v.push_back(s1); v.push_back(s2); v.p.. 2024. 7. 31.
스마트 포인터 • unique_ptr 특정 객체를 가리키는 하나의 스마트 포인터복사 새성자와 복사 대입 연산자 불가능 - 사용법unique_ptr 스마트 포인터명(new 클래스)unique_ptr 스마트 포인터명 = make_unique(인수); 가능하면 new로 하지 말고 make~로 할것 클래스를 스마트 포인터로 호출해보면 따로 delete 하지 않아도 소멸자가 자동으로 호출된다class T {public: T() { cout ptr = make_unique(); cout   - 상속관계class T {public: T() { cout ptr2 = make_unique(); cout  위와 같은 상속 관계에서 잘 동작한다 -재귀 호출#include #include using namespace std;void f.. 2024. 7. 31.
예외 처리 #include using namespace std;void f1(); void f2(); void f3();class Test { int id;public: Test(int n) { id = n; cout  위 코드를 실행하면 동적할당한 경우 메모리 해제가 잘 되지 않아 소멸자가 호출퇴지 않는다 2024. 7. 31.
c++ 입출력 시스템 텍스트 파일 생성해서 저장하는 코드int main() { ofstream fout; fout.open("song.txt"); if (!fout) { cout  클래스에서 계산값을 '#include #include #include using namespace std;class Circle { int radius;public: void setRadius(int radius); double getArea(); friend ofstream& operator 2024. 7. 30.
람다식 • 람다식f(x + y)를 (x + y) -> x + y 형태로 표현한다 - x+y를 출력하는 람다 메서드에 2+3한 값을 넣어서 출력[](int x, int y) {cout  -람다 메서드를 auto 타입으로 변수로 만들어두고 재활용해서 사용하는 코드, 이 패턴을 잘 알아두자 auto sum = [](int x, int y) {cout  -람다 메서드에 외부 변수 값을 넣어서 계산하는 코드 double pi = 3.14; auto calc = [pi](int r) -> double { return pi * r * r; }; - 참조 형으로 넘겨준 인자에 값을 람다식 안에서 갱신하는 코드 double pi = 3.14, res = 0; auto calc = [&pi, &res](int r) -> doub.. 2024. 7. 30.
템플릿 & STL • 함수 중복의 약점함수 중복은 매개변수 이외의 코드가 중복되어 비효율적이다 • 템플릿 선언을 이용한 swap 함수template나 template 형태로 제네릭 타입을 선언하고 사용한다#include using namespace std;templatevoid myswap(T& a, T& b) { T tmp; tmp = a; a = b; b = tmp;}int main() { int a = 4, b = 5; cout  템플릿을 이용하면 재사용성이 증가하지만 포팅에 취약하고 디버깅이 어려워진다 • 템플릿 스택 코드#pragma once#include using namespace std;template class MyStack{ int size; T* arr; int top = -1;public: MySta.. 2024. 7. 29.
상속, 오버라이딩, 추상화 • 상속 기본 클래스  #include "Point.h"void Point::showPoint() { std::cout x = x; this->y = y;} point를 상속받는 클래스 ColorPoint헤더#pragma once#include "Point.h"#include #include class ColorPoint : public Point { std::string color;public: void setColor(std::string color); void showColorPoint();};구현#include "ColorPoint.h"void ColorPoint::showColorPoint() { std::cout color = color;} 메인#include .. 2024. 7. 29.
메서드 오버로딩 & 디폴트 매개변수 & static & 프렌드 & 연산자 오버로딩 • 메서드 오버로딩이름이 같고 인자가 다른 메서드를 이용해서 다형성을 구현인자가 모호하면 오버로딩이 불가능하다#include #include #include #include using namespace std;int getMin(int a, int b) { return (a > b) ? b : a;}double getMin(double a, double b) { return (a >=b) ? b : a;}string getMin(string a, string b) { return (a.compare(b) > 0) ? b : a;}int getMin(int arr[], int size) { int min = INT16_MAX; for (int i = 0; i  • 디폴트 매개변수 디폴트 매개변수는 함수의 .. 2024. 7. 26.
C++ 객체지향 프로그래밍 • 클래스와 객체#include using namespace std;class Rectangle {public : int width; int height; Rectangle(int width, int height); Rectangle(); int getArea() { return width * height; }};Rectangle::Rectangle() { width = 5; height = 10; cout width =width; this->height = hegiht; cout  • 생성자 중복 테스트 #include using namespace std;class Rectangle {public : int width = 1; int height = 1; Rectangle(int width, int .. 2024. 7. 25.
컴파일러 최적화 • 변수별 특성 • 재귀함수 최적화#include #if TCASE==1 //재귀int fact(int n) { if((n==1) || (n==0)) return 1; else return n * fact(n-1);}#elif TCASE==2 //goto로 하는 루프int fact(int n) { int i=1, rst=1; if(n==0) return 1;loop: if(i 재귀,goto,반복문으로 팩토리얼 연산을 하는 소스코드를 컴파일한 후 디스어셈블해서 비교 - 컴파일, 디스어셈블리 명령어gcc recursiveFunc.c -g -DTCASE=3objdump -d -S a.out > r3 재귀  함수는  반복적인  처리를  짧은  코드와  효과적인  처리로  편의를  제공하지만, 함수의  반복적인 .. 2024. 7. 23.
보이드 포인터를 이용한 제네릭 프로그래밍 보이드 포인터를 이용한 제네릭 기법은  코드의  재사용성을  높이고, 유연성을  제공하여  다양한  데이터  타입에  대해  반복적인  코드  작성을  줄일  수  있다. Generic Programming은 일반적으로  컴파일  시점에 타입 안전성을  보장하며,코드의 성능 최적화에도 도움을 줄 수 있다. 복잡성을  줄이고  유지보수성을  향상시키는데  기여할  수  있다. • 타입에 상관없이 정렬되는 프로그램 1. 함수 포인터로 인자를 받는다2. 받은 인자의 타입에 따라 다른 정렬 메서드를 작성한다간단해 보이지만 굉장히 복잡했다C에서의 제네릭 - (void*)  형태 #include #include #include #include "swap.h"#define NAME_SIZE 20//void*로 주소를.. 2024. 7. 23.
부트로더 전원이 들어오면 OS보다 먼저 실행되는 프로그램 HW/SW를 초기화한다 메모리 관련 커맨드, 시스템 모니터링 커멘드를 지원한다OS 다운로드&로딩 커맨드를 지원한다 2024. 7. 23.
함수 포인터, 구조체 포인터 예제 - 함수 포인터추가하자 -구조체 포인터typedef struct _CMD_TBL { char *cmd; // command name void (*run)(int); // function point. char *usage; // command usage} CMD_TBL;#define CMD_TBL_T1 {"on", ledon, " ledon function"}#define CMD_TBL_T2 {"off", ledoff, " ledoff function"}#define CMD_TBL_T3 {"state", getstate, " button state function"}#define CMD_TBL_END {0, 0, 0}// 구조체 포인터 순회하는 코드CMD_TBL *cptr; for (cptr .. 2024. 7. 23.
임베디드 C • 컴파일 과정- gcc 명령어 옵션• 컴파일 후 실행터미널에서 gcc -S ptrNarray1 ptrNarray1.c gcc -S  v1.s volatileBasic1.c gcc -o ptrNarray1 ptrNarray1.c  ./ptrNarray1  -memcpy를 이용한 데이터 복사int swap(void *dest, void *src, int size){ void* tmp = malloc(size); if (tmp == NULL) return -1; memcpy(tmp,dest,size); memcpy(dest,src,size); memcpy(src,tmp,size); free(tmp);} - 비트 연산자 계산기bitSet 해당 위치 비트를 1로 만들기bitReset 해당 위치 비트를 0으로 만.. 2024. 7. 22.
리눅스 C 환경설정 • 윈도우 리눅스 환경 설정wsl --install -d ubuntusudo apt-get updatesudo apt install wsl - OpenSSH 서버 설치 후 환경 확인Telnet을 통해서도 원격으로 리눅스에 접근할 수 있지만 보안 문제때문에 ssh로 접근하는 방법을 사용한다 sudo apt install openssh-serversudo systemctl status sshd  vscode 설치 후remote development 확장 설치 wsl 터미널에서 ip addr 명령어 입력 후 inet 다음에 있는 ipv4 주소 복사vscode 좌하단 remote development 클릭하고 connect to host 입력 후 리눅스계정@ipv4주소 입력hoshi03@172.27.10.53-.. 2024. 7. 22.
volatile 지시자 임베디드 환경에서 컴파일러가 특정 변수를 최적화를 수행하지 않게 만드는 키워드HW 레지스터 접근이나 멀티쓰레드 환경, 신호 처리 등의 환경에서 사용한다 언어 기초를 떼고 더 깊게 들어가면서 강사님이 자세하게 설명해준다고 하니 그때 다시 정리하자 2024. 7. 19.
1주차 C 전처리, 매크로, 조건부 컴파일 • 전처리소스 파일 -> 전처리 -> 컴파일 -> 링크 단계를 통해 소스파일을 실행파일로 변환한다 -전처리 hello.c -> hello.i소스파일이 전처리 단계를 통해 #으로 시작하는 #include나 #define 등의헤더 파일이나 상수, 매크로등을 처리한다#ifdef, #endif 등의 지시문도 전처리 과정에서 처리되어 코드블록의 포함 여부를 결정한다전처리 단계가 끝나면, 소스 코드의 텍스트가 전처리문에 따라 수정된 상태가 된다 -컴파일hello.i -> hello.s나 hello.obj컴파일러가 고수준 언어를 저수준으로 변환구문 분석, 어셈블리 코드 생성, 최적화등의 작업을 진행해소스 프로그램을 목적 프로그램으로 변환한다 -어셈블hello.s -> hello.o어셈블러가 어셈블리어를 기계어로 변환.. 2024. 7. 19.
1주차 C 공용체,열거형,파일 입출력 • 구조체 비트 필드 메모리를 몇 비트나 사용할지 정의하는 방법b1은 4비트, b2는 2비트만 사용하게 정의했다#define _CRT_SECURE_NO_WARNINGS #include #include #include // strlen 함수 사용을 위해 추가#include "myList.h"struct bit { unsigned char b1 : 4; unsigned char b2 : 2;} ch;int main() { ch.b1 = 0x0E; ch.b2 = 0x00; printf("%d\n", sizeof(ch)); printf("%u, %u\n", ch.b1, ch.b2);} • 공용체 공용체는 멤버간에 메모리를 공유한다다른 멤버가 메모리를 사용하면 기존 멤버가 사용하던 값이 초기화된다 아래의 .. 2024. 7. 19.
1주차 C 기초부터 이중연결리스트까지 배열 선언할때 크기+1로 널문자를 포함해주기 - 안하면 어디서 끝나는지를 모른다 • 헤더파일 분할 vs환경에서 헤더 파일 분할에 헤더파일을 생성한다정수를 인자로 받아서 팩토리얼을 구해주는 함수를 fac.h에 생성한다 -fac.h#include int factorial(int input) { if (input == 1) return 1; return input * factorial(input - 1);} main 함수에서 사용자가 만든 헤더를 #include "fac.h" 형태로 삽입해서 사용한다#define _CRT_SECURE_NO_WARNINGS #include #include "fac.h"int main(void) { int a; scanf("%d", &a); printf("%d", factoria.. 2024. 7. 18.