byidev.com
Languages (61)
2024-05-13 22:14:35

 

개요

 C언어로 네트워크 프로그래밍을 하면 다소 번거로운 점이 많이 존재한다. 네트워크 라이브러리를 사용해 간편하게 바꿀수도 있지만 공부하고 있는 입장이라면 다음과 같이 매크로를 작성하며 편리하게 사용할 수 있는 방법을 생각해보는 것도 중요한 과정 중 하나라고 생각한다.

 필자는 궁극적으로 귀찮음을 이기지 못하고 Ctrl C + Ctrl V를 하기 위해 만들었다 ㅎ.. 이 글을 읽는 분들도 지금 네트워크 프로그래밍을 하고있다면 나만의 매크로로 구성된 헤더파일을 하나 가져보는 것도 괜찮을 것 이다.

IPv4

 IPv4 주소는 32비트의 1.1.1.1 ~ 255.255.255.255의 MIN, MAX 값을 가지는 주소 표기 방식이다. 다음의 내용과 같이 비트 쉬프트 및 AND 연산을 통해 보기 좋은 pretty 결과물을 얻을 수 있다. IP 주소가 반대로 뜬다면 당황하지 말고 자신의 데스크톱 저장 방식이 LE인지 BE인지 확인해보길 바란다. 간단하게 0~24 쉬프트 연산의 순서를 반대로 진행하면 정상적인 결과 값을 얻을 수 있다.

 

매크로

#define IPV4_ADDR_FMT "%d.%d.%d.%d"
#define IPV4_ADDR_FMT_ARGS(addr) ((addr >> 0) & 0XFF), ((addr >> 8) & 0XFF), ((addr >> 16) & 0XFF), ((addr >> 24) & 0XFF)

 

출력

// 표준 입출력 예제
printf("int_ipv4 = "IPV4_ADDR_FMT"\n", IPV4_ADDR_FMT_ARGS(src_ipv4));
printf("dst_ipv4 = "IPV4_ADDR_FMT"\n", IPV4_ADDR_FMT_ARGS(dst_ipv4));

// 파일 입출력 예제
fprintf(fp, "int_ipv4 = "IPV4_ADDR_FMT"\n", IPV4_ADDR_FMT_ARGS(src_ipv4));
fprintf(fp, "dst_ipv4 = "IPV4_ADDR_FMT"\n", IPV4_ADDR_FMT_ARGS(dst_ipv4));

 

IPv6

 IPv4 주소가 32 비트 주소 체계라면 IPv6는 128 비트 주소 체계이다. 기존 IPv4 주소가 고갈되는 문제를 해결되기 위해 탄생하였으며 그만큼 MIN, MAX의 범위가 크다. IPv4가 0~8, 8~16, 16~24, 24~32로 주소지를 구분지어 표기했다면 IPv6는 /0~/16~/32~/48~/64~/80~/96~/112~/128로 주소지를 구분짓는다. IPv6 주소는 uint128_t 또는 unsigned char 배열로 저장할 수 있다.

 

매크로

#define IPV6_ADDR_FMT "%u:%u:%u:%u:%u:%u:%u:%u:%u:%u:%u:%u:%u:%u:%u:%u"
#define IPV6_ADDR_FMT_ARGS(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]

 

출력

// 표준 입출력 예제
printf("src_ipv6 = "IPV6_ADDR_FMT"\n", IPV6_ADDR_FMT_ARGS(src_ipv6));
printf("dst_ipv6 = "IPV6_ADDR_FMT"\n", IPV6_ADDR_FMT_ARGS(dst_ipv6));

// 파일 입출력 예제
fprintf(fp, "src_ipv6 = "IPV6_ADDR_FMT"\n", IPV6_ADDR_FMT_ARGS(src_ipv6));
fprintf(fp, "dst_ipv6 = "IPV6_ADDR_FMT"\n", IPV6_ADDR_FMT_ARGS(dst_ipv6));

 

