분류 전체보기 57

07. C언어_퀵 정렬 (Quick sort)

퀵 정렬(Quick sort)이란?- 퀵 정렬은 기준값(pivot)을 중심으로 연속적으로 분할하며 정렬하는 기법 - pivot 값을 중심으로 pivot보다 작은 값을 왼쪽으로, pivot보다 큰 값을 오른쪽으로 배열시키는 방식 - sort가 완료될 때까지 (left>=right) 반복 퀵정렬 알고리즘 구현1. sort값의 가장 우측 값을 pivot으로 설정 2. 한 구간 안에서 다음을 반복적으로 수행한다. - 구간 좌측부터 pivot보다 큰 값을 j를 증가시키면서 검사 - 구간 우측부터 pivot보다 작은 값을 k를 감소시키면서 검사 - jk이면 한 구간에 대한 교환이 완료된 것이므로 j의 자리에 있는 값과 pivot의 값을 교환 (이때 pivot값을 중심으로 좌측에는 pivot보다 작은 값이, 우측에는..

C언어 2024.05.15

04. C++_얕은복사/깊은복사

객체를 복사한다는 것은 내용을 다른 객체로 복사하는 것을 의미하는데, 클래스의 객체가 다른 객체로 복사될 때는 보통 매개변수로 같은 클래스의 객체를 받아서 그 객체의 내용을 복사하여 새로운 객체를 생성하는 복사 생성자 (copy Constructor)에 의해 복사가 수행됩니다. 이 때, 복사 생성자가 어떻게 구현이 되었냐에 따라 객체 복사가 깊은 복사인지, 얕은 복사인지 결정되게 됩니다. 이번 포스팅에서는 깊은 복사, 얕은 복사에 대한 개념과 간단한 예제에 대해 알아보겠습니다.깊은 복사(Deep copy)깊은 복사는 객체를 복사할 때 해당 객체가 동적으로 할당된 메모리를 사용하고 있다면, 이 동적 메모리까지 새롭게 할당하고 복사하여 두 객체가 완전히 독립적인 데이터를 갖도록 하는 것입니다. 따라서 포인터..

C++ 2024.03.24

03. C++_invoke

일반적으로 클래스의 멤버함수를 호출할 때 멤버함수와 함께 객체의 정보가 함께 전달됩니다. 따라서 static 이 아닌 멤버 함수는 함수가 호출될 때 컴파일러가 객체의 객체의 정보 또한 함수의 인자로 전달을 하는데 이것을 thiscall이라고 합니다.  예를 들어 인자가 1개인 멤버 함수 mf1(int a)가 있다고 했을 때, 실제 객체가 함수를 호출할 때에는 mf1(&pt, int a)와 같이 2개의 인자를 전달하는 형태로 바뀝니다.  멤버 데이터는 객체당 한개씩 생성되는 반면, 멤버 함수는 여러 객체가 있어도 하나만 존재하는데 컴파일러에서 멤버함수를 호출할 때 객체에 대한 정보를 보내주기 때문에 멤버함수의 인자가 어떤 객체의 멤버인지 알 수 있습니다. class Point{ int x{0}; int y..

C++ 2024.03.24

02. 리눅스 _소켓 통신(TCP/IP) 개념과 예제

인터넷 소켓 통신 (TCP/IP)소켓 통신은 소켓 프로그래밍을 사용하여 구현되며, 컴퓨터 네트워크를 통해 데이터를 주고받는 통신을 하기 위한 API(Application Programming Interface)를 제공합니다. 소켓은 IP주소와 포트번호로 식별되는 네트워크 통신에서 사용되는 엔드포인트로, 통신을 수행하는 두 개의 시스템 사이에서 데이터를 주고받을 수 있는 인터페이스를 제공합니다. 인터넷 소켓은 TCP/IP 프로토콜을 기반으로 하는 소켓으로, 연결지향 통신이라고도 합니다.소켓 통신은 클라이언트와 서버 간의 통신을 하는 구조로, 클라이언트는 서버에 연결 요청을 보내고, 서버는 클라이언트의 요청을 차리하고 응답을 반환합니다.  소켓 통신 과정[클라이언트 소켓]1) socket() : 소켓을 생성..

리눅스 2024.03.18

02. C++_Initializer_list

Initalizer_list는 c++11 표준 라이브러리에서 제공하는 타입으로, 배열의 초기화를 쉽게 처리하기위한 reference 객체입니다. 이 객체는 const T 타입의 요소로 이루어진 배열에 대한 접근을 제공하며, 중괄호 '{}'안에 나열된 값을 가져와 메모리를 초기화 합니다. 이때 배열이 놓인 메모리가 어느 위치인지는 정의되어있지 않고, readonly로 읽기 전용 메모리에 할당되어 s가 파괴될 때 같이 헤제됩니다.  std::initializer_list는 멤버함수로 size(), begin(), end() 등을 가지며, 포인터 2개로 구현되어 연속된 메모리의 시작위치와 끝 위치를 가리킵니다. * initializer_list의 멤버함수#include #include int main(){ ..

C++ 2024.03.18

01. 리눅스_시그널(signal) 정의 및 함수

Signal 이란?시그널이란 프로세스 간 특정 이벤트가 발생하였을때 신호를 보내서 알려주는 방식입니다. 시그널은 소프트웨어 인터럽트 라고도 하며 시그널이 발생하면 기존의 프로세스를 중단하고 시그널이 처리될 때까지 인터럽트 처리를 합니다. 이때 발생한 시그널에 따라 정의된 시그널 핸들러를 호출하여 지정된 방법에 따라서 시그널을 처리합니다. Signal handler란?시그널 핸들러란 특정 signal을 처리하기 위해 지정된 함수를 뜻합니다. 시그널 처리함수를 커널에게 등록요청을 한 후 특정 시그널이 발생하면 기존의 프로세스를 중단하고 정의된 처리 함수를 호출하여 수행합니다. 한편, SIGKILL, SIGSTOP등의 프로세스 동작 제어와 관련된 신호는 시그널 핸들러에의해 처리 방식을 재정의 하는 것이 불가능..

리눅스 2024.03.11

01. C++_Placement new

Placement new는 메모리를 할당하는 방식 중 하나인데, 이는 사용자가 이미 할당된 메모리 영역에 생성자를 명시적으로 호출하여 객체를 직접 생성하기 위한 방식입니다.이는 일반적인 new 키워드를 사용하여 동적으로 메모리를 할당하는 것과는 조금 다릅니다. 보통 new 키워드를 사용하여 동적으로 메모리를 할당하면 시스템은 메모리를 할당하고 (메모리할당&생성자호출), 생성자를 호출하여 객체를 초기화 합니다. 반면 Placement new는 이미 할당된 메모리 영역에 생성자를 호출하여 객체를 직접 생성합니다. (생성자만 호출)우선 기존의 new 키워드를 활용하여 동적할당을 하는 방법에 대해서 살펴보겠습니다.- new Point(1,2)#include #include class Point{ int x..

C++ 2024.03.11