MAC

 MAC 주소는 데이터 링크 계층에서 통신을 위한 네트워크 인터페이스, 즉 HW에 부여된 고유 식별자이다. 이더넷과 와이파이를 포함한 대부분의 네트워크 기술에 네트워크 주소로 사용되며 MAC 주소는 매체 접근 제어 프로토콜 OSI 모델 하위 계층에서 사용된다. 다음과 같이 매크로를 작성할 수 있다.

 

매크로

#define MAC_ADDR_FMT "%02X:%02X:%02X:%02X:%02X:%02X"
#define MAC_ADDR_FMT_ARGS(addr) addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]

 

출력

// 표준 입출력 예제
printf("src_mac = "MAC_ADDR_FMT"\n", MAC_ADDR_FMT_ARGS(src_mac));
printf("dst_mac = "MAC_ADDR_FMT"\n", MAC_ADDR_FMT_ARGS(dst_mac));

// 파일 입출력 예제
fprintf(fp, "src_mac = "MAC_ADDR_FMT"\n", MAC_ADDR_FMT_ARGS(src_mac));
fprintf(fp, "dst_mac = "MAC_ADDR_FMT"\n", MAC_ADDR_FMT_ARGS(dst_mac));
2024-03-25 13:31:37

 

1. 소스코드 (Source Code)

  • 개발자가 텍스트 에디터나 IDE를 사용하여 C 언어로 프로그램을 작성한다.
  • 해당 파일은 '.c' 확장자를 가진다.

2. 전처리기 (Preprocessor)

  • 전처리기는 소스 코드를 받아서 전처리 단계를 수행.
  • 매크로 확장, 헤더 파일 포함, 조건부 컴파일, 주석 제거 등의 작업을 수행.
  • 전처리된 파일은 컴파일러로 전달 되기 전의 임시 파일 '.i' 확장자를 가진다.

3. 컴파일러 (Compiler)

  • 전처리된 소스 코드를 컴파일러에 전달하여 기계어로 번역한다.
  • 컴파일러는 소스 코드를 분석하고 목적 코드를 생성한다.
  • 생성된 목적 코드는 어셈블러로 전달. '.s' 확장자를 가진다.

4. 어셈블러 (Assembler)

  • 목적 코드를 받아 어셈블러가 해당 아키텍처에 맞는 기계어 코드로 변환한다.
  • 해당 단계에서는 소스 코드를 직접 기계어로 변환하는 과정이다.
  • 생성된 기계어 코드는 링커로 전달. '.o' 확장자를 가진다.

5. 링커 (Linker)

  • 링커는 여러 개의 오브젝트 파일과 라이브러리 파일을 받아 하나의 실행 파일로 결합한다.
    • 이때 라이브러리등의 파일은 '.a' 확장자로 전달된다.
  • 외부 참조를 해결하고 실행 파일에 필요한 모든 구성 요소를 포함.
  • 최종적으로 실행 파일이 생성되어 사용자가 실행할 수 있게된다.
    • Windows => {file}.exe
    • Unix => {file}.out

6. 로케이터 (Locator)

  • 로케이터는 실행 파일을 메모리에 로드하고 실행할 때의 주소를 지정하는 역할이다.
  • 프로그램의 각 섹션(코드, 데이터 등)이 메모리에서 어디에 위치해야 하는지 결정.
  • 실행 파일이 메모리에 로드될 때 로케이터는 각 섹션의 주소를 지정하여 올바른 동작을 유도.
    • 코드 (Code)
      • 코드 영역은 실행할 프로그램의 코드를 메모리에 저장.
    •  데이터 (Data)
      • 데이터 영역은 프로그램의 전역 변수와 정적 변수를 메모리에 저장.
    • 스택 (Stack)
      • 스택은 함수 호출 및 지역 변수의 할당과 관련된 메모리를 저장.
      • 함수가 호출될 때마다 해당 함수의 지역 변수와 매개 변수가 스택에 할당.
      • 스택은 후입선출(LIFO, Last In First Out) 구조를 가지며 자동으로 관리됨.
    • 힙 (Heap)
      • 힙은 동적으로 할당된 메모리를 저장하는 영역.
      • 프로그램 실행 중 필요한 크기의 메모리를 동적으로 할당하고 해제할 수 있다.
      • 힙은 사용자가 직접 관리해야 하며 메모리 누수 (Memory Leak)와 같은 문제 유발 우려.
      • malloc, calloc, realloc 함수를 사용하여 힙 메모리 하당, free 사용하여 할당 해제.
    • BSS (Block Started Symbol)
      • BSS 영역은 초기화되지 않은 전역 변수 및 정적 변수를 저장.

 

2024-03-05 23:00:37

go

Go 설치하기

Go 공식 홈페이지에서 Download 버튼을 통해 Go 컴파일러를 설치할 수 있다.

 

The Go Programming Language

DevOps & Site Reliability With fast build times, lean syntax, an automatic formatter and doc generator, Go is built to support both DevOps and SRE.

go.dev

go build

go build 커맨드는 Go 프로그램을 컴파일하여 실행 파일을 생성한다. 일반적으로 소스 코드 파일을 컴파일하여 실행 파일을 생성하며, 이 때 실행 파일의 이름은 소스 코드 파일이 있는 디렉토리의 이름이 된다.

package main

import "fmt"

func main() {
	fmt.Println("Hello World")
}

다음과 같이 간단한 .go 파일을 작성한 후 build 커맨드를 입력해 빌드할 수 있다.

go build {file}

그러면 파일의 이름으로 실행 파일이 생성된다.

go run

go run 커맨드는 Go 프로그램을 컴파일하지 않고 바로 실행한다. 소스 코드 파일을 인자로 받아서 컴파일 없이 실행 파일을 생성하지 않고 코드를 실행한다. 주로 간단한 테스트나 프로토타이핑을 할 때 사용된다.

go run {file}

package

Go 프로그램은 수많은 .go 패키지로 생성된다. 우리는 package 키워드를 통해 Go 코드를 조직화 단위로 정의할 수 있다. 다음과 같이 코드에서 package가 main이면 프로그램은 실행 파일로 컴파일된다.

 

Go는 공백에 의미를 갖지 않는다. 새 줄, 공백 및 탭은 따로 갖춰 작성할 필요가 없지만 가독성을 위해 개발자는 다음과 같이 코드를 작성한다.

package main

import "fmt"

func main () {
  fmt.Println("Hello World")
}

func

func 키워드는 함수를 선언할 때 사용된다. 우리는 다음의 코드에서 func 키워드의 뒤에 main과 (), {}를 붙여 main 함수를 생성한 것이다.

package main

import "fmt"

func main () {
  fmt.Println("Hello World")
}

import와 별칭

import 키워드는 Go 프로그램에서 다른 패키지의 코드를 현재 파일에 가져오는데 사용된다. 다음의 코드에서 우리는 import "fmt"를 통해 Go의 표준 입출력을 가져올 수 있었다. 여기서 import "time"을 보면 t라는 글자가 사용되고 있는데 이와같이 별칭을 사용할 수도 있다.

package main

import "fmt"
import t "time"

func main() {
  fmt.Println("Hello World")
  fmt.Println(t.Now())
}

import 키워드를 통해 여러개의 패키지를 등록할 때는 다음과 같이 사용할 수도 있다.

import (
    "fmt"
    "time"
)

go doc

코드를 작성할 때 fmt와 같은 패키지를 사용할 때, 해당 패키지에서 제공하는 함수에는 어떤 것들이 있는지 알고 싶다면 go doc 커맨드를 사용해보자. 다음과 같이 패키지 단위 및 패키지의 함수 단위로 설명을 확인할 수 있다.

go doc fmt
go doc fmt.Println
2024-03-05 20:05:48

go

개요

  • 2009년 11월 구글에서 첫 발표, 2012년 3월 정식 발표
  • C++의 복잡함을 해결하고자 개발된 언어
  • Go 언어는 Golang으로 흔히 불림

특징

  • 빠른 컴파일 속도
    • Go의 컴파일러는 매우 빠르며 코드 수정 후 다시 컴파일 하는데 시간이 매우 적게 걸린다.
  • 간결한 문법
    • Go는 문법이 간결하여 코드를 읽고 쓰기 쉽다.
    • 세미콜론을 사용하지 않는 등.
  • 정적 타입 검사
    • Go는 정적 타입 검사를 통해 안정성을 제공한다.
    • 컴파일시 타입 오류를 찾을 수 있어 프로그램의 신뢰성을 높인다.
  • 경량 스레드 고루틴 (Goroutine)
    • Go는 고루틴을 통해 간단하게 병렬 프로그래밍이 가능하다.
    • 고루틴은 OS 스레드보다 경량이며, 여러개의 고루틴을 사용해도 효율적으로 동작한다.
  • 풍부한 표준 라이브러리
    • Go에는 HTTP 서버를 비롯한 다양한 기능을 제공하는 표준 라이브러리가 포함되어 있다.
    • 개발 과정을 단순화하고 생산성을 향상시킨다.
  • 간단한 동기화 메커니즘
    • 고루틴 간의 통신 및 동기화를 위한 채널이라는 메커니즘을 제공해 병렬 프로그래밍을 간소화한다.
  • 크로스 플랫폼 지원
    • Go는 다양한 운영 체제 및 아키텍처를 지원한다.
    • Windows, macOS, Linux, FreeBSD, Android, iOS, WebBrowser(WebAssembly)
  • C언어와의 호환성
    • Go는 C 언어와의 상호 운용성을 제공하여 기존의 C 라이브러리를 사용하거나 Go로 작성된 코드를 C로 호출할 수 있다.
  • 단순함과 실용성
    • 25개의 키워드만 사용하는 단순함과 실용성을 지향하는 언어이다.
    • 아래의 표 참조.
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

단점

  • 고성능 연산에 부적합
    • C/C++에 비해 느린 실행 속도를 가지고 있다.
  • 저수준 시스템 개발에 제한
    • 가비지 컬렉션과 고루틴을 지원하는 런타임 등으로 저수준 시스템 개발에는 적합하지 않을 수 있다.

지원

  • JestBrains - GoLand
  • IntelliJ IDEA - Go Plugin
  • Visual Studio Code
  • Eclipse
  • LiteIDE

버전

Version Release Information
go1 2012.03 초기 릴리스
go1.1 2013.05 빠른 컴파일 속도, 런타임 버그 수정
go1.2 2013.12 병렬 컴파일, for 루프 최적화
go1.3 2014.06 nil 참조 오류 방지, 숫자 계산 최적화
go1.4 2014.12 탈출 분석 컴파일, 커스텀 컴파일러 훅
go1.5 2015.08 SSA 컴파일, 상수 폴딩 최적화
go1.6 2016.02 고루틴 제거 시 가비지 컬렉션 최적화
go1.7 2016.08 컴파일 속도 향상, 새로운 구문 추가
go1.8 2017.02 고루틴 경쟁 상태 수정, 플래그 지원
go1.9 2017.08 기능 개선 및 성능 향상
go1.10 2018.02 기능 개선 및 컴파일 속도 향상
go1.11 2018.08 모듈 지원 추가
go1.12 2019.02 모듈 기능 개선, 고루틴 조건 변수 사용
go1.13 2019.09 기능 개선, 모듈 지원 개선
go1.14 2020.02 기능 개선, 모듈 및 빌드 시스템 개선
go1.15 2020.08 기능 개선, ARM64 지원 추가
go1.16 2021.02 기능 개선, 빌드 속도 향상
go1.17 2021.08 컴파일 속도 향상, 기능 개선
go1.18 2022.02 기능 개선, 모듈 지원 확대
go1.19 2022.08 성능 향상, 새로운 기능 추가
go1.20 2023.02 제네릭 지원 추가
go1.21 2023.08 컴파일 속도 향상, 런타임 최적화
go1.22 2024.02 기능 개선, 모듈 및 라이브러리 업데이트
 

Release History - The Go Programming Language

Release History This page summarizes the changes between official stable releases of Go. The change log has the full details. To update to a specific release, use: git fetch --tags git checkout goX.Y.Z Release

2024-02-28 11:40:00

링크드 리스트와 배열 : 탐색 속도 비교

배열 (Array)

  • 장점
    • 인덱스를 사용하여 빠르게 접근이 가능하다.
  • 단점
    • 크기제한 : 배열의 크기는 선언할 때 고정되므로 삽입/삭제 시 크기를 동적으로 조절하기 어렵다.
    • 삽입/삭제 오버헤드 : 배열에서 중간에 요소를 삽입하거나 삭제할 경우 해당 요소 뒤의 모든 요소를 이동시켜야 하므로 오버헤드가 발생한다.

링크드 리스트 (Linked List)

  • 장점
    • 동적 크기 조절 : 링크드 리스트는 삽입 및 삭제가 용이하며 크기를 동적으로 조절할 수 있다.
    • 효율적인 삽입/삭제 : 링크드 리스트에서는 요소의 삽입과 삭제가 해당 요소의 위치에만 영향을 미치므로 오버헤드가 적다.
  • 단점
    • 탐색 속도 : 링크드 리스트는 요소를 찾기 위해 처음부터 순회해야 하므로 배열보다 느린 탐색 속도를 가진다.
      • 이진 탐색을 통해 속도 개선이 가능하지만 리스트가 정렬되어 있어야 하며, 리스트 요소에 대한 임의 접근이 가능해야 한다. 일반적인 경우라면 배열이나 해시 테이블 등의 자료구조가 더 빠른 탐색 속도를 가진다.

오버헤드란?

오버헤드는 어떤 작업을 수행할 때 추가적으로 발생하는 비용을 의미한다. 배열에서의 삽입이나 삭제는 해당 요소 이후의 모든 요소들을 이동시켜야 하므로 이 작업이 발생하는 비용이 오버헤드에 해당한다. 이로 인해 배열에서의 삽입 및 삭제 작업은 많은 자원을 소모하게 된다.

배열
[1, 2, 3, 4, 5]

링크드 리스트
1 -> 2 -> 3 -> 4 -> 5

 

2024-01-16 16:10:13

C++

 

필자는 코딩 테스트를 준비하며 다양한 알고리즘 문제를

풀어보기 위해 C/C++ 언어를 선택하였다.

 

매번 어려움을 겪었던 개발환경 설정을 비로소 이번에야

글로 남겨 필요할떄 마다 꺼내볼 생각이다.

 

1. Visual Studio Code 설치

 

여러 개발환경에서 다양한 언어를 접했지만 아직도 필자는

VS-Code 가 가장 편한 IDE 인 것 같다.

 

많은 사람들이 사용하는 개발환경인 만큼 정보의 양도 많으니

딱히 취향이 있는것이 아니라면 사용하는것이 좋다는 판단이다.

 

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

2. Extention 항목에서 C++ 설치하기

 

아래의 그림에서 볼 수 있듯이 좌측의 도형 아이콘 Extension 항목에서

C++ 을 검색하면 Microsoft 사에서 지원하는 C/C++ 확장을 설치할 수 있다.

 

다만 내용에서도 보이듯 추가적으로 설치해야 할 과정들은 남아있다.

 

C++ is a compiled language meaning your program's source code must be translated (compiled) before it can be run on your computer.

C++은 프로그램의 소스 코드가 컴퓨터에서 실행되기 전, 컴파일 되어야 한다는 것을 의미하는 컴파일된 언어.

 

VS Code is first and foremost an editor, and relies on command-line tools to do much of the development workflow.

VS Code는 우선 편집기이며, 개발 워크플로우의 대부분을 명령줄 도구에 의존.

 

The C/C++ extension does not include a C++ compiler or debugger.

C/C++ 확장에는 C++ 컴파일러나 디버거가 포함되어 있지 않다.

 

You will need to install these tools or use those already installed on your computer.

도구를 설치하거나 컴퓨터에 이미 설치된 도구를 사용해야 한다.

 

C/C++ Extension

 

3. C/C++ 컴파일러 gcc/g++ 설치를 위한 MinGW 설치하기

 

아래의 SOURCEFORGE 사이트 링크를 통해 MinGW를 설치해보자.

Download Latest Version 버튼을 클릭하면 다운로드가 진행된다.

 

 

MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net

Our team of highly trained cybersecurity professionals provides expertise in compliance, tool assessments, threat hunting, incident response and more. Critical Start is leading the way in Managed Detection and Response (MDR) services. With a unique approac

sourceforge.net

 

다음의 그림과 같이 실행할 수 있는 파일을 다운로드 했다면 성공이다.

Install 버튼을 클릭한다.

 

Continue 버튼을 클릭한다.

 

다음 그림과 같다면 정상적으로 설치가 되고 있는 모습이다.

설치가 끝났다면 Continue 버튼을 클릭한다.

 

필자는 이미 설치를 완료한 상황이지만,

설치를 위해 다음과 같이 초록색으로 마크된 네개의 항목에 대해

우클릭 => Mark for Installation을 클릭한다.

 

이후, 좌상단의 Installation에서 Apply Changes를 클릭하고,

설치를 위해 나타나는 창에서 Apply 버튼을 클릭해주면 된다.

 

4. 시스템 환경 변수 설정

 

다음 그림과 같이 시스템 환경 변수 편집의 문구를 입력하면

시스템 속성이 나타나게 된다.

 

시스템 속성의 하단에 위치한 환경 변수를 클릭해준다.

 

다음과 같이 환경 변수 목록이 나열되어있다.

우리는 Path 변수를 클릭하고 편집 버튼을 누른다.

 

새로 만들기 버튼을 눌러 다음의 절차를 추가해준다.

 

다음 그림과 같이 입력하여 최 하단에 경로 설정이 되었는지 확인해준다.

 

5. gcc/g++ 프롬프트로 버전 확인하기

 

다음 그림과 같이 명령 프롬프트를 실행한다.

 

다음 그림과 같이 각각의 명령어를 통해 버전을 확인해준다.

그림과 같이 각각의 명령어마다 버전이 뜬다면 정상적으로 설정 되었다.

 

VS-Code 간단한 예제 코드 작성 및 설정

 

마지막 단계로 VS-Code에서 간단한 예제를 작성해보자.

필자는 <stdio.h> 헤더를 사용해 printf 구절로 출력을 확인해보았다.

 

당연히 바로 실행되지는 않는다.

launch.json과 tasks.json에 오류가 있다며 설정을 필요로 한다고 나타난다.

 

launch.json

다음의 내용을 그대로 복사 붙여넣기 하여 수정해준다.

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "C++ Launch",
      "type": "cppdbg",
      "request": "launch",
      "program": "${workspaceFolder}/your_executable_name.exe",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "save and compile for C++"
    }
  ]
}

 

tasks.json

다음의 내용을 그대로 복사 붙여넣기 하여 수정해준다.

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "save and compile for C++",
      "command": "g++",
      "args": [
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "group": "build",
      "problemMatcher": {
        "fileLocation": [
          "relative",
          "${workspaceRoot}"
        ],
        "pattern": {
          "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
          "file": 1,
          "line": 2,
          "column": 3,
          "severity": 4,
          "message": 5
        }
      }
    },
    {
      "label": "save and compile for C",
      "command": "gcc",
      "args": [
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "group": "build",
      "problemMatcher": {
        "fileLocation": [
          "relative",
          "${workspaceRoot}"
        ],
        "pattern": {
          "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning error):\\s+(.*)$",
          "file": 1,
          "line": 2,
          "column": 3,
          "severity": 4,
          "message": 5
        }
      }
    },
    {
      "label": "execute",
      "command": "cmd",
      "group": "test",
      "args": [
        "/C",
        "${fileDirname}\\${fileBasenameNoExtension}"
      ]
    },
    {
      "type": "cppbuild",
      "label": "C/C++: gcc.exe 활성 파일 빌드",
      "command": "C:\\MinGW\\bin\\gcc.exe",
      "args": [
        "-fdiagnostics-color=always",
        "-g",
        "${file}",
        "-o",
        "${fileDirname}\\${fileBasenameNoExtension}.exe"
      ],
      "options": {
        "cwd": "C:\\MinGW\\bin"
      },
      "problemMatcher": [
        "$gcc"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      },
      "detail": "디버거에서 생성된 작업입니다."
    }
  ]
}