From 98de35049b6c2254bbc255349a88ad4cd13c05e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=80=EC=B4=9D?= <136239807+EunChong999@users.noreply.github.com> Date: Fri, 1 Dec 2023 14:52:26 +0900 Subject: [PATCH 01/41] Update _config.yml --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 1da3e705de83..26e480d2a270 100644 --- a/_config.yml +++ b/_config.yml @@ -21,7 +21,7 @@ title_separator : "-" subtitle : # site tagline that appears below site title in masthead name : "Your Name" description : "An amazing website." -url : # the base hostname & protocol for your site e.g. "https://mmistakes.github.io" +url : "https://EunChong999.github.io" baseurl : # the subpath of your site, e.g. "/blog" repository : # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes" teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png" From 72d54665e20f8c64f4e3c9222d8e8eabd00e7ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=80=EC=B4=9D?= <136239807+EunChong999@users.noreply.github.com> Date: Fri, 1 Dec 2023 15:03:33 +0900 Subject: [PATCH 02/41] Create 2023-12-01-first.md --- _posts/2023-12-01-first.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 _posts/2023-12-01-first.md diff --git a/_posts/2023-12-01-first.md b/_posts/2023-12-01-first.md new file mode 100644 index 000000000000..84a3a83a86d6 --- /dev/null +++ b/_posts/2023-12-01-first.md @@ -0,0 +1,8 @@ +--- +layout: single +title: "첫 포스팅입니다. 설례네요." +--- + +# 오늘 처음 블로그를 만들었어요 + +앞으로 열심히 해보겠습니다. From c411811ea8e2db166e9a5a91290dea76a2f04e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=80=EC=B4=9D?= <136239807+EunChong999@users.noreply.github.com> Date: Fri, 1 Dec 2023 23:03:38 +0900 Subject: [PATCH 03/41] =?UTF-8?q?Update=20and=20rename=202023-12-01-first.?= =?UTF-8?q?md=20to=20Chapter=2001=20C=20=EC=96=B8=EC=96=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _posts/2023-12-01-first.md | 8 -- .../Chapter 01 C \354\226\270\354\226\264" | 81 +++++++++++++++++++ 2 files changed, 81 insertions(+), 8 deletions(-) delete mode 100644 _posts/2023-12-01-first.md create mode 100644 "_posts/Chapter 01 C \354\226\270\354\226\264" diff --git a/_posts/2023-12-01-first.md b/_posts/2023-12-01-first.md deleted file mode 100644 index 84a3a83a86d6..000000000000 --- a/_posts/2023-12-01-first.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: single -title: "첫 포스팅입니다. 설례네요." ---- - -# 오늘 처음 블로그를 만들었어요 - -앞으로 열심히 해보겠습니다. diff --git "a/_posts/Chapter 01 C \354\226\270\354\226\264" "b/_posts/Chapter 01 C \354\226\270\354\226\264" new file mode 100644 index 000000000000..4a236f9a8101 --- /dev/null +++ "b/_posts/Chapter 01 C \354\226\270\354\226\264" @@ -0,0 +1,81 @@ +--- +layout: single +title: "Chapter 01 C 언어" +--- + +앞으로 열심히 해보겠습니다. + +# 1 프로그램 + +> 프로그램(program)이란 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 처리 방법과 순서를 기술한 일련의 명령문의 집합체를 의미한다. + +## 1.1 프로그래밍 언어 + +> 프로그래밍 언아(programming language)란 기계(컴퓨터)에게 명령이나 연산을 시킬 목적으로 설계되어 기계와 의사소통을 할 수 있게 해주는 언어를 의미한다. + +### 1.1.1 프로그래밍 언어의 분류 + +- 프로그래밍 언어 + +> 프로그래밍 언어는 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나뉜다. + +> 저급 언어와 고급 언어는 , 기계가 이해하기 쉬운가(저급 언어), 사람이 이해하기 쉬운가(고급 언어)를 상대적으로 나눈 개념이라고 할 수 있다. + +- 저급 언어 + +> 저급 언어는 컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어이다. + +> 저급 언어는 실행 속도가 매우 빠르지만, 사람이 배우기에는 매우 어려워 프로그램의 유지보수가 힘들다. + +> 대표적인 언어로는 기계어(machine language)와 어셈블리어(assembly language) 등이 있다. + +- 고급 언어 + +> 고급 언어는 컴퓨터보다는 사람이 알기 쉽도록 작성된 프로그래밍 언어이다. + +> 고급 언어는 컴파일러나 인터프리터에 의해 기계가 이해 할 수 있는 언어로 번역되어 실행 된다. 저급 언어보다는 상대적으로 실행 속도가 느리지만, 저급 언어에 비해 가독성이 높고 다루기가 쉽다. + +> 대표적으로 자바, 파이썬 등이 있다. + +- C 언어 + +> C 언어는 저급 언어와 고급 언어의 특징을 모두 가지고 있는 절차 지향 프로그래밍 언어(procedure-oriented programming language)이다. + +# 2 C 언어 + +## 1.1 C 언어의 역사 + +> C 언어는 1972년 벨 연구소의 켄 톰프슨(Kenneth Thompson)과 데니스 리치(Dennis Ritchie)가 유닉스(UNIX) 운영체제에서 사용하기 위해 개발한 범용적인 고급 언어이다. + +> A 언어라고 불리는 ALGOL 60부터, CPL, BCPL을 거쳐, +켄 톰프슨이 B 언어를 개발하게 된다. +이후 데니스 리치가 B언어를 좀 더 개선하여 지금의 C 언어를 만들게 된다. +C 언어라는 이름의 유래 또한 B 언어 바로 다음에 개발되어서 명명된 이름이다. + +## 1.2 C 언어의 탄생 배경 + +> C 언어 이전에 유닉스 운영체제는 어셈블리어라는 저급 언어를 사용했다. +하지만 어셈블리어는 특정 하드웨어에 종속적인 언어여서, 이 언어로 작성된 프로그램은 다른 하드웨어로 이식할 수 없었다. 즉, 하나의 기능을 하는 프로그램을 CPU의 종류만큼 여러 번 작성해야만 했던 것이다. +따라서 이식성도 좋고 어셈블리어보다 쉬운 언어가 필요해졌고, +그래서 개발된 언어가 바로 C 언어이다. + +> 현재 널리 사용되는 모든 운영체제의 커널은 대부분 C 언어를 이용해 구현되어 있다. +이처럼 C 언어는 시스템 프로그래밍에 가장 잘 어울리지만, 응용 프로그래밍에도 많이 사용되는 프로그래밍 언어이다. + +## 1.3 C 언어의 특징 + +### 1.3.1 C 언어의 장점 + +1. C 언어로 작성된 프로그램은 다양한 하드웨어로의 이식성이 좋다. + +2. C 언어는 절차 지향 프로그래밍 언어로, 코드가 복잡하지 않아 상대적으로 유지보수가 쉽다. + +3. C 언어는 저급 언어의 특징을 가지고 있으므로, 어셈블리어 수준으로 하드웨어를 제어할 수 있다. + +4. C 언어는 코드가 간결하여, 완성된 프로그램의 크기가 작고 실행 속도가 빠르다. + +### 1.3.2 C 언어의 단점 + +1. C 언어는 저급 언어의 특징을 가지고 있으므로, 자바와 같은 다른 고급 언어보다 배우기가 쉽지 않다. + +2. C 언어는 다른 언어와는 달리 시스템 자원을 직접 제어할 수 있으므로, 프로그래밍하는데 세심한 주의를 기울여야 한다. From 5fce509854cdd7616f3fafbcf8717f7c63773538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=80=EC=B4=9D?= <136239807+EunChong999@users.noreply.github.com> Date: Fri, 1 Dec 2023 23:06:27 +0900 Subject: [PATCH 04/41] =?UTF-8?q?Update=20Chapter=2001=20C=20=EC=96=B8?= =?UTF-8?q?=EC=96=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "_posts/Chapter 01 C \354\226\270\354\226\264" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/_posts/Chapter 01 C \354\226\270\354\226\264" "b/_posts/Chapter 01 C \354\226\270\354\226\264" index 4a236f9a8101..d05343c1fc94 100644 --- "a/_posts/Chapter 01 C \354\226\270\354\226\264" +++ "b/_posts/Chapter 01 C \354\226\270\354\226\264" @@ -3,7 +3,7 @@ layout: single title: "Chapter 01 C 언어" --- -앞으로 열심히 해보겠습니다. +C 언어에 관한 글입니다. # 1 프로그램 From e8458e7a35ed4252f4e9c515797288abcea07018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=80=EC=B4=9D?= <136239807+EunChong999@users.noreply.github.com> Date: Fri, 1 Dec 2023 23:09:55 +0900 Subject: [PATCH 05/41] =?UTF-8?q?Rename=20Chapter=2001=20C=20=EC=96=B8?= =?UTF-8?q?=EC=96=B4=20to=202023-12-01-first.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2023-12-01-first.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "_posts/Chapter 01 C \354\226\270\354\226\264" => _posts/2023-12-01-first.md (100%) diff --git "a/_posts/Chapter 01 C \354\226\270\354\226\264" b/_posts/2023-12-01-first.md similarity index 100% rename from "_posts/Chapter 01 C \354\226\270\354\226\264" rename to _posts/2023-12-01-first.md From dbe39d7b053a7f1b9881e2bbe5e85b478e82b487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=80=EC=B4=9D?= <136239807+EunChong999@users.noreply.github.com> Date: Fri, 1 Dec 2023 23:20:51 +0900 Subject: [PATCH 06/41] Create 2023-12-01-second.md --- _posts/2023-12-01-second.md | 88 +++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 _posts/2023-12-01-second.md diff --git a/_posts/2023-12-01-second.md b/_posts/2023-12-01-second.md new file mode 100644 index 000000000000..58fb292b2b98 --- /dev/null +++ b/_posts/2023-12-01-second.md @@ -0,0 +1,88 @@ +--- +layout: single +title: "Chapter 02 C 프로그래밍" +--- + +C 프로그래밍에 관한 글입니다. + +# 1 프로그래밍(programming) + +> 프로그래밍(programming)이란 목적에 맞는 알고리즘으로부터 프로그래밍 언어를 사용하여 구체적인 프로그램을 작성하는 과정을 의미한다. + +> 작성된 프로그램은 먼저 실행 파일(executable file)로 변환되어야 실행할 수 있다. + +> C 언어에서 실행 파일을 생성하는 순서는 다음 그림과 같다. + +![](https://velog.velcdn.com/images/ecg/post/cd39d837-732c-4c11-a726-4eed99bd3722/image.png) + +1. 소스 파일(source file)의 작성 + +2. 선행처리기(preprocessor)에 의한 선행처리 + +3. 컴파일러(compiler)에 의한 컴파일 + +4. 링커(linker)에 의한 링크 + +5. 실행 파일(executable file)의 생성 + +## 1.1 소스 파일(source file)의 작성 + +> 프로그래밍에서 가장 먼저 해야 할 작업은 바로 프로그램을 작성하는 것이다. + +> C 언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 원시 파일 또는 소스 파일이라고 한다. + +> C 언어를 통해 작성된 소스 파일의 확장자는 .c 가 된다. + +## 1.2 선행처리기(preprocessor)에 의한 선행처리 + +- 선행처리 + +> 선행처리(preprocess)란 소스 파일 중에서도 선행처리 문자(#)로 시작하는 선행처리 지시문의 처리 작업을 의미한다. + +> 선행처리 작업은 선행처리기(preprocessor)가 수행한다. + +> 선행처리기는 코드를 생성하는 것이 아닌, 컴파일하기 전 컴파일러가 작업하기 좋도록 소스를 재구성해주는 역할만을 한다. + +## 1.3 컴파일러(compiler)에 의한 컴파일 + +> 컴퓨터는 0과 1로 이루어진 이진수로 작성된 기계어만을 이해할 수 있다. + +> 소스 파일은 개발자에 의해 C언어로 작성되므로, 컴퓨터는 그것을 바로 이해할 수 없다. + +- 컴파일 + +> 컴파일(compile)이란 소스 파일을 컴퓨터가 알아볼 수 있는 기계어로 변환시키는 작업을 의미한다. + +- 오브젝트 파일 + +> 오브젝트 파일(object file)이란 컴파일러에 의해 수행된 컴파일이 끝나 기계어로 변환된 파일을 의미한다. + +> 이러한 오브젝트 파일의 확장자는 .o 나 .obj 가 된다. + +## 1.4 링커(linker)에 의한 링크 + +> 컴파일러에 의해 생성된 오브젝트 파일은 운영체제와의 인터페이스를 담당하는 시동 코드(start-up code)를 가지고 있지 않다. + +- 시동 코드 + +> 시동 코드(start-up code)란 운영체제와의 인터페이스를 담당하는 코드이다. + +> 또한, 오브젝트 파일은 대부분의 C 프로그램에서 사용하는 C 표준 라이브러리 파일도 포함되어 있지 않다. + +- 링크 + +> 링크(link)란 하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드 등을 합쳐 하나의 파일로 만드는 작업을 의미한다. + +> 링크는 링커(linker)에 의해 수행되며, 링크가 끝나면 하나의 새로운 실행 파일이나 라이브러리 파일이 생성된다. + +- 분할 컴파일 + +> 분할 컴파일이란 여러 개의 소스 파일을 작성하여 최종적으로 링크를 통해 하나의 실행 파일로 만드는 것을 의미한다. + +## 1.5 실행 파일(executable file)의 생성 + +> 소스 파일은 선행처리기, 컴파일러 그리고 링커에 의해 일정한 과정을 거쳐 실행 파일로 변환된다. + +> 최근 사용되는 개발 툴은 대부분 위에서 소개한 선행처리기, 컴파일러, 링커를 모두 내장하고 있으므로, 소스 파일에서 한 번에 실행 파일을 생성해 준다. + +> 이렇게 생성된 실행 파일의 확장자는 .exe 가 된다. From f38db027d264be0ae26707ab9b537874de2a9361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=80=EC=B4=9D?= <136239807+EunChong999@users.noreply.github.com> Date: Fri, 1 Dec 2023 23:24:57 +0900 Subject: [PATCH 07/41] Update _config.yml --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 26e480d2a270..7f586db40571 100644 --- a/_config.yml +++ b/_config.yml @@ -12,7 +12,7 @@ # theme : "minimal-mistakes-jekyll" # remote_theme : "mmistakes/minimal-mistakes" -minimal_mistakes_skin : "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" +minimal_mistakes_skin : "dark" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" # Site Settings locale : "en-US" From c44106e5b1be7fa7e6861fec4075a36e67f36648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9D=80=EC=B4=9D?= <136239807+EunChong999@users.noreply.github.com> Date: Fri, 1 Dec 2023 23:37:15 +0900 Subject: [PATCH 08/41] Create 2023-12-01-third.md --- _posts/2023-12-01-third.md | 171 +++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 _posts/2023-12-01-third.md diff --git a/_posts/2023-12-01-third.md b/_posts/2023-12-01-third.md new file mode 100644 index 000000000000..3c745eba1058 --- /dev/null +++ b/_posts/2023-12-01-third.md @@ -0,0 +1,171 @@ +--- +layout: single +title: "Chapter 03 C 프로그램의 특징" +--- + +C 프로그램의 특징에 관한 글입니다. + +# 1 C 프로그램의 특징 + +> C 언어로 작성된 프로그램이 가지는 일반적인 특징은 다음과 같다. + +1. C 프로그램의 기본 단위는 함수이다. + +2. 함수 내의 각 명령문은 세미콜론(;)으로 끝나야 한다. + +3. C 언어는 대소문자를 구분한다. + +4. C 언어는 자유 형식(free-format)을 허용한다. + +## 1.1 C 프로그램의 기본 단위는 함수이다. + +> C 프로그램은 하나 또는 그 이상의 함수(function)로 이루어진다. + +> 또한, C 언어로 구현되는 모든 프로그램은 반드시 main() 함수를 가지고 있어야 한다. + +> C 프로그램이 실행되면 컴퓨터는 제일 먼저 main() 함수를 찾아서 호출하기 때문이다. + +- 예제 + +```c +#include +#define TEXT "Welcome to C Programming!!" + +int main() +{ + return 0; // main() 함수의 모든 명령문을 수행한 후에는 0을 반환함. +} +``` + +## 1.2 함수 내의 각 명령문은 세미콜론(;)으로 끝나야 한다. + +> 함수는 언제나 기능을 가지고 있어야 한다. + +- 명령문 + +> 명령문(statement)이란 C언어에서 기능을 정의하기 위해 사용되는 문장을 의미한다. + +> 함수 내의 명령문은 언제나 위에서부터 아래로 순차적으로 실행되며, 언제나 세미콜론(;)으로 끝나야 한다. + +- 예제 + +```c +printf("C 언어"); // 정상적으로 출력됨. +printf("C 언어") // 오류가 발생함. +``` + +## 1.3 C언어는 대소문자를 구분한다. + +> C 언어에서 변수나 함수의 이름을 작성할 때나 키워드나 예약어 등을 사용할 때는 대소문자를 정확히 구분하여 사용해야 한다. + +- 예제 + +```c +printf("C 언어"); // 정상적으로 출력됨. +Printf("C 언어") // 오류가 발생함. +``` + +## 1.4 C 언어는 자유 형식(free-format)을 허용한다. + +> C 언어에서는 문법만 맞으면 여러 개의 명령문을 한 줄에 쓸 수도 있고, 하나의 명령문을 여러 줄에 나누어 쓸 수도 있다. + +> 하지만 프로그램의 구조를 한눈에 파악할 수 있도록, 될 수 있으면 들여쓰기 등을 잘 활용해 보기 좋게 작성하는 것이 좋다. + +> 다음 두 예제는 정확히 같은 동작을 수행한다. + +- 예제 + +```c +int func() { printf("C언어는 재밌어요!"); } +``` + +- 예제 + +```c +int func() + +{ + printf("C언어는 재밌어요!"); + +} +``` + +# 2 주석(comments) + +> 주석은 코드에 대한 이해를 돕는 설명을 적거나 디버깅을 위해 작성한다. + +> C 언어 주석의 장점은 프로그램 내의 어디에나 올 수 있다는 점이다. + +## 2.1 주석의 정의 + +> 주석(comment)이란 프로그래머를 위해 소스 코드 상에 직접 기술된 일종의 설명글을 가리킨다. 주석은 컴파일 시 무시되어 프로그램 수행에는 전혀 영향을 미치지 않는다. + +> C 언어의 한 줄 주석은 시작위치에 //을 사용하고, 여러 줄 주석은 /*로 시작해서 반드시 */로 끝나야 한다. + +## 2.2 주석의 종류 + +> C 언어의 한 줄 주석은 시작위치에 //을 사용하고, 여러 줄 주석은 /*로 시작해서 반드시 */로 끝나야 한다. + +- 문법 + +```c +// 한 줄 주석 + +/* 여러 + + 줄 + + 주석 */ +``` + +## 2.3 주석의 중첩 + +> 다음 예제는 여러 줄 주석 안에 또 다른 한 줄 주석을 중첩해서 삽입하는 예제이다. + +- 예제 + +```c +/* 여러 줄 + + // 이렇게 두 줄 주석 안에 또 다른 한 줄 주석을 삽입할 수 있습니다. + +주석입니다. */ +``` + +> 위의 예제처럼 C 언어에서는 여러 줄 주석 안에 또 다른 한 줄 주석은 삽입할 수 있다. + +> 하지만 다음 예제처럼 여러 줄 주석 안에 또 다른 여러 줄 주석은 중첩해서 삽입할 수 없다. + +- 예제 + +```c +① /* 여러 줄 + +② /* 또 다른 여러 줄 주석입니다. */ + +③ 주석입니다. */ +``` + +> 위의 예제처럼 여러 줄 주석 안에 또 다른 여러 줄 주석을 삽입하면, ②번 라인에서 삽입한 주석의 종료 기호(*/)를 ①번 라인에서 시작한 첫 번째 주석이 자신의 종료 기호(*/)로 잘못 인식하게 된다. 위 예제의 ③번 라인은 주석으로 인식되지 못하고, 컴파일 시 오류가 발생하게 된다. + +> C 언어에서 여러 줄 주석은 절대로 중첩해서 사용해서는 안 된다. + +> 다음 예제는 여러 주석을 추가한 예제이다. + +- 예제 + +```c +#include +#define TEXT "Welcome to C Programming!!" + +/* 여기서부터 main() 함수가 시작됨. + + 작성자 : 홍길동 */ + +int main() +{ + printf(TEXT); // printf() 함수는 인수로 전달받은 데이터를 출력해주는 함수임. + return 0; // main() 함수의 모든 명령문을 수행한 후에는 0을 반환함. + +} +``` From 5a598937954bf402dab385a254ff4444c6f7f181 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 17:43:32 +0900 Subject: [PATCH 09/41] =?UTF-8?q?feat=20:=20=EB=A1=9C=EC=BB=AC=20=EC=84=9C?= =?UTF-8?q?=EB=B2=84=20=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 1291498971d7..cb8b26971af0 100644 --- a/Gemfile +++ b/Gemfile @@ -1,2 +1,3 @@ source "https://rubygems.org" -gemspec \ No newline at end of file +gemspec +gem "webrick", "~> 1.8" From 62028b62c04586f73954268663bc37ba31f36098 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 18:19:28 +0900 Subject: [PATCH 10/41] =?UTF-8?q?feat=20:=20=ED=85=8C=EB=A7=88=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A0=9C=EB=AA=A9=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/app.json | 1 + .obsidian/appearance.json | 3 + .obsidian/core-plugins-migration.json | 30 +++++ .obsidian/core-plugins.json | 20 ++++ .obsidian/hotkeys.json | 1 + .obsidian/workspace.json | 160 ++++++++++++++++++++++++++ _config.yml | 6 +- _posts/2023-12-01-second.md | 2 +- 8 files changed, 219 insertions(+), 4 deletions(-) create mode 100644 .obsidian/app.json create mode 100644 .obsidian/appearance.json create mode 100644 .obsidian/core-plugins-migration.json create mode 100644 .obsidian/core-plugins.json create mode 100644 .obsidian/hotkeys.json create mode 100644 .obsidian/workspace.json diff --git a/.obsidian/app.json b/.obsidian/app.json new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ b/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json new file mode 100644 index 000000000000..c8c365d89b8b --- /dev/null +++ b/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "accentColor": "" +} \ No newline at end of file diff --git a/.obsidian/core-plugins-migration.json b/.obsidian/core-plugins-migration.json new file mode 100644 index 000000000000..436f43cf561e --- /dev/null +++ b/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json new file mode 100644 index 000000000000..9405bfdc224d --- /dev/null +++ b/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/.obsidian/hotkeys.json b/.obsidian/hotkeys.json new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ b/.obsidian/hotkeys.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json new file mode 100644 index 000000000000..682d617b6ab8 --- /dev/null +++ b/.obsidian/workspace.json @@ -0,0 +1,160 @@ +{ + "main": { + "id": "714f4911ae7453d7", + "type": "split", + "children": [ + { + "id": "2479c76722abfef4", + "type": "tabs", + "children": [ + { + "id": "bcc96669a83b4c4b", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "_posts/2023-12-01-second.md", + "mode": "source", + "source": false + } + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "9c19c37cdd2c1df7", + "type": "split", + "children": [ + { + "id": "8792780e3c0cf536", + "type": "tabs", + "children": [ + { + "id": "e5a4d8f3d8bcf0d4", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "70aef7345187e503", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "545fb4650a6f6b4d", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "8fdde2d36d733d55", + "type": "split", + "children": [ + { + "id": "dda76e87445e3728", + "type": "tabs", + "children": [ + { + "id": "69a768b02265e6ec", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "_posts/2023-12-01-second.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "4195e1766443cfd3", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "_posts/2023-12-01-second.md", + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "8fede9336240c5ea", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "4cb02b8f1721f042", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "_posts/2023-12-01-second.md" + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "left-ribbon": { + "hiddenItems": { + "switcher:퀵 스위처 열기": false, + "graph:그래프 뷰 열기": false, + "canvas:새 캔버스 만들기": false, + "daily-notes:오늘의 데일리 노트 열기": false, + "templates:템플릿 삽입": false, + "command-palette:명령어 팔레트 열기": false + } + }, + "active": "bcc96669a83b4c4b", + "lastOpenFiles": [ + "_posts/2023-12-01-first.md", + "screenshot-layouts.png", + "무제 파일.md", + "_site/무제 파일.md", + "screenshot.png", + "README.md", + "CHANGELOG.md", + "_posts/2023-12-01-second.md" + ] +} \ No newline at end of file diff --git a/_config.yml b/_config.yml index 7f586db40571..44a3adad733d 100644 --- a/_config.yml +++ b/_config.yml @@ -12,11 +12,11 @@ # theme : "minimal-mistakes-jekyll" # remote_theme : "mmistakes/minimal-mistakes" -minimal_mistakes_skin : "dark" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" +minimal_mistakes_skin : "aqua" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" # Site Settings -locale : "en-US" -title : "Site Title" +locale : "en-US" +title : "EunChong" title_separator : "-" subtitle : # site tagline that appears below site title in masthead name : "Your Name" diff --git a/_posts/2023-12-01-second.md b/_posts/2023-12-01-second.md index 58fb292b2b98..3d6829522d5a 100644 --- a/_posts/2023-12-01-second.md +++ b/_posts/2023-12-01-second.md @@ -1,6 +1,6 @@ --- layout: single -title: "Chapter 02 C 프로그래밍" +title: Chapter 02 C 프로그래밍 --- C 프로그래밍에 관한 글입니다. From 52fb2cbfd5b64f0c233838930f6ed0a9e2b79598 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 19:57:08 +0900 Subject: [PATCH 11/41] =?UTF-8?q?test=20:=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 68 +++++++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 682d617b6ab8..fbe47dfbccf7 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,12 +11,8 @@ "id": "bcc96669a83b4c4b", "type": "leaf", "state": { - "type": "markdown", - "state": { - "file": "_posts/2023-12-01-second.md", - "mode": "source", - "source": false - } + "type": "empty", + "state": {} } } ] @@ -85,7 +81,6 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-01-second.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +97,6 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-01-second.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -124,9 +118,7 @@ "type": "leaf", "state": { "type": "outline", - "state": { - "file": "_posts/2023-12-01-second.md" - } + "state": {} } } ] @@ -148,13 +140,51 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ - "_posts/2023-12-01-first.md", - "screenshot-layouts.png", - "무제 파일.md", - "_site/무제 파일.md", - "screenshot.png", - "README.md", - "CHANGELOG.md", - "_posts/2023-12-01-second.md" + "_site/staticman.yml", + "_site/screenshot.png", + "_site/screenshot-layouts.png", + "_site/minimal-mistakes-jekyll.gemspec", + "_site/third/index.html", + "_site/third", + "_site/second/index.html", + "_site/second", + "_site/first/index.html", + "_site/first", + "_site/banner.js", + "_site/assets/js/main.min.js", + "_site/assets/js/lunr/lunr.min.js", + "test/assets/images/unsplash-image-9.jpg", + "test/assets/images/unsplash-image-8.jpg", + "test/assets/images/unsplash-image-7.jpg", + "test/assets/images/unsplash-image-6.jpg", + "test/assets/images/unsplash-image-5.jpg", + "test/assets/images/unsplash-image-4.jpg", + "test/assets/images/unsplash-image-3.jpg", + "test/assets/images/unsplash-image-2.jpg", + "test/_recipes/peanut-butter-cookies.md", + "test/_recipes/oatmeal-cookies.md", + "test/_recipes/chocolate-chip-cookies.md", + "test/_posts/2017-11-28-post-exclude-search.md", + "test/_posts/2017-01-23-layout-header-video.md", + "test/_posts/2016-02-24-welcome-to-jekyll.md", + "test/_posts/2013-08-16-markup-syntax-highlighting.md", + "test/_posts/2013-05-22-markup-more-images.md", + "test/_posts/2013-01-11-markup-html-tags-and-formatting.md", + "test/_posts/2013-01-10-markup-image-alignment.md", + "test/_posts/2013-01-09-markup-text-alignment.md", + "test/_posts/2013-01-05-markup-title-with-special-characters.md", + "test/_posts/2013-01-05-markup-title-with-markup.md", + "test/_posts/2012-05-22-markup-text-readability.md", + "test/_posts/2012-03-15-layout-sidebar-nav-list.md", + "test/_posts/2012-05-22-markup-text-readability-wide-page.md", + "test/_posts/2012-03-15-layout-sidebar-custom.md", + "test/_posts/2012-03-15-layout-header-overlay-image-tagline.md", + "test/_posts/2012-03-15-layout-header-overlay-image.md", + "test/_posts/2012-03-15-layout-more-tag.md", + "test/_posts/2012-03-15-layout-header-image-vertical.md", + "test/_posts/2012-03-15-layout-header-overlay-color.md", + "test/_posts/2012-03-15-layout-header-image-text-readability.md", + "test/_posts/2012-03-15-layout-header-image-horizontal.md", + "test/_posts/2012-03-15-layout-header-image-external.md" ] } \ No newline at end of file From c49c56de079ca4f4e5a35b2f45fb024ed1b9654e Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 20:01:15 +0900 Subject: [PATCH 12/41] =?UTF-8?q?feat=20:=20=EC=A0=9C=EB=AA=A9=20=EB=B0=8F?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 16 ++++++++++++---- _config.yml | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index fbe47dfbccf7..23a37d7ac811 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,8 +11,12 @@ "id": "bcc96669a83b4c4b", "type": "leaf", "state": { - "type": "empty", - "state": {} + "type": "markdown", + "state": { + "file": "_posts/2023-12-01-third.md", + "mode": "source", + "source": false + } } } ] @@ -81,6 +85,7 @@ "state": { "type": "backlink", "state": { + "file": "_posts/2023-12-01-third.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -97,6 +102,7 @@ "state": { "type": "outgoing-link", "state": { + "file": "_posts/2023-12-01-third.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -118,7 +124,9 @@ "type": "leaf", "state": { "type": "outline", - "state": {} + "state": { + "file": "_posts/2023-12-01-third.md" + } } } ] @@ -140,6 +148,7 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ + "_posts/2023-12-01-second.md", "_site/staticman.yml", "_site/screenshot.png", "_site/screenshot-layouts.png", @@ -152,7 +161,6 @@ "_site/first", "_site/banner.js", "_site/assets/js/main.min.js", - "_site/assets/js/lunr/lunr.min.js", "test/assets/images/unsplash-image-9.jpg", "test/assets/images/unsplash-image-8.jpg", "test/assets/images/unsplash-image-7.jpg", diff --git a/_config.yml b/_config.yml index 44a3adad733d..e1ba4fc3f7b4 100644 --- a/_config.yml +++ b/_config.yml @@ -16,10 +16,10 @@ minimal_mistakes_skin : "aqua" # "air", "aqua", "contrast", "dark", "dirt", " # Site Settings locale : "en-US" -title : "EunChong" +title : "Blog" title_separator : "-" subtitle : # site tagline that appears below site title in masthead -name : "Your Name" +name : "EunChong" description : "An amazing website." url : "https://EunChong999.github.io" baseurl : # the subpath of your site, e.g. "/blog" From 25b2b29a2e8a734eb8573fd91e23aa9173ecbb03 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 20:07:51 +0900 Subject: [PATCH 13/41] =?UTF-8?q?feat=20:=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_config.yml b/_config.yml index e1ba4fc3f7b4..8ca61875e169 100644 --- a/_config.yml +++ b/_config.yml @@ -20,7 +20,7 @@ title : "Blog" title_separator : "-" subtitle : # site tagline that appears below site title in masthead name : "EunChong" -description : "An amazing website." +description : "Study & Develop" url : "https://EunChong999.github.io" baseurl : # the subpath of your site, e.g. "/blog" repository : # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes" @@ -104,10 +104,10 @@ analytics: # Site Author author: - name : "Your Name" + name : "EunChong" avatar : # path of avatar image, e.g. "/assets/images/bio-photo.jpg" - bio : "I am an **amazing** person." - location : "Somewhere" + bio : "Study & Develop" + # location : "Somewhere" email : links: - label: "Email" From c684e485ee2f139e527bad2ef5459ed9bf83943e Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 20:53:51 +0900 Subject: [PATCH 14/41] =?UTF-8?q?feat=20:=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 14 +++++++------- _config.yml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 23a37d7ac811..900f0295789a 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-01-third.md", + "file": "_posts/2023-12-01-second.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-01-third.md", + "file": "_posts/2023-12-01-second.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-01-third.md", + "file": "_posts/2023-12-01-second.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-01-third.md" + "file": "_posts/2023-12-01-second.md" } } } @@ -148,6 +148,8 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ + "_posts/2023-12-01-third.md", + "Gemfile.lock", "_posts/2023-12-01-second.md", "_site/staticman.yml", "_site/screenshot.png", @@ -160,7 +162,6 @@ "_site/first/index.html", "_site/first", "_site/banner.js", - "_site/assets/js/main.min.js", "test/assets/images/unsplash-image-9.jpg", "test/assets/images/unsplash-image-8.jpg", "test/assets/images/unsplash-image-7.jpg", @@ -192,7 +193,6 @@ "test/_posts/2012-03-15-layout-header-image-vertical.md", "test/_posts/2012-03-15-layout-header-overlay-color.md", "test/_posts/2012-03-15-layout-header-image-text-readability.md", - "test/_posts/2012-03-15-layout-header-image-horizontal.md", - "test/_posts/2012-03-15-layout-header-image-external.md" + "test/_posts/2012-03-15-layout-header-image-horizontal.md" ] } \ No newline at end of file diff --git a/_config.yml b/_config.yml index 8ca61875e169..44aebc4abd1d 100644 --- a/_config.yml +++ b/_config.yml @@ -12,7 +12,7 @@ # theme : "minimal-mistakes-jekyll" # remote_theme : "mmistakes/minimal-mistakes" -minimal_mistakes_skin : "aqua" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" +minimal_mistakes_skin : "dark" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" # Site Settings locale : "en-US" From 84b8ee43d6d7cd18be81fcedb188de40573e96d9 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 21:05:18 +0900 Subject: [PATCH 15/41] =?UTF-8?q?feat=20:=20=ED=8C=8C=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 32 ++-- .../Chapter 01 C \354\226\270\354\226\264.md" | 0 ...34\352\267\270\353\236\230\353\260\215.md" | 0 ...0\354\235\230 \355\212\271\354\247\225.md" | 2 +- ...r 04 printf() \355\225\250\354\210\230.md" | 167 ++++++++++++++++++ 5 files changed, 184 insertions(+), 17 deletions(-) rename _posts/2023-12-01-first.md => "_posts/Chapter 01 C \354\226\270\354\226\264.md" (100%) rename _posts/2023-12-01-second.md => "_posts/Chapter 02 C \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" (100%) rename _posts/2023-12-01-third.md => "_posts/Chapter 03 C \355\224\204\353\241\234\352\267\270\353\236\250\354\235\230 \355\212\271\354\247\225.md" (99%) create mode 100644 "_posts/Chapter 04 printf() \355\225\250\354\210\230.md" diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 900f0295789a..4db3fcb236dc 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-01-second.md", + "file": "_posts/Chapter 01 C 언어.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-01-second.md", + "file": "_posts/Chapter 01 C 언어.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-01-second.md", + "file": "_posts/Chapter 01 C 언어.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-01-second.md" + "file": "_posts/Chapter 01 C 언어.md" } } } @@ -148,20 +148,22 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ - "_posts/2023-12-01-third.md", + "_posts/Chapter 02 C 프로그래밍.md", + "_posts/Chapter 03 C 프로그램의 특징.md", + "_posts/Chapter 04 printf() 함수.md", + "_posts/Chapter 01 C 언어.md", + "_site/Chapter-03-C-프로그램의-특징/index.html", + "_site/Chapter-03-C-프로그램의-특징", + "_site/Chapter-02-C-프로그래밍/index.html", + "_site/Chapter-02-C-프로그래밍", + "_site/Chapter-01-C-언어/index.html", + "_site/Chapter-01-C-언어", + "banner.js", "Gemfile.lock", - "_posts/2023-12-01-second.md", "_site/staticman.yml", "_site/screenshot.png", "_site/screenshot-layouts.png", "_site/minimal-mistakes-jekyll.gemspec", - "_site/third/index.html", - "_site/third", - "_site/second/index.html", - "_site/second", - "_site/first/index.html", - "_site/first", - "_site/banner.js", "test/assets/images/unsplash-image-9.jpg", "test/assets/images/unsplash-image-8.jpg", "test/assets/images/unsplash-image-7.jpg", @@ -191,8 +193,6 @@ "test/_posts/2012-03-15-layout-header-overlay-image.md", "test/_posts/2012-03-15-layout-more-tag.md", "test/_posts/2012-03-15-layout-header-image-vertical.md", - "test/_posts/2012-03-15-layout-header-overlay-color.md", - "test/_posts/2012-03-15-layout-header-image-text-readability.md", - "test/_posts/2012-03-15-layout-header-image-horizontal.md" + "test/_posts/2012-03-15-layout-header-overlay-color.md" ] } \ No newline at end of file diff --git a/_posts/2023-12-01-first.md "b/_posts/Chapter 01 C \354\226\270\354\226\264.md" similarity index 100% rename from _posts/2023-12-01-first.md rename to "_posts/Chapter 01 C \354\226\270\354\226\264.md" diff --git a/_posts/2023-12-01-second.md "b/_posts/Chapter 02 C \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" similarity index 100% rename from _posts/2023-12-01-second.md rename to "_posts/Chapter 02 C \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" diff --git a/_posts/2023-12-01-third.md "b/_posts/Chapter 03 C \355\224\204\353\241\234\352\267\270\353\236\250\354\235\230 \355\212\271\354\247\225.md" similarity index 99% rename from _posts/2023-12-01-third.md rename to "_posts/Chapter 03 C \355\224\204\353\241\234\352\267\270\353\236\250\354\235\230 \355\212\271\354\247\225.md" index 3c745eba1058..5a1266028ad0 100644 --- a/_posts/2023-12-01-third.md +++ "b/_posts/Chapter 03 C \355\224\204\353\241\234\352\267\270\353\236\250\354\235\230 \355\212\271\354\247\225.md" @@ -1,6 +1,6 @@ --- layout: single -title: "Chapter 03 C 프로그램의 특징" +title: Chapter 03 C 프로그램의 특징 --- C 프로그램의 특징에 관한 글입니다. diff --git "a/_posts/Chapter 04 printf() \355\225\250\354\210\230.md" "b/_posts/Chapter 04 printf() \355\225\250\354\210\230.md" new file mode 100644 index 000000000000..e07660c7d25a --- /dev/null +++ "b/_posts/Chapter 04 printf() \355\225\250\354\210\230.md" @@ -0,0 +1,167 @@ +--- +layout: single +title: Chapter 04 printf() 함수 +--- +# 1 C 언어 표준 입출력 함수 + +> 사용자가 프로그램과 대화하기 위해 사용하는 함수를 입출력 함수 또는 I/O 함수라고 한다. +printf() 함수와 scanf() 함수는 C언어 표준 입출력 함수 중 에서도 가장 많이 사용되는 대표적인 입출력 함수이다. + +## 1.1 출력 함수(printf)의 사용법 + +> printf() 함수는 C 언어의 표준 출력 함수로, 여러 종류의 데이터(data)를 다양한 서식에 맞춰 출력할 수 있게 해준다. + +> printf() 함수의 원형은 다음과 같다. + +- 함수 원형 + +```c +#include +int printf(const char * restrict format, ...); +``` + +> printf() 함수의 f는 formatted의 약자이며, 서식화된 출력을 지원한다는 의미이다. + +> 이 함수는 출력할 데이터를 어떤 서식에 맞춰 출력할지 서식 지정자(format specifier)를 통해 직접 지정할 수 있다. + +- 예제 + +```c +printf("printf() 함수는 서식 지정자를 통해 출력할 데이터의 서식을 지정할 수 있습니다!\n"); +printf("변수에 저장된 숫자는 %d입니다.", 10); +``` + +- 실행 결과 + +```c +printf() 함수는 서식 지정자를 통해 출력할 데이터의 서식을 지정할 수 있습니다! +변수에 저장된 숫자는 10입니다. +``` + +> 위의 예제에서는 int형 데이터를 나타내기 위해서 '%d'라는 서식 지정자를 사용했다. +또한, 줄 바꿈은 '\n'라는 이스케이프 시퀀스를 사용하여 표현하고 있다. + +## 1.2 이스케이프 시퀀스(escape sequence) + +> 이스케이프 시퀀스(escape sequence)란 컴퓨터와 주변 기기의 상태를 +바꾸는 데에 쓰이는 일련의 문자열을 의미한다. +이스케이프 시퀀스는 프로그램의 결과가 화면에 출력될 때 사용하게 될 특수한 문자를 위해 만들어졌다. + +> C언어에서 사용되는 이스케이프 시퀀스는 다음과 같다. + +![](https://velog.velcdn.com/images/ecg/post/512d0512-862b-4b0d-8fae-f706261f1190/image.png) + +> 이스케이프 시퀀스 중에서 '\f'와 '\v'는 프린터로 출력할 때에만 의미를 가진다. + + +- 예제 + +```c +printf("C언어에서 사용하는 \"특수 문자\"에는 여러가지가 있습니다.\n"); +printf("\t특수 문자의 바로 앞에는 언제나 \\가 와야 합니다."); +``` + +- 실행 결과 + +```c +C언어에서 사용하는 "특수 문자"에는 여러가지가 있습니다. + 특수 문자의 바로 앞에는 언제나 \가 와야 합니다. +``` + +## 1.3 서식 지정자(format specifier) + +> 서식 지정자(format specifier)란 컴퓨터가 어떤 정보를 어떻게 해석할 건지를 지정해주는 걸 의미한다. +printf() 함수에서는 이러한 서식 지정자를 통해 출력할 데이터의 서식을 사용자가 직접 지정할 수 있다. + +> C언어에서 사용되는 대표적인 서식 지정자는 다음과 같다. + +![](https://velog.velcdn.com/images/ecg/post/9510eedb-bbcd-49c6-a41f-8194fbc11ee7/image.png) + +- 예제 + +```c +printf("%%c를 사용한 결과 : %c\n", 'a'); // 문자 +printf("%%s를 사용한 결과 : %s\n", "즐거운 C언어"); // 문자열 + +printf("%%f를 사용한 결과 : %f\n", 0.123456); +printf("%%f를 사용한 결과 : %f\n", 0.123456789); // 소수점 6자리까지만 표현 + +printf("%%o를 사용한 결과 : %o\n", 123); // 8진 정수 +printf("%%x를 사용한 결과 : %x\n", 123); // 16진 정수 + +printf("%%g를 사용한 결과 : %g\n", 0.001234); // 값에 따라 %f나 %e +printf("%%g를 사용한 결과 : %g\n", 0.00001234); // 값에 따라 %f나 %e +printf("%%G를 사용한 결과 : %G\n", 0.000001234); // 값에 따라 %f나 %E +``` + +- 실행 결과 + +```c +%c를 사용한 결과 : a +%s를 사용한 결과 : 즐거운 C언어 +%f를 사용한 결과 : 0.123456 +%f를 사용한 결과 : 0.123457 +%o를 사용한 결과 : 173 +%x를 사용한 결과 : 7b +%g를 사용한 결과 : 0.001234 +%g를 사용한 결과 : 1.234e-05 +%G를 사용한 결과 : 1.234E-06 +``` + +### 1.3.1 서식 지정자의 동시 사용 + +> 여러 개의 서식 지정자를 동시에 사용하여, 여러 개의 데이터에 서로 다른 서식을 지정해 출력할 수 있다. +단, 이때 서식 지정자의 순서와 타입은 출력할 데이터의 순서와 타입과 반드시 일치해야 한다. + +- 예제 + + +```c +printf("저장된 정수는 %d이며, 저장된 문자열은 %s입니다.\n", 123, "C언어"); +``` + +- 실행 결과 + +```c +저장된 정수는 123이며, 저장된 문자열은 C언어입니다. +``` + +### 1.3.2 출력 필드의 폭 설정 + +> 서식 지정자의 '%'기호와 타입을 나타내는 영문자 사이에 숫자를 추가하여 출력되는 필드의 폭을 직접 설정할 수 있다. + +> 내부의 숫자는 오른쪽 정렬이 기본이며, 숫자 앞에 '-'기호를 붙이면 왼쪽 정렬로 변경된다. +또한, 숫자 앞에 '+'기호를 붙이면 숫자를 오른쪽 정렬한 상태에서 +양수에는 '+'기호를, 음수에는 '-'기호를 붙여서 출력한다. +이때 소수 부분의 숫자는 출력되는 소수의 자릿수를 명시한다. + +- 예제 + +```c +printf(" %%d를 사용한 결과 : |%d|\n", 123); +printf(" %%7d를 사용한 결과 : |%7d|\n", 123); +printf(" %%+7d를 사용한 결과 : |%+7d|\n", 123); +printf(" %%-7d를 사용한 결과 : |%-7d|\n\n", 123); + + +printf(" %%f를 사용한 결과 : |%f|\n", 1.23); +printf(" %%.1f를 사용한 결과 : |%.1f|\n", 1.23); +printf(" %%7.2f를 사용한 결과 : |%7.2f|\n", 1.23); +printf("%%+7.2f를 사용한 결과 : |%+7.2f|\n", 1.23); +printf("%%-7.2f를 사용한 결과 : |%-7.2f|\n\n", 1.23); +``` + +- 실행 결과 + +```c + %d를 사용한 결과 : |123| + %7d를 사용한 결과 : | 123| + %+7d를 사용한 결과 : | +123| + %-7d를 사용한 결과 : |123 | + + %f를 사용한 결과 : |1.230000| + %.1f를 사용한 결과 : |1.2| + %7.2f를 사용한 결과 : | 1.23| +%+7.2f를 사용한 결과 : | +1.23| +%-7.2f를 사용한 결과 : |1.23 | +``` \ No newline at end of file From 4bc10217279000a079708813d5b15fde185308fb Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 21:07:53 +0900 Subject: [PATCH 16/41] =?UTF-8?q?feat=20:=20=ED=8C=8C=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 22 +++++++++---------- .../Chapter-01-C-\354\226\270\354\226\264.md" | 0 ...34\352\267\270\353\236\230\353\260\215.md" | 0 ...0\354\235\230-\355\212\271\354\247\225.md" | 0 ...r-04-printf()-\355\225\250\354\210\230.md" | 0 5 files changed, 11 insertions(+), 11 deletions(-) rename "_posts/Chapter 01 C \354\226\270\354\226\264.md" => "_posts/Chapter-01-C-\354\226\270\354\226\264.md" (100%) rename "_posts/Chapter 02 C \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" => "_posts/Chapter-02-C-\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" (100%) rename "_posts/Chapter 03 C \355\224\204\353\241\234\352\267\270\353\236\250\354\235\230 \355\212\271\354\247\225.md" => "_posts/Chapter-03-C-\355\224\204\353\241\234\352\267\270\353\236\250\354\235\230-\355\212\271\354\247\225.md" (100%) rename "_posts/Chapter 04 printf() \355\225\250\354\210\230.md" => "_posts/Chapter-04-printf()-\355\225\250\354\210\230.md" (100%) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 4db3fcb236dc..6f911d0839e4 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Chapter 01 C 언어.md", + "file": "_posts/Chapter-04-printf()-함수.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Chapter 01 C 언어.md", + "file": "_posts/Chapter-04-printf()-함수.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Chapter 01 C 언어.md", + "file": "_posts/Chapter-04-printf()-함수.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Chapter 01 C 언어.md" + "file": "_posts/Chapter-04-printf()-함수.md" } } } @@ -148,9 +148,13 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ - "_posts/Chapter 02 C 프로그래밍.md", - "_posts/Chapter 03 C 프로그램의 특징.md", + "_posts/Chapter-03-C-프로그램의-특징.md", + "_posts/Chapter-02-C-프로그래밍.md", + "_posts/Chapter-01-C-언어.md", "_posts/Chapter 04 printf() 함수.md", + "_posts/Chapter-04-printf()-함수.md", + "_posts/Chapter 03 C 프로그램의 특징.md", + "_posts/Chapter 02 C 프로그래밍.md", "_posts/Chapter 01 C 언어.md", "_site/Chapter-03-C-프로그램의-특징/index.html", "_site/Chapter-03-C-프로그램의-특징", @@ -189,10 +193,6 @@ "test/_posts/2012-03-15-layout-sidebar-nav-list.md", "test/_posts/2012-05-22-markup-text-readability-wide-page.md", "test/_posts/2012-03-15-layout-sidebar-custom.md", - "test/_posts/2012-03-15-layout-header-overlay-image-tagline.md", - "test/_posts/2012-03-15-layout-header-overlay-image.md", - "test/_posts/2012-03-15-layout-more-tag.md", - "test/_posts/2012-03-15-layout-header-image-vertical.md", - "test/_posts/2012-03-15-layout-header-overlay-color.md" + "test/_posts/2012-03-15-layout-header-overlay-image-tagline.md" ] } \ No newline at end of file diff --git "a/_posts/Chapter 01 C \354\226\270\354\226\264.md" "b/_posts/Chapter-01-C-\354\226\270\354\226\264.md" similarity index 100% rename from "_posts/Chapter 01 C \354\226\270\354\226\264.md" rename to "_posts/Chapter-01-C-\354\226\270\354\226\264.md" diff --git "a/_posts/Chapter 02 C \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" "b/_posts/Chapter-02-C-\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" similarity index 100% rename from "_posts/Chapter 02 C \355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" rename to "_posts/Chapter-02-C-\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" diff --git "a/_posts/Chapter 03 C \355\224\204\353\241\234\352\267\270\353\236\250\354\235\230 \355\212\271\354\247\225.md" "b/_posts/Chapter-03-C-\355\224\204\353\241\234\352\267\270\353\236\250\354\235\230-\355\212\271\354\247\225.md" similarity index 100% rename from "_posts/Chapter 03 C \355\224\204\353\241\234\352\267\270\353\236\250\354\235\230 \355\212\271\354\247\225.md" rename to "_posts/Chapter-03-C-\355\224\204\353\241\234\352\267\270\353\236\250\354\235\230-\355\212\271\354\247\225.md" diff --git "a/_posts/Chapter 04 printf() \355\225\250\354\210\230.md" "b/_posts/Chapter-04-printf()-\355\225\250\354\210\230.md" similarity index 100% rename from "_posts/Chapter 04 printf() \355\225\250\354\210\230.md" rename to "_posts/Chapter-04-printf()-\355\225\250\354\210\230.md" From daf467f6d3793d4fb962520b0780dbbcf3addab6 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 2 Dec 2023 23:36:45 +0900 Subject: [PATCH 17/41] =?UTF-8?q?feat=20:=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 100 +++-- _config.yml | 45 ++- _data/navigation.yml | 6 +- _pages/category-archive.md | 7 + _pages/tag-archive.md | 7 + .../2023-12-01-1.md | 2 + .../2023-12-01-2.md | 2 + .../2023-12-01-3.md | 2 + .../2023-12-02-1.md | 5 + _posts/2023-12-02-2.md | 136 +++++++ _posts/2023-12-02-3.md | 158 ++++++++ _posts/2023-12-02-4.md | 56 +++ _posts/2023-12-02-5.md | 165 ++++++++ _posts/2023-12-02-6.md | 248 ++++++++++++ _posts/2023-12-02-7.md | 97 +++++ _posts/2023-12-02-8.md | 46 +++ _posts/2023-12-02-9.md | 84 ++++ _posts/2023-12-02-91.md | 40 ++ _posts/2023-12-02-92.md | 54 +++ _posts/2023-12-02-93.md | 61 +++ _posts/2023-12-02-94.md | 118 ++++++ _posts/2023-12-02-95.md | 362 ++++++++++++++++++ assets/images/DEV.png | Bin 0 -> 28682 bytes 23 files changed, 1724 insertions(+), 77 deletions(-) create mode 100644 _pages/category-archive.md create mode 100644 _pages/tag-archive.md rename "_posts/Chapter-01-C-\354\226\270\354\226\264.md" => _posts/2023-12-01-1.md (99%) rename "_posts/Chapter-02-C-\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" => _posts/2023-12-01-2.md (99%) rename "_posts/Chapter-03-C-\355\224\204\353\241\234\352\267\270\353\236\250\354\235\230-\355\212\271\354\247\225.md" => _posts/2023-12-01-3.md (99%) rename "_posts/Chapter-04-printf()-\355\225\250\354\210\230.md" => _posts/2023-12-02-1.md (98%) create mode 100644 _posts/2023-12-02-2.md create mode 100644 _posts/2023-12-02-3.md create mode 100644 _posts/2023-12-02-4.md create mode 100644 _posts/2023-12-02-5.md create mode 100644 _posts/2023-12-02-6.md create mode 100644 _posts/2023-12-02-7.md create mode 100644 _posts/2023-12-02-8.md create mode 100644 _posts/2023-12-02-9.md create mode 100644 _posts/2023-12-02-91.md create mode 100644 _posts/2023-12-02-92.md create mode 100644 _posts/2023-12-02-93.md create mode 100644 _posts/2023-12-02-94.md create mode 100644 _posts/2023-12-02-95.md create mode 100644 assets/images/DEV.png diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 6f911d0839e4..202c89902cbc 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,12 +11,8 @@ "id": "bcc96669a83b4c4b", "type": "leaf", "state": { - "type": "markdown", - "state": { - "file": "_posts/Chapter-04-printf()-함수.md", - "mode": "source", - "source": false - } + "type": "empty", + "state": {} } } ] @@ -85,7 +81,6 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Chapter-04-printf()-함수.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +97,6 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Chapter-04-printf()-함수.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -124,9 +118,7 @@ "type": "leaf", "state": { "type": "outline", - "state": { - "file": "_posts/Chapter-04-printf()-함수.md" - } + "state": {} } } ] @@ -148,51 +140,51 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ - "_posts/Chapter-03-C-프로그램의-특징.md", - "_posts/Chapter-02-C-프로그래밍.md", - "_posts/Chapter-01-C-언어.md", - "_posts/Chapter 04 printf() 함수.md", - "_posts/Chapter-04-printf()-함수.md", - "_posts/Chapter 03 C 프로그램의 특징.md", - "_posts/Chapter 02 C 프로그래밍.md", - "_posts/Chapter 01 C 언어.md", - "_site/Chapter-03-C-프로그램의-특징/index.html", - "_site/Chapter-03-C-프로그램의-특징", - "_site/Chapter-02-C-프로그래밍/index.html", - "_site/Chapter-02-C-프로그래밍", - "_site/Chapter-01-C-언어/index.html", - "_site/Chapter-01-C-언어", - "banner.js", - "Gemfile.lock", - "_site/staticman.yml", + "_site/language/3/index.html", + "_site/language/3", + "_site/language/4/index.html", + "_site/language/4", + "_site/language/5/index.html", + "_site/language/5", + "_site/language/7/index.html", + "_site/language/7", + "_site/language/6/index.html", + "_site/language/6", + "_site/language/8/index.html", + "_site/_pages/tag-archive.md", + "_pages/tag-archive.md", + "_posts/2023-12-02-95.md", + "_posts/2023-12-02-94.md", + "_posts/2023-12-02-93.md", + "_posts/2023-12-02-92.md", + "_posts/2023-12-02-91.md", + "_posts/2023-12-02-10.md", + "_posts/2023-12-02-9-1.md", + "_posts/2023-12-02-9.md", + "_posts/2023-12-02-8.md", + "_posts/2023-12-02-7.md", + "_posts/2023-12-02-14.md", + "_posts/2023-12-02-13.md", + "_posts/2023-12-02-12.md", + "_posts/2023-12-02-11.md", + "_posts/2023-12-02-6.md", + "_posts/2023-12-02-5.md", + "_posts/2023-12-02-4.md", + "_posts/2023-12-02-3.md", + "_site/_pages/category-archive.md", + "_pages/category-archive.md", + "_site/assets/images/DEV.png", + "assets/images/DEV.png", + "_site/assets/images/d76c4a17-9336-4f69-acb5-1a5352a99ef7.png", + "assets/images/d76c4a17-9336-4f69-acb5-1a5352a99ef7.png", + "_site/assets/images/a788cc85-0df7-4225-8137-5612f739a97c.png", + "assets/images/a788cc85-0df7-4225-8137-5612f739a97c.png", + "_posts/2023-12-02-15.md", + "_posts/2023-12-02-2.md", + "_posts/2023-12-02-1.md", "_site/screenshot.png", "_site/screenshot-layouts.png", - "_site/minimal-mistakes-jekyll.gemspec", "test/assets/images/unsplash-image-9.jpg", - "test/assets/images/unsplash-image-8.jpg", - "test/assets/images/unsplash-image-7.jpg", - "test/assets/images/unsplash-image-6.jpg", - "test/assets/images/unsplash-image-5.jpg", - "test/assets/images/unsplash-image-4.jpg", - "test/assets/images/unsplash-image-3.jpg", - "test/assets/images/unsplash-image-2.jpg", - "test/_recipes/peanut-butter-cookies.md", - "test/_recipes/oatmeal-cookies.md", - "test/_recipes/chocolate-chip-cookies.md", - "test/_posts/2017-11-28-post-exclude-search.md", - "test/_posts/2017-01-23-layout-header-video.md", - "test/_posts/2016-02-24-welcome-to-jekyll.md", - "test/_posts/2013-08-16-markup-syntax-highlighting.md", - "test/_posts/2013-05-22-markup-more-images.md", - "test/_posts/2013-01-11-markup-html-tags-and-formatting.md", - "test/_posts/2013-01-10-markup-image-alignment.md", - "test/_posts/2013-01-09-markup-text-alignment.md", - "test/_posts/2013-01-05-markup-title-with-special-characters.md", - "test/_posts/2013-01-05-markup-title-with-markup.md", - "test/_posts/2012-05-22-markup-text-readability.md", - "test/_posts/2012-03-15-layout-sidebar-nav-list.md", - "test/_posts/2012-05-22-markup-text-readability-wide-page.md", - "test/_posts/2012-03-15-layout-sidebar-custom.md", - "test/_posts/2012-03-15-layout-header-overlay-image-tagline.md" + "test/assets/images/unsplash-image-8.jpg" ] } \ No newline at end of file diff --git a/_config.yml b/_config.yml index 44aebc4abd1d..92d48536d14a 100644 --- a/_config.yml +++ b/_config.yml @@ -15,19 +15,19 @@ minimal_mistakes_skin : "dark" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" # Site Settings -locale : "en-US" -title : "Blog" -title_separator : "-" -subtitle : # site tagline that appears below site title in masthead -name : "EunChong" -description : "Study & Develop" +locale : "ko-KR" +title : "DEVLOG" +title_separator : "|" +subtitle : "HELLO, WORLD!" +name : "EUNCHONG" +description : "DON’T WORRY IF IT DOESN’T WORK RIGHT. IF EVERYTHING DID, YOU’D BE OUT OF A JOB" url : "https://EunChong999.github.io" baseurl : # the subpath of your site, e.g. "/blog" repository : # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes" teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png" -logo : # path of logo image to display in the masthead, e.g. "/assets/images/88x88.png" +logo : "/assets/images/DEV.png" masthead_title : # overrides the website title displayed in the masthead, use " " for no title -# breadcrumbs : false # true, false (default) +breadcrumbs : true # true, false (default) words_per_minute : 200 comments: provider : # false (default), "disqus", "discourse", "facebook", "staticman", "staticman_v2", "utterances", "giscus", "custom" @@ -104,10 +104,10 @@ analytics: # Site Author author: - name : "EunChong" + name : "EUNCHONG" avatar : # path of avatar image, e.g. "/assets/images/bio-photo.jpg" - bio : "Study & Develop" - # location : "Somewhere" + bio : “DON’T WORRY IF IT DOESN’T WORK RIGHT. IF EVERYTHING DID, YOU’D BE OUT OF A JOB” + location : "South Korea" email : links: - label: "Email" @@ -257,16 +257,16 @@ tag_archive: type: liquid path: /tags/ # https://github.com/jekyll/jekyll-archives -# jekyll-archives: -# enabled: -# - categories -# - tags -# layouts: -# category: archive-taxonomy -# tag: archive-taxonomy -# permalinks: -# category: /categories/:name/ -# tag: /tags/:name/ +jekyll-archives: + enabled: + - categories + - tags + layouts: + category: archive-taxonomy + tag: archive-taxonomy + permalinks: + category: /categories/:name/ + tag: /tags/:name/ # HTML Compression @@ -290,3 +290,6 @@ defaults: comments: # true share: true related: true + show_date : true + +date_format: "%Y-%m-%d" \ No newline at end of file diff --git a/_data/navigation.yml b/_data/navigation.yml index 6f30866f3bed..47035a2645d8 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -1,7 +1,9 @@ # main links main: - - title: "Quick-Start Guide" - url: https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/ +- title : "Category" + url : /categories/ +- title : "Tag" + url : /tags/ # - title: "About" # url: https://mmistakes.github.io/minimal-mistakes/about/ # - title: "Sample Posts" diff --git a/_pages/category-archive.md b/_pages/category-archive.md new file mode 100644 index 000000000000..2a2d3f2f03c5 --- /dev/null +++ b/_pages/category-archive.md @@ -0,0 +1,7 @@ +--- +title : "Category" +layout : categories +permalink : /categories/ +author_profile : true +sidebar_main : true +--- \ No newline at end of file diff --git a/_pages/tag-archive.md b/_pages/tag-archive.md new file mode 100644 index 000000000000..5ab57ae2b6f8 --- /dev/null +++ b/_pages/tag-archive.md @@ -0,0 +1,7 @@ +--- +title : "Tag" +layout : tags +permalink : /tags/ +author_profile : true +sidebar_main : true +--- \ No newline at end of file diff --git "a/_posts/Chapter-01-C-\354\226\270\354\226\264.md" b/_posts/2023-12-01-1.md similarity index 99% rename from "_posts/Chapter-01-C-\354\226\270\354\226\264.md" rename to _posts/2023-12-01-1.md index d05343c1fc94..ee2a2549c321 100644 --- "a/_posts/Chapter-01-C-\354\226\270\354\226\264.md" +++ b/_posts/2023-12-01-1.md @@ -1,6 +1,8 @@ --- layout: single title: "Chapter 01 C 언어" +categories : Language +tag : C --- C 언어에 관한 글입니다. diff --git "a/_posts/Chapter-02-C-\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" b/_posts/2023-12-01-2.md similarity index 99% rename from "_posts/Chapter-02-C-\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" rename to _posts/2023-12-01-2.md index 3d6829522d5a..31f363deaa2b 100644 --- "a/_posts/Chapter-02-C-\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215.md" +++ b/_posts/2023-12-01-2.md @@ -1,6 +1,8 @@ --- layout: single title: Chapter 02 C 프로그래밍 +categories : Language +tag : C --- C 프로그래밍에 관한 글입니다. diff --git "a/_posts/Chapter-03-C-\355\224\204\353\241\234\352\267\270\353\236\250\354\235\230-\355\212\271\354\247\225.md" b/_posts/2023-12-01-3.md similarity index 99% rename from "_posts/Chapter-03-C-\355\224\204\353\241\234\352\267\270\353\236\250\354\235\230-\355\212\271\354\247\225.md" rename to _posts/2023-12-01-3.md index 5a1266028ad0..0523b3e13831 100644 --- "a/_posts/Chapter-03-C-\355\224\204\353\241\234\352\267\270\353\236\250\354\235\230-\355\212\271\354\247\225.md" +++ b/_posts/2023-12-01-3.md @@ -1,6 +1,8 @@ --- layout: single title: Chapter 03 C 프로그램의 특징 +categories : Language +tag : C --- C 프로그램의 특징에 관한 글입니다. diff --git "a/_posts/Chapter-04-printf()-\355\225\250\354\210\230.md" b/_posts/2023-12-02-1.md similarity index 98% rename from "_posts/Chapter-04-printf()-\355\225\250\354\210\230.md" rename to _posts/2023-12-02-1.md index e07660c7d25a..60cbedc05643 100644 --- "a/_posts/Chapter-04-printf()-\355\225\250\354\210\230.md" +++ b/_posts/2023-12-02-1.md @@ -1,7 +1,12 @@ --- layout: single title: Chapter 04 printf() 함수 +categories : Language +tag : C --- + +printf() 함수에 관한 글입니다. + # 1 C 언어 표준 입출력 함수 > 사용자가 프로그램과 대화하기 위해 사용하는 함수를 입출력 함수 또는 I/O 함수라고 한다. diff --git a/_posts/2023-12-02-2.md b/_posts/2023-12-02-2.md new file mode 100644 index 000000000000..d591fce53afd --- /dev/null +++ b/_posts/2023-12-02-2.md @@ -0,0 +1,136 @@ +--- +layout: single +title: Chapter 05 scanf() 함수 +categories : Language +tag : C +--- + +scanf() 함수에 관한 글입니다. + +# 1 scanf() 함수 + +> scanf() 함수는 C 언어의 표준 입력 함수로, 사용자로부터 다양한 데이터를 다양한 서식에 맞춰 입력받을 수 있게 해준다. + +> scanf() 함수의 원형은 다음과 같다. + +- 함수 원형 + +```c +#include +int scanf(const char * restrict format, ...); +``` + +> scanf() 함수의 f는 formatted의 약자이며, 서식화된 입력을 받는다는 의미이다. +이 함수는 입력받은 데이터를 어떤 서식으로 변환할지 서식 지정자(format specifier)를 통해 직접 지정할 수 있다. + +> 다음 예제는 사용자로부터 정수를 두 번 입력받아서 그 합을 출력하는 예제이다. + +- 예제 + +```c +#include +int main(void) +{ + int num01, num02; + + printf("첫 번째 정수를 입력하세요 : "); + scanf("%d", &num01); + printf("두 번째 정수를 입력하세요 : "); + scanf("%d", &num02); + + printf("입력하신 두 정수의 합은 %d입니다.\n", num01 + num02); + return 0; + +} +``` + +- 실행 결과 + +```c +첫 번째 정수를 입력하세요 : 10 +두 번째 정수를 입력하세요 : 20 +입력하신 두 정수의 합은 30입니다. +``` + +> C언어에서 데이터를 입력받으려면 입력받고자 하는 데이터의 타입에 해당하는 크기의 메모리를 우선 할당받아야 한다. +이처럼 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 변수(variable)라고 한다. + +> scanf() 함수에 포함된 '&'기호는 주소 연산자(&)라고 한다. +이 주소 연산자는 입력받은 데이터를 뒤에 나오는 변수에 저장하라는 의미이다. + +# 2 서식 지정자의 동시 사용 + +> 여러 개의 서식 지정자를 동시에 사용하여, +여러 데이터를 서로 다른 서식으로 한 번에 입력받을 수 있다. +단, 이때에는 서식 지정자의 순서와 저장할 변수의 순서가 반드시 같아야 한다. +입력받는 데이터의 구분은 공백(줄 바꿈, 탭, 띄어쓰기 등)을 기준으로 삼는다. + +> 다음 예제는 사용자로부터 두 개의 정수를 한 번에 입력받아, 각각 8진수와 16진수로 출력하는 예제입이다. + +- 예제 + +```c +#include +int main(void) +{ + int num01, num02; + + printf("두 개의 정수를 입력하세요 : "); + scanf("%d %d", &num01, &num02); + + printf("입력하신 두 정수를 8진수로 나타내면 %o와 %o가 되고,\n", num01, num02); + printf("입력하신 두 정수를 16진수로 나타내면 %x와 %x가 됩니다.\n", num01, num02); + return 0; +} +``` + +- 실행 결과 + +``` +두 개의 정수를 입력하세요 : 10 20 +입력하신 두 정수를 8진수로 나타내면 12와 24가 되고, +입력하신 두 정수를 16진수로 나타내면 a와 14가 됩니다. +``` + +# 3 double형 실수의 입력 + +> scanf() 함수로 float형 실수를 입력받을 때는 서식 지정자로 '%f'를 사용하면 된다. +하지만 double형 실수를 입력받을 때는 printf() 함수에서처럼 '%f'를 사용하면 안 된다. +scanf() 함수로 double형 실수를 입력받을 때는 반드시 '%lf' 서식 지정자를 사용해야 정확한 값으로 입력받을 수 있다. + +> 다음 예제는 사용자로부터 두 개의 실수를 한 번에 입력받아 출력하는 예제이다. + +- 예제 + +```c +#include +int main(void) +{ + float num01; + double num02; + + printf("두 개의 실수를 입력하세요 : "); + scanf("%f %f", &num01, &num02); + printf("입력하신 두 실수는 %f와 %f입니다.\n", num01, num02); + printf("입력받은 두 실수 중 두 번째 double형 변수에는 전혀 다른 값이 저장되었습니다.\n\n"); + + printf("다시 한 번 두 개의 실수를 입력하세요 : "); + scanf("%f %lf", &num01, &num02); + printf("입력하신 두 실수는 %f와 %f입니다.\n", num01, num02); + printf("이번에는 두 실수 모두 제대로 저장되었습니다.\n"); + return 0; + +} +``` + +- 실행 결과 + +```c +두 개의 실수를 입력하세요 : 1.2 3.4 +입력하신 두 실수는 1.200000와 0.000000입니다. +입력받은 두 실수 중 두 번째 double형 변수에는 전혀 다른 값이 저장되었습니다. + +다시 한 번 두 개의 실수를 입력하세요 : 1.2 3.4 +입력하신 두 실수는 1.200000와 3.400000입니다. +이번에는 두 실수 모두 제대로 저장되었습니다. +``` \ No newline at end of file diff --git a/_posts/2023-12-02-3.md b/_posts/2023-12-02-3.md new file mode 100644 index 000000000000..c599729e678a --- /dev/null +++ b/_posts/2023-12-02-3.md @@ -0,0 +1,158 @@ +--- +layout: single +title: Chapter 06 변수 +categories : Language +tag : C +--- + +변수에 관한 글입니다. + +# 1 변수(variable) + +- 변수 + +> 변수(variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다. 즉, 변수란 데이터(data)를 저장할 수 있는 메모리 공간을 의미하며, 이렇게 저장된 값은 변경될 수 있다. + +> C 언어에서 숫자 표현에 관련된 변수는 정수형 변수와 실수형 변수로 구분할 수 있다. +또다시 정수형 변수는 char형, int형, long형 변수로, 실수형 변수는 float형, double형 변수로 나눌 수 있다. + +> 또한, 데이터가 저장된 메모리의 주소를 저장하고 처리하는 포인터 변수가 있다. +관련된 정보를 한 번에 묶어서 처리하는 사용자 정의 구조체 변수도 있다. + +## 1.1 변수의 이름 생성 규칙 + +> C 언어에서는 변수의 이름을 비교적 자유롭게 지을 수 있다. +하지만 변수의 이름은 해당 변수에 저장될 데이터의 의미를 잘 나타내도록 짓는 것이 가장 좋다. + +> C 언어에서 변수의 이름을 생성할 때에 반드시 지켜야 하는 규칙은 다음과 같다. + +1. 변수의 이름은 영문자(대소문자), 숫자, 언더스코어(_)로만 구성된다. + +2. 변수의 이름은 숫자로 시작될 수 없다. + +3. 변수의 이름 사이에는 공백을 포함할 수 없다. + +4. 변수의 이름으로 C 언어에서 미리 정의된 키워드(keyword)는 사용할 수 없다. + +> 다음 표는 변수의 이름을 생성할 때에 지겨야하는 규칙의 예시이다. + +![업로드중..](blob:https://velog.io/3bd73a7c-4cea-411e-b514-a82c4160d97b) + +> C 언어에서는 변수의 이름에 대소문자를 구분하므로 이 점에 주의해야 한다. +ex) int tcp 과 int Tcp 는 같은 변수가 아니다. + +> 다음은 C 언어에서 사용되는 키워드(Keyword)들이다. + +- 키워드 + +> 키워드(Keyword)란 고유한 의미를 가지는 예약어를 의미한다. + +> C 언어에는 32개의 키워드가 있으며, 이러한 키워드들은 미국표준협회 ANSI에서 지정한 키워드들이다. 아래의 키워드들은 위의 예시처럼 변수의 이름으로 사용할 수 없다. + +![업로드중..](blob:https://velog.io/e30b5f76-29e2-46f2-9e81-4abfae0fa22f) + +## 1.2 비트(bit)와 바이트(byte) + +> 컴퓨터는 모든 데이터를 2진수로 표현하고 처리한다. + +- 비트 + +> 비트(bit)란 컴퓨터가 데이터를 처리하기 위해 사용하는 데이터의 최소 단위를 의미한다. + +> 이러한 비트에는 2진수의 값(0과 1)을 단 하나만 저장할 수 있다. + +- 바이트 + +> 바이트(byte)란 비트가 8개 모여서 구성되며, 한 문자를 표현할 수 있는 최소 단위를 의미한다. + +## 1.3 변수와 메모리 구조 + +> 변수는 기본적으로 메모리의 주소(address)를 기억하는 역할을 한다. + +- 메모리 주소 + +> 메모리 주소란 물리적인 메모리 공간을 서로 구분하기 위해 사용되는 일종의 식별자를 의미한다. +즉, 메모리 주소란 메모리 공간에서의 정확한 위치를 식별하기 위한 고유 주소를 의미한다. + +> 변수를 참조할 때는 메모리의 주소를 참조하는 것이 아닌, 해당 주소에 저장된 데이터를 참조하게 된다. 따라서 변수는 데이터가 저장된 메모리의 주소뿐만 아니라, 저장된 데이터의 길이와 형태에 관한 정보도 같이 기억해야 한다. + +> 다음 그림은 메모리 상에 변수가 어떤 식으로 저장되는지를 보여준다. + +![업로드중..](blob:https://velog.io/f05101da-c90c-4329-a3b1-12e3a915b90b) + +> 위의 그림처럼 하나의 메모리 공간에는 8개의 비트로 이루어진 1바이트의 데이터가 저장된다. +따라서 메모리의 주소 또한 1바이트씩 증가되며, 낮은 주소부터 차례대로 데이터가 저장된다. +위의 그림에서 변수의 길이가 총 4개의 메모리 공간을 포함하므로, 해당 변수에는 4바이트의 데이터가 저장되어 있다. + +> 이때 변수의 이름은 첫 번째 메모리 주소인 0x10만을 가리키게 된다. +따라서 변수의 길이가 4이며, 변수가 어떤 형태로 구성되는지도 알아야만 해당 변수에서 데이터를 올바르게 참조할 수 있다. + +## 1.4 변수의 선언 + +> C 언어에서는 변수를 사용하기 전에 반드시 먼저 해당 변수를 저장하기 위한 메모리 공간을 할당받아야 한다. 이렇게 해당 변수만을 위한 메모리 공간을 할당받는 행위를 변수의 선언이라고 부른다. 만약 선언되지 않은 변수를 사용하려고 하면, C 컴파일러는 오류를 발생시킨다. + +> C 언어에서 변수를 선언하는 방법은 다음과 같이 두 가지 방법이 있다. + +1. 변수의 선언만 하는 방법 + +2. 변수의 선언과 동시에 초기화하는 방법 + +### 1.4.1 변수의 선언만 하는 방법 + +> 이 방법은 먼저 변수를 선언하여 메모리 공간만을 할당받고, 나중에 변수를 초기화하는 방법이다. + +> C 언어에서 변수를 선언하는 방법은 다음과 같다. + +- 문법 + +```c +타입 변수이름; +``` + +- 예제 + +```c +int num; + +... + +num = 20; +``` + +> 위의 예제처럼 정수를 저장하기 위한 메모리 공간을 할당받으면, 반드시 해당 타입의 데이터만을 저장해야 한다. 그렇지 않고 다른 타입의 데이터를 저장할 경우에는 저장된 데이터에 변형 및 손실이 일어날 수도 있다. + +> 변수의 초기화란 해당 변수를 사용할 수 있도록 초기값을 설정하는 행위이다. +초기화되지 않은 변수에는 아무런 의미 없는 값인 쓰레깃값만이 들어가 있다. + +- 예제 + +```c +int num; +printf("%d", num); +``` + +> 위의 예제에서 변수 num은 선언만 하고 아직 초기화되지 않았다. +하지만 printf() 함수에서 변수 num을 사용하여 해당 변수에 저장된 값을 출력하려고 하고 있다. + +> 이와 같은 경우에 C 컴파일러는 오류를 발생시키지는 않겠지만, 프로그램은 사용자가 의도하지 않은 결과를 출력할 것dl다. 따라서 C 언어에서는 초기화되지 않은 변수는 절대로 사용해서는 안된다. + +### 1.4.2 변수의 선언과 동시에 초기화하는 방법 + +> C언어에서 변수는 선언과 동시에 그 값을 초기화할 수 있다. +또한, 선언하고자 하는 변수들의 타입만 같다면 여러 변수를 동시에 선언할 수도 있다. + +- 문법 + +```c +1. 타입 변수이름[, 변수이름]; +2. 타입 변수이름 = 초깃값[, 변수이름 = 초깃값]; +``` + +- 예제 + +```c +int num01, num02; +double num03 = 1.23, num04 = 4.56; +``` + + \ No newline at end of file diff --git a/_posts/2023-12-02-4.md b/_posts/2023-12-02-4.md new file mode 100644 index 000000000000..9217d2648b88 --- /dev/null +++ b/_posts/2023-12-02-4.md @@ -0,0 +1,56 @@ +--- +layout: single +title: Chapter 07 상수 +categories : Language +tag : C +--- + +상수에 관한 글입니다. + +# 1 상수(constant) + +- 상수 + +> 상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다. + +> 하지만 상수가 변수와 다른 점은 프로그램이 실행되는 동안 상수에 저장된 데이터는 변경할 수 없다는 점이다. + +> 이러한 상수는 표현 방식에 따라 다음과 같이 나눌 수 있다. + +1. 리터럴 상수(literal constant) + +2. 심볼릭 상수(symbolic constant) + +## 1.1 리터럴 상수(literal constant) + +> 리터럴 상수(literal constant)는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않다. C 언어에서는 적절한 메모리 공간을 할당받기 위하여, +기본적으로 변수든 상수든 타입을 가지게 된다. + +> 리터럴 상수는 타입에 따라 정수형 리터럴 상수, 실수형 리터럴 상수, 문자형 리터럴 상수 등으로 구분할 수 있다. + +1. 정수형 리터럴 상수는 123, -456과 같이 아라비아 숫자와 부호로 직접 표현된다. + +2. 실수형 리터럴 상수는 3.14, -45.6과 같이 소수 부분을 가지는 아라비아 숫자로 표현된다. + +3. 문자형 리터럴 상수는 'a', 'Z'와 같이 따옴표('')로 감싸진 문자로 표현된다. + +- 예제 + +```c +123 // 정수형 리터럴 상수 +3.14 // 실수형 리터럴 상수 +'a' // 문자형 리터럴 상수 +``` + +## 1.2 심볼릭 상수(symbolic constant) + +> 심볼릭 상수는 변수와 마찬가지로 이름을 가지고 있는 상수이다. +이러한 심볼릭 상수는 반드시 선언과 동시에 초기화되어야 한다. +심볼릭 상수는 const 키워드를 사용하거나, 매크로를 이용하여 선언할 수 있다. + +- 예제 + +```c +const int MAX = 10; // const 키워드를 이용한 심볼릭 상수 +#define MAX 10; // #define 선행처리 지시자를 이용한 매크로 심볼릭 상수 +``` diff --git a/_posts/2023-12-02-5.md b/_posts/2023-12-02-5.md new file mode 100644 index 000000000000..7c6b95738078 --- /dev/null +++ b/_posts/2023-12-02-5.md @@ -0,0 +1,165 @@ +--- +layout: single +title: Chapter 08 기본 타입 +categories : Language +tag : C +--- + +기본 타입에 관한 글입니다. + +# 1 기본 타입 + +> C 언어에서 타입(data type)이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 한다. + +> C 언어는 여러 형태의 타입을 미리 작성하여 제공하고 있는데, 이것을 기본 타입이라고 한다. 이러한 기본 타입은 크게 정수형, 실수형, 그리고 문자형 타입으로 나눌 수 있다. + +## 1.1 정수형 타입 + +> C 언어에서 정수란 부호를 가지고 있고, 소수 부분이 없는 수를 의미한다. + +> 정수형 데이터에 unsigned 키워드를 추가하면, 부호를 나타내는 +최상위 비트(MSB, Most Significant Bit)까지도 크기를 나타내는 데 사용할 수 있다. + +> unsigned 정수는 음수를 표현할 수는 없게 되지만, +0을 포함한 양의 정수는 두 배 더 많이 표현할 수 있게 된다. + +> 음의 정수까지도 표현할 수 있는 signed 키워드는 +모든 타입에서 기본적으로 생략하여 사용할 수 있다. + +- 최상위 비트 + +> 최상위 비트(MSB, Most Significant Bit)란 1바이트를 구성하는 8개의 비트 중 최고값을 갖는 비트를 의미한다. + +> 다음 표는 각각의 정수 타입에 따른 메모리의 크기 및 데이터의 표현 범위를 나타낸다. + +![](https://velog.velcdn.com/images/ecg/post/2762a0e4-ea8c-483f-a741-154f260591d3/image.png) + +> 정수형 데이터의 타입을 결정할 때에는 반드시 +자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 한다. +해당 타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면, +오버플로우가 발생해 전혀 다른 값이 저장될 수 있기 때문이다. + +- 오버플로우 + +> 오버플로우(overflow)란 해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상을 의미한다. + +> 오버플로우가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 +인접 비트를 덮어쓰므로, 잘못된 결과를 얻을 수 있다. + +- 언더플로우 + +> 언더플로우(underflow)란 해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상을 의미한다. + +> 다음 예제는 int형 변수에 해당 타입이 저장할 수 있는 최댓값과 그 최댓값을 넘는 숫자를 대입하는 예제이다. + +- 예제 + +```c +int num = 2147483647; // int형 타입이 저장할 수 있는 최댓값인 2^31 - 1 +printf("변수 num에 저장된 값은 %d입니다.\n", num); + +num = 2147483648; // int형 타입이 저장할 수 없는 숫자인 2^31 +printf("변수 num에 저장된 값은 %d입니다.\n", num); +``` + +- 실행 결과 + +```c +변수 num에 저장된 값은 2147483647입니다. +변수 num에 저장된 값은 -2147483648입니다. +``` + +> 위의 두 번째 실행 결과를 살펴보면, 변수 num에 양수를 대입했지만 +음수로 저장된 것을 확인할 수 있다. +이처럼 오버플로우가 발생하면 전혀 예상치 못한 결과를 얻을 수 있으므로, +데이터를 저장할 때는 언제나 해당 데이터 타입의 최대 크기까지 고려해야 한다. + +> 컴퓨터는 내부적으로 정수형 중에서도 int형의 데이터를 가장 빠르게 처리한다. +따라서 정수형 데이터는 보편적으로 크기에 상관없이 int형을 가장 많이 사용한다. +int형은 운영체제의 환경에 따라 다릅니다. +16bit라면 2바이트, 32bit라면 4바이트, 64bit이상부터 4바이트이다. + +## 1.2 실수형 타입 + +> C언어에서 실수란 소수부나 지수가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가진다. +하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계를 지닌다. +이러한 실수형 데이터의 오차는 C언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제이다. + +![](https://velog.velcdn.com/images/ecg/post/416d2a6d-8a45-48e3-8967-74b248db8e35/image.png) + +> 다음 예제는 소수점을 16자리 가지는 실수를 float형과 double형 변수에 각각 대입하는 예제이다. + +- 예제 + +```c +float num01 = 3.1415926535897932; // float 타입의 유효 자릿수는 소수점 6자리 +printf("변수 pi에 저장된 값은 %.20f입니다.\n", num01); + +double num02 = 3.1415926535897932; // double 타입의 유효 자릿수는 소수점 16자리 +printf("변수 pi에 저장된 값은 %.20f입니다.\n", num02); +``` + +- 실행 결과 + +```c +변수 num01에 저장된 값은 3.14159274101257324219입니다. +변수 num02에 저장된 값은 3.14159265358979311600입니다. +``` + +> 위의 예제에서 변수 num01에는 소수점 6자리까지만 정확한 값이 저장되어 있고, +소수점 7자리부터는 틀린 값이 저장되어 있다. +또한, 변수 num02에는 소수점 15자리까지만 정확한 값이 저장되어 있고, +소수점 16자리부터는 틀린 값이 저장되어 있는 것을 확인할 수 있다. + +> 이처럼 실수형 데이터의 타입을 결정할 때는 +표현 범위 이외에도 유효 자릿수를 반드시 고려해야 한다. + +![](https://velog.velcdn.com/images/ecg/post/eb3062c9-5630-4003-920e-f8c5ec6f5b8f/image.png) + +> 과거에는 실수를 표현할 때 float형을 많이 사용했지만, 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용한다. + +## 1.3 문자형 타입 + +- 문자형 타입 + +> C언어에서 문자형 데이터란 문자 하나를 표현할 수 있는 타입을 의미한다.| + +> 컴퓨터는 2진수밖에 인식하지 못하므로, 문자도 숫자로 표현해야 컴퓨터가 인식할 수 있다. +따라서 어떤 문자를 어떤 숫자에 대응시킬 것인가에 대한 약속이 필요하다. + +> 이러한 약속 중에서 가장 많이 사용되는 것이 바로 아스키코드(ASCII)이다. + +- 아스키코드 + +> 아스키코드(ASCII)란 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식을 의미한다. + +> 아스키코드는 문자를 7비트로 표현하므로, 총 128개의 문자를 표현할 수 있다. + +> 아스키코드의 구성은 다음과 같다. + + - 출력할 수 없는 33개의 문자 + + - 출력할 수 있는 52개의 영문 대소문자, 10개의 숫자, 32개의 특수 문자와 1개의 공백 문자 + +![](https://velog.velcdn.com/images/ecg/post/d743ef3f-4a40-4e87-aeb0-5b84dda4b510/image.png) + +다음 예제는 char형 변수에 저장된 문자를 여러 서식 지정자를 사용하여 출력하는 예제입니다. + +- 예제 + +```c +char ch = 'a'; +printf("변수 ch에 저장된 값은 %c입니다.\n", ch); +printf("변수 ch에 저장된 값은 %d입니다.\n", ch); +``` + +- 실행 결과 + +```c +변수 ch에 저장된 값은 a입니다. +변수 ch에 저장된 값은 97입니다. +``` + +> 위의 예제에서 서식 지정자 '%c'를 사용하여 출력한 결과는 제대로 문자 'a'가 출력된다. +하지만 서식 지정자 '%d'를 사용하여 출력한 결과는 97이라는 숫자로 출력된다. +즉, 이것은 문자가 내부적으로는 아스키코드에 해당하는 숫자로 저장되어 있음을 보여준다. diff --git a/_posts/2023-12-02-6.md b/_posts/2023-12-02-6.md new file mode 100644 index 000000000000..692850ff6340 --- /dev/null +++ b/_posts/2023-12-02-6.md @@ -0,0 +1,248 @@ +--- +layout: single +title: Chapter 09 타입 변환 +categories : Language +tag : C +--- + +타입 변환에 관한 글입니다. + +# 1 타입 변환(type conversion) + +> C 언어에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행된다. +이처럼 하나의 타입을 다른 타입으로 바꾸는 행위를 타입 변환(type conversion)이라고 합니다. + +> 표현 범위가 좁은 타입에서 표현 범위가 더 넓은 타입으로의 타입 변환은 큰 문제가 되지 않는다. +하지만 반대의 경우인 표현 범위가 좁은 타입으로의 타입 변환에서는 데이터의 손실이 발생한다. + +> 타입 변환은 크게 다음과 같이 두 가지 방식으로 나눌 수 있다. + +1. 묵시적 타입 변환(자동 타입 변환) + +2. 명시적 타입 변환(강제 타입 변환) + +## 1.1 묵시적 타입 변환(자동 타입 변환, implicit type conversion) + +- 묵시적 타입 변환 + +> 묵시적 타입 변환이란 대입 연산이나 산술 연산에서 +C 컴파일러가 자동으로 실행해주는 타입 변환을 의미한다. + +> C언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 +연산자의 왼쪽에 존재하는 데이터의 타입으로 묵시적 타입 변환이 진행된다. +또한, 산술 연산에서는 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환이 진행된다. + +> 다음 예제는 대입 연산에서 일어나는 묵시적 타입 변환을 보여준다. + +- 예제 + +```c +char ch = 200; +int num01 = 3.14; +double num02 = 5; + +printf(" ch에 저장된 값은 %d입니다.\n", ch); +printf("num01에 저장된 값은 %d입니다.\n", num01); +printf("num02에 저장된 값은 %f입니다.\n", num02); +``` + +- 실행 결과 + +```c + ch에 저장된 값은 -56입니다. +num01에 저장된 값은 3입니다. +num02에 저장된 값은 5.000000입니다. +``` + +> 위의 예제에서는 char형 변수에 char형 변수가 표현할 수 있는 범위를 넘는 데이터를 저장한다. +따라서 전달된 데이터의 상위 비트가 자동으로 삭제되어 데이터의 손실이 발생한다. +또한, int형 변수에 실수를 저장했기 때문에 +소수 부분이 자동으로 삭제되어 데이터의 손실이 발생한다. +하지만 double형 변수에 int형 데이터를 저장하는 것은 데이터가 double형으로 자동 타입 변환되지만, 데이터의 손실은 발생하지 않는다. + +> 다음 예제는 산술 연산에서 일어나는 묵시적 타입 변환을 보여준다. + +- 예제 + +```c +double result01 = 5 + 3.14; +double result02 = 5.0f + 3.14; + +printf("result01에 저장된 값은 %f입니다.\n", result01); +printf("result02에 저장된 값은 %f입니다.\n", result02); + +``` +- 실행 결과 + +```c +result01에 저장된 값은 8.140000입니다. +result02에 저장된 값은 8.140000입니다. +``` + +> 위의 예제에서 첫 번째 연산은 int형 데이터와 double형 데이터의 산술 연산이다. +따라서 데이터의 손실이 최소화되도록 int형 데이터가 double형 데이터로 자동 타입 변환된다. +두 번째 연산은 float형 데이터와 double형 데이터의 산술 연산이다. +위와 마찬가지로 데이터의 손실이 최소화되도록 +float형 데이터가 double형 데이터로 자동 타입 변환된다. + +> 이렇게 컴파일러가 자동으로 수행하는 타입 변환은 +언제나 데이터의 손실이 최소화되는 방향으로 이루어진다. +따라서 C 컴파일러는 다음과 같은 순서대로 자동 타입 변환을 수행하게 된다. + +> char 형 → short 형 → int 형 → long 형 → float 형 → double 형 → long double 형 + +## 1.2 명시적 타입 변환(강제 타입 변환, explicit type conversion) + +- 명시적 타입 변환 + +> 명시적 타입 변환이란 사용자가 타입 캐스트(type cast) 연산자를 사용하여 강제적으로 수행하는 타입 변환을 의미한다. + +> 변환하고자 하는 데이터의 앞에 괄호(())를 추가하고, 그 안에 변환할 타입을 적으면 된다. +C언어에서는 이 괄호(())를 타입 캐스트(type cast) 연산자라고 한다. + +> 다음 예제는 명시적 타입 변환을 보여주는 예제이다. + +- 예제 + +```c +int num01 = 1; +int num02 = 4; + +double result01 = num01 / num02; +double result02 = (double)num01 / num02; + +printf("result01에 저장된 값은 %f입니다.\n", result01); +printf("result02에 저장된 값은 %f입니다.\n", result02); +``` + +- 실행 결과 + +```c +result01에 저장된 값은 0.000000입니다. +result02에 저장된 값은 0.250000입니다. +``` + +> 위의 예제에서 첫 번째 연산의 결괏값은 0.000000으로 출력된다. +그 이유는 산술 연산에 대한 결괏값의 타입은 피연산자의 타입과 언제나 일치하기 때문이다. +즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터로 나온다. +따라서 두 번째 연산에서처럼 하나의 피연산자를 명시적으로 +double형으로 지정해야만 정확한 결괏값을 얻을 수 있다.# 1 타입 변환(type conversion) + +> C 언어에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행된다. +이처럼 하나의 타입을 다른 타입으로 바꾸는 행위를 타입 변환(type conversion)이라고 합니다. + +> 표현 범위가 좁은 타입에서 표현 범위가 더 넓은 타입으로의 타입 변환은 큰 문제가 되지 않는다. +하지만 반대의 경우인 표현 범위가 좁은 타입으로의 타입 변환에서는 데이터의 손실이 발생한다. + +> 타입 변환은 크게 다음과 같이 두 가지 방식으로 나눌 수 있다. + +1. 묵시적 타입 변환(자동 타입 변환) + +2. 명시적 타입 변환(강제 타입 변환) + +## 1.1 묵시적 타입 변환(자동 타입 변환, implicit type conversion) + +- 묵시적 타입 변환 + +> 묵시적 타입 변환이란 대입 연산이나 산술 연산에서 +C 컴파일러가 자동으로 실행해주는 타입 변환을 의미한다. + +> C언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 +연산자의 왼쪽에 존재하는 데이터의 타입으로 묵시적 타입 변환이 진행된다. +또한, 산술 연산에서는 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환이 진행된다. + +> 다음 예제는 대입 연산에서 일어나는 묵시적 타입 변환을 보여준다. + +- 예제 + +```c +char ch = 200; +int num01 = 3.14; +double num02 = 5; + +printf(" ch에 저장된 값은 %d입니다.\n", ch); +printf("num01에 저장된 값은 %d입니다.\n", num01); +printf("num02에 저장된 값은 %f입니다.\n", num02); +``` + +- 실행 결과 + +```c + ch에 저장된 값은 -56입니다. +num01에 저장된 값은 3입니다. +num02에 저장된 값은 5.000000입니다. +``` + +> 위의 예제에서는 char형 변수에 char형 변수가 표현할 수 있는 범위를 넘는 데이터를 저장한다. +따라서 전달된 데이터의 상위 비트가 자동으로 삭제되어 데이터의 손실이 발생한다. +또한, int형 변수에 실수를 저장했기 때문에 +소수 부분이 자동으로 삭제되어 데이터의 손실이 발생한다. +하지만 double형 변수에 int형 데이터를 저장하는 것은 데이터가 double형으로 자동 타입 변환되지만, 데이터의 손실은 발생하지 않는다. + +> 다음 예제는 산술 연산에서 일어나는 묵시적 타입 변환을 보여준다. + +- 예제 + +```c +double result01 = 5 + 3.14; +double result02 = 5.0f + 3.14; + +printf("result01에 저장된 값은 %f입니다.\n", result01); +printf("result02에 저장된 값은 %f입니다.\n", result02); + +``` +- 실행 결과 + +```c +result01에 저장된 값은 8.140000입니다. +result02에 저장된 값은 8.140000입니다. +``` + +> 위의 예제에서 첫 번째 연산은 int형 데이터와 double형 데이터의 산술 연산이다. +따라서 데이터의 손실이 최소화되도록 int형 데이터가 double형 데이터로 자동 타입 변환된다. +두 번째 연산은 float형 데이터와 double형 데이터의 산술 연산이다. +위와 마찬가지로 데이터의 손실이 최소화되도록 +float형 데이터가 double형 데이터로 자동 타입 변환된다. + +> 이렇게 컴파일러가 자동으로 수행하는 타입 변환은 +언제나 데이터의 손실이 최소화되는 방향으로 이루어진다. +따라서 C 컴파일러는 다음과 같은 순서대로 자동 타입 변환을 수행하게 된다. + +> char 형 → short 형 → int 형 → long 형 → float 형 → double 형 → long double 형 + +## 1.2 명시적 타입 변환(강제 타입 변환, explicit type conversion) + +- 명시적 타입 변환 + +> 명시적 타입 변환이란 사용자가 타입 캐스트(type cast) 연산자를 사용하여 강제적으로 수행하는 타입 변환을 의미한다. + +> 변환하고자 하는 데이터의 앞에 괄호(())를 추가하고, 그 안에 변환할 타입을 적으면 된다. +C언어에서는 이 괄호(())를 타입 캐스트(type cast) 연산자라고 한다. + +> 다음 예제는 명시적 타입 변환을 보여주는 예제이다. + +- 예제 + +```c +int num01 = 1; +int num02 = 4; + +double result01 = num01 / num02; +double result02 = (double)num01 / num02; + +printf("result01에 저장된 값은 %f입니다.\n", result01); +printf("result02에 저장된 값은 %f입니다.\n", result02); +``` + +- 실행 결과 + +```c +result01에 저장된 값은 0.000000입니다. +result02에 저장된 값은 0.250000입니다. +``` + +> 위의 예제에서 첫 번째 연산의 결괏값은 0.000000으로 출력된다. +그 이유는 산술 연산에 대한 결괏값의 타입은 피연산자의 타입과 언제나 일치하기 때문이다. +즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터로 나온다. +따라서 두 번째 연산에서처럼 하나의 피연산자를 명시적으로 +double형으로 지정해야만 정확한 결괏값을 얻을 수 있다. \ No newline at end of file diff --git a/_posts/2023-12-02-7.md b/_posts/2023-12-02-7.md new file mode 100644 index 000000000000..870df6cdbd76 --- /dev/null +++ b/_posts/2023-12-02-7.md @@ -0,0 +1,97 @@ +--- +layout: single +title: Chapter 10 산술 연산자 +categories : Language +tag : C +--- + +산술 연산자에 관한 글입니다. + +# 1 연산자(operator) + +- 연산자 + +> 연산자(operator)란 프로그램의 산술식이나 연산식을 +표현하고 처리하기 위해 제공되는 다양한 기호를 의미한다. + +> C언어에서는 여러 종류의 연산을 위해 다양한 연산자를 제공하고 있다. + +## 1.1 산술 연산자(arithmetic operator) + +- 산술 연산자 + +> 산술 연산자란 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자를 의미한다. + +> 산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, +피연산자들의 결합 방향은 왼쪽에서 오른쪽이다. + +- 항 + +> 항이란 해당 연산의 실행이 가능하기 위해 필요한 값이나 변수를 의미한다. +따라서 이항 연산자란 해당 연산의 실행을 위해서 +두 개의 값이나 변수가 필요한 연산자를 의미한다. + +![](https://velog.velcdn.com/images/ecg/post/8e54c925-26b2-400a-b914-a5dd0280d238/image.png) + +- 예제 + +```c +int num01 = 10; +int num02 = 4; + +printf("+ 연산자에 의한 결괏값은 %d입니다.\n", num01 + num02); +printf("- 연산자에 의한 결괏값은 %d입니다.\n", num01 - num02); +printf("* 연산자에 의한 결괏값은 %d입니다.\n", num01 * num02); +printf("/ 연산자에 의한 결괏값은 %d입니다.\n", num01 / num02); +printf("% 연산자에 의한 결괏값은 %d입니다.\n", num01 % num02); +``` + +- 실행 결과 + +```c ++ 연산자에 의한 결괏값은 14입니다. +- 연산자에 의한 결괏값은 6입니다. +* 연산자에 의한 결괏값은 40입니다. +/ 연산자에 의한 결괏값은 2입니다. +% 연산자에 의한 결괏값은 2입니다. +``` + +## 1.2 연산자의 우선순위(operator precedence)와 결합 방향(associativity) + +> 연산자의 우선순위는 수식 내에 여러 연산자가 함께 등장할 때, +어느 연산자가 먼저 처리될 것인가를 결정한다. + +> 다음 그림은 가장 높은 우선순위를 가지고 있는 +괄호(()) 연산자를 사용하여 연산자의 처리 순서를 변경하는 것을 보여준다. + +![](https://velog.velcdn.com/images/ecg/post/a43c5d73-8507-4abb-bc7c-749e8bbcc0d6/image.png) + +> 연산자의 결합 방향은 수식 내에 우선순위가 같은 연산자가 둘 이상 있을 때, +먼저 어느 연산을 수행할 것인가를 결정한다. + +![](https://velog.velcdn.com/images/ecg/post/480e8a55-87ff-484a-9b39-384f0364c058/image.png) + +## 1.3 C 언어 연산자의 우선순위 + +> C언어에서 연산자의 우선순위와 결합 방향은 다음과 같다. + +- 1순위 + +![](https://velog.velcdn.com/images/ecg/post/2ec55668-2e92-435d-aa01-dac622419564/image.png) + +- 2순위 + +![](https://velog.velcdn.com/images/ecg/post/1d9517d0-4cfb-42ed-aaa6-e8addbecf2ba/image.png) + +- 3 ~ 7 순위 + +![](https://velog.velcdn.com/images/ecg/post/9e035a21-123c-4858-9ace-a9d5cc1198c1/image.png) + +- 8 ~ 15 순위 + +![](https://velog.velcdn.com/images/ecg/post/3f43f584-f53a-4a89-998f-f4477d4a79c6/image.png) + +> 위의 표에서 나온 순서대로 우선순위가 빠른 연산자가 가장 먼저 실행된다. +또한, 같은 우선순위를 가지는 연산자가 둘 이상 있을 때에는 +결합 순서에 따라 실행 순서가 결정된다. + diff --git a/_posts/2023-12-02-8.md b/_posts/2023-12-02-8.md new file mode 100644 index 000000000000..ccb6318960cd --- /dev/null +++ b/_posts/2023-12-02-8.md @@ -0,0 +1,46 @@ +--- +layout: single +title: Chapter 11 대입 연산자 +categories : Language +tag : C +--- + +대입 연산자에 관한 글입니다. + +# 1 대입 연산자(assignment operator) + +- 대입 연산자 + +> 대입 연산자란 변수에 값을 대입할 때 사용하는 이항 연산자를 의미한다. + +> 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다. +또한, 산술 연산자와 결합한 다양한 복합 대입 연산자가 존재한다. + +![](https://velog.velcdn.com/images/ecg/post/261fda28-96ee-4f71-9bf9-5c9695e2ab99/image.png) + +- 예제 + +```c +int num01 = 7; +int num02 = 7; +int num03 = 7; + +num01 = num01 - 5; +num02 -= 5; +num03 =- 5; + +printf("- 연산자에 의한 결괏값은 %d입니다.\n", num01); +printf("-= 연산자에 의한 결괏값은 %d입니다.\n", num02); +printf("=- 연산자에 의한 결괏값은 %d입니다.\n", num03); +``` + +- 실행 결과 + +```c +- 연산자에 의한 결괏값은 2입니다. +-= 연산자에 의한 결괏값은 2입니다. +=- 연산자에 의한 결괏값은 -5입니다. +``` + +> 위의 예제에서 num03 =- 5 연산은 단순히 -5를 변수 num03에 대입(=)하는 연산이 되었다. +이처럼 복합 대입 연산자에서 연산자의 순서는 매우 중요하다. diff --git a/_posts/2023-12-02-9.md b/_posts/2023-12-02-9.md new file mode 100644 index 000000000000..15ffb132bc40 --- /dev/null +++ b/_posts/2023-12-02-9.md @@ -0,0 +1,84 @@ +--- +layout: single +title: Chapter 12 증감 연산자 +categories : Language +tag : C +--- + +증감 연산자에 관한 글입니다. + +# 1 증감 연산자(increment and decrement operator) + +- 증감 연산자 + +> 증감 연산자란 피연산자를 1씩 증가 혹은 1씩 감소시킬 때 사용하는 연산자를 의미한다. + +> 이 연산자는 피연산자가 단 하나뿐인 단항 연산자이다. + +> 증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 +위치하는가에 따라 연산의 순서 및 결과가 달라진다. + +![](https://velog.velcdn.com/images/ecg/post/76c0c662-330b-43cb-9c15-5f7957b888ef/image.png) + +- 예제 + +```c +int num01 = 7; +int num02 = 7; +int result01, result02; + +result01 = (++num01) - 5; +result02 = (num02++) - 5; + +printf("전위 증가 연산자에 의한 결괏값은 %d이고, 변수의 값은 %d로 변했습니다.\n", result01, num01); +printf("후위 증가 연산자에 의한 결괏값은 %d이고, 변수의 값은 %d로 변했습니다.\n", result02, num02); +``` + +- 실행 결과 + +```c +전위 증가 연산자에 의한 결괏값은 3이고, 변수의 값은 8로 변했습니다. +후위 증가 연산자에 의한 결괏값은 2이고, 변수의 값은 8로 변했습니다. +``` + +> 위의 예제에서 첫 번째 연산은 변수 num01의 값을 먼저 1 증가시킨 후에 나머지 연산을 수행한다. +하지만 두 번째 연산에서는 먼저 모든 연산을 마친 후에 변수 num02의 값을 1 증가시킨다. +따라서 변수 num02의 증가는 관련된 연산에 아무런 영향도 미치지 않는다. + +## 1.1 증감 연산자의 연산 순서 + +> 증감 연산자는 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서가 달라진다. + +> 다음 예제는 증감 연산자의 연산 순서를 살펴보기 위한 예제이다. + +- 예제 + +```c +int x = 10; +int y = x-- + 5 + --x; + +printf("변수 x의 값은 %d이고, 변수 y의 값은 %d입니다.\n", x, y); +``` + +- 실행 결과 + +```c +변수 x의 값은 8이고, 변수 y의 값은 23입니다. +``` + +> 다음 그림은 위의 예제에서 수행되는 연산의 순서를 보여준다. + +![](https://velog.velcdn.com/images/ecg/post/657bb35d-f99c-44d6-b90f-8bc2fba1efb3/image.png) + +① : 첫 번째 감소 연산자(decrement operator)는 피연산자의 뒤쪽에 위치하므로, +덧셈 연산이 먼저 수행된다. + +② : 덧셈 연산이 수행된 후에 감소 연산이 수행된다. (x의 값 : 9) + +③ : 두 번째 감소 연산자는 피연산자의 앞쪽에 위치하므로, 덧셈 연산보다 먼저 수행된다. (x의 값 : 8) + +④ : 감소 연산이 수행된 후에 덧셈 연산이 수행된다. + +⑤ : 마지막으로 변수 y에 결괏값의 대입 연산이 수행된다. (y의 값 : 23) + + diff --git a/_posts/2023-12-02-91.md b/_posts/2023-12-02-91.md new file mode 100644 index 000000000000..60b49cfd4aa1 --- /dev/null +++ b/_posts/2023-12-02-91.md @@ -0,0 +1,40 @@ +--- +layout: single +title: Chapter 13 비교 연산자 +categories : Language +tag : C +--- + +비교 연산자에 관한 글입니다. + +# 1 비교 연산자(comparison operator) + +- 비교 연산자 + +> 비교 연산자란 피연산자 사이의 상대적인 크기를 판단하는 연산자를 의미한다. + +> 비교 연산자는 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, +어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단한다. +> 비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, +피연산자들의 결합 방향은 왼쪽에서 오른쪽이다. + +![](https://velog.velcdn.com/images/ecg/post/6f4f904d-d9d2-4c49-8e0a-e44d39a726ba/image.png) + +> C 언어에서 거짓(false)은 0이며, 0이 아닌 모든 것은 참(true)으로 인식된다. + +- 예제 + +```c +int num01 = 3; +int num02 = 7; + +printf("== 연산자에 의한 결괏값은 %d입니다.\n", num01 == num02); +printf("<= 연산자에 의한 결괏값은 %d입니다.\n", num01 <= num02); +``` + +- 실행 결과 + +```c +== 연산자에 의한 결괏값은 0입니다. +<= 연산자에 의한 결괏값은 1입니다. +``` diff --git a/_posts/2023-12-02-92.md b/_posts/2023-12-02-92.md new file mode 100644 index 000000000000..abcbc3b05563 --- /dev/null +++ b/_posts/2023-12-02-92.md @@ -0,0 +1,54 @@ +--- +layout: single +title: Chapter 14 논리 연산자 +categories : Language +tag : C +--- + +논리 연산자에 관한 글입니다. + +# 1 논리 연산자(logical operator) + +- 논리 연산자 + +> 논리 연산자란 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자를 의미한다. + +> AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, +피연산자들의 결합 방향은 왼쪽에서 오른쪽이다. +NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, +피연산자의 결합 방향은 오른쪽에서 왼쪽이다. + +![](https://velog.velcdn.com/images/ecg/post/4a5a994c-e71e-4366-a9bc-4febee2b452a/image.png) + +> C언어에서 거짓(false)은 0이며, 0이 아닌 모든 것은 참(true)으로 인식된다. + +> 다음은 논리 연산자의 모든 동작의 결과를 보여주는 진리표(truth table)이다. + +![](https://velog.velcdn.com/images/ecg/post/4111ff52-cf54-4b52-8edb-159ad319ec0d/image.png) + +- 예제 + +```c +int num01 = 3; +int num02 = -7; +int result01, result02; + +result01 = (num01 > 0) && (num01 < 5); +result02 = (num02 < 0) || (num02 > 10); + +printf("&& 연산자에 의한 결괏값은 %d입니다.\n", result01); +printf("|| 연산자에 의한 결괏값은 %d입니다.\n", result02); +printf(" ! 연산자에 의한 결괏값은 %d입니다.\n", !result02); +``` + +- 실행 결과 + +```c +&& 연산자에 의한 결괏값은 1입니다. +|| 연산자에 의한 결괏값은 1입니다. + ! 연산자에 의한 결괏값은 0입니다. +``` + +> 컴퓨터에서 참(true)은 보통 1로 표현되고, 거짓(false)은 0으로 표현된다. +하지만 C언어에서는 음수를 포함해 0이 아닌 모든 수가 참(true)으로 취급된다. + diff --git a/_posts/2023-12-02-93.md b/_posts/2023-12-02-93.md new file mode 100644 index 000000000000..c40830a0954b --- /dev/null +++ b/_posts/2023-12-02-93.md @@ -0,0 +1,61 @@ +--- +layout: single +title: Chapter 15 비트 연산자 +categories : Language +tag : C +--- + +비트 연산자에 관한 글입니다. + +# 1 비트 연산자(bitwise operator) + +- 비트 연산자 + +> 비트 연산자란 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자를 의미한다. + +> 또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다. + +![](https://velog.velcdn.com/images/ecg/post/24c86468-2b2d-41c5-b9c1-5584c59d6ee8/image.png) + +> 다음 그림은 비트 AND 연산자(&)의 동작을 나타낸다. +이처럼 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, +다른 경우는 모두 0을 반환한다. + +![](https://velog.velcdn.com/images/ecg/post/7cec40d3-b84a-4eb5-81b7-a547f59ea2b4/image.png) + +> 다음 그림은 비트 OR 연산자(|)의 동작을 나타낸다. +이처럼 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, +두 비트가 모두 0일 때만 0을 반환한다. + +![](https://velog.velcdn.com/images/ecg/post/8fdf9f18-94e6-48c4-b69a-b50d65b2fe5d/image.png) + +> 다음 그림은 비트 XOR 연산자(^)의 동작을 나타낸다. +이처럼 비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, +서로 같으면 0을 반환한다. + +![](https://velog.velcdn.com/images/ecg/post/b18082b3-eeff-4b4a-8c28-8cf88e9ce27f/image.png) + +> 다음 그림은 비트 NOT 연산자(~)의 동작을 나타낸다. +이처럼 비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환한다. + +![](https://velog.velcdn.com/images/ecg/post/8872793a-1d5b-4bb6-8bd5-413460192262/image.png) + +> 다음 예제는 비트 NOT 연산자(~)와 시프트 연산자(<<, >>)의 예제이다. + +- 예제 + +```c +int num01 = 15; int num02 = 8; + +printf(" ~ 연산자에 의한 결괏값은 %d입니다.\n", ~num01); // 1의 보수 +printf("<< 연산자에 의한 결괏값은 %d입니다.\n", num02 << 1); // 곱하기 2 +printf(">> 연산자에 의한 결괏값은 %d입니다.\n", num02 >> 1); // 나누기 2 +``` + +- 실행 결과 + +```c + ~ 연산자에 의한 결괏값은 -16입니다. +<< 연산자에 의한 결괏값은 16입니다. +>> 연산자에 의한 결괏값은 4입니다. +``` \ No newline at end of file diff --git a/_posts/2023-12-02-94.md b/_posts/2023-12-02-94.md new file mode 100644 index 000000000000..2e69e097f499 --- /dev/null +++ b/_posts/2023-12-02-94.md @@ -0,0 +1,118 @@ +--- +layout: single +title: Chapter 16 기타 연산자 +categories : Language +tag : C +--- + +기타 연산자에 관한 글입니다. + +# 1 삼항 연산자(ternary operator) + +- 삼항 연산자 + +> 삼항 연산자란 다른 언어에는 존재하지 않는 C언어만의 독특한 연산자를 의미한다. +이 연산자는 C언어에서도 유일하게 피연산자를 세 개나 가지는 조건 연산자이다. + +> 삼항 연산자의 문법은 다음과 같다. + +- 문법 + +```c +조건식 ? 반환값1 : 반환값2 +``` + +> 물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, +결괏값이 거짓(false)이면 반환값2를 반환된다. +이때 반환값에는 값뿐만 아니라 수식, 함수 호출 등 +여러 가지 형태의 명령문이 올 수 있다. + +- 예제 + +```c +int num01 = 15; +int num02 = 8; +int result; + +result = (num01 > num02) ? num01 : num02; +printf("둘 중에 더 큰수는 %d입니다.\n", result); +``` + +- 실행 결과 + +> 둘 중에 더 큰수는 15이다. + +> 삼항 연산자는 짧은 if / else 문 대신에 사용할 수 있으며, +코드를 간결하게 작성할 수 있도록 도와준다. + +# 2 쉼표 연산자 + +- 쉼표 연산자 + +> 쉼표(,) 연산자란 얼핏 연산자가 아닌 것처럼 보이지만 다양한 용도로 사용되는 연산자를 의미한다. 이 연산자는 어떠한 연산을 수행하는 것이 아니라 다음과 같은 상황에서 사용된다. + + - 두 연산식을 하나의 연산식으로 나타내고자 할 때 + + - 둘 이상의 인수를 함수로 전달하고자 할 때 + +- 예제 + +```c +int num01 = 15, num02 = 8; +printf("첫 번째 수는 %d이고, 두 번째 수는 %d입니다.\n", num01, num02); +``` + +- 실행 결과 + +```c +첫 번째 수는 15이고, 두 번째 수는 8입니다. +``` + +> 위의 예제에서 쉼표 연산자는 둘 이상의 변수를 동시에 선언하기 위해서 사용되었다. +또한, printf() 함수에서는 둘 이상의 인수를 동시에 printf() 함수로 전달하기 위해서 사용되었다. + +# 3 sizeof 연산자 + +> 사용자의 컴퓨터 환경에 따라 타입에 할당되는 메모리의 크기가 달라질 수 있다. +sizeof 연산자는 단항 연산자로 피연산자의 크기를 바이트 단위로 반환한다. +이 연산자는 피연산자로 타입뿐만 아니라 변수나 상수를 전달받을 수도 있다. +sizeof 연산자에 변수나 상수가 피연산자로 전달되면, +해당 변수나 상수에 해당하는 타입의 크기를 반환해 준다. + +- 예제 + +```c +printf("char: %d, short: %d, int: %d, long: %d, long long: %d\n", + sizeof(char), // 1: sizeof로 char 자료형의 크기를 구함 + sizeof(short), // 2: sizeof로 short 자료형의 크기를 구함 + sizeof(int), // 4: sizeof로 int 자료형의 크기를 구함 + sizeof(long), // 4: sizeof로 long 자료형의 크기를 구함 + sizeof(long long) // 8: sizeof로 long long 자료형의 크기를 구함 +); +``` + +- 실행 결과 + +```c +char: 1, short: 2, int: 4, long: 4, long long: 8 +``` + +> sizeof 연산자를 통해 컴퓨터 환경에서의 타입 크기를 알아볼 수 있다. + +# 4 포인터 연산자 + +> C언어에서 포인터와 연관되어 사용되는 연산자는 다음과 같다. + +1. 주소 연산자(&) + +2. 참조 연산자(*) + +> 주소 연산자(&)는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다. +'&'기호는 앰퍼샌드(ampersand)라고 읽으며, 번지 연산자라고도 불린다. + +> 참조 연산자(*)는 포인터의 이름이나 주소 앞에 사용하여, +포인터에 가리키는 주소에 저장된 값을 반환한다. + +> C언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용된다. +> 이항 연산자로 사용하면 곱셈 연산으로 사용되며, +포인터의 선언 시나 메모리에 접근할 때도 사용된다. \ No newline at end of file diff --git a/_posts/2023-12-02-95.md b/_posts/2023-12-02-95.md new file mode 100644 index 000000000000..c45eca60f0c1 --- /dev/null +++ b/_posts/2023-12-02-95.md @@ -0,0 +1,362 @@ +--- +layout: single +title: Chapter 17 조건문 +categories : Language +tag : C +--- + +조건문에 관한 글입니다. + +# 1 제어문(control flow statements) + +> C 프로그램은 절차적 프로그램(procedural program) +또는 명령형 프로그램(Imperative program)에 속한다. +C 프로그램에는 수많은 명령문이 포함되어 있으며, +이 명령문은 처음부터 끝까지 순서대로 실행된다. +따라서 원하는 결과를 얻기 위해서는 프로그램의 +이러한 순차적인 흐름을 제어해야만 한다. + +> 이때 사용하는 명령문을 제어문이라고 하며, +제어문에는 조건문, 반복문 등이 있다. +제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있으며, +이러한 중괄호 영역을 블록(block)이라고 한다. + +## 1.1 조건문(conditional statements) + +- 조건문 + +> 조건문이란 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문을 의미한다. + +> 조건문 중에서도 가장 기본이 되는 명령문은 바로 if 문이다. + +> C 언어에서 사용하는 대표적인 조건문의 형태는 다음과 같다. + +1. if 문 +2. if / else 문 +3. if / else if / else 문 +4. switch 문 + +## 1.2 if 문 + +> if 문은 조건식의 결과가 참(true)이면 주어진 명령문을 실행하며, 거짓(false)이면 아무것도 실행하지 않는다. + +> if 문을 순서도로 표현하면 다음 그림과 같다. + +![](https://velog.velcdn.com/images/ecg/post/aea7be98-1092-4d6d-9ff5-579a6c48402a/image.png) + +> C 언어에서 if 문의 문법은 다음과 같다. + +- 문법 + +```c +if (조건식) +{ + 조건식의 결과가 참일 때 실행하고자 하는 명령문; +} +``` + +> 위의 코드에서 블록에 속한 명령문은 중괄호({})를 기준으로 +오른쪽으로 들여쓰기가 되어 있는 것을 볼 수 있다. +이처럼 들여쓰기를 통해 코드의 가독성을 높이는 것을 인덴트(indent)라고 하며, +될 수 있으면 모든 코드를 인덴트하는 것이 좋다. + +> 다음 예제는 if 문을 3번 연속해서 사용하여, +사용자가 입력한 수와 숫자 5를 비교하여 그 결괏값을 출력하는 예제입니다. + +- 예제 + +```c +int num = 3; +if (num < 5) +{ + printf("입력하신 수는 5보다 작습니다.\n"); +} +if (num == 5) +{ + printf("입력하신 수는 5입니다.\n"); +} +if (num > 5) +{ + printf("입력하신 수는 5보다 큽니다.\n"); +} +``` + +- 실행 결과 + +```c +입력하신 수는 5보다 작습니다. +``` + +> if 문에서 실행될 명령문이 한 줄 뿐이라면 중괄호({})를 생략할 수 있다. + +## 1.3 if / else 문 + +> if 문과 함께 사용하는 else 문은 if 문과는 반대로 주어진 조건식의 결과가 거짓(false)이면 주어진 명령문을 실행한다. + +> if / else 문을 순서도로 표현하면 다음 그림과 같다. + +![](https://velog.velcdn.com/images/ecg/post/11fb4a60-2789-4e3d-b352-d290c1e6f185/image.png) + +> C 언어에서 else 문의 문법은 다음과 같다. + +- 문법 + +```c +if (조건식) +{ + 조건식의 결과가 참일 때 실행하고자 하는 명령문; +} +else +{ + 조건식의 결과가 거짓일 때 실행하고자 하는 명령문; +} +``` + +> else 문을 사용하면 좀 더 직관적으로 표현할 수 있다. + +- 예제 + +```c +int num = 5; +if (num < 5) +{ + printf("입력하신 수는 5보다 작습니다.\n"); +} +else +{ + if (num == 5) + { + printf("입력하신 수는 5입니다.\n"); + } + else + { + printf("입력하신 수는 5보다 큽니다.\n"); + } +} +``` + +- 실행 결과 + +```c +입력하신 수는 5입니다. +``` + +> else 문에서도 실행될 명령문이 한 줄뿐이라면 중괄호({})를 생략할 수 있다. + +## 1.4 if / else if / else 문 + +> else if 문은 if 문처럼 조건식을 가질 수 있기 때문에 +중첩된 if 문을 좀 더 간결하게 표현할 수 있도록 해준다. +하나의 조건문 안에서 if 문과 else 문은 단 한 번만 사용될 수 있다. +하지만 else if 문은 여러 번 사용될 수 있어서 +복잡한 조건도 표현할 수 있다. + +> if / else if / else 문을 순서도로 표현하면 다음 그림과 같다. + +![업로드중..](blob:https://velog.io/f80b6e3f-728b-4b36-8a48-cc5e26eb2faa) + +> C 언어에서 else if 문의 문법은 다음과 같다. + +- 문법 + +``` +if (조건식1) +{ + 조건식1의 결과가 참일 때 실행하고자 하는 명령문; +} +else if (조건식2) +{ + 조건식2의 결과가 참일 때 실행하고자 하는 명령문; +} +else +{ + 조건식1의 결과도 거짓이고, 조건식2의 결과도 거짓일 때 실행하고자 하는 명령문; +} +``` + +> else if 문을 사용하면 더욱 간결하게 표현할 수 있다. + +- 예제 + +```c +int num = 7; +if (num < 5) +{ + printf("입력하신 수는 5보다 작습니다.\n"); +} +else if (num == 5) +{ + printf("입력하신 수는 5입니다.\n"); +} +else +{ + printf("입력하신 수는 5보다 큽니다.\n"); +} +``` + +- 실행 결과 + +```c +입력하신 수는 5보다 큽니다. +``` + +> else if 문에서도 실행될 명령문이 한 줄뿐이라면 중괄호({})를 생략할 수 있다. + +## 1.5 삼항 연산자에 의한 조건문 + +> C 언어에서는 if / else 문을 삼항 연산자를 이용하여 간단히 표현할 수 있다. + +- 문법 + +```c +조건식 ? 반환값1 : 반환값2 +``` + +## 1.6 switch 문 + +> switch 문은 if / else 문과 마찬가지로 주어진 조건 값의 결과에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문이다. +이러한 switch 문은 if / else 문보다 가독성이 더 좋으며, 컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른 편이다. + +> 하지만 switch 문의 조건 값으로는 int형으로 승격할 수 있는(integer promotion) 값만이 사용될 수 있다. +즉, C언어에서는 char형, short형, int형 변수나 +리터럴과 열거체까지 사용할 수 있다. +따라서 if / else 문보다는 사용할 수 있는 상황이 적은 편이다. + +> C 언어에서 switch 문의 문법은 다음과 같다. + +- 문법 + +```c +switch (조건 값) +{ + case 값1: + 조건 값이 값1일 때 실행하고자 하는 명령문; + break; + case 값2: + 조건 값이 값2일 때 실행하고자 하는 명령문; + break; + ... + default: + 조건 값이 어떠한 case 절에도 해당하지 않을 때 실행하고자 하는 명령문; + break; +} +``` + +> default 절은 조건 값이 위에 나열된 +어떠한 case 절에도 해당하지 않을 때 실행된다. + +> 이 구문은 반드시 존재해야 하는 것은 아니며 필요할 때에만 선언할 수 있다. + +> default 절의 위치가 반드시 switch 문의 맨 마지막일 필요는 없다. + +- 예제 + +```c +int num = 2; +switch (num) +{ + case 1: + printf("입력하신 수는 1입니다.\n"); + break; + case 2: + printf("입력하신 수는 2입니다.\n"); + break; + case 3: + printf("입력하신 수는 3입니다.\n"); + break; + case 4: + printf("입력하신 수는 4입니다.\n"); + break; + case 5: + printf("입력하신 수는 5입니다.\n"); + break; + default: + printf("1부터 5까지의 수만 입력해 주세요!"); + break; +} +``` + +- 실행 결과 + +```c +입력하신 수는 2입니다. +``` + +> 각 case 절 및 default 절은 반드시 break 키워드를 포함하고 있어야 한다. break 키워드는 조건 값에 해당하는 case 절이나 default 절이 실행된 뒤에 전체 switch 문을 빠져나가게 해준다. +만약에 break 키워드가 없다면, 조건에 해당하는 switch 문의 case 절 이후의 모든 case 절이 전부 실행될 것이다. + +> 다음 예제는 앞서 살펴본 예제에서 break 키워드를 모두 삭제한 예제이다. + +- 예제 + +```c +int num = 2; +switch (num) +{ + case 1: + printf("입력하신 수는 1입니다.\n"); + case 2: + printf("입력하신 수는 2입니다.\n"); + case 3: + printf("입력하신 수는 3입니다.\n"); + case 4: + printf("입력하신 수는 4입니다.\n"); + case 5: + printf("입력하신 수는 5입니다.\n"); + default: + printf("1부터 5까지의 수만 입력해 주세요!"); +} +``` + +- 실행 결과 + +```c +입력하신 수는 2입니다. +입력하신 수는 3입니다. +입력하신 수는 4입니다. +입력하신 수는 5입니다. +1부터 5까지의 수만 입력해 주세요! +``` + +> 위의 예제처럼 break 키워드가 없으면, 조건 값에 해당하는 case 절뿐만 아니라 그 이후에 등장하는 모든 case 절과 default 절이 전부 실행됨을 알 수 있다. + +> 다음 예제는 조건 값으로 여러 개의 char형 문자를 검사하는 예제이다. +이렇게 switch 문의 조건으로 여러 개의 case 절을 사용하여 여러 개의 조건을 한 번에 검사할 수 있다. + +- 예제 + +```c +char ch = 'a'; +switch (ch) +{ + case 'a': + case 'A': + printf("이 학생의 학점은 A입니다.\n"); + break; + case 'b': + case 'B': + printf("이 학생의 학점은 B입니다.\n"); + break; + case 'c': + case 'C': + printf("이 학생의 학점은 C입니다.\n"); + break; + case 'd': + case 'D': + printf("이 학생의 학점은 D입니다.\n"); + break; + case 'f': + case 'F': + printf("이 학생의 학점은 F입니다.\n"); + break; + default: + printf("학점을 정확히 입력해 주세요!(A, B, C, D, F)"); + break; +} +``` + +- 실행 결과 + +```c +이 학생의 학점은 A입니다. +``` \ No newline at end of file diff --git a/assets/images/DEV.png b/assets/images/DEV.png new file mode 100644 index 0000000000000000000000000000000000000000..eb434154e3fd512009a3ec7a8d97e029b1aa6c14 GIT binary patch literal 28682 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 Date: Sun, 3 Dec 2023 11:29:37 +0900 Subject: [PATCH 18/41] =?UTF-8?q?feat=20:=20=ED=8C=8C=EC=9D=BC=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 86 +++++++++++++----------- _posts/{ => 2023-12-01}/2023-12-01-1.md | 0 _posts/{ => 2023-12-01}/2023-12-01-2.md | 0 _posts/{ => 2023-12-01}/2023-12-01-3.md | 0 _posts/{ => 2023-12-02}/2023-12-02-1.md | 0 _posts/{ => 2023-12-02}/2023-12-02-2.md | 0 _posts/{ => 2023-12-02}/2023-12-02-3.md | 0 _posts/{ => 2023-12-02}/2023-12-02-4.md | 0 _posts/{ => 2023-12-02}/2023-12-02-5.md | 0 _posts/{ => 2023-12-02}/2023-12-02-6.md | 0 _posts/{ => 2023-12-02}/2023-12-02-7.md | 0 _posts/{ => 2023-12-02}/2023-12-02-8.md | 0 _posts/{ => 2023-12-02}/2023-12-02-9.md | 0 _posts/{ => 2023-12-02}/2023-12-02-91.md | 0 _posts/{ => 2023-12-02}/2023-12-02-92.md | 0 _posts/{ => 2023-12-02}/2023-12-02-93.md | 0 _posts/{ => 2023-12-02}/2023-12-02-94.md | 0 _posts/{ => 2023-12-02}/2023-12-02-95.md | 0 18 files changed, 47 insertions(+), 39 deletions(-) rename _posts/{ => 2023-12-01}/2023-12-01-1.md (100%) rename _posts/{ => 2023-12-01}/2023-12-01-2.md (100%) rename _posts/{ => 2023-12-01}/2023-12-01-3.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-1.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-2.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-3.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-4.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-5.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-6.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-7.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-8.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-9.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-91.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-92.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-93.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-94.md (100%) rename _posts/{ => 2023-12-02}/2023-12-02-95.md (100%) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 202c89902cbc..1df053ce061a 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,8 +11,12 @@ "id": "bcc96669a83b4c4b", "type": "leaf", "state": { - "type": "empty", - "state": {} + "type": "markdown", + "state": { + "file": "_posts/2023-12-02/2023-12-02-1.md", + "mode": "source", + "source": false + } } } ] @@ -81,6 +85,7 @@ "state": { "type": "backlink", "state": { + "file": "_posts/2023-12-02/2023-12-02-1.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -97,6 +102,7 @@ "state": { "type": "outgoing-link", "state": { + "file": "_posts/2023-12-02/2023-12-02-1.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -118,7 +124,9 @@ "type": "leaf", "state": { "type": "outline", - "state": {} + "state": { + "file": "_posts/2023-12-02/2023-12-02-1.md" + } } } ] @@ -140,48 +148,48 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ - "_site/language/3/index.html", - "_site/language/3", - "_site/language/4/index.html", - "_site/language/4", - "_site/language/5/index.html", - "_site/language/5", - "_site/language/7/index.html", - "_site/language/7", - "_site/language/6/index.html", - "_site/language/6", - "_site/language/8/index.html", - "_site/_pages/tag-archive.md", - "_pages/tag-archive.md", - "_posts/2023-12-02-95.md", - "_posts/2023-12-02-94.md", - "_posts/2023-12-02-93.md", - "_posts/2023-12-02-92.md", - "_posts/2023-12-02-91.md", - "_posts/2023-12-02-10.md", - "_posts/2023-12-02-9-1.md", - "_posts/2023-12-02-9.md", - "_posts/2023-12-02-8.md", - "_posts/2023-12-02-7.md", - "_posts/2023-12-02-14.md", - "_posts/2023-12-02-13.md", - "_posts/2023-12-02-12.md", - "_posts/2023-12-02-11.md", - "_posts/2023-12-02-6.md", - "_posts/2023-12-02-5.md", - "_posts/2023-12-02-4.md", - "_posts/2023-12-02-3.md", - "_site/_pages/category-archive.md", - "_pages/category-archive.md", + "_site/language/95/index.html", + "_site/language/95", + "_posts/2023-12-02/2023-12-02-95.md", + "_site/language/94/index.html", + "_site/language/94", + "_site/page4/index.html", + "_site/page4", + "_posts/2023-12-02/2023-12-02-94.md", + "_site/language/93/index.html", + "_site/language/93", + "_posts/2023-12-02/2023-12-02-93.md", + "_site/language/92/index.html", + "_site/language/92", + "_posts/2023-12-02/2023-12-02-92.md", + "_site/language/91/index.html", + "_posts/2023-12-02/2023-12-02-91.md", + "_posts/2023-12-02/2023-12-02-9.md", + "_posts/2023-12-02/2023-12-02-8.md", + "_posts/2023-12-02/2023-12-02-7.md", + "_posts/2023-12-02/2023-12-02-6.md", + "_posts/2023-12-02/2023-12-02-5.md", + "_posts/2023-12-02/2023-12-02-4.md", + "_posts/2023-12-02/2023-12-02-3.md", + "_posts/2023-12-02/2023-12-02-2.md", + "_posts/2023-12-02/2023-12-02-1.md", + "_posts/2023-12-02/1.md", + "_posts/2023-12-02/2023-12-02.md", + "_posts/2023-12-01/2023-12-01-3.md", + "_posts/2023-12-01/2023-12-01-2.md", + "_posts/2023-12-01/2023-12-01-1.md", + "_posts/2023-12-02/95.md", + "_posts/2023-12-02/94.md", + "_posts/2023-12-02/93.md", + "_posts/2023-12-02/92.md", + "_posts/2023-12-02/91.md", + "_posts/2023-12-02/9.md", "_site/assets/images/DEV.png", "assets/images/DEV.png", "_site/assets/images/d76c4a17-9336-4f69-acb5-1a5352a99ef7.png", "assets/images/d76c4a17-9336-4f69-acb5-1a5352a99ef7.png", "_site/assets/images/a788cc85-0df7-4225-8137-5612f739a97c.png", "assets/images/a788cc85-0df7-4225-8137-5612f739a97c.png", - "_posts/2023-12-02-15.md", - "_posts/2023-12-02-2.md", - "_posts/2023-12-02-1.md", "_site/screenshot.png", "_site/screenshot-layouts.png", "test/assets/images/unsplash-image-9.jpg", diff --git a/_posts/2023-12-01-1.md b/_posts/2023-12-01/2023-12-01-1.md similarity index 100% rename from _posts/2023-12-01-1.md rename to _posts/2023-12-01/2023-12-01-1.md diff --git a/_posts/2023-12-01-2.md b/_posts/2023-12-01/2023-12-01-2.md similarity index 100% rename from _posts/2023-12-01-2.md rename to _posts/2023-12-01/2023-12-01-2.md diff --git a/_posts/2023-12-01-3.md b/_posts/2023-12-01/2023-12-01-3.md similarity index 100% rename from _posts/2023-12-01-3.md rename to _posts/2023-12-01/2023-12-01-3.md diff --git a/_posts/2023-12-02-1.md b/_posts/2023-12-02/2023-12-02-1.md similarity index 100% rename from _posts/2023-12-02-1.md rename to _posts/2023-12-02/2023-12-02-1.md diff --git a/_posts/2023-12-02-2.md b/_posts/2023-12-02/2023-12-02-2.md similarity index 100% rename from _posts/2023-12-02-2.md rename to _posts/2023-12-02/2023-12-02-2.md diff --git a/_posts/2023-12-02-3.md b/_posts/2023-12-02/2023-12-02-3.md similarity index 100% rename from _posts/2023-12-02-3.md rename to _posts/2023-12-02/2023-12-02-3.md diff --git a/_posts/2023-12-02-4.md b/_posts/2023-12-02/2023-12-02-4.md similarity index 100% rename from _posts/2023-12-02-4.md rename to _posts/2023-12-02/2023-12-02-4.md diff --git a/_posts/2023-12-02-5.md b/_posts/2023-12-02/2023-12-02-5.md similarity index 100% rename from _posts/2023-12-02-5.md rename to _posts/2023-12-02/2023-12-02-5.md diff --git a/_posts/2023-12-02-6.md b/_posts/2023-12-02/2023-12-02-6.md similarity index 100% rename from _posts/2023-12-02-6.md rename to _posts/2023-12-02/2023-12-02-6.md diff --git a/_posts/2023-12-02-7.md b/_posts/2023-12-02/2023-12-02-7.md similarity index 100% rename from _posts/2023-12-02-7.md rename to _posts/2023-12-02/2023-12-02-7.md diff --git a/_posts/2023-12-02-8.md b/_posts/2023-12-02/2023-12-02-8.md similarity index 100% rename from _posts/2023-12-02-8.md rename to _posts/2023-12-02/2023-12-02-8.md diff --git a/_posts/2023-12-02-9.md b/_posts/2023-12-02/2023-12-02-9.md similarity index 100% rename from _posts/2023-12-02-9.md rename to _posts/2023-12-02/2023-12-02-9.md diff --git a/_posts/2023-12-02-91.md b/_posts/2023-12-02/2023-12-02-91.md similarity index 100% rename from _posts/2023-12-02-91.md rename to _posts/2023-12-02/2023-12-02-91.md diff --git a/_posts/2023-12-02-92.md b/_posts/2023-12-02/2023-12-02-92.md similarity index 100% rename from _posts/2023-12-02-92.md rename to _posts/2023-12-02/2023-12-02-92.md diff --git a/_posts/2023-12-02-93.md b/_posts/2023-12-02/2023-12-02-93.md similarity index 100% rename from _posts/2023-12-02-93.md rename to _posts/2023-12-02/2023-12-02-93.md diff --git a/_posts/2023-12-02-94.md b/_posts/2023-12-02/2023-12-02-94.md similarity index 100% rename from _posts/2023-12-02-94.md rename to _posts/2023-12-02/2023-12-02-94.md diff --git a/_posts/2023-12-02-95.md b/_posts/2023-12-02/2023-12-02-95.md similarity index 100% rename from _posts/2023-12-02-95.md rename to _posts/2023-12-02/2023-12-02-95.md From fb92760d4608b0c0decbef56e742d12d39e9ee86 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sun, 3 Dec 2023 11:59:59 +0900 Subject: [PATCH 19/41] =?UTF-8?q?feat=20:=20=EB=82=A0=EC=A7=9C=20=EA=B8=B0?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 65 +++++++++---------- ...023-12-01-3.md => 2023-12-01-C-Program.md} | 8 +-- ...12-01-2.md => 2023-12-01-C-Programming.md} | 8 +-- .../2023-12-01-1.md => 2023-12-01-C.md} | 10 +-- ...7.md => 2023-12-02-arithmetic-operator.md} | 8 +-- ...8.md => 2023-12-02-assignment-operator.md} | 8 +-- ...23-12-02-5.md => 2023-12-02-basic-type.md} | 8 +-- ...2-93.md => 2023-12-02-bitwise-operator.md} | 8 +-- ...1.md => 2023-12-02-comparison-operator.md} | 8 +-- ...md => 2023-12-02-conditional-statement.md} | 8 +-- ...2023-12-02-4.md => 2023-12-02-constant.md} | 8 +-- ...12-02-increment-and-decrement operator.md} | 8 +-- ...2-92.md => 2023-12-02-logical-operator.md} | 8 +-- ...-02-94.md => 2023-12-02-other-operator.md} | 8 +-- ...2023-12-02-1.md => 2023-12-02-printf().md} | 8 +-- .../2023-12-02-2.md => 2023-12-02-scanf().md} | 8 +-- ...-12-02-6.md => 2023-12-02-type-casting.md} | 8 +-- ...2023-12-02-3.md => 2023-12-02-variable.md} | 8 +-- 18 files changed, 101 insertions(+), 102 deletions(-) rename _posts/{2023-12-01/2023-12-01-3.md => 2023-12-01-C-Program.md} (97%) rename _posts/{2023-12-01/2023-12-01-2.md => 2023-12-01-C-Programming.md} (97%) rename _posts/{2023-12-01/2023-12-01-1.md => 2023-12-01-C.md} (97%) rename _posts/{2023-12-02/2023-12-02-7.md => 2023-12-02-arithmetic-operator.md} (96%) rename _posts/{2023-12-02/2023-12-02-8.md => 2023-12-02-assignment-operator.md} (91%) rename _posts/{2023-12-02/2023-12-02-5.md => 2023-12-02-basic-type.md} (98%) rename _posts/{2023-12-02/2023-12-02-93.md => 2023-12-02-bitwise-operator.md} (95%) rename _posts/{2023-12-02/2023-12-02-91.md => 2023-12-02-comparison-operator.md} (91%) rename _posts/{2023-12-02/2023-12-02-95.md => 2023-12-02-conditional-statement.md} (98%) rename _posts/{2023-12-02/2023-12-02-4.md => 2023-12-02-constant.md} (95%) rename _posts/{2023-12-02/2023-12-02-9.md => 2023-12-02-increment-and-decrement operator.md} (96%) rename _posts/{2023-12-02/2023-12-02-92.md => 2023-12-02-logical-operator.md} (94%) rename _posts/{2023-12-02/2023-12-02-94.md => 2023-12-02-other-operator.md} (97%) rename _posts/{2023-12-02/2023-12-02-1.md => 2023-12-02-printf().md} (98%) rename _posts/{2023-12-02/2023-12-02-2.md => 2023-12-02-scanf().md} (97%) rename _posts/{2023-12-02/2023-12-02-6.md => 2023-12-02-type-casting.md} (99%) rename _posts/{2023-12-02/2023-12-02-3.md => 2023-12-02-variable.md} (98%) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 1df053ce061a..de9e9625125a 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-02/2023-12-02-1.md", + "file": "_posts/2023-12-01-C.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-02/2023-12-02-1.md", + "file": "_posts/2023-12-01-C.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-02/2023-12-02-1.md", + "file": "_posts/2023-12-01-C.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-02/2023-12-02-1.md" + "file": "_posts/2023-12-01-C.md" } } } @@ -148,42 +148,41 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ - "_site/language/95/index.html", - "_site/language/95", + "_posts/2023-12-02-conditional-statement.md", + "_site/language/conditional-statement/index.html", + "_site/language/conditional-statement", + "_site/language/index.html", + "_posts/2023-12-02-other-operator.md", + "_site/language/other-operator/index.html", + "_site/language/other-operator", + "_posts/2023-12-02-bitwise-operator.md", + "_site/language/bitwise-operator/index.html", + "_site/language/bitwise-operator", + "_posts/2023-12-02-logical-operator.md", + "_site/language/logical-operator/index.html", + "_site/language/logical-operator", + "_posts/2023-12-02-comparison-operator.md", + "_site/language/comparison-operator/index.html", + "_posts/2023-12-02-increment-and-decrement operator.md", + "_posts/2023-12-02-assignment-operator.md", + "_posts/2023-12-02-arithmetic-operator.md", + "_posts/2023-12-01-C-Programming.md", + "_posts/2023-12-01-C-Program.md", + "_posts/2023-12-02-type-casting.md", + "_posts/2023-12-02-basic-type.md", + "_posts/2023-12-02-constant.md", + "_posts/2023-12-02-variable.md", + "_posts/2023-12-02-scanf().md", + "_posts/2023-12-02-printf().md", + "_posts/2023-12-01-C.md", + "_posts/2023-12-01-3.md", "_posts/2023-12-02/2023-12-02-95.md", - "_site/language/94/index.html", - "_site/language/94", - "_site/page4/index.html", - "_site/page4", "_posts/2023-12-02/2023-12-02-94.md", - "_site/language/93/index.html", - "_site/language/93", "_posts/2023-12-02/2023-12-02-93.md", - "_site/language/92/index.html", - "_site/language/92", "_posts/2023-12-02/2023-12-02-92.md", - "_site/language/91/index.html", "_posts/2023-12-02/2023-12-02-91.md", "_posts/2023-12-02/2023-12-02-9.md", "_posts/2023-12-02/2023-12-02-8.md", - "_posts/2023-12-02/2023-12-02-7.md", - "_posts/2023-12-02/2023-12-02-6.md", - "_posts/2023-12-02/2023-12-02-5.md", - "_posts/2023-12-02/2023-12-02-4.md", - "_posts/2023-12-02/2023-12-02-3.md", - "_posts/2023-12-02/2023-12-02-2.md", - "_posts/2023-12-02/2023-12-02-1.md", - "_posts/2023-12-02/1.md", - "_posts/2023-12-02/2023-12-02.md", - "_posts/2023-12-01/2023-12-01-3.md", - "_posts/2023-12-01/2023-12-01-2.md", - "_posts/2023-12-01/2023-12-01-1.md", - "_posts/2023-12-02/95.md", - "_posts/2023-12-02/94.md", - "_posts/2023-12-02/93.md", - "_posts/2023-12-02/92.md", - "_posts/2023-12-02/91.md", - "_posts/2023-12-02/9.md", "_site/assets/images/DEV.png", "assets/images/DEV.png", "_site/assets/images/d76c4a17-9336-4f69-acb5-1a5352a99ef7.png", diff --git a/_posts/2023-12-01/2023-12-01-3.md b/_posts/2023-12-01-C-Program.md similarity index 97% rename from _posts/2023-12-01/2023-12-01-3.md rename to _posts/2023-12-01-C-Program.md index 0523b3e13831..c84bc22c0472 100644 --- a/_posts/2023-12-01/2023-12-01-3.md +++ b/_posts/2023-12-01-C-Program.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 03 C 프로그램의 특징 -categories : Language -tag : C +date: 2023-12-03 11:55:41 +categories: Language +tags: C +excerpt: C 프로그램의 특징에 관한 글입니다. --- -C 프로그램의 특징에 관한 글입니다. - # 1 C 프로그램의 특징 > C 언어로 작성된 프로그램이 가지는 일반적인 특징은 다음과 같다. diff --git a/_posts/2023-12-01/2023-12-01-2.md b/_posts/2023-12-01-C-Programming.md similarity index 97% rename from _posts/2023-12-01/2023-12-01-2.md rename to _posts/2023-12-01-C-Programming.md index 31f363deaa2b..975606024ecd 100644 --- a/_posts/2023-12-01/2023-12-01-2.md +++ b/_posts/2023-12-01-C-Programming.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 02 C 프로그래밍 -categories : Language -tag : C +date: 2023-12-03 11:55:35 +categories: Language +tags: C +excerpt: C 프로그래밍에 관한 글입니다. --- -C 프로그래밍에 관한 글입니다. - # 1 프로그래밍(programming) > 프로그래밍(programming)이란 목적에 맞는 알고리즘으로부터 프로그래밍 언어를 사용하여 구체적인 프로그램을 작성하는 과정을 의미한다. diff --git a/_posts/2023-12-01/2023-12-01-1.md b/_posts/2023-12-01-C.md similarity index 97% rename from _posts/2023-12-01/2023-12-01-1.md rename to _posts/2023-12-01-C.md index ee2a2549c321..823d5a9d1a89 100644 --- a/_posts/2023-12-01/2023-12-01-1.md +++ b/_posts/2023-12-01-C.md @@ -1,12 +1,12 @@ --- layout: single -title: "Chapter 01 C 언어" -categories : Language -tag : C +title: Chapter 01 C 언어 +date: 2023-12-03 11:55:25 +categories: Language +tags: C +excerpt: C 언어에 관한 글입니다. --- -C 언어에 관한 글입니다. - # 1 프로그램 > 프로그램(program)이란 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 처리 방법과 순서를 기술한 일련의 명령문의 집합체를 의미한다. diff --git a/_posts/2023-12-02/2023-12-02-7.md b/_posts/2023-12-02-arithmetic-operator.md similarity index 96% rename from _posts/2023-12-02/2023-12-02-7.md rename to _posts/2023-12-02-arithmetic-operator.md index 870df6cdbd76..c033aff71a54 100644 --- a/_posts/2023-12-02/2023-12-02-7.md +++ b/_posts/2023-12-02-arithmetic-operator.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 10 산술 연산자 -categories : Language -tag : C +date: 2023-12-03 11:58:02 +categories: Language +tags: C +excerpt: 산술 연산자에 관한 글입니다. --- -산술 연산자에 관한 글입니다. - # 1 연산자(operator) - 연산자 diff --git a/_posts/2023-12-02/2023-12-02-8.md b/_posts/2023-12-02-assignment-operator.md similarity index 91% rename from _posts/2023-12-02/2023-12-02-8.md rename to _posts/2023-12-02-assignment-operator.md index ccb6318960cd..b7de71ad35c5 100644 --- a/_posts/2023-12-02/2023-12-02-8.md +++ b/_posts/2023-12-02-assignment-operator.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 11 대입 연산자 -categories : Language -tag : C +date: 2023-12-03 11:58:07 +categories: Language +tags: C +excerpt: 대입 연산자에 관한 글입니다. --- -대입 연산자에 관한 글입니다. - # 1 대입 연산자(assignment operator) - 대입 연산자 diff --git a/_posts/2023-12-02/2023-12-02-5.md b/_posts/2023-12-02-basic-type.md similarity index 98% rename from _posts/2023-12-02/2023-12-02-5.md rename to _posts/2023-12-02-basic-type.md index 7c6b95738078..d8238543d494 100644 --- a/_posts/2023-12-02/2023-12-02-5.md +++ b/_posts/2023-12-02-basic-type.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 08 기본 타입 -categories : Language -tag : C +date: 2023-12-03 11:57:38 +categories: Language +tags: C +excerpt: 기본 타입에 관한 글입니다. --- -기본 타입에 관한 글입니다. - # 1 기본 타입 > C 언어에서 타입(data type)이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 한다. diff --git a/_posts/2023-12-02/2023-12-02-93.md b/_posts/2023-12-02-bitwise-operator.md similarity index 95% rename from _posts/2023-12-02/2023-12-02-93.md rename to _posts/2023-12-02-bitwise-operator.md index c40830a0954b..de6cfeece672 100644 --- a/_posts/2023-12-02/2023-12-02-93.md +++ b/_posts/2023-12-02-bitwise-operator.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 15 비트 연산자 -categories : Language -tag : C +date: 2023-12-03 11:58:45 +categories: Language +tags: C +excerpt: 비트 연산자에 관한 글입니다. --- -비트 연산자에 관한 글입니다. - # 1 비트 연산자(bitwise operator) - 비트 연산자 diff --git a/_posts/2023-12-02/2023-12-02-91.md b/_posts/2023-12-02-comparison-operator.md similarity index 91% rename from _posts/2023-12-02/2023-12-02-91.md rename to _posts/2023-12-02-comparison-operator.md index 60b49cfd4aa1..5024a1ed8925 100644 --- a/_posts/2023-12-02/2023-12-02-91.md +++ b/_posts/2023-12-02-comparison-operator.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 13 비교 연산자 -categories : Language -tag : C +date: 2023-12-03 11:58:29 +categories: Language +tags: C +excerpt: 비교 연산자에 관한 글입니다. --- -비교 연산자에 관한 글입니다. - # 1 비교 연산자(comparison operator) - 비교 연산자 diff --git a/_posts/2023-12-02/2023-12-02-95.md b/_posts/2023-12-02-conditional-statement.md similarity index 98% rename from _posts/2023-12-02/2023-12-02-95.md rename to _posts/2023-12-02-conditional-statement.md index c45eca60f0c1..167812125b98 100644 --- a/_posts/2023-12-02/2023-12-02-95.md +++ b/_posts/2023-12-02-conditional-statement.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 17 조건문 -categories : Language -tag : C +date: 2023-12-03 11:59:00 +categories: Language +tags: C +excerpt: 조건문에 관한 글입니다. --- -조건문에 관한 글입니다. - # 1 제어문(control flow statements) > C 프로그램은 절차적 프로그램(procedural program) diff --git a/_posts/2023-12-02/2023-12-02-4.md b/_posts/2023-12-02-constant.md similarity index 95% rename from _posts/2023-12-02/2023-12-02-4.md rename to _posts/2023-12-02-constant.md index 9217d2648b88..1782cfd8eb1a 100644 --- a/_posts/2023-12-02/2023-12-02-4.md +++ b/_posts/2023-12-02-constant.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 07 상수 -categories : Language -tag : C +date: 2023-12-03 11:57:05 +categories: Language +tags: C +excerpt: 상수에 관한 글입니다. --- -상수에 관한 글입니다. - # 1 상수(constant) - 상수 diff --git a/_posts/2023-12-02/2023-12-02-9.md b/_posts/2023-12-02-increment-and-decrement operator.md similarity index 96% rename from _posts/2023-12-02/2023-12-02-9.md rename to _posts/2023-12-02-increment-and-decrement operator.md index 15ffb132bc40..2e2d64077f4a 100644 --- a/_posts/2023-12-02/2023-12-02-9.md +++ b/_posts/2023-12-02-increment-and-decrement operator.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 12 증감 연산자 -categories : Language -tag : C +date: 2023-12-03 11:58:18 +categories: Language +tags: C +excerpt: 증감 연산자에 관한 글입니다. --- -증감 연산자에 관한 글입니다. - # 1 증감 연산자(increment and decrement operator) - 증감 연산자 diff --git a/_posts/2023-12-02/2023-12-02-92.md b/_posts/2023-12-02-logical-operator.md similarity index 94% rename from _posts/2023-12-02/2023-12-02-92.md rename to _posts/2023-12-02-logical-operator.md index abcbc3b05563..b10d8b88827f 100644 --- a/_posts/2023-12-02/2023-12-02-92.md +++ b/_posts/2023-12-02-logical-operator.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 14 논리 연산자 -categories : Language -tag : C +date: 2023-12-03 11:58:35 +categories: Language +tags: C +excerpt: 논리 연산자에 관한 글입니다. --- -논리 연산자에 관한 글입니다. - # 1 논리 연산자(logical operator) - 논리 연산자 diff --git a/_posts/2023-12-02/2023-12-02-94.md b/_posts/2023-12-02-other-operator.md similarity index 97% rename from _posts/2023-12-02/2023-12-02-94.md rename to _posts/2023-12-02-other-operator.md index 2e69e097f499..71c9631c1666 100644 --- a/_posts/2023-12-02/2023-12-02-94.md +++ b/_posts/2023-12-02-other-operator.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 16 기타 연산자 -categories : Language -tag : C +date: 2023-12-03 11:58:52 +categories: Language +tags: C +excerpt: 기타 연산자에 관한 글입니다. --- -기타 연산자에 관한 글입니다. - # 1 삼항 연산자(ternary operator) - 삼항 연산자 diff --git a/_posts/2023-12-02/2023-12-02-1.md b/_posts/2023-12-02-printf().md similarity index 98% rename from _posts/2023-12-02/2023-12-02-1.md rename to _posts/2023-12-02-printf().md index 60cbedc05643..a32956c0779e 100644 --- a/_posts/2023-12-02/2023-12-02-1.md +++ b/_posts/2023-12-02-printf().md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 04 printf() 함수 -categories : Language -tag : C +date: 2023-12-03 11:56:03 +categories: Language +tags: C +excerpt: printf() 함수에 관한 글입니다. --- -printf() 함수에 관한 글입니다. - # 1 C 언어 표준 입출력 함수 > 사용자가 프로그램과 대화하기 위해 사용하는 함수를 입출력 함수 또는 I/O 함수라고 한다. diff --git a/_posts/2023-12-02/2023-12-02-2.md b/_posts/2023-12-02-scanf().md similarity index 97% rename from _posts/2023-12-02/2023-12-02-2.md rename to _posts/2023-12-02-scanf().md index d591fce53afd..11a576e3713a 100644 --- a/_posts/2023-12-02/2023-12-02-2.md +++ b/_posts/2023-12-02-scanf().md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 05 scanf() 함수 -categories : Language -tag : C +date: 2023-12-03 11:56:41 +categories: Language +tags: C +excerpt: scanf() 함수에 관한 글입니다. --- -scanf() 함수에 관한 글입니다. - # 1 scanf() 함수 > scanf() 함수는 C 언어의 표준 입력 함수로, 사용자로부터 다양한 데이터를 다양한 서식에 맞춰 입력받을 수 있게 해준다. diff --git a/_posts/2023-12-02/2023-12-02-6.md b/_posts/2023-12-02-type-casting.md similarity index 99% rename from _posts/2023-12-02/2023-12-02-6.md rename to _posts/2023-12-02-type-casting.md index 692850ff6340..51fd38c0a49b 100644 --- a/_posts/2023-12-02/2023-12-02-6.md +++ b/_posts/2023-12-02-type-casting.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 09 타입 변환 -categories : Language -tag : C +date: 2023-12-03 11:57:46 +categories: Language +tags: C +excerpt: 타입 변환에 관한 글입니다. --- -타입 변환에 관한 글입니다. - # 1 타입 변환(type conversion) > C 언어에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행된다. diff --git a/_posts/2023-12-02/2023-12-02-3.md b/_posts/2023-12-02-variable.md similarity index 98% rename from _posts/2023-12-02/2023-12-02-3.md rename to _posts/2023-12-02-variable.md index c599729e678a..ac620e0b4497 100644 --- a/_posts/2023-12-02/2023-12-02-3.md +++ b/_posts/2023-12-02-variable.md @@ -1,12 +1,12 @@ --- layout: single title: Chapter 06 변수 -categories : Language -tag : C +date: 2023-12-03 11:56:51 +categories: Language +tags: C +excerpt: 변수에 관한 글입니다. --- -변수에 관한 글입니다. - # 1 변수(variable) - 변수 From 49c5c7ee5d00e5ffd616869b37ccf61a2c6bc183 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sun, 3 Dec 2023 12:04:59 +0900 Subject: [PATCH 20/41] =?UTF-8?q?feat=20:=20=EB=82=A0=EC=A7=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _posts/2023-12-01-C-Program.md | 2 +- _posts/2023-12-01-C-Programming.md | 2 +- _posts/2023-12-01-C.md | 2 +- _posts/2023-12-02-arithmetic-operator.md | 2 +- _posts/2023-12-02-assignment-operator.md | 2 +- _posts/2023-12-02-basic-type.md | 2 +- _posts/2023-12-02-bitwise-operator.md | 2 +- _posts/2023-12-02-comparison-operator.md | 2 +- _posts/2023-12-02-conditional-statement.md | 2 +- _posts/2023-12-02-constant.md | 2 +- _posts/2023-12-02-increment-and-decrement operator.md | 2 +- _posts/2023-12-02-logical-operator.md | 2 +- _posts/2023-12-02-other-operator.md | 2 +- _posts/2023-12-02-printf().md | 2 +- _posts/2023-12-02-scanf().md | 2 +- _posts/2023-12-02-type-casting.md | 2 +- _posts/2023-12-02-variable.md | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/_posts/2023-12-01-C-Program.md b/_posts/2023-12-01-C-Program.md index c84bc22c0472..0b038907c64a 100644 --- a/_posts/2023-12-01-C-Program.md +++ b/_posts/2023-12-01-C-Program.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 03 C 프로그램의 특징 -date: 2023-12-03 11:55:41 +date: 2023-12-03 11:55:41 +0700 categories: Language tags: C excerpt: C 프로그램의 특징에 관한 글입니다. diff --git a/_posts/2023-12-01-C-Programming.md b/_posts/2023-12-01-C-Programming.md index 975606024ecd..748f281fa60d 100644 --- a/_posts/2023-12-01-C-Programming.md +++ b/_posts/2023-12-01-C-Programming.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 02 C 프로그래밍 -date: 2023-12-03 11:55:35 +date: 2023-12-03 11:55:35 +0700 categories: Language tags: C excerpt: C 프로그래밍에 관한 글입니다. diff --git a/_posts/2023-12-01-C.md b/_posts/2023-12-01-C.md index 823d5a9d1a89..32884d056851 100644 --- a/_posts/2023-12-01-C.md +++ b/_posts/2023-12-01-C.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 01 C 언어 -date: 2023-12-03 11:55:25 +date: 2023-12-03 11:55:25 +0700 categories: Language tags: C excerpt: C 언어에 관한 글입니다. diff --git a/_posts/2023-12-02-arithmetic-operator.md b/_posts/2023-12-02-arithmetic-operator.md index c033aff71a54..57667f1551f2 100644 --- a/_posts/2023-12-02-arithmetic-operator.md +++ b/_posts/2023-12-02-arithmetic-operator.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 10 산술 연산자 -date: 2023-12-03 11:58:02 +date: 2023-12-03 11:58:02 +0700 categories: Language tags: C excerpt: 산술 연산자에 관한 글입니다. diff --git a/_posts/2023-12-02-assignment-operator.md b/_posts/2023-12-02-assignment-operator.md index b7de71ad35c5..cbdff3bc3bb1 100644 --- a/_posts/2023-12-02-assignment-operator.md +++ b/_posts/2023-12-02-assignment-operator.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 11 대입 연산자 -date: 2023-12-03 11:58:07 +date: 2023-12-03 11:58:07 +0700 categories: Language tags: C excerpt: 대입 연산자에 관한 글입니다. diff --git a/_posts/2023-12-02-basic-type.md b/_posts/2023-12-02-basic-type.md index d8238543d494..e67402b6c63e 100644 --- a/_posts/2023-12-02-basic-type.md +++ b/_posts/2023-12-02-basic-type.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 08 기본 타입 -date: 2023-12-03 11:57:38 +date: 2023-12-03 11:57:38 +0700 categories: Language tags: C excerpt: 기본 타입에 관한 글입니다. diff --git a/_posts/2023-12-02-bitwise-operator.md b/_posts/2023-12-02-bitwise-operator.md index de6cfeece672..874e61257b12 100644 --- a/_posts/2023-12-02-bitwise-operator.md +++ b/_posts/2023-12-02-bitwise-operator.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 15 비트 연산자 -date: 2023-12-03 11:58:45 +date: 2023-12-03 11:58:45 +0700 categories: Language tags: C excerpt: 비트 연산자에 관한 글입니다. diff --git a/_posts/2023-12-02-comparison-operator.md b/_posts/2023-12-02-comparison-operator.md index 5024a1ed8925..07423c967c78 100644 --- a/_posts/2023-12-02-comparison-operator.md +++ b/_posts/2023-12-02-comparison-operator.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 13 비교 연산자 -date: 2023-12-03 11:58:29 +date: 2023-12-03 11:58:29 +0700 categories: Language tags: C excerpt: 비교 연산자에 관한 글입니다. diff --git a/_posts/2023-12-02-conditional-statement.md b/_posts/2023-12-02-conditional-statement.md index 167812125b98..7fa3003c42f8 100644 --- a/_posts/2023-12-02-conditional-statement.md +++ b/_posts/2023-12-02-conditional-statement.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 17 조건문 -date: 2023-12-03 11:59:00 +date: 2023-12-03 11:59:00 +0700 categories: Language tags: C excerpt: 조건문에 관한 글입니다. diff --git a/_posts/2023-12-02-constant.md b/_posts/2023-12-02-constant.md index 1782cfd8eb1a..a96787c60909 100644 --- a/_posts/2023-12-02-constant.md +++ b/_posts/2023-12-02-constant.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 07 상수 -date: 2023-12-03 11:57:05 +date: 2023-12-03 11:57:05 +0700 categories: Language tags: C excerpt: 상수에 관한 글입니다. diff --git a/_posts/2023-12-02-increment-and-decrement operator.md b/_posts/2023-12-02-increment-and-decrement operator.md index 2e2d64077f4a..bff68a947d45 100644 --- a/_posts/2023-12-02-increment-and-decrement operator.md +++ b/_posts/2023-12-02-increment-and-decrement operator.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 12 증감 연산자 -date: 2023-12-03 11:58:18 +date: 2023-12-03 11:58:18 +0700 categories: Language tags: C excerpt: 증감 연산자에 관한 글입니다. diff --git a/_posts/2023-12-02-logical-operator.md b/_posts/2023-12-02-logical-operator.md index b10d8b88827f..cc6da51bb593 100644 --- a/_posts/2023-12-02-logical-operator.md +++ b/_posts/2023-12-02-logical-operator.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 14 논리 연산자 -date: 2023-12-03 11:58:35 +date: 2023-12-03 11:58:35 +0700 categories: Language tags: C excerpt: 논리 연산자에 관한 글입니다. diff --git a/_posts/2023-12-02-other-operator.md b/_posts/2023-12-02-other-operator.md index 71c9631c1666..8f41087f2431 100644 --- a/_posts/2023-12-02-other-operator.md +++ b/_posts/2023-12-02-other-operator.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 16 기타 연산자 -date: 2023-12-03 11:58:52 +date: 2023-12-03 11:58:52 +0700 categories: Language tags: C excerpt: 기타 연산자에 관한 글입니다. diff --git a/_posts/2023-12-02-printf().md b/_posts/2023-12-02-printf().md index a32956c0779e..ded208ae8c2c 100644 --- a/_posts/2023-12-02-printf().md +++ b/_posts/2023-12-02-printf().md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 04 printf() 함수 -date: 2023-12-03 11:56:03 +date: 2023-12-03 11:56:03 +0700 categories: Language tags: C excerpt: printf() 함수에 관한 글입니다. diff --git a/_posts/2023-12-02-scanf().md b/_posts/2023-12-02-scanf().md index 11a576e3713a..c5c12ef27efe 100644 --- a/_posts/2023-12-02-scanf().md +++ b/_posts/2023-12-02-scanf().md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 05 scanf() 함수 -date: 2023-12-03 11:56:41 +date: 2023-12-03 11:56:41 +0700 categories: Language tags: C excerpt: scanf() 함수에 관한 글입니다. diff --git a/_posts/2023-12-02-type-casting.md b/_posts/2023-12-02-type-casting.md index 51fd38c0a49b..e118b74e8355 100644 --- a/_posts/2023-12-02-type-casting.md +++ b/_posts/2023-12-02-type-casting.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 09 타입 변환 -date: 2023-12-03 11:57:46 +date: 2023-12-03 11:57:46 +0700 categories: Language tags: C excerpt: 타입 변환에 관한 글입니다. diff --git a/_posts/2023-12-02-variable.md b/_posts/2023-12-02-variable.md index ac620e0b4497..ce735a3c424c 100644 --- a/_posts/2023-12-02-variable.md +++ b/_posts/2023-12-02-variable.md @@ -1,7 +1,7 @@ --- layout: single title: Chapter 06 변수 -date: 2023-12-03 11:56:51 +date: 2023-12-03 11:56:51 +0700 categories: Language tags: C excerpt: 변수에 관한 글입니다. From 60ae8409e84dea9aa415e0d7b21e06fdac317e34 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sun, 3 Dec 2023 20:01:01 +0900 Subject: [PATCH 21/41] =?UTF-8?q?feat=20:=20=EB=82=A0=EC=A7=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/app.json | 4 +- .obsidian/appearance.json | 3 +- .obsidian/graph.json | 22 +++ .obsidian/workspace.json | 98 +++++----- Pasted image 20231203135844.png | Bin 0 -> 10367 bytes Pasted image 20231203140231.png | Bin 0 -> 9933 bytes Pasted image 20231203142032.png | Bin 0 -> 8334 bytes _pages/404.md | 8 + ...or.md => 2023-12-03-ArithmeticOperator.md} | 3 +- ...or.md => 2023-12-03-AssignmentOperator.md} | 3 +- ...-basic-type.md => 2023-12-03-BasicType.md} | 3 +- ...rator.md => 2023-12-03-BitwiseOperator.md} | 3 +- _posts/{2023-12-01-C.md => 2023-12-03-C.md} | 3 +- ...01-C-Program.md => 2023-12-03-CProgram.md} | 3 +- ...gramming.md => 2023-12-03-CProgramming.md} | 3 +- ...or.md => 2023-12-03-ComparisonOperator.md} | 3 +- ....md => 2023-12-03-ConditionalStatement.md} | 3 +- ...-02-constant.md => 2023-12-03-Constant.md} | 3 +- ...23-12-03-IncrementAndDecrementOperator.md} | 3 +- _posts/2023-12-03-IterationStatement.md | 185 ++++++++++++++++++ ...rator.md => 2023-12-03-LogicalOperator.md} | 3 +- ...perator.md => 2023-12-03-OtherOperator.md} | 3 +- ...-02-printf().md => 2023-12-03-Printf().md} | 3 +- ...12-02-scanf().md => 2023-12-03-Scanf().md} | 3 +- ...e-casting.md => 2023-12-03-TypeCasting.md} | 3 +- ...-02-variable.md => 2023-12-03-Variable.md} | 3 +- assets/images/404.png | Bin 0 -> 19649 bytes 27 files changed, 303 insertions(+), 68 deletions(-) create mode 100644 .obsidian/graph.json create mode 100644 Pasted image 20231203135844.png create mode 100644 Pasted image 20231203140231.png create mode 100644 Pasted image 20231203142032.png create mode 100644 _pages/404.md rename _posts/{2023-12-02-arithmetic-operator.md => 2023-12-03-ArithmeticOperator.md} (98%) rename _posts/{2023-12-02-assignment-operator.md => 2023-12-03-AssignmentOperator.md} (96%) rename _posts/{2023-12-02-basic-type.md => 2023-12-03-BasicType.md} (99%) rename _posts/{2023-12-02-bitwise-operator.md => 2023-12-03-BitwiseOperator.md} (98%) rename _posts/{2023-12-01-C.md => 2023-12-03-C.md} (98%) rename _posts/{2023-12-01-C-Program.md => 2023-12-03-CProgram.md} (99%) rename _posts/{2023-12-01-C-Programming.md => 2023-12-03-CProgramming.md} (98%) rename _posts/{2023-12-02-comparison-operator.md => 2023-12-03-ComparisonOperator.md} (96%) rename _posts/{2023-12-02-conditional-statement.md => 2023-12-03-ConditionalStatement.md} (99%) rename _posts/{2023-12-02-constant.md => 2023-12-03-Constant.md} (97%) rename _posts/{2023-12-02-increment-and-decrement operator.md => 2023-12-03-IncrementAndDecrementOperator.md} (98%) create mode 100644 _posts/2023-12-03-IterationStatement.md rename _posts/{2023-12-02-logical-operator.md => 2023-12-03-LogicalOperator.md} (97%) rename _posts/{2023-12-02-other-operator.md => 2023-12-03-OtherOperator.md} (98%) rename _posts/{2023-12-02-printf().md => 2023-12-03-Printf().md} (99%) rename _posts/{2023-12-02-scanf().md => 2023-12-03-Scanf().md} (99%) rename _posts/{2023-12-02-type-casting.md => 2023-12-03-TypeCasting.md} (99%) rename _posts/{2023-12-02-variable.md => 2023-12-03-Variable.md} (99%) create mode 100644 assets/images/404.png diff --git a/.obsidian/app.json b/.obsidian/app.json index 9e26dfeeb6e6..1866230cb54f 100644 --- a/.obsidian/app.json +++ b/.obsidian/app.json @@ -1 +1,3 @@ -{} \ No newline at end of file +{ + "spellcheck": false +} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index c8c365d89b8b..ea11cbeba3cc 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1,3 +1,4 @@ { - "accentColor": "" + "accentColor": "", + "baseFontSize": 14 } \ No newline at end of file diff --git a/.obsidian/graph.json b/.obsidian/graph.json new file mode 100644 index 000000000000..29afc6b5c0d1 --- /dev/null +++ b/.obsidian/graph.json @@ -0,0 +1,22 @@ +{ + "collapse-filter": false, + "search": "tag:#C ", + "showTags": true, + "showAttachments": false, + "hideUnresolved": true, + "showOrphans": true, + "collapse-color-groups": true, + "colorGroups": [], + "collapse-display": true, + "showArrow": false, + "textFadeMultiplier": 0, + "nodeSizeMultiplier": 1, + "lineSizeMultiplier": 1, + "collapse-forces": true, + "centerStrength": 0.518713248970312, + "repelStrength": 10, + "linkStrength": 1, + "linkDistance": 250, + "scale": 0.36288736930121895, + "close": false +} \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index de9e9625125a..a1ac547d75b3 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-01-C.md", + "file": "_posts/2023-12-03-IncrementAndDecrementOperator.md", "mode": "source", "source": false } @@ -69,7 +69,7 @@ } ], "direction": "horizontal", - "width": 300 + "width": 200 }, "right": { "id": "8fdde2d36d733d55", @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-01-C.md", + "file": "_posts/2023-12-03-IncrementAndDecrementOperator.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-01-C.md", + "file": "_posts/2023-12-03-IncrementAndDecrementOperator.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-01-C.md" + "file": "_posts/2023-12-03-IncrementAndDecrementOperator.md" } } } @@ -148,50 +148,50 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ - "_posts/2023-12-02-conditional-statement.md", - "_site/language/conditional-statement/index.html", - "_site/language/conditional-statement", - "_site/language/index.html", - "_posts/2023-12-02-other-operator.md", - "_site/language/other-operator/index.html", - "_site/language/other-operator", - "_posts/2023-12-02-bitwise-operator.md", - "_site/language/bitwise-operator/index.html", - "_site/language/bitwise-operator", - "_posts/2023-12-02-logical-operator.md", - "_site/language/logical-operator/index.html", - "_site/language/logical-operator", - "_posts/2023-12-02-comparison-operator.md", - "_site/language/comparison-operator/index.html", - "_posts/2023-12-02-increment-and-decrement operator.md", - "_posts/2023-12-02-assignment-operator.md", - "_posts/2023-12-02-arithmetic-operator.md", - "_posts/2023-12-01-C-Programming.md", - "_posts/2023-12-01-C-Program.md", - "_posts/2023-12-02-type-casting.md", - "_posts/2023-12-02-basic-type.md", - "_posts/2023-12-02-constant.md", - "_posts/2023-12-02-variable.md", - "_posts/2023-12-02-scanf().md", - "_posts/2023-12-02-printf().md", + "_posts/2023-12-03-IterationStatement.md", + "_site/Pasted image 20231203142032.png", + "Pasted image 20231203142032.png", + "_site/Pasted image 20231203140231.png", + "Pasted image 20231203140231.png", + "_site/Pasted image 20231203135844.png", + "Pasted image 20231203135844.png", + "_posts/2023-12-03-IncrementAndDecrementOperator.md", + "_site/language/IterationStatement/index.html", + "_site/language/IterationStatement", + "_site/IterationStatement/index.html", + "_site/IterationStatement", + "_posts/2023-12-03-CProgram.md", + "_posts/2023-12-03-ArithmeticOperator.md", + "_site/assets/images/404.png", + "assets/images/404.png", + "_site/images/2023-12-01-second/404.png", + "_site/images/2023-12-01-second", + "_site/images", + "images/2023-12-01-second/404.png", + "_site/404.html", + "_site/_pages/404.md", + "_site/_pages", + "_pages/404.md", + "_posts/2023-12-03-Variable.md", + "_site/language/Variable/index.html", + "_site/language/Variable", + "_posts/2023-12-03-CProgramming.md", + "_posts/2023-12-03-AssignmentOperator.md", + "_posts/2023-12-03-BasicType.md", + "_posts/2023-12-03-BitwiseOperator.md", + "_posts/2023-12-03-C.md", + "_posts/2023-12-03-ComparisonOperator.md", + "_posts/2023-12-03-ConditionalStatement.md", + "_posts/2023-12-03-Constant.md", + "_posts/2023-12-03--BitwiseOperator.md", + "_posts/2023-12-03--AssignmentOperator.md", "_posts/2023-12-01-C.md", - "_posts/2023-12-01-3.md", - "_posts/2023-12-02/2023-12-02-95.md", - "_posts/2023-12-02/2023-12-02-94.md", - "_posts/2023-12-02/2023-12-02-93.md", - "_posts/2023-12-02/2023-12-02-92.md", - "_posts/2023-12-02/2023-12-02-91.md", - "_posts/2023-12-02/2023-12-02-9.md", - "_posts/2023-12-02/2023-12-02-8.md", - "_site/assets/images/DEV.png", - "assets/images/DEV.png", - "_site/assets/images/d76c4a17-9336-4f69-acb5-1a5352a99ef7.png", - "assets/images/d76c4a17-9336-4f69-acb5-1a5352a99ef7.png", - "_site/assets/images/a788cc85-0df7-4225-8137-5612f739a97c.png", - "assets/images/a788cc85-0df7-4225-8137-5612f739a97c.png", - "_site/screenshot.png", - "_site/screenshot-layouts.png", - "test/assets/images/unsplash-image-9.jpg", - "test/assets/images/unsplash-image-8.jpg" + "_posts/2023-12-03--C.md", + "_posts/2023-12-03--BasicType.md", + "_posts/2023-12-03--ArithmeticOperator.md", + "_posts/2023-12-03--ComparisonOperator.md", + "_posts/2023-12-03--ConditionalStatement.md", + "_posts/2023-12-03--Constant.md", + "_posts/2023-12-03--IncrementAndDecrementOperator.md" ] } \ No newline at end of file diff --git a/Pasted image 20231203135844.png b/Pasted image 20231203135844.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f37c74e7a666d717ee0cf7e3837031045dd928 GIT binary patch literal 10367 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 literal 0 HcmV?d00001 diff --git a/Pasted image 20231203140231.png b/Pasted image 20231203140231.png new file mode 100644 index 0000000000000000000000000000000000000000..a039737df2823004bbff5f75a9857a600624afcf GIT binary patch literal 9933 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 literal 0 HcmV?d00001 diff --git a/Pasted image 20231203142032.png b/Pasted image 20231203142032.png new file mode 100644 index 0000000000000000000000000000000000000000..5957cfbe4c364d95627bc9fa5c9d1178bc1ee95a GIT binary patch literal 8334 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 반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문을 의미한다. + +> 프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문 중 하나이다. + +> C 언어에서 사용되는 대표적인 반복문의 형태는 다음과 같다. + +1. while 문 + +2. do / while 문 + +3. for 문 + +## 1.1 while 문 + +> while 문은 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행한다. + +> C언어에서 while 문의 문법은 다음과 같다. + +- 문법 + +```c +while (조건식) +{ + 조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문; +} +``` + +![[Pasted image 20231203135844.png]] + +> while 문은 우선 조건식이 참(true)인지를 판단하여, + 참이면 내부의 명령문을 실행한다. + 이렇게 내부의 명령문을 전부 실행하고 나면, + 다시 조건식으로 돌아와 또 한 번 참인지를 판단하게 된다. + +- 루프 + +> 루프(loop)란 표현식의 검사를 통해 반복해서 실행되는 반복문을 의미한다. + +- 예제 + +```c +int i = 0; +int num = 5; + +while (i < num) +{ + printf("while 문이 %d 번째 반복 수행중입니다.\n", i + 1); + i++; // 이 부분을 삭제하면 무한 루프에 빠지게 됨 +} +printf("while 문이 종료된 후 변수 i의 값은 %d입니다.\n", i); +``` + +- 실행 결과 + +```c +while 문이 1 번째 반복 수행중입니다. +while 문이 2 번째 반복 수행중입니다. +while 문이 3 번째 반복 수행중입니다. +while 문이 4 번째 반복 수행중입니다. +while 문이 5 번째 반복 수행중입니다. +while 문이 종료된 후 변수 i의 값은 5입니다. +``` + +> while 문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않을 때는 +> 프로그램이 영원히 반복되게 된다. + 이것을 무한 루프(infinite loop)에 빠졌다고 한다. + 반복문에서 조건식의 거짓일때 반복문이 종료가되지만, + 무한루프는 조건식의 거짓이 없이 항상 참이므로 반복문이 종료되지 않고 + 무한히 실행되는 반복문을 말한다. + 무한 루프에 빠진 프로그램은 영원히 종료되지 않는다. + +> 무한 루프는 특별히 의도한 경우가 아니라면 반드시 피해야 하는 상황이다. + 따라서 while 문을 작성할 때는 조건식의 결과가 어느 순간 거짓(false)을 갖도록 + 조건식의 결과를 변경하는 명령문을 반드시 포함시켜야 한다. + +> 위의 예제에서 조건식의 결과를 변경하는 명령문인 i++를 제거하면, 변수 i의 값은 언제나 0이기 때문에 무한 루프에 빠지게 된다. + +> while 문에서 실행될 명령문이 한 줄 뿐이라면 중괄호({})를 생략할 수 있다. + +## 1.2 do / while 문 + +> while 문은 루프에 진입하기 전에 먼저 조건식부터 검사한다. +> 하지만 do / while 문은 먼저 루프를 한 번 실행한 후에 조건식을 검사한다. +> 즉, do / while 문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행한다. + +> C 언어에서 do / while 문의 문법은 다음과 같다. + +- 문법 + +```c +do { +    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문; +} while (조건식); +``` + +![[Pasted image 20231203140231.png]] + +- 예제 + +```c +int i = 0; +int num = 3;   + +do { +    printf("do / while 문이 %d 번째 반복 수행중입니다.\n", i + 1); +    i++; +} while (i > num); +printf("do / while 문이 종료된 후 변수 i의 값은 %d입니다.\n", i); +``` + +- 실행 결과 + +```c +do / while 문이 1 번째 반복 수행중입니다. +while 문이 종료된 후 변수 i의 값은 1입니다. +``` + +> 위의 예제가 만약 while 문이었다면 단 한 번의 출력도 없었을 것이다. +> 하지만 do / while 문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행해준다. + +## 1.3 for 문 + +> for 문은 while 문과는 달리 자체적으로 +> 초기식, 조건식, 증감식을 모두 포함하고 있는 반복문이다. +> 따라서 while 문보다는 좀 더 간결하게 반복문을 표현할 수 있다. + +> C 언어에서 for 문의 문법은 다음과 같다. + +- 문법 + +```c +for (초기식; 조건식; 증감식)  +{ +    조건식의 결과가 참인 동안 반복적으로 실행하고자 하는 명령문; +} +``` + +![[Pasted image 20231203142032.png]] + +> 이때 for 문을 구성하는 초기식, 조건식, 증감식은 각각 생략될 수 있다. + +> for 문을 사용하면 앞선 예제의 while 문을 더욱 더 간결하게 표현할 수 있다. + +- 예제 + +```c +int i; +int num = 7;   + +for (i = 0; i < num; i++) +{ +    printf("for 문이 %d 번째 반복 수행중입니다.\n", i + 1); +} +printf("for 문이 종료된 후 변수 i의 값은 %d입니다.\n", i); +``` + +- 실행 결과 + +```c +for 문이 1 번째 반복 수행중입니다. +for 문이 2 번째 반복 수행중입니다. +for 문이 3 번째 반복 수행중입니다. +for 문이 4 번째 반복 수행중입니다. +for 문이 5 번째 반복 수행중입니다. +for 문이 6 번째 반복 수행중입니다. +for 문이 7 번째 반복 수행중입니다. +while 문이 종료된 후 변수 i의 값은 7입니다. +``` + +> for 문에서 실행될 명령문이 한 줄 뿐이라면 중괄호({})를 생략할 수 있다. diff --git a/_posts/2023-12-02-logical-operator.md b/_posts/2023-12-03-LogicalOperator.md similarity index 97% rename from _posts/2023-12-02-logical-operator.md rename to _posts/2023-12-03-LogicalOperator.md index cc6da51bb593..16383c3115ea 100644 --- a/_posts/2023-12-02-logical-operator.md +++ b/_posts/2023-12-03-LogicalOperator.md @@ -1,10 +1,11 @@ --- layout: single title: Chapter 14 논리 연산자 -date: 2023-12-03 11:58:35 +0700 +date: 2023-12-03 11:58:35 +09:00 categories: Language tags: C excerpt: 논리 연산자에 관한 글입니다. +toc: true --- # 1 논리 연산자(logical operator) diff --git a/_posts/2023-12-02-other-operator.md b/_posts/2023-12-03-OtherOperator.md similarity index 98% rename from _posts/2023-12-02-other-operator.md rename to _posts/2023-12-03-OtherOperator.md index 8f41087f2431..856ff812e394 100644 --- a/_posts/2023-12-02-other-operator.md +++ b/_posts/2023-12-03-OtherOperator.md @@ -1,10 +1,11 @@ --- layout: single title: Chapter 16 기타 연산자 -date: 2023-12-03 11:58:52 +0700 +date: 2023-12-03 11:58:52 +09:00 categories: Language tags: C excerpt: 기타 연산자에 관한 글입니다. +toc: true --- # 1 삼항 연산자(ternary operator) diff --git a/_posts/2023-12-02-printf().md b/_posts/2023-12-03-Printf().md similarity index 99% rename from _posts/2023-12-02-printf().md rename to _posts/2023-12-03-Printf().md index ded208ae8c2c..8f3277519238 100644 --- a/_posts/2023-12-02-printf().md +++ b/_posts/2023-12-03-Printf().md @@ -1,10 +1,11 @@ --- layout: single title: Chapter 04 printf() 함수 -date: 2023-12-03 11:56:03 +0700 +date: 2023-12-03 11:56:03 +09:00 categories: Language tags: C excerpt: printf() 함수에 관한 글입니다. +toc: true --- # 1 C 언어 표준 입출력 함수 diff --git a/_posts/2023-12-02-scanf().md b/_posts/2023-12-03-Scanf().md similarity index 99% rename from _posts/2023-12-02-scanf().md rename to _posts/2023-12-03-Scanf().md index c5c12ef27efe..57f7c0e2a284 100644 --- a/_posts/2023-12-02-scanf().md +++ b/_posts/2023-12-03-Scanf().md @@ -1,10 +1,11 @@ --- layout: single title: Chapter 05 scanf() 함수 -date: 2023-12-03 11:56:41 +0700 +date: 2023-12-03 11:56:41 +09:00 categories: Language tags: C excerpt: scanf() 함수에 관한 글입니다. +toc: true --- # 1 scanf() 함수 diff --git a/_posts/2023-12-02-type-casting.md b/_posts/2023-12-03-TypeCasting.md similarity index 99% rename from _posts/2023-12-02-type-casting.md rename to _posts/2023-12-03-TypeCasting.md index e118b74e8355..e9abe4ffe0a0 100644 --- a/_posts/2023-12-02-type-casting.md +++ b/_posts/2023-12-03-TypeCasting.md @@ -1,10 +1,11 @@ --- layout: single title: Chapter 09 타입 변환 -date: 2023-12-03 11:57:46 +0700 +date: 2023-12-03 11:57:46 +09:00 categories: Language tags: C excerpt: 타입 변환에 관한 글입니다. +toc: true --- # 1 타입 변환(type conversion) diff --git a/_posts/2023-12-02-variable.md b/_posts/2023-12-03-Variable.md similarity index 99% rename from _posts/2023-12-02-variable.md rename to _posts/2023-12-03-Variable.md index ce735a3c424c..23a0bed69187 100644 --- a/_posts/2023-12-02-variable.md +++ b/_posts/2023-12-03-Variable.md @@ -1,10 +1,11 @@ --- layout: single title: Chapter 06 변수 -date: 2023-12-03 11:56:51 +0700 +date: 2023-12-03 11:56:51 +09:00 categories: Language tags: C excerpt: 변수에 관한 글입니다. +toc: true --- # 1 변수(variable) diff --git a/assets/images/404.png b/assets/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..3937b75ebdc8ee3ea98fddc252b51482a34d318f GIT binary patch literal 19649 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 Q6TvjlUICsR9#``J0+6;mYybcN literal 0 HcmV?d00001 From c8c2b8088c714a68177acf4c36e86fc07a0d3bfb Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sun, 3 Dec 2023 22:50:56 +0900 Subject: [PATCH 22/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 70 ++++---- _posts/2023-12-03-CLanguageFunction.md | 197 ++++++++++++++++++++++ _posts/2023-12-03-ControlStatement.md | 149 ++++++++++++++++ _posts/2023-12-03-IterationStatement.md | 1 + _posts/2023-12-03-ValidRangeOfVariable.md | 11 ++ 5 files changed, 393 insertions(+), 35 deletions(-) create mode 100644 _posts/2023-12-03-CLanguageFunction.md create mode 100644 _posts/2023-12-03-ControlStatement.md create mode 100644 _posts/2023-12-03-ValidRangeOfVariable.md diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index a1ac547d75b3..f811981f7e2e 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-03-IncrementAndDecrementOperator.md", + "file": "_posts/2023-12-03-ValidRangeOfVariable.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-03-IncrementAndDecrementOperator.md", + "file": "_posts/2023-12-03-ValidRangeOfVariable.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-03-IncrementAndDecrementOperator.md", + "file": "_posts/2023-12-03-ValidRangeOfVariable.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-03-IncrementAndDecrementOperator.md" + "file": "_posts/2023-12-03-ValidRangeOfVariable.md" } } } @@ -148,50 +148,50 @@ }, "active": "bcc96669a83b4c4b", "lastOpenFiles": [ + "_posts/2023-12-03-Variable.md", + "_posts/2023-12-03-OtherOperator.md", + "_posts/2023-12-03-LogicalOperator.md", "_posts/2023-12-03-IterationStatement.md", + "_posts/2023-12-03-IncrementAndDecrementOperator.md", + "_posts/2023-12-03-CProgramming.md", + "_posts/2023-12-03-CProgram.md", + "_posts/2023-12-03-ControlStatement.md", + "_posts/2023-12-03-Constant.md", + "_posts/2023-12-03-ConditionalStatement.md", + "_posts/2023-12-03-ComparisonOperator.md", + "_posts/2023-12-03-CLanguageFunction.md", + "_posts/2023-12-03-TypeCasting.md", + "_posts/2023-12-03-BasicType.md", + "_posts/2023-12-03-Printf().md", + "_posts/2023-12-03-ValidRangeOfVariable.md", + "_site/language/ValidRangeOfVariable/index.html", + "_site/language/ValidRangeOfVariable", + "_site/language/ValidRangeOf-variables/index.html", + "_site/language/ValidRangeOf-variables", + "_site/language/CLanguageFunction-1/index.html", + "_site/language/CLanguageFunction-1", + "_site/page5/index.html", + "_site/page5", + "_site/language/CLanguageFunction/index.html", + "_site/language/CLanguageFunction", + "_posts/2023-12-03-ArithmeticOperator.md", + "_posts/2023-12-03-AssignmentOperator.md", + "_posts/2023-12-03-BitwiseOperator.md", + "_posts/2023-12-03-C.md", + "_posts/2023-12-03-Scanf().md", "_site/Pasted image 20231203142032.png", "Pasted image 20231203142032.png", "_site/Pasted image 20231203140231.png", "Pasted image 20231203140231.png", "_site/Pasted image 20231203135844.png", "Pasted image 20231203135844.png", - "_posts/2023-12-03-IncrementAndDecrementOperator.md", - "_site/language/IterationStatement/index.html", - "_site/language/IterationStatement", - "_site/IterationStatement/index.html", - "_site/IterationStatement", - "_posts/2023-12-03-CProgram.md", - "_posts/2023-12-03-ArithmeticOperator.md", "_site/assets/images/404.png", "assets/images/404.png", "_site/images/2023-12-01-second/404.png", - "_site/images/2023-12-01-second", - "_site/images", "images/2023-12-01-second/404.png", - "_site/404.html", "_site/_pages/404.md", - "_site/_pages", "_pages/404.md", - "_posts/2023-12-03-Variable.md", - "_site/language/Variable/index.html", - "_site/language/Variable", - "_posts/2023-12-03-CProgramming.md", - "_posts/2023-12-03-AssignmentOperator.md", - "_posts/2023-12-03-BasicType.md", - "_posts/2023-12-03-BitwiseOperator.md", - "_posts/2023-12-03-C.md", - "_posts/2023-12-03-ComparisonOperator.md", - "_posts/2023-12-03-ConditionalStatement.md", - "_posts/2023-12-03-Constant.md", "_posts/2023-12-03--BitwiseOperator.md", - "_posts/2023-12-03--AssignmentOperator.md", - "_posts/2023-12-01-C.md", - "_posts/2023-12-03--C.md", - "_posts/2023-12-03--BasicType.md", - "_posts/2023-12-03--ArithmeticOperator.md", - "_posts/2023-12-03--ComparisonOperator.md", - "_posts/2023-12-03--ConditionalStatement.md", - "_posts/2023-12-03--Constant.md", - "_posts/2023-12-03--IncrementAndDecrementOperator.md" + "_posts/2023-12-03--AssignmentOperator.md" ] } \ No newline at end of file diff --git a/_posts/2023-12-03-CLanguageFunction.md b/_posts/2023-12-03-CLanguageFunction.md new file mode 100644 index 000000000000..76979c901f77 --- /dev/null +++ b/_posts/2023-12-03-CLanguageFunction.md @@ -0,0 +1,197 @@ +--- +layout: single +title: Chapter 20 C 언어 함수 +date: 2023-12-03 20:48:01 +09:00 +categories: + - Language +tags: + - C +excerpt: C 언어 함수에 관한 글입니다. +toc: true +--- + +# 1 함수 + +- 함수 + +> 프로그래밍에서 함수(function)란 하나의 특별한 목적의 작업을 수행하기 위해  + 독립적으로 설계된 프로그램 코드의 집합을 의미한다. + C 프로그램은 이러한 함수들로 구성되며, 포함된 함수들을 사용하여 프로그램의 목적을 달성하게 된다. + +> C언어에서 함수는 크게 표준 함수와 사용자 정의 함수로 구분할 수 있다. + +--- + +# 1.1 함수를 사용하는 이유 + +> 함수를 사용하는 가장 큰 이유는 바로 반복적인 프로그래밍을 피할 수 있기 때문이다. +> 프로그램에서 특정 작업을 여러 번 반복해야 할 때는 해당 작업을 수행하는 함수를 작성하면 된다. +> 그리고서 프로그램이 필요할 때마다 작성한 함수를 호출하면 해당 작업을 반복해서 수행할 수 있다. + +> 또한, 프로그램을 여러 개의 함수로 나누어 작성하면, 모듈화로 인해 전체적인 코드의 가독성이 좋아진다. +> 그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수를 할 수 있다. +> 함수의 크기에 대해서 정확히 명시된 규칙은 없으나, +> 대략 하나의 기능을 하나의 함수로 만드는 것이 가장 좋다. + +--- + +# 1.2 함수의 정의 + +> C언어에서 사용자 정의 함수를 정의하는 방법은 다음 그림과 같다. + +![함수 선언](https://tcpschool.com/lectures/img_c_function_structure.png) + +1. 반환 타입(return type) : 함수가 모든 작업을 마치고 반환하는 데이터의 타입을 명시한다. + +2. 함수 이름 : 함수를 호출하기 위한 이름을 명시한다. + +3. 매개변수 목록(parameters) : 함수 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시한다. + +4. 함수 몸체 : 함수의 고유 기능을 수행하는 명령문의 집합이다. + +> 함수 호출 시에는 여러 개의 인수를 전달할 수 있지만, 함수가 반환할 수 있는 값은 1개를 넘지 못한다. +> 또한, 함수의 특성에 따라 인수나 반환값이 하나도 없는 함수도 존재할 수 있다. +> 다음 예제에서는 인수로 전달받은 두 수 중에서 더 큰 수를 반환하는 bigNum() 함수를 정의하여 사용한다. + +- 예제 + +```c +#include + +int bigNum(int num01, int num02) // 함수의 정의 +{ +    if (num01 >= num02) +    { +        return num01; +    } +    else +    { +        return num02; +    } +} + +int main(void) +{ +    int result;   + +    result = bigNum(3, 5); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    result = bigNum(3, 1); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    result = bigNum(7, 5); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    return 0; +}   +``` + +- 실행 결과 + +```c +두 수 중 더 큰수는 5입니다. +두 수 중 더 큰수는 3입니다. +두 수 중 더 큰수는 7입니다. +``` + +--- + +# 1.3 함수의 원형 선언 + +> C언어에서 함수를 정의할 때는 그 위치가 매우 중요하다. + +> 다음 예제는 함수 정의의 위치만을 바꾼 예제이다. + +- 예제 + +```c +#include + +int main(void) +{ +    int result;   + +    result = bigNum(3, 5); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    result = bigNum(3, 1); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    result = bigNum(7, 5); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    return 0; +}   + +int bigNum(int num01, int num02) // 함수의 정의 +{ +    if (num01 >= num02) +    { +        return num01; +    } +    else +    { +        return num02; +    } +} +``` + +> C 언어에서는 가장 먼저 main() 함수가 컴파일러에 의해 컴파일된다. + +> 위의 예제에서 컴파일러는 main() 함수에 등장하는 bigNum() 함수를 +> 아직 알지 못하기 때문에 컴파일 오류를 발생시킨다. +> 따라서 컴파일러에 bigNum() 함수는 나중에 정의되어 있다고 알려줘야 한다. +> 그 역할을 하는 것이 바로 함수의 원형(prototype) 선언이다. + +> 위와 같이 차례대로 한 번에 컴파일하는 방식을 단일 패스(one pass) 컴파일 방식이라고 한다. +> 하지만 하드웨어의 발달로 컴파일러에 따라 여러 번에 걸쳐 컴파일하는 +> 다중 패스(multi-pass) 방식이 많아지고 있다. +> 다중 패스 방식의 컴파일러에서는 함수의 원형을 선언하지 않아도 컴파일 오류를 발생시키지 않는다. +> 하지만 오래된 컴파일러는 대부분 단일 패스 방식으로 컴파일하므로, +> C 표준에서는 여전히 함수의 원형을 정의하고 있다. + +> 함수의 원형 선언은 다음과 같은 방식으로 선언된다. + +- 문법 + +```c +반환타입 함수이름(매개변수타입); +``` + +> 다음 예제는 함수의 원형 선언을 추가한 예제이다. +> 이렇게 함수의 원형은 main() 함수 앞에 미리 선언되어야 한다. + +- 예제 + +```c +#include +int bigNum (int, int); // 함수의 원형 선언   + +int main(void) +{ +    int result;   + +    result = bigNum(3, 5); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    result = bigNum(3, 1); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    result = bigNum(7, 5); // 함수의 호출 +    printf("두 수 중 더 큰수는 %d입니다.\n", result); +    return 0; +}   + +int bigNum(int num01, int num02) // 함수의 정의 +{ +    if (num01 >= num02) +    { +        return num01; +    } +    else +    { +        return num02; +    } +} +``` + +- 실행 결과 + +```c +두 수 중 더 큰수는 5입니다. +두 수 중 더 큰수는 3입니다. +두 수 중 더 큰수는 7입니다. +``` \ No newline at end of file diff --git a/_posts/2023-12-03-ControlStatement.md b/_posts/2023-12-03-ControlStatement.md new file mode 100644 index 000000000000..914cbe0402ec --- /dev/null +++ b/_posts/2023-12-03-ControlStatement.md @@ -0,0 +1,149 @@ +--- +layout: single +title: Chapter 19 기타 제어문 +date: 2023-12-03 20:33:12 +09:00 +categories: Language +tags: C +excerpt: 기타 제어문에 관한 글입니다. +toc: true +--- + +# 1 루프의 제어 + +> 일반적으로 조건식의 검사를 통해 루프로 진입하면,  +> 다음 조건식을 검사하기 전까지 루프 안에 있는 모든 명령문을 실행한다. +> 하지만 continue 문과 break 문은 이러한 일반적인 루프의 흐름을 +> 사용자가 직접 제어할 수 있도록 해준다. + +# 1.1 continue 문 + +> continue 문은 루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, + 바로 다음 조건식의 판단으로 넘어가게 한다. +> 보통 반복문 내에서 특정 조건에 대한 예외 처리를 하고자 할 때 자주 사용된다. + +> 다음 예제는 1부터 100까지의 정수 중에서 3의 배수를 제외하고 출력하는 예제이다. + +- 예제 + +```c +int i; +int except_num = 3;   + +for (i = 1; i <= 100; i++) +{ +    if (i % except_num == 0) +    { +        continue; +    } +    printf("%d ", i); +}   +``` + +- 실행 결과 + +```c +1 +2 +4 +5 +7 +... +97 +98 +100 +``` + +> 위의 예제에서 변수 i의 값이 3의 배수인 경우에는 continue 문을 이용하여 +> for 문의 printf() 함수 부분을 건너뛰고 있다. + +--- + +# 1.2 break 문 + +> break 문은 루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤, +> 반복문 바로 다음에 위치한 명령문을 실행한다. +> 즉 루프 내에서 조건식의 판단 결과에 상관없이 반복문을 완전히 빠져나가고 싶을 때 사용한다. + +> 다음 예제는 1부터 10까지의 합을 구하는 예제이다. + +- 예제 + +```c +int start_num = 1; +int end_num = 10; +int sum = 0;   + +while (1) +{ +    sum += start_num; +    if (start_num == end_num) +    { +        break; +    } +    start_num++; +} +``` + +- 실행 결과 + +```c +1부터 10까지 더한 값은 55입니다. +``` + +> 위의 예제에서는 변수 start_num의 값이 end_num의 값과 같아지면, 무조건 while 문을 종료하게 된다. + +> 다음 예제는 구구단에서 5단까지 각 단의 수만큼만 출력하는 예제이다. + +- 예제 + +```c +int i, j;   + +for (i = 2; i <= 5; i++) +{ +    for (j = 1; j <= 9; j++) +    { +        printf("%d * %d = %d\n", i, j, i * j); +        if (i == j) +        { +            printf("\n"); +            break; +        } +    } +}  +``` + +- 실행 결과 + +```c +2 * 1 = 2 +2 * 2 = 4 + +3 * 1 = 3 +3 * 2 = 6 +3 * 3 = 9 + +4 * 1 = 4 +4 * 2 = 8 +4 * 3 = 12 +4 * 4 = 16 + +5 * 1 = 5 +5 * 2 = 10 +5 * 3 = 15 +5 * 4 = 20 +5 * 5 = 25 +``` + +> 위의 예제는 두 개의 for 문을 중첩해서 사용하여 구구단을 출력하고 있다. + 이때 내부의 for 문은 변수 i와 j의 값이 같아지면, break 문을 호출하여 내부의 for 문을 빠져나간다. + 따라서 구구단의 각 단이 해당 단의 수만큼만 출력될 수 있다. + +--- + +# 1.3 goto 문 + +> goto 문은 프로그램의 흐름을 지정된 레이블(label)로 무조건 변경시키는 명령문이다. + goto 문은 다른 제어문과는 달리 아무런 조건 없이 프로그램의 흐름을 옮겨준다. + 따라서 가장 손쉽게 사용할 수 있지만, 반면에 프로그램의 흐름을 매우 복잡하게 만들기도 한다. + 이러한 단점 때문에 현재는 디버깅 이외에는 거의 사용되지 않는다. diff --git a/_posts/2023-12-03-IterationStatement.md b/_posts/2023-12-03-IterationStatement.md index 2d2148b9e9e3..60d30651db4e 100644 --- a/_posts/2023-12-03-IterationStatement.md +++ b/_posts/2023-12-03-IterationStatement.md @@ -9,6 +9,7 @@ tags: excerpt: 반복문에 관한 글입니다. toc: true --- + # 1 반복문(iteration statements) - 반복문 diff --git a/_posts/2023-12-03-ValidRangeOfVariable.md b/_posts/2023-12-03-ValidRangeOfVariable.md new file mode 100644 index 000000000000..f26714220841 --- /dev/null +++ b/_posts/2023-12-03-ValidRangeOfVariable.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 21 변수의 유효 범위 +date: 2023-12-03 21:03:20 +09:00 +categories: + - Language +tags: + - C +excerpt: 변수의 유효 범위에 관한 글입니다. +toc: true +--- From 72fbe073978bb2675e027467327603facd605ff4 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Mon, 4 Dec 2023 22:34:58 +0900 Subject: [PATCH 23/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 117 ++++----- 2023-12-04.md | 0 Pasted image 20231204195434.png | Bin 0 -> 55538 bytes Pasted image 20231204212405.png | Bin 0 -> 18384 bytes [.md | 0 _posts/2023-12-03-ConditionalStatement.md | 2 +- _posts/2023-12-03-ValidRangeOfVariable.md | 240 ++++++++++++++++++ _posts/2023-12-03-Variable.md | 6 +- _posts/2023-12-04-1DArrangement.md | 236 +++++++++++++++++ _posts/2023-12-04-BasicIO.md | 11 + _posts/2023-12-04-BasicStructure.md | 11 + _posts/2023-12-04-BitOperation.md | 11 + _posts/2023-12-04-ByteStorageOrder.md | 11 + ...2023-12-04-CharacterInputOutputFunction.md | 11 + _posts/2023-12-04-CommonAndEnumeration.md | 11 + _posts/2023-12-04-ConditionalCompilation.md | 11 + _posts/2023-12-04-ConsoleIO.md | 11 + _posts/2023-12-04-DynamicMemoryAllocation.md | 11 + _posts/2023-12-04-ExpressionsOfRealNumbers.md | 11 + _posts/2023-12-04-FileIO.md | 11 + _posts/2023-12-04-FileIOFunction.md | 11 + _posts/2023-12-04-HeaderFiles.md | 11 + _posts/2023-12-04-HowToForwardArgument.md | 11 + _posts/2023-12-04-MacroFunction.md | 11 + _posts/2023-12-04-MemoryStructure.md | 11 + .../2023-12-04-MultidimensionalArrangement.md | 219 ++++++++++++++++ ...2023-12-04-PointerArrayAndArrayPointers.md | 11 + _posts/2023-12-04-PointerConcept.md | 165 ++++++++++++ _posts/2023-12-04-PointerOperation.md | 103 ++++++++ .../2023-12-04-PointerToArrayRelationships.md | 11 + _posts/2023-12-04-PointersAndStructures.md | 11 + _posts/2023-12-04-Pre-definedMacro.md | 11 + _posts/2023-12-04-Pre-processor.md | 11 + _posts/2023-12-04-RecursiveCall.md | 120 +++++++++ ...3-12-04-RepresentationOfNegativeNumbers.md | 11 + _posts/2023-12-04-SplitCompilation.md | 11 + _posts/2023-12-04-StackFrame.md | 11 + _posts/2023-12-04-String.md | 11 + _posts/2023-12-04-StringIOFunction.md | 11 + _posts/2023-12-04-StringProcessingFunction.md | 11 + _posts/2023-12-04-UtilizationOfStructures.md | 11 + _posts/2023-12-04-VariousPointers.md | 11 + ...240\234 \355\214\214\354\235\274 1.canvas" | 1 + ...240\234 \355\214\214\354\235\274 2.canvas" | 1 + ...240\234 \355\214\214\354\235\274 3.canvas" | 1 + ...4\240\234 \355\214\214\354\235\274.canvas" | 1 + ...353\263\265\354\202\254\353\263\270 1.png" | Bin 0 -> 16369 bytes ... \353\263\265\354\202\254\353\263\270.png" | Bin 0 -> 16369 bytes ...01\254\353\246\260\354\203\267(753) 1.png" | Bin 0 -> 24851 bytes ...\201\254\353\246\260\354\203\267(753).png" | Bin 0 -> 24851 bytes 50 files changed, 1469 insertions(+), 62 deletions(-) create mode 100644 2023-12-04.md create mode 100644 Pasted image 20231204195434.png create mode 100644 Pasted image 20231204212405.png create mode 100644 [.md create mode 100644 _posts/2023-12-04-1DArrangement.md create mode 100644 _posts/2023-12-04-BasicIO.md create mode 100644 _posts/2023-12-04-BasicStructure.md create mode 100644 _posts/2023-12-04-BitOperation.md create mode 100644 _posts/2023-12-04-ByteStorageOrder.md create mode 100644 _posts/2023-12-04-CharacterInputOutputFunction.md create mode 100644 _posts/2023-12-04-CommonAndEnumeration.md create mode 100644 _posts/2023-12-04-ConditionalCompilation.md create mode 100644 _posts/2023-12-04-ConsoleIO.md create mode 100644 _posts/2023-12-04-DynamicMemoryAllocation.md create mode 100644 _posts/2023-12-04-ExpressionsOfRealNumbers.md create mode 100644 _posts/2023-12-04-FileIO.md create mode 100644 _posts/2023-12-04-FileIOFunction.md create mode 100644 _posts/2023-12-04-HeaderFiles.md create mode 100644 _posts/2023-12-04-HowToForwardArgument.md create mode 100644 _posts/2023-12-04-MacroFunction.md create mode 100644 _posts/2023-12-04-MemoryStructure.md create mode 100644 _posts/2023-12-04-MultidimensionalArrangement.md create mode 100644 _posts/2023-12-04-PointerArrayAndArrayPointers.md create mode 100644 _posts/2023-12-04-PointerConcept.md create mode 100644 _posts/2023-12-04-PointerOperation.md create mode 100644 _posts/2023-12-04-PointerToArrayRelationships.md create mode 100644 _posts/2023-12-04-PointersAndStructures.md create mode 100644 _posts/2023-12-04-Pre-definedMacro.md create mode 100644 _posts/2023-12-04-Pre-processor.md create mode 100644 _posts/2023-12-04-RecursiveCall.md create mode 100644 _posts/2023-12-04-RepresentationOfNegativeNumbers.md create mode 100644 _posts/2023-12-04-SplitCompilation.md create mode 100644 _posts/2023-12-04-StackFrame.md create mode 100644 _posts/2023-12-04-String.md create mode 100644 _posts/2023-12-04-StringIOFunction.md create mode 100644 _posts/2023-12-04-StringProcessingFunction.md create mode 100644 _posts/2023-12-04-UtilizationOfStructures.md create mode 100644 _posts/2023-12-04-VariousPointers.md create mode 100644 "\353\254\264\354\240\234 \355\214\214\354\235\274 1.canvas" create mode 100644 "\353\254\264\354\240\234 \355\214\214\354\235\274 2.canvas" create mode 100644 "\353\254\264\354\240\234 \355\214\214\354\235\274 3.canvas" create mode 100644 "\353\254\264\354\240\234 \355\214\214\354\235\274.canvas" create mode 100644 "\354\212\244\355\201\254\353\246\260\354\203\267(753) - \353\263\265\354\202\254\353\263\270 1.png" create mode 100644 "\354\212\244\355\201\254\353\246\260\354\203\267(753) - \353\263\265\354\202\254\353\263\270.png" create mode 100644 "\354\212\244\355\201\254\353\246\260\354\203\267(753) 1.png" create mode 100644 "\354\212\244\355\201\254\353\246\260\354\203\267(753).png" diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index f811981f7e2e..d8f1e1661184 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -4,19 +4,15 @@ "type": "split", "children": [ { - "id": "2479c76722abfef4", + "id": "3c886135c1fe4ea5", "type": "tabs", "children": [ { - "id": "bcc96669a83b4c4b", + "id": "61669096ec41de77", "type": "leaf", "state": { - "type": "markdown", - "state": { - "file": "_posts/2023-12-03-ValidRangeOfVariable.md", - "mode": "source", - "source": false - } + "type": "empty", + "state": {} } } ] @@ -48,7 +44,7 @@ "state": { "type": "search", "state": { - "query": "", + "query": "EunChong999.github.io", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -65,7 +61,8 @@ "state": {} } } - ] + ], + "currentTab": 1 } ], "direction": "horizontal", @@ -85,7 +82,6 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-03-ValidRangeOfVariable.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +98,6 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-03-ValidRangeOfVariable.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -124,9 +119,7 @@ "type": "leaf", "state": { "type": "outline", - "state": { - "file": "_posts/2023-12-03-ValidRangeOfVariable.md" - } + "state": {} } } ] @@ -146,52 +139,60 @@ "command-palette:명령어 팔레트 열기": false } }, - "active": "bcc96669a83b4c4b", + "active": "70aef7345187e503", "lastOpenFiles": [ - "_posts/2023-12-03-Variable.md", - "_posts/2023-12-03-OtherOperator.md", - "_posts/2023-12-03-LogicalOperator.md", - "_posts/2023-12-03-IterationStatement.md", - "_posts/2023-12-03-IncrementAndDecrementOperator.md", - "_posts/2023-12-03-CProgramming.md", - "_posts/2023-12-03-CProgram.md", - "_posts/2023-12-03-ControlStatement.md", - "_posts/2023-12-03-Constant.md", + "2023-12-04.md", + "_site/무제 파일 3.canvas", + "무제 파일 3.canvas", + "무제 파일 2.canvas", + "_site/무제 파일 2.canvas", + "_site/무제 파일 1.canvas", + "무제 파일 1.canvas", + "_site/2023-12-04.md", + "_site/무제 파일.canvas", + "무제 파일.canvas", + "_posts/2023-12-04-PointerOperation.md", + "_posts/2023-12-04-PointerConcept.md", + "_posts/2023-12-04-1DArrangement.md", "_posts/2023-12-03-ConditionalStatement.md", - "_posts/2023-12-03-ComparisonOperator.md", - "_posts/2023-12-03-CLanguageFunction.md", + "_posts/2023-12-03-Variable.md", + "_posts/2023-12-03-Scanf().md", "_posts/2023-12-03-TypeCasting.md", - "_posts/2023-12-03-BasicType.md", - "_posts/2023-12-03-Printf().md", "_posts/2023-12-03-ValidRangeOfVariable.md", - "_site/language/ValidRangeOfVariable/index.html", - "_site/language/ValidRangeOfVariable", - "_site/language/ValidRangeOf-variables/index.html", - "_site/language/ValidRangeOf-variables", - "_site/language/CLanguageFunction-1/index.html", - "_site/language/CLanguageFunction-1", - "_site/page5/index.html", - "_site/page5", - "_site/language/CLanguageFunction/index.html", - "_site/language/CLanguageFunction", - "_posts/2023-12-03-ArithmeticOperator.md", - "_posts/2023-12-03-AssignmentOperator.md", - "_posts/2023-12-03-BitwiseOperator.md", - "_posts/2023-12-03-C.md", - "_posts/2023-12-03-Scanf().md", - "_site/Pasted image 20231203142032.png", - "Pasted image 20231203142032.png", - "_site/Pasted image 20231203140231.png", - "Pasted image 20231203140231.png", - "_site/Pasted image 20231203135844.png", - "Pasted image 20231203135844.png", - "_site/assets/images/404.png", - "assets/images/404.png", - "_site/images/2023-12-01-second/404.png", - "images/2023-12-01-second/404.png", - "_site/_pages/404.md", - "_pages/404.md", - "_posts/2023-12-03--BitwiseOperator.md", - "_posts/2023-12-03--AssignmentOperator.md" + "_posts/2023-12-04-BasicIO.md", + "_posts/2023-12-04-BasicStructure.md", + "_posts/2023-12-04-BitOperation.md", + "_posts/2023-12-04-ByteStorageOrder.md", + "_posts/2023-12-04-CharacterInputOutputFunction.md", + "_posts/2023-12-04-CommonAndEnumeration.md", + "_posts/2023-12-04-ConditionalCompilation.md", + "_posts/2023-12-04-ConsoleIO.md", + "_posts/2023-12-04-DynamicMemoryAllocation.md", + "_posts/2023-12-04-ExpressionsOfRealNumbers.md", + "_posts/2023-12-04-FileIO.md", + "_posts/2023-12-04-FileIOFunction.md", + "_posts/2023-12-04-HeaderFiles.md", + "_posts/2023-12-04-HowToForwardArgument.md", + "_posts/2023-12-04-MacroFunction.md", + "_site/Pasted image 20231204212405.png", + "Pasted image 20231204212405.png", + "_site/Pasted image 20231204195434.png", + "Pasted image 20231204195434.png", + "_site/assets/images/스크린샷(753).png", + "_site/assets/images/스크린샷(753) - 복사본.png", + "assets/images/스크린샷(753) - 복사본.png", + "assets/images/스크린샷(753).png", + "_site/스크린샷(753) 1.png", + "스크린샷(753) 1.png", + "_site/language/ValidRangeOfVariable-copy/index.html", + "_site/language/ValidRangeOfVariable-copy", + "_site/page12/index.html", + "_site/page12", + "_site/language/ExpressionsOfRealNumbers/index.html", + "_site/language/ExpressionsOfRealNumbers", + "_site/language/RepresentationOfNegativeNumbers/index.html", + "_site/language/RepresentationOfNegativeNumbers", + "_site/language/BitOperation/index.html", + "_site/language/BitOperation" ] } \ No newline at end of file diff --git a/2023-12-04.md b/2023-12-04.md new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/Pasted image 20231204195434.png b/Pasted image 20231204195434.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf74daa45fa0879dc1da56f1b3f3e666788efa2 GIT binary patch literal 55538 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℞8s%y=D<4DzO=o<4)LZZsy2C8h0_YU6Q%o2mW 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 if / else if / else 문을 순서도로 표현하면 다음 그림과 같다. -![업로드중..](blob:https://velog.io/f80b6e3f-728b-4b36-8a48-cc5e26eb2faa) +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/0f3d12d8-e175-4d81-ae18-a02ce9f73e56) > C 언어에서 else if 문의 문법은 다음과 같다. diff --git a/_posts/2023-12-03-ValidRangeOfVariable.md b/_posts/2023-12-03-ValidRangeOfVariable.md index f26714220841..b2d637a9f9f6 100644 --- a/_posts/2023-12-03-ValidRangeOfVariable.md +++ b/_posts/2023-12-03-ValidRangeOfVariable.md @@ -9,3 +9,243 @@ tags: excerpt: 변수의 유효 범위에 관한 글입니다. toc: true --- +# 1 변수의 유효 범위(variable scope) + +> C 언어에서는 변수의 선언 위치에 따라 해당 변수의 유효 범위, +> 메모리 반환 시기, 초기화 여부, 저장되는 장소 등이 변경된다. + +> C 언어에서 변수는 위와 같은 특징들을 기준으로 다음과 같이 나눌 수 있다. + +1. 지역 변수(local variable) + +2. 전역 변수(global variable) + +3. 정적 변수(static variable) + +4. 레지스터 변수(register variable) + + +## 1,1 메모리의 구조 + +> 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공한다. + C 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다. + +1. 코드(code) 영역 + +2. 데이터(data) 영역 + +3. 스택(stack) 영역 + +4. 힙(heap) 영역 + + + +## 1.2 지역 변수(local variable) + +> 지역 변수란 '블록' 내에서 선언된 변수를 의미한다. + 지역 변수는 변수가 선언된 블록 내에서만 유효하며, 블록이 종료되면 메모리에서 사라진다. + +> 이러한 지역 변수는 메모리상의 스택(stack) 영역에 저장되며, +> 초기화하지 않으면 의미 없는 값(쓰레기값)으로 초기화된다. +함수의 매개변수 또한 함수 내에서 정의되는 지역 변수로 취급된다. + +- 예제 + +```c +#include    +void local(void);   + +int main(void) +{ +    int i = 5; +    int var = 10; +    printf("main() 함수 내의 지역 변수 var의 값은 %d입니다.\n", var);   + +    if (i < 10) +    { +        local(); +        int var = 30; +        printf("if 문 내의 지역 변수 var의 값은 %d입니다.\n", var); +    }   + +    printf("현재 지역 변수 var의 값은 %d입니다.\n", var); +    return 0; +}   + +void local(void) +{ +    int var = 20; +    printf("local() 함수 내의 지역 변수 var의 값은 %d입니다.\n", var); +}   +``` + +- 실행 결과 + +```c +main() 함수 내의 지역 변수 var의 값은 10입니다. +local() 함수 내의 지역 변수 var의 값은 20입니다. +if 문 내의 지역 변수 var의 값은 30입니다. +현재 지역 변수 var의 값은 10입니다. +``` + +> 위의 예제에서 변수 var은 한 번은 main() 함수 내에서, +> 또 한 번은 if 문에서, 마지막은 local() 함수 내에서 선언된다. +이처럼 같은 이름의 변수 var은 모두 다른 중괄호({}) 영역에서 선언되었으며, +이러한 중괄호 영역을 블록(block)이라고 한다. +이렇게 변수의 유효 범위는 변수가 선언된 블록을 기준으로 설정되며, +해당 블록이 끝나면 모든 지역 변수는 메모리에서 사라지게 된다. + +>위의 변수의 이름으로 같은 이름을 여러 번 사용하는 것은 구문 상 에러를 발생시키지는 않지만,  +>바람직하지 못한 방식이다. + +> 한 블록 내에서 같은 이름의 변수를 또다시 선언하려고 하면 컴파일러는 오류를 발생시킨다. + + + +## 1.3 전역 변수(global variable) + +- 전역 변수 + +>전역 변수란 함수의 외부에서 선언된 변수를 의미한다. + +> 전역 변수는 프로그램의 어디에서나 접근할 수 있으며, +> 프로그램이 종료되어야만 메모리에서 사라진다. + +> 이러한 전역 변수는 메모리상의 데이터(data) 영역에 저장되며, +> 직접 초기화하지 않아도 0으로 자동 초기화된다. + +- 예제 + +```c +#include    +void local(void); +int var; // 전역 변수 선언     + +int main(void) +{ +    printf("전역 변수 var의 초깃값은 %d입니다.\n", var);   +    int i = 5; +    int var = 10; // 지역 변수 선언 +    printf("main() 함수 내의 지역 변수 var의 값은 %d입니다.\n", var);   + +    if (i < 10) +    { +        local(); +        printf("현재 변수 var의 값은 %d입니다.\n", var); // 지역 변수에 접근 +    }   + +    printf("더 이상 main() 함수에서는 전역 변수 var에 접근할 수가 없습니다.\n"); +    return 0; +}   + +void local(void) +{ +    var = 20; // 전역 변수의 값 변경 +    printf("local() 함수 내에서 접근한 전역 변수 var의 값은 %d입니다.\n", var); +}   +``` + +- 실행 결과 + +```c +전역 변수 var의 초기값은 0입니다. +main() 함수 내의 지역 변수 var의 값은 10입니다. +local() 함수 내에서 접근한 전역 변수 var의 값은 20입니다. +현재 변수 var의 값은 10입니다. +더 이상 main() 함수에서는 전역 변수 var에 접근할 수가 없습니다. +``` + +> 위의 예제에서 전역 변수 var와 같은 이름의 지역 변수 var가 main() 함수 내부에서 선언된다. +이 지역 변수가 선언되기 전까지는 main() 함수에서도 전역 변수 var에 접근할 수 있다. +하지만 지역 변수 var가 선언된 후에는 main() 함수에서 전역 변수 var로 접근할 방법이 없어진다. +왜냐하면, 블록 내에서 선언된 지역 변수는 같은 이름의 전역 변수를 덮어쓰기 때문이다. + +>따라서 이처럼 전역 변수와 같은 이름으로 지역 변수를 선언하는 것은 좋지 않다. + +> 또한, 여러 개의 파일로 구성된 프로그램에서 외부 파일의 전역 변수를 사용하기 위해서는 +> extern 키워드를 사용해 다시 선언해야 줘야한다. + + + +## 1.4 정적 변수(static variable) + +- 정적 변수 + +>C 언어에서 정적 변수란 static 키워드로 선언한 변수를 의미한다. + +>이렇게 선언된 정적 변수는 지역 변수와 전역 변수의 특징을 모두 가지게 된다. +함수 내에서 선언된 정적 변수는 전역 변수처럼 단 한 번만 초기화되며(초기화는 최초 실행 시 단 한번만 수행됨), 프로그램이 종료되어야 메모리상에서 사라진다. +또한, 이렇게 선언된 정적 변수는 지역 변수처럼 해당 함수 내에서만 접근할 수 있다. + +- 예제 + +```c +#include    +void local(void); +void staticVar(void);   + +int main(void) +{ +    int i;   +    for (i = 0; i < 3; i++) +    { +        local(); +        staticVar(); +    }   +    return 0; +}   + +void local(void) +{ +    int count = 1; +    printf("local() 함수가 %d 번째 호출되었습니다.\n", count); +    count++; +}   + +void staticVar(void) +{ + ① static int static_count = 1; +    printf("staticVar() 함수가 %d 번째 호출되었습니다.\n", static_count); +    static_count++; +} +``` + +- 실행 결과 + +```c +local() 함수가 1 번째 호출되었습니다. +staticVar() 함수가 1 번째 호출되었습니다. +local() 함수가 1 번째 호출되었습니다. +staticVar() 함수가 2 번째 호출되었습니다. +local() 함수가 1 번째 호출되었습니다. +staticVar() 함수가 3 번째 호출되었습니다. +``` + +>위의 예제는 지역 변수로 선언된 count와 정적 변수로 선언된 static_count를 서로 비교하는 예제이다. +지역 변수인 count는 함수의 호출이 끝날 때마다 메모리상에서 사라진다. +하지만 정적 변수인 static_count는 함수의 호출이 끝나도 메모리상에서 사라지지 않고, 다음 함수 호출 때 이전의 데이터를 그대로 가지고 있다. + +>정적 변수 static_count의 초기화를 수행하는 ①번 라인의 코드는 최초로 실행될 때 +>단 한 번만 수행되며, 두 번째부터는 수행되지 않는다. +또한, static_count는 전역 변수와는 달리 자신이 선언된 staticVar() 함수 +이외의 영역에서는 호출할 수 없다. + +--- + +## 1.5 레지스터 변수(register variable) + +- 레지스터 변수 + +> 레지스터 변수란 지역 변수를 선언할 때 register 키워드를 붙여 선언한 변수를 의미한다. + +>이렇게 선언된 레지스터 변수는 CPU의 레지스터(register) 메모리에 저장되어 빠르게 접근할 수 있게 된다. + +> 하지만 컴퓨터의 레지스터는 매우 작은 크기의 메모리이므로, +> 이 영역에 변수를 선언하기 힘든 경우도 많다. +그럴 때 C 컴파일러는 해당 변수를 그냥 지역변수로 선언하게 된다. + +- 변수의 종류 + +![스크린샷(753) - 복사본](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/a9d06cea-66ab-41dd-8650-b4579650ea56) + +![스크린샷(753)](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/7e16d544-4181-4d9e-8c1d-d9d539323efd) \ No newline at end of file diff --git a/_posts/2023-12-03-Variable.md b/_posts/2023-12-03-Variable.md index 23a0bed69187..287fb017e420 100644 --- a/_posts/2023-12-03-Variable.md +++ b/_posts/2023-12-03-Variable.md @@ -37,7 +37,7 @@ toc: true > 다음 표는 변수의 이름을 생성할 때에 지겨야하는 규칙의 예시이다. -![업로드중..](blob:https://velog.io/3bd73a7c-4cea-411e-b514-a82c4160d97b) +![스크린샷(754)](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/f245ce43-4651-4723-b4f0-35c7033932eb) > C 언어에서는 변수의 이름에 대소문자를 구분하므로 이 점에 주의해야 한다. ex) int tcp 과 int Tcp 는 같은 변수가 아니다. @@ -50,7 +50,7 @@ ex) int tcp 과 int Tcp 는 같은 변수가 아니다. > C 언어에는 32개의 키워드가 있으며, 이러한 키워드들은 미국표준협회 ANSI에서 지정한 키워드들이다. 아래의 키워드들은 위의 예시처럼 변수의 이름으로 사용할 수 없다. -![업로드중..](blob:https://velog.io/e30b5f76-29e2-46f2-9e81-4abfae0fa22f) +![스크린샷(755)](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/da047eec-1a7e-4b3e-941d-b72bc9018813) ## 1.2 비트(bit)와 바이트(byte) @@ -79,7 +79,7 @@ ex) int tcp 과 int Tcp 는 같은 변수가 아니다. > 다음 그림은 메모리 상에 변수가 어떤 식으로 저장되는지를 보여준다. -![업로드중..](blob:https://velog.io/f05101da-c90c-4329-a3b1-12e3a915b90b) +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/935fffda-1f28-4c32-aa23-2d206bad5adc) > 위의 그림처럼 하나의 메모리 공간에는 8개의 비트로 이루어진 1바이트의 데이터가 저장된다. 따라서 메모리의 주소 또한 1바이트씩 증가되며, 낮은 주소부터 차례대로 데이터가 저장된다. diff --git a/_posts/2023-12-04-1DArrangement.md b/_posts/2023-12-04-1DArrangement.md new file mode 100644 index 000000000000..e80b80df42b4 --- /dev/null +++ b/_posts/2023-12-04-1DArrangement.md @@ -0,0 +1,236 @@ +--- +layout: single +title: Chapter 23 1차원 배열 +date: 2023-12-04 18:49:47 +09:00 +categories: + - Language +tags: + - C +excerpt: 1차원 배열에 관한 글입니다. +toc: true +--- + +# 1 배열(array) + +- 배열 + +>배열(array)이란 같은 타입의 변수들로 이루어진 유한 집합을 의미한다. + +- 배열 요소 + +> 배열 요소(element)란 배열을 구성하는 각각의 값을 의미한다. + +- 인덱스 + +>인덱스(index)란 배열에서의 위치를 가리키는 숫자를 의미한다. + +>C 언어에서 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있다. + +> 배열은 같은 종류의 데이터를 많이 다뤄야 하는 경우에 사용할 수 있는 가장 기본적인 자료 구조이다. + +>배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 +>그 이상의 다차원 배열로도 선언할 수 있다. +하지만 현실적으로 이해하기가 쉬운 2차원 배열까지가 많이 사용된다. + + + +## 1.1 1차원 배열 + +>1차원 배열은 가장 기본적인 배열로 다음과 같은 문법에 따라 선언된다. + +- 문법 + +```c +타입 배열이름[배열길이]; +``` + +> 타입은 배열 요소로 들어가는 변수의 타입을 명시한다. +배열 이름은 배열이 선언된 후에 배열로 접근하기 위해 사용된다. +배열의 길이는 해당 배열이 몇 개의 배열 요소를 가지게 되는지 명시한다. + +>C언어에서는 배열을 선언만 하고 초기화하지 않으면, +>각 배열 요소에 아무런 의미를 가지지 않는 쓰레기값이 저장되어 있게 된다. +따라서 초기화되지 않은 배열은 사용하지 않도록 주의를 기울여야 한다. + +- 예제 + +```c +int i; +int sum = 0; +int grade[3];        // 길이가 3인 int형 배열 선언   + +/* 배열의 초기화 */ +grade[0] = 85;       // 국어 점수 +grade[1] = 65;       // 영어 점수 +grade[2] = 90;       // 수학 점수   + +for (i = 0; i < 3; i++) +{ +    sum += grade[i]; // 인덱스를 이용한 배열의 접근 +}   +printf("국영수 과목 총 점수 합계는 %d점이고, 평균 점수는 %f점입니다.\n", sum, (double)sum/3);   +``` + +- 실행 결과 + +```c +국영수 과목 총 점수 합계는 240점이고, 평균 점수는 80.000000점입니다. +``` + +>위의 예제는 길이가 3인 int형 배열을 선언하고 있다. +또한, 0부터 시작하는 인덱스(index)를 이용하면 각각의 배열 요소에 따로 접근할 수 있다. + +>다음 그림은 위의 예제에서 사용된 배열 grade가 메모리 상에서 어떻게 저장되는지를 보여준다. + +![img_c_onedimensional_array](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/9d7ef0be-cbfc-40c7-919a-b42869f87825) + +>위의 그림처럼 언제나 배열의 이름은 배열의 첫 번째 요소와 같은 주소를 가리키고 있다. + + + +## 1.2 배열의 선언과 동시에 초기화 하는 방법 + +>C 언어에서는 변수와 마찬가지로 배열도 선언과 동시에 초기화할 수 있다. + +>다음과 같이 중괄호({})를 사용하여 초깃값을 나열한 것을 초기화 리스트라고 한다. + +- 문법 + +```c +타입 배열이름[배열길이] = {배열요소1, 배열요소2, ...}; +``` + +>단, 초기화 리스트의 타입과 배열의 타입은 반드시 일치해야 한다. +만약에 초기화 리스트의 개수가 배열의 총 길이보다 적으면, 배열의 앞에서부터 차례대로 초기화된다. +이때 초기화되지 못한 나머지 배열 요소는 모두 0으로 자동 초기화된다. + +>다음 예제는 배열을 선언과 동시에 초기화하는 예제이다. + +- 예제 + +```c +int i; +int sum = 0; +int grade[3] = {85, 65, 90}; // 길이가 3인 int형 배열의 선언과 동시에 초기화   + +for (i = 0; i < 3; i++) +{ +    sum += grade[i]; +}   +printf("국영수 과목 총 점수 합계는 %d이고, 평균 점수는 %f입니다.\n", sum, (double)(sum/3));   +``` + +- 실행 결과 + +```c +국영수 과목 총 점수 합계는 240이고, 평균 점수는 80.000000입니다. +``` + + + +## 1.3 배열의 길이 자동 설정 + +>C 언어에서는 초기화 리스트에 맞춰 자동으로 배열의 길이를 설정할 수도 있다. + +>다음과 같이 배열의 길이를 따로 입력하지 않은 배열은 초기화 리스트의 배열 요소의 개수에 맞춰 자동으로 배열의 길이가 설정된다. + +- 문법 + +```c +타입 배열이름[] = {배열요소1, 배열요소2, ...}; +``` + +>다음 예제에서 int형 배열 arr의 길이는 자동으로 3으로 설정됨과 동시에 +>초기화 리스트에 의해 초기화된다. + +- 예제 + +```c +int arr[] = {1, 2, 3}; +``` + + + +## 1.4 배열의 특징 + +>C 언어에서 배열은 다음과 같은 특징을 가진다. + +1. 배열의 길이를 선언할 때에는 반드시 상수를 사용해야 한다. + +2. 배열 요소의 인덱스는 언제나 0부터 시작한다. + +3. C 컴파일러는 배열의 길이를 전혀 신경 쓰지 않는다. + +- 예제 + +```c +int i; +int sum = 0; +int grade[3] = {85, 65, 90}; // grade[0], grade[1], grade[2]만 선언 및 초기화 +grade[3] = 100;              // grade[3]를 선언하지 않고 초기화 진행   + +for (i = 0; i < 4; i++)      // grade[3]도 수식에 포함 +{ +    sum += grade[i]; +}   +printf("국영수 과목 총 점수 합계는 %d이고, 평균 점수는 %f입니다.\n", sum, (double)sum/3);   +``` + +- 실행 결과 + +```c +국영수 과목 총 점수 합계는 340이고, 평균 점수는 113.333333입니다. +``` + +> 위의 예제에서는 크기가 3인 int형 배열 grade를 선언하고 있다. +즉, 배열 grade의 배열 요소는 grade[0], grade[1], grade[2]만이 존재한다. +하지만 존재하지도 않는 grade[3]이라는 배열 요소의 초기화를 진행하고, +반복문을 통해 수식에서도 이용한다. + +>이때 C 컴파일러는 오류는커녕 수식에서까지 이 배열 요소를 이용하여 결과를 출력한다. +하지만 이 결과는 개발자가 전혀 의도하지 않은 결과물이며, +이러한 프로그램은 종종 예상치 못한 결과를 내주기도 한다. + +>위와 같이 C 언어에서는 컴파일러가 일일이 배열의 길이 등을 검사하여 오류를 출력해 주지 않는다. +따라서 C 언어로 프로그래밍할 때에는 이런 계산을 언제나 개발자가 직접 신경 써야 한다. + + + +## 1.5 배열이 차지하는 메모리의 크기 + +>C 언어에서 배열을 복사하거나 배열 요소에 특정 작업을 하고 싶을 때는  +>해당 배열이 차지하는 메모리의 크기를 정확히 알고 있어야만 한다. + +>배열이 차지하는 총 메모리의 크기는 다음 수식을 사용하여 구할 수 있다. + +- 수식 + +```c +배열이 차지하는 메모리의 크기 = 배열의 길이 X sizeof(타입) +``` + +>배열의 길이를 알고 싶을 때에는 다음 수식을 사용하여 구할 수 있다. + +- 수식 + +```c +배열의 길이 = sizeof(배열 이름) / sizeof(배열 이름[0]) +``` + +>위의 수식에서 배열 이름[0]은 해당 배열의 타입을 표현하기 위해서 사용되었다. + +>다음 예제는 수식을 이용하여 배열의 길이는 구하는 예제이다. + +- 예제 + +```c +int grade[] = {85, 65, 90};                     // 배열의 길이를 명시하지 않음 +int arr_len = sizeof(grade) / sizeof(grade[0]); // 배열의 길이를 구하는 공식   +printf("배열 arrGrade의 길이는 %d입니다.\n", arr_len); +``` + +- 실행 결과 + +```c +배열 grade의 길이는 3입니다. +``` \ No newline at end of file diff --git a/_posts/2023-12-04-BasicIO.md b/_posts/2023-12-04-BasicIO.md new file mode 100644 index 000000000000..632b80dae266 --- /dev/null +++ b/_posts/2023-12-04-BasicIO.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 34 기본적인 입출력 +date: 2023-12-04 18:56:55 +09:00 +categories: + - Language +tags: + - C +excerpt: 기본적인 입출력에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-BasicStructure.md b/_posts/2023-12-04-BasicStructure.md new file mode 100644 index 000000000000..ccf2e0779847 --- /dev/null +++ b/_posts/2023-12-04-BasicStructure.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 39 구조체의 기본 +date: 2023-12-04 19:01:09 +09:00 +categories: + - Language +tags: + - C +excerpt: 구조체의 기본에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-BitOperation.md b/_posts/2023-12-04-BitOperation.md new file mode 100644 index 000000000000..67a478395c7d --- /dev/null +++ b/_posts/2023-12-04-BitOperation.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 53 비트 단위 연산 +date: 2023-12-04 19:10:00 +09:00 +categories: + - Language +tags: + - C +excerpt: 비트 단위 연산에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-ByteStorageOrder.md b/_posts/2023-12-04-ByteStorageOrder.md new file mode 100644 index 000000000000..239a483940e3 --- /dev/null +++ b/_posts/2023-12-04-ByteStorageOrder.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 52 바이트 저장 순서 +date: 2023-12-04 19:09:24 +09:00 +categories: + - Language +tags: + - C +excerpt: 바이트 저장 순서에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-CharacterInputOutputFunction.md b/_posts/2023-12-04-CharacterInputOutputFunction.md new file mode 100644 index 000000000000..2d169af6501e --- /dev/null +++ b/_posts/2023-12-04-CharacterInputOutputFunction.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 35 문자 입출력 함수 +date: 2023-12-04 18:58:06 +09:00 +categories: + - Language +tags: + - C +excerpt: 문자 입출력 함수에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-CommonAndEnumeration.md b/_posts/2023-12-04-CommonAndEnumeration.md new file mode 100644 index 000000000000..72977984352c --- /dev/null +++ b/_posts/2023-12-04-CommonAndEnumeration.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 43 공용체와 열거체 +date: 2023-12-04 19:03:17 +09:00 +categories: + - Language +tags: + - C +excerpt: 공용체와 열거체에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-ConditionalCompilation.md b/_posts/2023-12-04-ConditionalCompilation.md new file mode 100644 index 000000000000..210789cae961 --- /dev/null +++ b/_posts/2023-12-04-ConditionalCompilation.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 51 조건부 컴파일 +date: 2023-12-04 19:08:50 +09:00 +categories: + - Language +tags: + - C +excerpt: 조건부 컴파일에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-ConsoleIO.md b/_posts/2023-12-04-ConsoleIO.md new file mode 100644 index 000000000000..eb9f33177e69 --- /dev/null +++ b/_posts/2023-12-04-ConsoleIO.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 43 콘솔 입출력 +date: 2023-12-04 19:03:54 +09:00 +categories: + - Language +tags: + - C +excerpt: 콘솔 입출력에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-DynamicMemoryAllocation.md b/_posts/2023-12-04-DynamicMemoryAllocation.md new file mode 100644 index 000000000000..e3ca406b6455 --- /dev/null +++ b/_posts/2023-12-04-DynamicMemoryAllocation.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 33 메모리의 동적 할당 +date: 2023-12-04 18:56:13 +09:00 +categories: + - Language +tags: + - C +excerpt: 메모리의 동적 할당에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-ExpressionsOfRealNumbers.md b/_posts/2023-12-04-ExpressionsOfRealNumbers.md new file mode 100644 index 000000000000..234d3f8436ab --- /dev/null +++ b/_posts/2023-12-04-ExpressionsOfRealNumbers.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 55 실수의 표현 +date: 2023-12-04 19:11:25 +09:00 +categories: + - Language +tags: + - C +excerpt: 실수의 표현에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-FileIO.md b/_posts/2023-12-04-FileIO.md new file mode 100644 index 000000000000..9797e8d8b0fa --- /dev/null +++ b/_posts/2023-12-04-FileIO.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 44 파일 입출력 +date: 2023-12-04 19:04:22 +09:00 +categories: + - Language +tags: + - C +excerpt: 파일 입출력에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-FileIOFunction.md b/_posts/2023-12-04-FileIOFunction.md new file mode 100644 index 000000000000..a06eaabfe197 --- /dev/null +++ b/_posts/2023-12-04-FileIOFunction.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 45 파일 입출력 함수 +date: 2023-12-04 19:04:56 +09:00 +categories: + - Language +tags: + - C +excerpt: 파일 입출력 함수에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-HeaderFiles.md b/_posts/2023-12-04-HeaderFiles.md new file mode 100644 index 000000000000..c7b70e045c9f --- /dev/null +++ b/_posts/2023-12-04-HeaderFiles.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 49 헤더 파일 +date: 2023-12-04 19:07:44 +09:00 +categories: + - Language +tags: + - C +excerpt: 헤더 파일에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-HowToForwardArgument.md b/_posts/2023-12-04-HowToForwardArgument.md new file mode 100644 index 000000000000..752c62f70bb9 --- /dev/null +++ b/_posts/2023-12-04-HowToForwardArgument.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 27 인수 전달 방법 +date: 2023-12-04 18:52:21 +09:00 +categories: + - Language +tags: + - C +excerpt: 변수의 유효 범위에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-MacroFunction.md b/_posts/2023-12-04-MacroFunction.md new file mode 100644 index 000000000000..3891f7fb21f2 --- /dev/null +++ b/_posts/2023-12-04-MacroFunction.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 47 매크로 함수 +date: 2023-12-04 19:06:13 +09:00 +categories: + - Language +tags: + - C +excerpt: 매크로 함수에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-MemoryStructure.md b/_posts/2023-12-04-MemoryStructure.md new file mode 100644 index 000000000000..99dae788b092 --- /dev/null +++ b/_posts/2023-12-04-MemoryStructure.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 31 메모리의 구조 +date: 2023-12-04 18:55:15 +09:00 +categories: + - Language +tags: + - C +excerpt: 메모리의 구조에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-MultidimensionalArrangement.md b/_posts/2023-12-04-MultidimensionalArrangement.md new file mode 100644 index 000000000000..18af99333663 --- /dev/null +++ b/_posts/2023-12-04-MultidimensionalArrangement.md @@ -0,0 +1,219 @@ +--- +layout: single +title: Chapter 24 다차원 배열 +date: 2023-12-04 18:50:48 +09:00 +categories: + - Language +tags: + - C +excerpt: 다차원 배열에 관한 글입니다. +toc: true +--- + +# 1 다차원 배열(multi-dimensional array) + +- 다차원 배열 + +> 다차원 배열이란 2차원 이상의 배열을 의미하며, +> 배열 요소로 또 다른 배열을 가지는 배열을 의미한다. + +>즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며, +3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이고, +4차원 배열은 배열 요소로 3차원 배열을 가지는 배열인 것이다. + +## 1.1 2차원 배열(two dimensional array) + +- 2차원 배열 + +>2차원 배열이란 배열의 요소로 1차원 배열을 가지는 배열을 의미한다. + +>C 언어에서는 2차원 배열을 나타내는 타입을 따로 제공하지 않는다. +대신에 1차원 배열의 배열 요소로 또 다른 1차원 배열을 사용하여 2차원 배열을 나타낼 수 있다. + +>2차원 배열은 다음과 같은 문법에 따라 선언할 수 있다. + +- 문법 + +```c +타입 배열이름[행의길이][열의길이]; +``` + +>타입은 배열 요소로 저장되는 변수의 타입을 설정한다. +배열 이름은 배열이 선언된 후에 배열에 접근하기 위해 사용된다. + +>다음 그림은 2차원 배열을 이해하기 쉽도록 도식적으로 표현한 그림이다. + +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/c0080e9f-68f7-4ea2-8602-717cf12a0208) + +>하지만 컴퓨터의 메모리는 위와 같은 입체적 공간이 아닌 선형 공간이므로 실제로는 다음 그림과 같이 저장된다. + +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/e0506852-e2da-43b1-ac2f-1a2fd1eb061f) + +>다음 예제는 앞선 그림을 C 프로그램으로 작성한 예제이다. + +- 예제 + +```c +int arr01[6] = {10, 20, 30, 40, 50, 60}; +int arr02[2][3] = {10, 20, 30, 40, 50, 60};   +``` + +- 실행 결과 + +```c +arr01의 배열 요소의 값 +10 20 30 40 50 60 +arr02의 배열 요소의 값 +10 20 30 40 50 60 +``` + + + +## 1.2 배열의 선언과 동시에 초기화하는 방법 + +>1차원 배열과 마찬가지로 2차원 배열도 선언과 동시에 초기화할 수 있다. +2차원 배열은 1차원 배열과는 달리 여러 방식으로 초기화할 수 있다. + +1. 1차원 배열의 초기화 형태를 따르는 방식 + +2. 배열의 모든 요소를 초기화하는 방식 + +3. 배열의 일부 요소만을 초기화하는 방식 + + + +### 1.2.1 1차원 배열의 초기화 형태를 따르는 방식 + +> C 언어에서는 2차원 배열을 1차원 배열의 초기화 형태로도 초기화할 수 있다. + +- 문법 + +```c +타입 배열이름[행의길이][열의길이] = {배열요소[0][0], 배열요소[0][1], ..., 배열요소[1][0], 배열요소[1][1], ..., 배열요소[2][0], 배열요소[2][1], ...}; +``` + +>이 방식으로는 2차원 배열의 배열 요소 [0][0]부터 차례대로 초기화된다. +만약에 초기화하는 배열 요소의 개수가 배열의 총 길이보다 적으면, +나머지 배열 요소는 모두 0으로 초기화된다. + + + +### 1.2.2 배열의 모든 요소를 초기화하는 방식 + +>C 언어에서는 2차원 배열의 모든 요소를 초기화할 수 있다. + +- 문법 + +```C +타입 배열이름[행의길이][열의길이] = +{ +    {배열요소[0][0], 배열요소[0][1], ...}, +    {배열요소[1][0], 배열요소[1][1], ...}, +    {배열요소[2][0], 배열요소[2][1], ...}, +    ... +}; +``` + +>이 방식은 1차원 배열의 초기화 형태를 따르는 방식과 결과는 똑같다. + 하지만 좀 더 직관적으로 2차원 배열의 모습을 알 수 있으므로 보통 이 방식을 가장 많이 사용한다. + +>다음 예제는 두 가지 방식을 각각 사용하여 배열을 선언하고 초기화하는 예제이다. + +- 예제 + +```c +int arr01[2][3] = {10, 20, 30, 40, 50, 60}; +int arr02[2][3] = { +    {10, 20, 30}, +    {40, 50, 60} +};   +``` + +- 실행 결과 + +```c +arr01의 배열 요소의 값 +10 20 30 40 50 60 +arr02의 배열 요소의 값 +10 20 30 40 50 60 +``` + + + +### 1.2.3 배열의 일부 요소만을 초기화하는 방식 + +>C 언어에서는 2차원 배열의 일부 요소만을 초기화할 수도 있다. + +>이 방식으로는 다음 예제와 같이 2차원 배열의 원하는 배열 요소만을 초기화할 수 있다. +이때 초기화하지 않은 배열 요소는 모두 0으로 자동초기화된다. + +- 예제 + +```c +int arr[3][4] = { +    {10, 20}, +    {30, 40, 50, 60}, +    {0, 0, 70, 80} +}; +``` + +- 실행 결과 + +```c +  10  20   0   0 +  30  40  50  60 +   0   0  70  80 +``` + +>위의 예제에서 2차원 배열 열의 길이를 구할 때 사용하는 수식은 다음과 같다. + +- 수식 + +```c +arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]); // 2차원 배열의 열의 길이를 계산함 +``` + +>열의 길이는 sizeof(arr[0])으로 먼저 2차원 배열 한 행의 길이를 구한 후에, +>그 값을 배열 타입의 크기로 나누어서 구합니다. + +>열의 길이를 이용하면 2차원 배열 행의 길이도 구할 수 있다. + +- 수식 + +```c +arr_row_len = (sizeof(arr) / arr_col_len) / sizeof(arr[0][0]); // 2차원 배열의 행의 길이를 계산함 +``` + +>행의 길이는 sizeof(arr) / arr_col_len으로 먼저 2차원 배열 한 열의 길이를 구한 후에, +>그 값을 배열 타입의 크기로 나누어서 구한다. + + + +### 1.2.4 배열의 길이 자동 설정 + +>1차원 배열과 마찬가지로 2차원 배열도 배열의 길이를 명시하지 않고, +>자동으로 배열의 길이를 설정할 수 있다. +단, 행의 길이는 생략할 수 있지만, 열의 길이는 반드시 명시해야 한다. + +>다음 예제는 앞선 예제에서 행의 길이를 생략한 예제로, 같은 결과를 출력한다. + +- 예제 + +```c +int arr[][4] = { +    {10, 20}, +    {30, 40, 50, 60}, +    {0, 0, 70, 80} +}; +``` + +- 실행 결과 + +```c +  10  20   0   0 +  30  40  50  60 +   0   0  70  80 +``` + +>위의 예제에서 행의 길이를 명시하고, +>열의 길이를 생략하면 컴파일할 때 오류가 발생한다. \ No newline at end of file diff --git a/_posts/2023-12-04-PointerArrayAndArrayPointers.md b/_posts/2023-12-04-PointerArrayAndArrayPointers.md new file mode 100644 index 000000000000..164fc4610967 --- /dev/null +++ b/_posts/2023-12-04-PointerArrayAndArrayPointers.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 30 포인터 배열과 배열 포인터 +date: 2023-12-04 18:54:29 +09:00 +categories: + - Language +tags: + - C +excerpt: 포인터 배열과 배열 포인터에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-PointerConcept.md b/_posts/2023-12-04-PointerConcept.md new file mode 100644 index 000000000000..954df8be15a7 --- /dev/null +++ b/_posts/2023-12-04-PointerConcept.md @@ -0,0 +1,165 @@ +--- +layout: single +title: Chapter 25 포인터의 개념 +date: 2023-12-04 18:51:09 +09:00 +categories: + - Language +tags: + - C +excerpt: 포인터의 개념에 관한 글입니다. +toc: true +--- + +# 1 주소값의 이해 + +- 데이터의 주소값 + +> 데이터의 주소값이란 해당 데이터가 저장된 메모리의 시작 주소를 의미한다. + +>C 언어에서는 이러한 주소값을 1바이트 크기의 메모리 공간으로 나누어 표현한다. +예를 들어, int형 데이터는 4바이트의 크기를 가지지만, +int형 데이터의 주소값은 시작 주소 1바이트만을 가리킨다. + +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/de869fce-b182-4ce5-8664-707cd99b0a55) + +# 2 포인터 + +- 포인터 + +> C 언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수를 의미하며, +> 포인터 변수라고도 부른다. + +> char형 변수가 문자를 저장하고, +> int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다. + +- 예제 + +```c +int n = 100;   // 변수의 선언 +int *ptr = &n; // 포인터의 선언 +``` + +>다음 그림은 위의 예제에서 사용된 변수와 포인터가 메모리에서 +어떻게 저장되는지를 보여주는 예제이다. + +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/bb6a43f9-824e-443e-b0eb-3c4c1a269a1c) + +## 2.1 포인터 연산자 + +>C 언어에서 포인터와 연관되어 사용되는 연산자는 다음과 같다. + +1. 주소 연산자(&) + +2. 참조 연산자(*) + +### 2.1.1 주소 연산자(&) + +>주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다. +'&'기호는 앰퍼샌드(ampersand)라고 읽으며, 번지 연산자라고도 불립니다. + +### 2.1.2 참조 연산자(*) + +>참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, +>포인터에 가리키는 주소에 저장된 값을 반환한다. + +>C 언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용된다. +이항 연산자로 사용하면 곱셈 연산으로 사용되며, +포인터의 선언 시나 메모리에 접근할 때도 사용된다. + +## 2.2 포인터의 선언 + +>C 언어에서 포인터는 다음 문법에 따라 선언한다. + +- 문법 + +```c +타입* 포인터이름;   +``` + +>타입이란 포인터가 가리키고자 하는 변수의 타입을 명시한다. +포인터 이름은 포인터가 선언된 후에 포인터에 접근하기 위해 사용된다. + +>포인터를 선언한 후 참조 연산자(*)를 사용하기 전에 포인터는 반드시 먼저 초기화되어야 한다. +그렇지 않으면 의도하지 않은 메모리의 값을 변경하게 되기 때문이다. +따라서 C 컴파일러는 초기화하지 않은 포인터에 참조 연산자를 사용하면 오류를 발생시킨다. + +>따라서 다음과 같이 포인터의 선언과 동시에 초기화를 함께 하는 것이 좋다. + +- 문법 + +```c +타입* 포인터이름 = &변수이름; +또는 +타입* 포인터이름 = 주소값; +``` + +## 2.3 포인터의 참조 + +>C 언어에서 선언된 포인터는 참조 연산자(*)를 사용하여 참조할 수 있다. + +>다음 예제는 포인터의 주소값과 함께 포인터가 가리키고 있는 +>주소값의 데이터를 참조하는 예제이다. + +- 예제 + +```c +int x = 7;        // 변수의 선언 +int *ptr = &x;    // 포인터의 선언 +int *pptr = &ptr; // 포인터의 참조 +``` + +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/63b37f1b-9b98-477e-9730-117d8eeac4d9) + +- 예제 + +```c +int num01 = 1234; +double num02 = 3.14;   +int* ptr_num01 = &num01; +double* ptr_num02 = &num02;   +``` + +```c +① printf("포인터의 크기는 %d입니다.\n", sizeof(ptr_num01)); +② printf("포인터 ptr_num01이 가리키고 있는 주소값은 %#x입니다.\n", ptr_num01); +③ printf("포인터 ptr_num02가 가리키고 있는 주소값은 %#x입니다.\n", ptr_num02); +printf("포인터 ptr_num01이 가리키고 있는 주소에 저장된 값은 %d입니다.\n", *ptr_num01); +printf("포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 %f입니다.\n", *ptr_num02); +``` + +- 실행 결과 + +```c +포인터의 크기는 8입니다. +포인터 ptr_num01이 가리키고 있는 주소값은 0x7c255e4입니다. +포인터 ptr_num02가 가리키고 있는 주소값은 0x7c255e8입니다. +포인터 ptr_num01이 가리키고 있는 주소에 저장된 값은 1234입니다. +포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 3.140000입니다. +``` + +>위 예제의 ①번 라인에서는 sizeof 연산자를 사용하여 포인터 변수의 크기를 구하고 있다. + +>포인터 변수는 메모리에서 변수의 위치를 나타내는 주소를 다루는 변수이므로, +>그 크기는 일반적으로 CPU에 따라 결정된다. +따라서 32비트 CPU에서는 1워드(word)의 크기가 4바이트이므로, +포인터 변수의 크기 또한 4바이트가 될 것이다. + +>하지만 이러한 포인터 변수의 크기는 컴파일러로 컴파일할 때 그 크기까지 직접 명시할 수 있다. +따라서 포인터 변수의 크기는 CPU의 종류와 컴파일할 때 +사용된 컴파일러의 정책에 따라서 달라질 수 있다. + +>또한, ②번과 ③번 라인에서처럼 포인터가 가리키는 +>변수의 타입에 따라 포인터의 타입도 같이 바꿔주고 있다. +포인터의 타입은 참조 연산자를 통해 값을 참조할 때, +참조할 메모리의 크기를 알려주는 역할을 하기 때문이다. + +>다음 그림은 char형 포인터와 int형 포인터가 각각 메모리 상에서 +>해당 타입의 변수를 가리키는 것을 보여준다. + +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/62eb0f37-6ede-4efa-ae08-eaf72c652293) + +>워드(word)란 CPU가 한 번에 처리할 수 있는 데이터의 크기이다. +1바이트는 8비트이므로 32비트 시스템에서는 32비트 / 8비트 = 4, +즉 4바이트가 1워드(word)로 처리된다. +64비트 시스템에서는 64비트 / 8비트 = 8, +즉 8바이트가 1워드(word)로 처리된다. \ No newline at end of file diff --git a/_posts/2023-12-04-PointerOperation.md b/_posts/2023-12-04-PointerOperation.md new file mode 100644 index 000000000000..1ec7fb8b3914 --- /dev/null +++ b/_posts/2023-12-04-PointerOperation.md @@ -0,0 +1,103 @@ +--- +layout: single +title: Chapter 26 포인터 연산 +date: 2023-12-04 18:51:42 +09:00 +categories: + - Language +tags: + - C +excerpt: 포인터 연산에 관한 글입니다. +toc: true +--- + +# 1 포인터 연산 + +> 포인터는 값을 증가시키거나 감소시키는 등의 제한된 연산만을 할 수 있다. + +>C 언어의 포인터 연산에는 다음과 같은 규칙이 있다. + +1. 포인터끼리의 덧셈, 곱셈, 나눗셈은 아무런 의미가 없다. + +2. 포인터끼리의 뺄셈은 두 포인터 사이의 상대적 거리를 나타낸다. + +3. 포인터에 정수를 더하거나 뺄 수는 있지만, 실수와의 연산은 허용하지 않는다. + +4. 포인터끼리 대입하거나 비교할 수 있다. + +>다음 예제는 타입에 따른 포인터 연산의 증가값을 비교하는 예제이다. + +- 예제 + +```c +char* ptr_char = 0; +int* ptr_int = NULL; +double* ptr_double = 0x00;   + +printf("포인터 ptr_char가 현재 가리키고 있는 주소값은 %#x입니다.\n", ptr_char); +printf("포인터 ptr_int가 현재 가리키고 있는 주소값은 %#x입니다.\n", ptr_int); +printf("포인터 ptr_double이 현재 가리키고 있는 주소값은 %#x입니다.\n", ptr_double);   + +printf("포인터 ptr_char가 1 증가 후에 가리키고 있는 주소값은 %#x입니다.\n", ++ptr_char); +printf("포인터 ptr_int가 1 증가 후에 가리키고 있는 주소값은 %#x입니다.\n", ++ptr_int); +printf("포인터 ptr_double이 1 증가 후에 가리키고 있는 주소값은 %#x입니다.\n", ++ptr_double);   +``` + +- 실행 결과 + +```c +포인터   ptr_char가 현재 가리키고 있는 주소값은 0입니다. +포인터    ptr_int가 현재 가리키고 있는 주소값은 0입니다. +포인터 ptr_double이 현재 가리키고 있는 주소값은 0입니다. +포인터   ptr_char가 1 증가 후에 가리키고 있는 주소값은 0x1입니다. +포인터    ptr_int가 1 증가 후에 가리키고 있는 주소값은 0x4입니다. +포인터 ptr_double이 1 증가 후에 가리키고 있는 주소값은 0x8입니다. +``` + +>위의 예제에서 모든 포인터에 저장된 초기 주소값은 0x00 이다. +하지만 1을 증가시키는 포인터 연산 후 포인터가 가리키고 있는 주소는 +각각의 포인터 타입에 따라 달라진다. +그 증가 폭은 포인터가 가리키는 변수의 타입의 크기와 같게 된다. + +![포인터 연산](https://tcpschool.com/lectures/img_c_pointer_calculation.png) + +>예를 들어, int형 포인터의 증가폭은 int형 타입의 크기인 4바이트만큼 증가하게 된다. +이 법칙은 포인터의 뺄셈에서도 똑같이 적용된다. + +> 다음 예제는 포인터끼리의 비교 연산과 대입 연산을 보여주는 예제이다. + +- 예제 + +```c +int num01 = 10; +int num02 = 20; +int *ptr_num01 = &num01; +int *ptr_num02 = &num02;   + +if (ptr_num01 != ptr_num02) // 포인터끼리의 비교 연산 +{ +    printf("포인터 ptr_num01이 가리키고 있는 주소에 저장된 값은 %d입니다.\n", *ptr_num01); +    printf("포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 %d입니다.\n", *ptr_num02); +    printf("포인터 ptr_num01과 ptr_num02는 현재 다른 주소를 가리키고 있습니다.\n\n"); +    ptr_num02 = ptr_num01; // 포인터끼리의 대입 연산 +}   + +printf("포인터 ptr_num01이 가리키고 있는 주소에 저장된 값은 %d입니다.\n", *ptr_num01); +printf("포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 %d입니다.\n", *ptr_num02);   + +if (ptr_num01 == ptr_num02) // 포인터끼리의 비교 연산 +{ +    printf("포인터 ptr_num01과 ptr_num02는 현재 같은 주소를 가리키고 있습니다.\n"); +} +``` + +- 실행 결과 + +```c +포인터 ptr_num01이 가리키고 있는 주소에 저장된 값은 10입니다. +포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 20입니다. +포인터 ptr_num01과 ptr_num02는 현재 다른 주소를 가리키고 있습니다. + +포인터 ptr_num01이 가리키고 있는 주소에 저장된 값은 10입니다. +포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 10입니다. +포인터 ptr_num01과 ptr_num02는 현재 같은 주소를 가리키고 있습니다. +``` \ No newline at end of file diff --git a/_posts/2023-12-04-PointerToArrayRelationships.md b/_posts/2023-12-04-PointerToArrayRelationships.md new file mode 100644 index 000000000000..a24320196100 --- /dev/null +++ b/_posts/2023-12-04-PointerToArrayRelationships.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 29 포인터와 배열의 관계 +date: 2023-12-04 18:53:52 +09:00 +categories: + - Language +tags: + - C +excerpt: 포인터와 배열의 관계에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-PointersAndStructures.md b/_posts/2023-12-04-PointersAndStructures.md new file mode 100644 index 000000000000..d87e2519cce1 --- /dev/null +++ b/_posts/2023-12-04-PointersAndStructures.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 40 포인터와 구조체 +date: 2023-12-04 19:02:00 +09:00 +categories: + - Language +tags: + - C +excerpt: 포인터와 구조체에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-Pre-definedMacro.md b/_posts/2023-12-04-Pre-definedMacro.md new file mode 100644 index 000000000000..d8d97ff7e074 --- /dev/null +++ b/_posts/2023-12-04-Pre-definedMacro.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 48 미리 정의된 매크로 +date: 2023-12-04 19:06:56 +09:00 +categories: + - Language +tags: + - C +excerpt: 미리 정의된 매크로에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-Pre-processor.md b/_posts/2023-12-04-Pre-processor.md new file mode 100644 index 000000000000..25fa358833e4 --- /dev/null +++ b/_posts/2023-12-04-Pre-processor.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 46 선행처리기 +date: 2023-12-04 19:05:40 +09:00 +categories: + - Language +tags: + - C +excerpt: 선행처리기에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-RecursiveCall.md b/_posts/2023-12-04-RecursiveCall.md new file mode 100644 index 000000000000..f0ed9b3480ed --- /dev/null +++ b/_posts/2023-12-04-RecursiveCall.md @@ -0,0 +1,120 @@ +--- +layout: single +title: Chapter 22 재귀 호출 +date: 2023-12-04 18:49:03 +09:00 +categories: + - Language +tags: + - C +excerpt: 재귀 호출에 관한 글입니다. +toc: true +--- + +# 1 재귀 호출(recursive call) + +- 함수 + +>함수란 하나의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합을 의미한다. + +>C 프로그램은 이러한 함수들로 구성되며, +>포함된 함수들을 사용하여 프로그램의 목적을 달성하게 된다. + +- 재귀 호출 + +>재귀 호출(recursive call)이란 함수 내부에서 함수가 자기 자신을 또다시 호출하는 행위를 의미한다. + +>이러한 재귀 호출은 자기가 자신을 계속해서 호출하므로, 끝없이 반복되게 된다. +따라서 함수 내에 재귀 호출을 중단하도록 조건이 변경될 명령문을 반드시 포함해야 한다. + +> 재귀 호출은 알고리즘이나 자료 구조론에서는 매우 중요한 개념 중 하나이다. +또한, 재귀 호출을 사용하면 복잡한 문제도 매우 간단하게 논리적으로 접근하여 표현할 수 있다. + +## 1.1 재귀 호출의 개념 + +>다음은 재귀 호출을 사용하지 않고 1부터 n까지의 합을 구하는 함수에 대한 예제이다. + +- 예제 + +```c +int sum(int n) { +    int i; +    int result = 0; + +    for (i = 1; i <= n; i++) +    { +        result += i; +    } + +    return result; +}   +``` + +>위의 예제에서 sum() 함수는 재귀 호출을 사용하지 않고 만든 함수이다. +이러한 함수는 그냥 봐서는 그 목적을 바로 알 수 없으며, +코드를 해석해야 무슨 목적으로 만든 함수인지 알 수 있다. +즉 변수 i와 result는 왜 정의됐으며, for 문은 왜 사용되었는지 바로 알 수가 없다. + +> 재귀 호출을 사용하여 1부터 n까지의 합을 구하는 rSum() 함수를 만들 수 있다. +1부터 4까지의 합을 구하는 알고리즘은 다음과 같습니다. + +1. 1부터 4까지의 합은 1부터 3까지의 합에 4를 더하면 된다. + +2. 1부터 3까지의 합은 1부터 2까지의 합에 3을 더하면 된다. + +3. 1부터 2까지의 합은 1부터 1까지의 합에 2를 더하면 된다. + +4. 1부터 1까지의 합은 그냥 1이다. + +>위와 같이 논리적인 재귀 알고리즘을 구상하고 나면, 그것을 토대로 의사 코드를 작성할 수 있다. +위의 알고리즘을 의사 코드(pseudo code)로 작성하면 다음과 같다. + +- 의사 코드 + +```c +시작 +    1. n이 1이 아니면, 1부터 (n-1)까지의 합에 n을 더한 값을 반환함. +    2. n이 1이면, 그냥 1을 반환함. +끝 +``` + +- 의사 코드 + +>의사 코드(pseudo code)란 특정 프로그래밍 언어의 문법에 맞춰 작성된 것이 아닌,  +>일반적인 언어로 알고리즘을 표현한 코드를 의미한다. + +>이렇게 작성된 의사 코드는 재귀 호출을 이용해 다음 예제와 같이 바로 구현할 수 있게 된다. + +- 예제 + +```c +int rSum(int n) +{ +    if (n == 1)           // n이 1이면, 그냥 1을 반환함. +    { +          return 1; +    } +    return n + rSum(n-1); // n이 1이 아니면, n을 1부터 (n-1)까지의 합과 더한 값을 반환함. +} +``` + +- 실행 결과 + +```c +1부터 5까지의 합은 15입니다. +``` + +> 위의 예제에서 if 문이 존재하지 않으면, +> 이 프로그램은 실행 직후 스택 오버플로우(stack overflow)에 의해 종료될 것이다. +따라서 if 문처럼 재귀 호출을 중단하기 위한 조건문을 반드시 포함해야 한다. + +- 스택 오버플로우 + +>스택 오버플로우(stack overflow)란 메모리 구조 중 스택(stack) 영역에서 해당 프로그램이 사용할 수 있는 메모리 공간 이상을 사용하려고 할 때 발생하는 상황을 의미한다. + +>이처럼 재귀 호출은 다양한 알고리즘을 표현한 의사 코드를 그대로 코드로 옮길 수 있게 해준다. +따라서 재귀 호출은 직관적인 프로그래밍을 하는 데 많은 도움을 준다. + +>하지만 이러한 재귀 호출은 비재귀 호출보다 실행 시간이 오래 걸리는 단점을 가지고 있다. + +>재귀호출의 장점 : 코드의 간결함 +재귀호출의 단점 : 무한 재귀호출의 위험성, 성능 상의 문제 \ No newline at end of file diff --git a/_posts/2023-12-04-RepresentationOfNegativeNumbers.md b/_posts/2023-12-04-RepresentationOfNegativeNumbers.md new file mode 100644 index 000000000000..4d6b6840e917 --- /dev/null +++ b/_posts/2023-12-04-RepresentationOfNegativeNumbers.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 54 음수의 표현 +date: 2023-12-04 19:10:35 +09:00 +categories: + - Language +tags: + - C +excerpt: 음수의 표현에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-SplitCompilation.md b/_posts/2023-12-04-SplitCompilation.md new file mode 100644 index 000000000000..0b9aa4372288 --- /dev/null +++ b/_posts/2023-12-04-SplitCompilation.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 50 분할 컴파일 +date: 2023-12-04 19:08:20 +09:00 +categories: + - Language +tags: + - C +excerpt: 분할 컴파일에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-StackFrame.md b/_posts/2023-12-04-StackFrame.md new file mode 100644 index 000000000000..59734c056146 --- /dev/null +++ b/_posts/2023-12-04-StackFrame.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 32 스택 프레임 +date: 2023-12-04 18:55:47 +09:00 +categories: + - Language +tags: + - C +excerpt: 스택 프레임에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-String.md b/_posts/2023-12-04-String.md new file mode 100644 index 000000000000..154e2755c634 --- /dev/null +++ b/_posts/2023-12-04-String.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 36 문자열 +date: 2023-12-04 18:59:00 +09:00 +categories: + - Language +tags: + - C +excerpt: 문자열에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-StringIOFunction.md b/_posts/2023-12-04-StringIOFunction.md new file mode 100644 index 000000000000..a3a44f56de9d --- /dev/null +++ b/_posts/2023-12-04-StringIOFunction.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 37 문자열 입출력 함수 +date: 2023-12-04 18:59:30 +09:00 +categories: + - Language +tags: + - C +excerpt: 문자열 입출력 함수에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-StringProcessingFunction.md b/_posts/2023-12-04-StringProcessingFunction.md new file mode 100644 index 000000000000..066853a34bcd --- /dev/null +++ b/_posts/2023-12-04-StringProcessingFunction.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 38 문자열 처리 함수 +date: 2023-12-04 19:00:21 +09:00 +categories: + - Language +tags: + - C +excerpt: 문자열 처리 함수에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-UtilizationOfStructures.md b/_posts/2023-12-04-UtilizationOfStructures.md new file mode 100644 index 000000000000..b853a3892685 --- /dev/null +++ b/_posts/2023-12-04-UtilizationOfStructures.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 41 구조체의 활용 +date: 2023-12-04 19:02:36 +09:00 +categories: + - Language +tags: + - C +excerpt: 구조체의 활용에 관한 글입니다. +toc: true +--- diff --git a/_posts/2023-12-04-VariousPointers.md b/_posts/2023-12-04-VariousPointers.md new file mode 100644 index 000000000000..9dd38228e87f --- /dev/null +++ b/_posts/2023-12-04-VariousPointers.md @@ -0,0 +1,11 @@ +--- +layout: single +title: Chapter 28 다양한 포인터 +date: 2023-12-04 18:53:11 +09:00 +categories: + - Language +tags: + - C +excerpt: 다양한 포인터에 관한 글입니다. +toc: true +--- diff --git "a/\353\254\264\354\240\234 \355\214\214\354\235\274 1.canvas" "b/\353\254\264\354\240\234 \355\214\214\354\235\274 1.canvas" new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ "b/\353\254\264\354\240\234 \355\214\214\354\235\274 1.canvas" @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git "a/\353\254\264\354\240\234 \355\214\214\354\235\274 2.canvas" "b/\353\254\264\354\240\234 \355\214\214\354\235\274 2.canvas" new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ "b/\353\254\264\354\240\234 \355\214\214\354\235\274 2.canvas" @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git "a/\353\254\264\354\240\234 \355\214\214\354\235\274 3.canvas" "b/\353\254\264\354\240\234 \355\214\214\354\235\274 3.canvas" new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ "b/\353\254\264\354\240\234 \355\214\214\354\235\274 3.canvas" @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git "a/\353\254\264\354\240\234 \355\214\214\354\235\274.canvas" "b/\353\254\264\354\240\234 \355\214\214\354\235\274.canvas" new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ "b/\353\254\264\354\240\234 \355\214\214\354\235\274.canvas" @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git "a/\354\212\244\355\201\254\353\246\260\354\203\267(753) - \353\263\265\354\202\254\353\263\270 1.png" "b/\354\212\244\355\201\254\353\246\260\354\203\267(753) - \353\263\265\354\202\254\353\263\270 1.png" new file mode 100644 index 0000000000000000000000000000000000000000..5e07859e4746114fde5bf2144be0e5c7c04f7a13 GIT binary patch literal 16369 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

h6@yR7 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

h6@yR7 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 nbF=@$>wkY&z}Q Date: Wed, 6 Dec 2023 17:34:15 +0900 Subject: [PATCH 24/41] =?UTF-8?q?feat=20:=20=EB=AA=A8=EB=93=A0=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 111 ++++++++++-------- .../{2023-12-03-C.md => 2023-12-03-01_C.md} | 0 ...mming.md => 2023-12-03-02_CProgramming.md} | 0 ...-CProgram.md => 2023-12-03-03_CProgram.md} | 0 ...-Printf().md => 2023-12-03-04_Printf().md} | 2 +- ...03-Scanf().md => 2023-12-03-05_Scanf().md} | 2 +- ...-Variable.md => 2023-12-03-06_Variable.md} | 0 ...-Constant.md => 2023-12-03-07_Constant.md} | 0 ...asicType.md => 2023-12-03-08_BasicType.md} | 4 +- ...asting.md => 2023-12-03-09_TypeCasting.md} | 2 +- ...md => 2023-12-03-10_ArithmeticOperator.md} | 4 +- ...md => 2023-12-03-11_AssignmentOperator.md} | 0 ...12-03-12_IncrementAndDecrementOperator.md} | 0 ...md => 2023-12-03-13_ComparisonOperator.md} | 0 ...or.md => 2023-12-03-14_LogicalOperator.md} | 0 ...or.md => 2023-12-03-15_BitwiseOperator.md} | 0 ...ator.md => 2023-12-03-16_OtherOperator.md} | 4 +- ... => 2023-12-03-17_ConditionalStatement.md} | 2 +- ...md => 2023-12-03-18_IterationStatement.md} | 0 ...t.md => 2023-12-03-19_ControlStatement.md} | 0 ....md => 2023-12-03-20_CLanguageFunction.md} | 0 ... => 2023-12-03-21_ValidRangeOfVariable.md} | 0 ...Call.md => 2023-12-04-22_RecursiveCall.md} | 0 ...ment.md => 2023-12-04-23_1DArrangement.md} | 0 ...3-12-04-24_MultidimensionalArrangement.md} | 0 ...ept.md => 2023-12-04-25_PointerConcept.md} | 0 ...n.md => 2023-12-04-26_PointerOperation.md} | 0 ... => 2023-12-04-27_HowToForwardArgument.md} | 0 ...rs.md => 2023-12-04-28_VariousPointers.md} | 0 ...3-12-04-29_PointerToArrayRelationships.md} | 0 ...-12-04-30_PointerArrayAndArrayPointers.md} | 0 ...re.md => 2023-12-04-31_MemoryStructure.md} | 0 ...ckFrame.md => 2023-12-04-32_StackFrame.md} | 0 ... 2023-12-04-33_DynamicMemoryAllocation.md} | 0 ...04-BasicIO.md => 2023-12-04-34_BasicIO.md} | 0 ...-12-04-35_CharacterInputOutputFunction.md} | 0 ...2-04-String.md => 2023-12-04-36_String.md} | 0 ...n.md => 2023-12-04-37_StringIOFunction.md} | 0 ...2023-12-04-38_StringProcessingFunction.md} | 0 ...ure.md => 2023-12-04-39_BasicStructure.md} | 0 ...=> 2023-12-04-40_PointersAndStructures.md} | 0 ... 2023-12-04-41_UtilizationOfStructures.md} | 0 ... => 2023-12-04-43_CommonAndEnumeration.md} | 0 ...onsoleIO.md => 2023-12-04-43_ConsoleIO.md} | 0 ...2-04-FileIO.md => 2023-12-04-44_FileIO.md} | 0 ...ion.md => 2023-12-04-45_FileIOFunction.md} | 0 ...ssor.md => 2023-12-04-46_Pre-processor.md} | 0 ...tion.md => 2023-12-04-47_MacroFunction.md} | 0 ...o.md => 2023-12-04-48_Pre-definedMacro.md} | 0 ...rFiles.md => 2023-12-04-49_HeaderFiles.md} | 0 ...n.md => 2023-12-04-50_SplitCompilation.md} | 0 ...> 2023-12-04-51_ConditionalCompilation.md} | 0 ...r.md => 2023-12-04-52_ByteStorageOrder.md} | 0 ...ation.md => 2023-12-04-53_BitOperation.md} | 0 ...-04-54_RepresentationOfNegativeNumbers.md} | 0 ...2023-12-04-55_ExpressionsOfRealNumbers.md} | 0 56 files changed, 69 insertions(+), 62 deletions(-) rename _posts/{2023-12-03-C.md => 2023-12-03-01_C.md} (100%) rename _posts/{2023-12-03-CProgramming.md => 2023-12-03-02_CProgramming.md} (100%) rename _posts/{2023-12-03-CProgram.md => 2023-12-03-03_CProgram.md} (100%) rename _posts/{2023-12-03-Printf().md => 2023-12-03-04_Printf().md} (98%) rename _posts/{2023-12-03-Scanf().md => 2023-12-03-05_Scanf().md} (96%) rename _posts/{2023-12-03-Variable.md => 2023-12-03-06_Variable.md} (100%) rename _posts/{2023-12-03-Constant.md => 2023-12-03-07_Constant.md} (100%) rename _posts/{2023-12-03-BasicType.md => 2023-12-03-08_BasicType.md} (96%) rename _posts/{2023-12-03-TypeCasting.md => 2023-12-03-09_TypeCasting.md} (99%) rename _posts/{2023-12-03-ArithmeticOperator.md => 2023-12-03-10_ArithmeticOperator.md} (94%) rename _posts/{2023-12-03-AssignmentOperator.md => 2023-12-03-11_AssignmentOperator.md} (100%) rename _posts/{2023-12-03-IncrementAndDecrementOperator.md => 2023-12-03-12_IncrementAndDecrementOperator.md} (100%) rename _posts/{2023-12-03-ComparisonOperator.md => 2023-12-03-13_ComparisonOperator.md} (100%) rename _posts/{2023-12-03-LogicalOperator.md => 2023-12-03-14_LogicalOperator.md} (100%) rename _posts/{2023-12-03-BitwiseOperator.md => 2023-12-03-15_BitwiseOperator.md} (100%) rename _posts/{2023-12-03-OtherOperator.md => 2023-12-03-16_OtherOperator.md} (94%) rename _posts/{2023-12-03-ConditionalStatement.md => 2023-12-03-17_ConditionalStatement.md} (99%) rename _posts/{2023-12-03-IterationStatement.md => 2023-12-03-18_IterationStatement.md} (100%) rename _posts/{2023-12-03-ControlStatement.md => 2023-12-03-19_ControlStatement.md} (100%) rename _posts/{2023-12-03-CLanguageFunction.md => 2023-12-03-20_CLanguageFunction.md} (100%) rename _posts/{2023-12-03-ValidRangeOfVariable.md => 2023-12-03-21_ValidRangeOfVariable.md} (100%) rename _posts/{2023-12-04-RecursiveCall.md => 2023-12-04-22_RecursiveCall.md} (100%) rename _posts/{2023-12-04-1DArrangement.md => 2023-12-04-23_1DArrangement.md} (100%) rename _posts/{2023-12-04-MultidimensionalArrangement.md => 2023-12-04-24_MultidimensionalArrangement.md} (100%) rename _posts/{2023-12-04-PointerConcept.md => 2023-12-04-25_PointerConcept.md} (100%) rename _posts/{2023-12-04-PointerOperation.md => 2023-12-04-26_PointerOperation.md} (100%) rename _posts/{2023-12-04-HowToForwardArgument.md => 2023-12-04-27_HowToForwardArgument.md} (100%) rename _posts/{2023-12-04-VariousPointers.md => 2023-12-04-28_VariousPointers.md} (100%) rename _posts/{2023-12-04-PointerToArrayRelationships.md => 2023-12-04-29_PointerToArrayRelationships.md} (100%) rename _posts/{2023-12-04-PointerArrayAndArrayPointers.md => 2023-12-04-30_PointerArrayAndArrayPointers.md} (100%) rename _posts/{2023-12-04-MemoryStructure.md => 2023-12-04-31_MemoryStructure.md} (100%) rename _posts/{2023-12-04-StackFrame.md => 2023-12-04-32_StackFrame.md} (100%) rename _posts/{2023-12-04-DynamicMemoryAllocation.md => 2023-12-04-33_DynamicMemoryAllocation.md} (100%) rename _posts/{2023-12-04-BasicIO.md => 2023-12-04-34_BasicIO.md} (100%) rename _posts/{2023-12-04-CharacterInputOutputFunction.md => 2023-12-04-35_CharacterInputOutputFunction.md} (100%) rename _posts/{2023-12-04-String.md => 2023-12-04-36_String.md} (100%) rename _posts/{2023-12-04-StringIOFunction.md => 2023-12-04-37_StringIOFunction.md} (100%) rename _posts/{2023-12-04-StringProcessingFunction.md => 2023-12-04-38_StringProcessingFunction.md} (100%) rename _posts/{2023-12-04-BasicStructure.md => 2023-12-04-39_BasicStructure.md} (100%) rename _posts/{2023-12-04-PointersAndStructures.md => 2023-12-04-40_PointersAndStructures.md} (100%) rename _posts/{2023-12-04-UtilizationOfStructures.md => 2023-12-04-41_UtilizationOfStructures.md} (100%) rename _posts/{2023-12-04-CommonAndEnumeration.md => 2023-12-04-43_CommonAndEnumeration.md} (100%) rename _posts/{2023-12-04-ConsoleIO.md => 2023-12-04-43_ConsoleIO.md} (100%) rename _posts/{2023-12-04-FileIO.md => 2023-12-04-44_FileIO.md} (100%) rename _posts/{2023-12-04-FileIOFunction.md => 2023-12-04-45_FileIOFunction.md} (100%) rename _posts/{2023-12-04-Pre-processor.md => 2023-12-04-46_Pre-processor.md} (100%) rename _posts/{2023-12-04-MacroFunction.md => 2023-12-04-47_MacroFunction.md} (100%) rename _posts/{2023-12-04-Pre-definedMacro.md => 2023-12-04-48_Pre-definedMacro.md} (100%) rename _posts/{2023-12-04-HeaderFiles.md => 2023-12-04-49_HeaderFiles.md} (100%) rename _posts/{2023-12-04-SplitCompilation.md => 2023-12-04-50_SplitCompilation.md} (100%) rename _posts/{2023-12-04-ConditionalCompilation.md => 2023-12-04-51_ConditionalCompilation.md} (100%) rename _posts/{2023-12-04-ByteStorageOrder.md => 2023-12-04-52_ByteStorageOrder.md} (100%) rename _posts/{2023-12-04-BitOperation.md => 2023-12-04-53_BitOperation.md} (100%) rename _posts/{2023-12-04-RepresentationOfNegativeNumbers.md => 2023-12-04-54_RepresentationOfNegativeNumbers.md} (100%) rename _posts/{2023-12-04-ExpressionsOfRealNumbers.md => 2023-12-04-55_ExpressionsOfRealNumbers.md} (100%) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index d8f1e1661184..0df537ab26ea 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -11,8 +11,12 @@ "id": "61669096ec41de77", "type": "leaf", "state": { - "type": "empty", - "state": {} + "type": "markdown", + "state": { + "file": "_posts/2023-12-04-27_HowToForwardArgument.md", + "mode": "source", + "source": false + } } } ] @@ -44,7 +48,7 @@ "state": { "type": "search", "state": { - "query": "EunChong999.github.io", + "query": "Chapter 1 C 언어", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -61,8 +65,7 @@ "state": {} } } - ], - "currentTab": 1 + ] } ], "direction": "horizontal", @@ -82,6 +85,7 @@ "state": { "type": "backlink", "state": { + "file": "_posts/2023-12-04-27_HowToForwardArgument.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -98,6 +102,7 @@ "state": { "type": "outgoing-link", "state": { + "file": "_posts/2023-12-04-27_HowToForwardArgument.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -119,7 +124,9 @@ "type": "leaf", "state": { "type": "outline", - "state": {} + "state": { + "file": "_posts/2023-12-04-27_HowToForwardArgument.md" + } } } ] @@ -139,60 +146,60 @@ "command-palette:명령어 팔레트 열기": false } }, - "active": "70aef7345187e503", + "active": "61669096ec41de77", "lastOpenFiles": [ - "2023-12-04.md", - "_site/무제 파일 3.canvas", + "_posts/2023-12-04-26_PointerOperation.md", + "_posts/2023-12-04-25_PointerConcept.md", + "_posts/2023-12-04-24_MultidimensionalArrangement.md", + "_posts/2023-12-04-31_MemoryStructure.md", + "_site/language/31_MemoryStructure/index.html", + "_site/language/31_MemoryStructure", + "_posts/2023-12-03-21_ValidRangeOfVariable.md", + "_posts/2023-12-03-20_CLanguageFunction.md", + "_site/language/28_VariousPointers/index.html", + "_site/language/28_VariousPointers", + "_posts/2023-12-04-28_VariousPointers.md", + "_site/language/41_UtilizationOfStructures/index.html", + "_site/language/41_UtilizationOfStructures", + "_posts/2023-12-04-41_UtilizationOfStructures.md", + "_site/language/38_StringProcessingFunction/index.html", + "_site/language/38_StringProcessingFunction", + "_posts/2023-12-04-38_StringProcessingFunction.md", + "_site/language/37_StringIOFunction/index.html", + "_site/language/37_StringIOFunction", + "_posts/2023-12-04-37_StringIOFunction.md", + "_posts/2023-12-04-36_String.md", + "_posts/2023-12-04-32_StackFrame.md", + "_posts/2023-12-04-50_SplitCompilation.md", + "_posts/2023-12-04-54_RepresentationOfNegativeNumbers.md", + "_posts/2023-12-04-22_RecursiveCall.md", + "_posts/2023-12-04-46_Pre-processor.md", + "_posts/2023-12-04-48_Pre-definedMacro.md", + "_posts/2023-12-04-29_PointerToArrayRelationships.md", + "_posts/2023-12-04-40_PointersAndStructures.md", + "_posts/2023-12-04-30_PointerArrayAndArrayPointers.md", + "_posts/2023-12-04-47_MacroFunction.md", + "_posts/2023-12-04-27_HowToForwardArgument.md", + "_posts/2023-12-04-49_HeaderFiles.md", + "_posts/2023-12-04-45_FileIOFunction.md", + "_posts/2023-12-04-44_FileIO.md", + "스크린샷(753).png", + "스크린샷(753) 1.png", + "스크린샷(753) - 복사본.png", + "스크린샷(753) - 복사본 1.png", + "무제 파일.canvas", "무제 파일 3.canvas", "무제 파일 2.canvas", + "무제 파일 1.canvas", + "Pasted image 20231204212405.png", + "Pasted image 20231204195434.png", + "_site/무제 파일 3.canvas", "_site/무제 파일 2.canvas", "_site/무제 파일 1.canvas", - "무제 파일 1.canvas", - "_site/2023-12-04.md", "_site/무제 파일.canvas", - "무제 파일.canvas", - "_posts/2023-12-04-PointerOperation.md", - "_posts/2023-12-04-PointerConcept.md", - "_posts/2023-12-04-1DArrangement.md", - "_posts/2023-12-03-ConditionalStatement.md", - "_posts/2023-12-03-Variable.md", - "_posts/2023-12-03-Scanf().md", - "_posts/2023-12-03-TypeCasting.md", - "_posts/2023-12-03-ValidRangeOfVariable.md", - "_posts/2023-12-04-BasicIO.md", - "_posts/2023-12-04-BasicStructure.md", - "_posts/2023-12-04-BitOperation.md", - "_posts/2023-12-04-ByteStorageOrder.md", - "_posts/2023-12-04-CharacterInputOutputFunction.md", - "_posts/2023-12-04-CommonAndEnumeration.md", - "_posts/2023-12-04-ConditionalCompilation.md", - "_posts/2023-12-04-ConsoleIO.md", - "_posts/2023-12-04-DynamicMemoryAllocation.md", - "_posts/2023-12-04-ExpressionsOfRealNumbers.md", - "_posts/2023-12-04-FileIO.md", - "_posts/2023-12-04-FileIOFunction.md", - "_posts/2023-12-04-HeaderFiles.md", - "_posts/2023-12-04-HowToForwardArgument.md", - "_posts/2023-12-04-MacroFunction.md", "_site/Pasted image 20231204212405.png", - "Pasted image 20231204212405.png", "_site/Pasted image 20231204195434.png", - "Pasted image 20231204195434.png", "_site/assets/images/스크린샷(753).png", - "_site/assets/images/스크린샷(753) - 복사본.png", - "assets/images/스크린샷(753) - 복사본.png", - "assets/images/스크린샷(753).png", - "_site/스크린샷(753) 1.png", - "스크린샷(753) 1.png", - "_site/language/ValidRangeOfVariable-copy/index.html", - "_site/language/ValidRangeOfVariable-copy", - "_site/page12/index.html", - "_site/page12", - "_site/language/ExpressionsOfRealNumbers/index.html", - "_site/language/ExpressionsOfRealNumbers", - "_site/language/RepresentationOfNegativeNumbers/index.html", - "_site/language/RepresentationOfNegativeNumbers", - "_site/language/BitOperation/index.html", - "_site/language/BitOperation" + "_site/assets/images/스크린샷(753) - 복사본.png" ] } \ No newline at end of file diff --git a/_posts/2023-12-03-C.md b/_posts/2023-12-03-01_C.md similarity index 100% rename from _posts/2023-12-03-C.md rename to _posts/2023-12-03-01_C.md diff --git a/_posts/2023-12-03-CProgramming.md b/_posts/2023-12-03-02_CProgramming.md similarity index 100% rename from _posts/2023-12-03-CProgramming.md rename to _posts/2023-12-03-02_CProgramming.md diff --git a/_posts/2023-12-03-CProgram.md b/_posts/2023-12-03-03_CProgram.md similarity index 100% rename from _posts/2023-12-03-CProgram.md rename to _posts/2023-12-03-03_CProgram.md diff --git a/_posts/2023-12-03-Printf().md b/_posts/2023-12-03-04_Printf().md similarity index 98% rename from _posts/2023-12-03-Printf().md rename to _posts/2023-12-03-04_Printf().md index 8f3277519238..1681b51c5353 100644 --- a/_posts/2023-12-03-Printf().md +++ b/_posts/2023-12-03-04_Printf().md @@ -79,7 +79,7 @@ C언어에서 사용하는 "특수 문자"에는 여러가지가 있습니다. > 서식 지정자(format specifier)란 컴퓨터가 어떤 정보를 어떻게 해석할 건지를 지정해주는 걸 의미한다. printf() 함수에서는 이러한 서식 지정자를 통해 출력할 데이터의 서식을 사용자가 직접 지정할 수 있다. -> C언어에서 사용되는 대표적인 서식 지정자는 다음과 같다. +> C 언어에서 사용되는 대표적인 서식 지정자는 다음과 같다. ![](https://velog.velcdn.com/images/ecg/post/9510eedb-bbcd-49c6-a41f-8194fbc11ee7/image.png) diff --git a/_posts/2023-12-03-Scanf().md b/_posts/2023-12-03-05_Scanf().md similarity index 96% rename from _posts/2023-12-03-Scanf().md rename to _posts/2023-12-03-05_Scanf().md index 57f7c0e2a284..46b2a0601475 100644 --- a/_posts/2023-12-03-Scanf().md +++ b/_posts/2023-12-03-05_Scanf().md @@ -53,7 +53,7 @@ int main(void) 입력하신 두 정수의 합은 30입니다. ``` -> C언어에서 데이터를 입력받으려면 입력받고자 하는 데이터의 타입에 해당하는 크기의 메모리를 우선 할당받아야 한다. +> C 언어에서 데이터를 입력받으려면 입력받고자 하는 데이터의 타입에 해당하는 크기의 메모리를 우선 할당받아야 한다. 이처럼 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 변수(variable)라고 한다. > scanf() 함수에 포함된 '&'기호는 주소 연산자(&)라고 한다. diff --git a/_posts/2023-12-03-Variable.md b/_posts/2023-12-03-06_Variable.md similarity index 100% rename from _posts/2023-12-03-Variable.md rename to _posts/2023-12-03-06_Variable.md diff --git a/_posts/2023-12-03-Constant.md b/_posts/2023-12-03-07_Constant.md similarity index 100% rename from _posts/2023-12-03-Constant.md rename to _posts/2023-12-03-07_Constant.md diff --git a/_posts/2023-12-03-BasicType.md b/_posts/2023-12-03-08_BasicType.md similarity index 96% rename from _posts/2023-12-03-BasicType.md rename to _posts/2023-12-03-08_BasicType.md index 8740f0c049a5..28ee986d739f 100644 --- a/_posts/2023-12-03-BasicType.md +++ b/_posts/2023-12-03-08_BasicType.md @@ -84,7 +84,7 @@ int형은 운영체제의 환경에 따라 다릅니다. > C언어에서 실수란 소수부나 지수가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가진다. 하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계를 지닌다. -이러한 실수형 데이터의 오차는 C언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제이다. +이러한 실수형 데이터의 오차는 C 언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제이다. ![](https://velog.velcdn.com/images/ecg/post/416d2a6d-8a45-48e3-8967-74b248db8e35/image.png) @@ -144,7 +144,7 @@ printf("변수 pi에 저장된 값은 %.20f입니다.\n", num02); ![](https://velog.velcdn.com/images/ecg/post/d743ef3f-4a40-4e87-aeb0-5b84dda4b510/image.png) -다음 예제는 char형 변수에 저장된 문자를 여러 서식 지정자를 사용하여 출력하는 예제입니다. +>다음 예제는 char형 변수에 저장된 문자를 여러 서식 지정자를 사용하여 출력하는 예제이다. - 예제 diff --git a/_posts/2023-12-03-TypeCasting.md b/_posts/2023-12-03-09_TypeCasting.md similarity index 99% rename from _posts/2023-12-03-TypeCasting.md rename to _posts/2023-12-03-09_TypeCasting.md index e9abe4ffe0a0..415f3942011c 100644 --- a/_posts/2023-12-03-TypeCasting.md +++ b/_posts/2023-12-03-09_TypeCasting.md @@ -29,7 +29,7 @@ toc: true > 묵시적 타입 변환이란 대입 연산이나 산술 연산에서 C 컴파일러가 자동으로 실행해주는 타입 변환을 의미한다. -> C언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 +> C 언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 연산자의 왼쪽에 존재하는 데이터의 타입으로 묵시적 타입 변환이 진행된다. 또한, 산술 연산에서는 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환이 진행된다. diff --git a/_posts/2023-12-03-ArithmeticOperator.md b/_posts/2023-12-03-10_ArithmeticOperator.md similarity index 94% rename from _posts/2023-12-03-ArithmeticOperator.md rename to _posts/2023-12-03-10_ArithmeticOperator.md index 80d7ed2f54d6..a2875d7a6749 100644 --- a/_posts/2023-12-03-ArithmeticOperator.md +++ b/_posts/2023-12-03-10_ArithmeticOperator.md @@ -15,7 +15,7 @@ toc: true > 연산자(operator)란 프로그램의 산술식이나 연산식을 표현하고 처리하기 위해 제공되는 다양한 기호를 의미한다. -> C언어에서는 여러 종류의 연산을 위해 다양한 연산자를 제공하고 있다. +> C 언어에서는 여러 종류의 연산을 위해 다양한 연산자를 제공하고 있다. ## 1.1 산술 연산자(arithmetic operator) @@ -74,7 +74,7 @@ printf("% 연산자에 의한 결괏값은 %d입니다.\n", num01 % num02); ## 1.3 C 언어 연산자의 우선순위 -> C언어에서 연산자의 우선순위와 결합 방향은 다음과 같다. +> C 언어에서 연산자의 우선순위와 결합 방향은 다음과 같다. - 1순위 diff --git a/_posts/2023-12-03-AssignmentOperator.md b/_posts/2023-12-03-11_AssignmentOperator.md similarity index 100% rename from _posts/2023-12-03-AssignmentOperator.md rename to _posts/2023-12-03-11_AssignmentOperator.md diff --git a/_posts/2023-12-03-IncrementAndDecrementOperator.md b/_posts/2023-12-03-12_IncrementAndDecrementOperator.md similarity index 100% rename from _posts/2023-12-03-IncrementAndDecrementOperator.md rename to _posts/2023-12-03-12_IncrementAndDecrementOperator.md diff --git a/_posts/2023-12-03-ComparisonOperator.md b/_posts/2023-12-03-13_ComparisonOperator.md similarity index 100% rename from _posts/2023-12-03-ComparisonOperator.md rename to _posts/2023-12-03-13_ComparisonOperator.md diff --git a/_posts/2023-12-03-LogicalOperator.md b/_posts/2023-12-03-14_LogicalOperator.md similarity index 100% rename from _posts/2023-12-03-LogicalOperator.md rename to _posts/2023-12-03-14_LogicalOperator.md diff --git a/_posts/2023-12-03-BitwiseOperator.md b/_posts/2023-12-03-15_BitwiseOperator.md similarity index 100% rename from _posts/2023-12-03-BitwiseOperator.md rename to _posts/2023-12-03-15_BitwiseOperator.md diff --git a/_posts/2023-12-03-OtherOperator.md b/_posts/2023-12-03-16_OtherOperator.md similarity index 94% rename from _posts/2023-12-03-OtherOperator.md rename to _posts/2023-12-03-16_OtherOperator.md index 856ff812e394..b1f41f17fed3 100644 --- a/_posts/2023-12-03-OtherOperator.md +++ b/_posts/2023-12-03-16_OtherOperator.md @@ -12,7 +12,7 @@ toc: true - 삼항 연산자 -> 삼항 연산자란 다른 언어에는 존재하지 않는 C언어만의 독특한 연산자를 의미한다. +> 삼항 연산자란 다른 언어에는 존재하지 않는 C 언어만의 독특한 연산자를 의미한다. 이 연산자는 C언어에서도 유일하게 피연산자를 세 개나 가지는 조건 연산자이다. > 삼항 연산자의 문법은 다음과 같다. @@ -114,6 +114,6 @@ char: 1, short: 2, int: 4, long: 4, long long: 8 > 참조 연산자(*)는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환한다. -> C언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용된다. +> C 언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용된다. > 이항 연산자로 사용하면 곱셈 연산으로 사용되며, 포인터의 선언 시나 메모리에 접근할 때도 사용된다. \ No newline at end of file diff --git a/_posts/2023-12-03-ConditionalStatement.md b/_posts/2023-12-03-17_ConditionalStatement.md similarity index 99% rename from _posts/2023-12-03-ConditionalStatement.md rename to _posts/2023-12-03-17_ConditionalStatement.md index a4643a333f84..c818b29d1bc2 100644 --- a/_posts/2023-12-03-ConditionalStatement.md +++ b/_posts/2023-12-03-17_ConditionalStatement.md @@ -62,7 +62,7 @@ if (조건식) 될 수 있으면 모든 코드를 인덴트하는 것이 좋다. > 다음 예제는 if 문을 3번 연속해서 사용하여, -사용자가 입력한 수와 숫자 5를 비교하여 그 결괏값을 출력하는 예제입니다. +사용자가 입력한 수와 숫자 5를 비교하여 그 결괏값을 출력하는 예제이다. - 예제 diff --git a/_posts/2023-12-03-IterationStatement.md b/_posts/2023-12-03-18_IterationStatement.md similarity index 100% rename from _posts/2023-12-03-IterationStatement.md rename to _posts/2023-12-03-18_IterationStatement.md diff --git a/_posts/2023-12-03-ControlStatement.md b/_posts/2023-12-03-19_ControlStatement.md similarity index 100% rename from _posts/2023-12-03-ControlStatement.md rename to _posts/2023-12-03-19_ControlStatement.md diff --git a/_posts/2023-12-03-CLanguageFunction.md b/_posts/2023-12-03-20_CLanguageFunction.md similarity index 100% rename from _posts/2023-12-03-CLanguageFunction.md rename to _posts/2023-12-03-20_CLanguageFunction.md diff --git a/_posts/2023-12-03-ValidRangeOfVariable.md b/_posts/2023-12-03-21_ValidRangeOfVariable.md similarity index 100% rename from _posts/2023-12-03-ValidRangeOfVariable.md rename to _posts/2023-12-03-21_ValidRangeOfVariable.md diff --git a/_posts/2023-12-04-RecursiveCall.md b/_posts/2023-12-04-22_RecursiveCall.md similarity index 100% rename from _posts/2023-12-04-RecursiveCall.md rename to _posts/2023-12-04-22_RecursiveCall.md diff --git a/_posts/2023-12-04-1DArrangement.md b/_posts/2023-12-04-23_1DArrangement.md similarity index 100% rename from _posts/2023-12-04-1DArrangement.md rename to _posts/2023-12-04-23_1DArrangement.md diff --git a/_posts/2023-12-04-MultidimensionalArrangement.md b/_posts/2023-12-04-24_MultidimensionalArrangement.md similarity index 100% rename from _posts/2023-12-04-MultidimensionalArrangement.md rename to _posts/2023-12-04-24_MultidimensionalArrangement.md diff --git a/_posts/2023-12-04-PointerConcept.md b/_posts/2023-12-04-25_PointerConcept.md similarity index 100% rename from _posts/2023-12-04-PointerConcept.md rename to _posts/2023-12-04-25_PointerConcept.md diff --git a/_posts/2023-12-04-PointerOperation.md b/_posts/2023-12-04-26_PointerOperation.md similarity index 100% rename from _posts/2023-12-04-PointerOperation.md rename to _posts/2023-12-04-26_PointerOperation.md diff --git a/_posts/2023-12-04-HowToForwardArgument.md b/_posts/2023-12-04-27_HowToForwardArgument.md similarity index 100% rename from _posts/2023-12-04-HowToForwardArgument.md rename to _posts/2023-12-04-27_HowToForwardArgument.md diff --git a/_posts/2023-12-04-VariousPointers.md b/_posts/2023-12-04-28_VariousPointers.md similarity index 100% rename from _posts/2023-12-04-VariousPointers.md rename to _posts/2023-12-04-28_VariousPointers.md diff --git a/_posts/2023-12-04-PointerToArrayRelationships.md b/_posts/2023-12-04-29_PointerToArrayRelationships.md similarity index 100% rename from _posts/2023-12-04-PointerToArrayRelationships.md rename to _posts/2023-12-04-29_PointerToArrayRelationships.md diff --git a/_posts/2023-12-04-PointerArrayAndArrayPointers.md b/_posts/2023-12-04-30_PointerArrayAndArrayPointers.md similarity index 100% rename from _posts/2023-12-04-PointerArrayAndArrayPointers.md rename to _posts/2023-12-04-30_PointerArrayAndArrayPointers.md diff --git a/_posts/2023-12-04-MemoryStructure.md b/_posts/2023-12-04-31_MemoryStructure.md similarity index 100% rename from _posts/2023-12-04-MemoryStructure.md rename to _posts/2023-12-04-31_MemoryStructure.md diff --git a/_posts/2023-12-04-StackFrame.md b/_posts/2023-12-04-32_StackFrame.md similarity index 100% rename from _posts/2023-12-04-StackFrame.md rename to _posts/2023-12-04-32_StackFrame.md diff --git a/_posts/2023-12-04-DynamicMemoryAllocation.md b/_posts/2023-12-04-33_DynamicMemoryAllocation.md similarity index 100% rename from _posts/2023-12-04-DynamicMemoryAllocation.md rename to _posts/2023-12-04-33_DynamicMemoryAllocation.md diff --git a/_posts/2023-12-04-BasicIO.md b/_posts/2023-12-04-34_BasicIO.md similarity index 100% rename from _posts/2023-12-04-BasicIO.md rename to _posts/2023-12-04-34_BasicIO.md diff --git a/_posts/2023-12-04-CharacterInputOutputFunction.md b/_posts/2023-12-04-35_CharacterInputOutputFunction.md similarity index 100% rename from _posts/2023-12-04-CharacterInputOutputFunction.md rename to _posts/2023-12-04-35_CharacterInputOutputFunction.md diff --git a/_posts/2023-12-04-String.md b/_posts/2023-12-04-36_String.md similarity index 100% rename from _posts/2023-12-04-String.md rename to _posts/2023-12-04-36_String.md diff --git a/_posts/2023-12-04-StringIOFunction.md b/_posts/2023-12-04-37_StringIOFunction.md similarity index 100% rename from _posts/2023-12-04-StringIOFunction.md rename to _posts/2023-12-04-37_StringIOFunction.md diff --git a/_posts/2023-12-04-StringProcessingFunction.md b/_posts/2023-12-04-38_StringProcessingFunction.md similarity index 100% rename from _posts/2023-12-04-StringProcessingFunction.md rename to _posts/2023-12-04-38_StringProcessingFunction.md diff --git a/_posts/2023-12-04-BasicStructure.md b/_posts/2023-12-04-39_BasicStructure.md similarity index 100% rename from _posts/2023-12-04-BasicStructure.md rename to _posts/2023-12-04-39_BasicStructure.md diff --git a/_posts/2023-12-04-PointersAndStructures.md b/_posts/2023-12-04-40_PointersAndStructures.md similarity index 100% rename from _posts/2023-12-04-PointersAndStructures.md rename to _posts/2023-12-04-40_PointersAndStructures.md diff --git a/_posts/2023-12-04-UtilizationOfStructures.md b/_posts/2023-12-04-41_UtilizationOfStructures.md similarity index 100% rename from _posts/2023-12-04-UtilizationOfStructures.md rename to _posts/2023-12-04-41_UtilizationOfStructures.md diff --git a/_posts/2023-12-04-CommonAndEnumeration.md b/_posts/2023-12-04-43_CommonAndEnumeration.md similarity index 100% rename from _posts/2023-12-04-CommonAndEnumeration.md rename to _posts/2023-12-04-43_CommonAndEnumeration.md diff --git a/_posts/2023-12-04-ConsoleIO.md b/_posts/2023-12-04-43_ConsoleIO.md similarity index 100% rename from _posts/2023-12-04-ConsoleIO.md rename to _posts/2023-12-04-43_ConsoleIO.md diff --git a/_posts/2023-12-04-FileIO.md b/_posts/2023-12-04-44_FileIO.md similarity index 100% rename from _posts/2023-12-04-FileIO.md rename to _posts/2023-12-04-44_FileIO.md diff --git a/_posts/2023-12-04-FileIOFunction.md b/_posts/2023-12-04-45_FileIOFunction.md similarity index 100% rename from _posts/2023-12-04-FileIOFunction.md rename to _posts/2023-12-04-45_FileIOFunction.md diff --git a/_posts/2023-12-04-Pre-processor.md b/_posts/2023-12-04-46_Pre-processor.md similarity index 100% rename from _posts/2023-12-04-Pre-processor.md rename to _posts/2023-12-04-46_Pre-processor.md diff --git a/_posts/2023-12-04-MacroFunction.md b/_posts/2023-12-04-47_MacroFunction.md similarity index 100% rename from _posts/2023-12-04-MacroFunction.md rename to _posts/2023-12-04-47_MacroFunction.md diff --git a/_posts/2023-12-04-Pre-definedMacro.md b/_posts/2023-12-04-48_Pre-definedMacro.md similarity index 100% rename from _posts/2023-12-04-Pre-definedMacro.md rename to _posts/2023-12-04-48_Pre-definedMacro.md diff --git a/_posts/2023-12-04-HeaderFiles.md b/_posts/2023-12-04-49_HeaderFiles.md similarity index 100% rename from _posts/2023-12-04-HeaderFiles.md rename to _posts/2023-12-04-49_HeaderFiles.md diff --git a/_posts/2023-12-04-SplitCompilation.md b/_posts/2023-12-04-50_SplitCompilation.md similarity index 100% rename from _posts/2023-12-04-SplitCompilation.md rename to _posts/2023-12-04-50_SplitCompilation.md diff --git a/_posts/2023-12-04-ConditionalCompilation.md b/_posts/2023-12-04-51_ConditionalCompilation.md similarity index 100% rename from _posts/2023-12-04-ConditionalCompilation.md rename to _posts/2023-12-04-51_ConditionalCompilation.md diff --git a/_posts/2023-12-04-ByteStorageOrder.md b/_posts/2023-12-04-52_ByteStorageOrder.md similarity index 100% rename from _posts/2023-12-04-ByteStorageOrder.md rename to _posts/2023-12-04-52_ByteStorageOrder.md diff --git a/_posts/2023-12-04-BitOperation.md b/_posts/2023-12-04-53_BitOperation.md similarity index 100% rename from _posts/2023-12-04-BitOperation.md rename to _posts/2023-12-04-53_BitOperation.md diff --git a/_posts/2023-12-04-RepresentationOfNegativeNumbers.md b/_posts/2023-12-04-54_RepresentationOfNegativeNumbers.md similarity index 100% rename from _posts/2023-12-04-RepresentationOfNegativeNumbers.md rename to _posts/2023-12-04-54_RepresentationOfNegativeNumbers.md diff --git a/_posts/2023-12-04-ExpressionsOfRealNumbers.md b/_posts/2023-12-04-55_ExpressionsOfRealNumbers.md similarity index 100% rename from _posts/2023-12-04-ExpressionsOfRealNumbers.md rename to _posts/2023-12-04-55_ExpressionsOfRealNumbers.md From 4f87b9a3afecae46bddbec988ec7289b8a6149e7 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Wed, 6 Dec 2023 21:57:55 +0900 Subject: [PATCH 25/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 66 +++---- Pasted image 20231206191149.png | Bin 0 -> 15291 bytes Pasted image 20231206205417.png | Bin 0 -> 47050 bytes _posts/2023-12-03-01_C.md | 8 +- _posts/2023-12-03-21_ValidRangeOfVariable.md | 1 + _posts/2023-12-04-27_HowToForwardArgument.md | 99 ++++++++++ _posts/2023-12-04-28_VariousPointers.md | 150 +++++++++++++++ ...23-12-04-29_PointerToArrayRelationships.md | 72 +++++++ ...3-12-04-30_PointerArrayAndArrayPointers.md | 175 ++++++++++++++++++ _posts/2023-12-04-31_MemoryStructure.md | 58 ++++++ 10 files changed, 592 insertions(+), 37 deletions(-) create mode 100644 Pasted image 20231206191149.png create mode 100644 Pasted image 20231206205417.png diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 0df537ab26ea..54aeb0a8bb1a 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-04-27_HowToForwardArgument.md", + "file": "_posts/2023-12-04-31_MemoryStructure.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-04-27_HowToForwardArgument.md", + "file": "_posts/2023-12-04-31_MemoryStructure.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-04-27_HowToForwardArgument.md", + "file": "_posts/2023-12-04-31_MemoryStructure.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-04-27_HowToForwardArgument.md" + "file": "_posts/2023-12-04-31_MemoryStructure.md" } } } @@ -148,41 +148,45 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ - "_posts/2023-12-04-26_PointerOperation.md", - "_posts/2023-12-04-25_PointerConcept.md", + "_posts/2023-12-04-30_PointerArrayAndArrayPointers.md", + "_site/Pasted image 20231206205417.png", + "Pasted image 20231206205417.png", + "_posts/2023-12-04-29_PointerToArrayRelationships.md", + "_posts/2023-12-04-28_VariousPointers.md", "_posts/2023-12-04-24_MultidimensionalArrangement.md", - "_posts/2023-12-04-31_MemoryStructure.md", + "_posts/2023-12-03-18_IterationStatement.md", + "_posts/2023-12-04-27_HowToForwardArgument.md", + "_posts/2023-12-04-26_PointerOperation.md", + "_site/Pasted image 20231206191149.png", + "Pasted image 20231206191149.png", + "_posts/2023-12-03-01_C.md", + "_posts/2023-12-03-02_CProgramming.md", + "_posts/2023-12-03-03_CProgram.md", + "_posts/2023-12-03-04_Printf().md", + "_posts/2023-12-03-05_Scanf().md", + "_posts/2023-12-03-06_Variable.md", + "_posts/2023-12-03-07_Constant.md", + "_posts/2023-12-03-08_BasicType.md", + "_posts/2023-12-03-09_TypeCasting.md", + "_posts/2023-12-03-10_ArithmeticOperator.md", + "_posts/2023-12-03-11_AssignmentOperator.md", + "_posts/2023-12-03-12_IncrementAndDecrementOperator.md", + "_posts/2023-12-03-13_ComparisonOperator.md", + "_posts/2023-12-03-14_LogicalOperator.md", + "_posts/2023-12-03-15_BitwiseOperator.md", + "_posts/2023-12-03-16_OtherOperator.md", + "_posts/2023-12-03-17_ConditionalStatement.md", + "_posts/2023-12-03-19_ControlStatement.md", "_site/language/31_MemoryStructure/index.html", "_site/language/31_MemoryStructure", - "_posts/2023-12-03-21_ValidRangeOfVariable.md", - "_posts/2023-12-03-20_CLanguageFunction.md", "_site/language/28_VariousPointers/index.html", "_site/language/28_VariousPointers", - "_posts/2023-12-04-28_VariousPointers.md", "_site/language/41_UtilizationOfStructures/index.html", "_site/language/41_UtilizationOfStructures", - "_posts/2023-12-04-41_UtilizationOfStructures.md", "_site/language/38_StringProcessingFunction/index.html", "_site/language/38_StringProcessingFunction", - "_posts/2023-12-04-38_StringProcessingFunction.md", "_site/language/37_StringIOFunction/index.html", "_site/language/37_StringIOFunction", - "_posts/2023-12-04-37_StringIOFunction.md", - "_posts/2023-12-04-36_String.md", - "_posts/2023-12-04-32_StackFrame.md", - "_posts/2023-12-04-50_SplitCompilation.md", - "_posts/2023-12-04-54_RepresentationOfNegativeNumbers.md", - "_posts/2023-12-04-22_RecursiveCall.md", - "_posts/2023-12-04-46_Pre-processor.md", - "_posts/2023-12-04-48_Pre-definedMacro.md", - "_posts/2023-12-04-29_PointerToArrayRelationships.md", - "_posts/2023-12-04-40_PointersAndStructures.md", - "_posts/2023-12-04-30_PointerArrayAndArrayPointers.md", - "_posts/2023-12-04-47_MacroFunction.md", - "_posts/2023-12-04-27_HowToForwardArgument.md", - "_posts/2023-12-04-49_HeaderFiles.md", - "_posts/2023-12-04-45_FileIOFunction.md", - "_posts/2023-12-04-44_FileIO.md", "스크린샷(753).png", "스크린샷(753) 1.png", "스크린샷(753) - 복사본.png", @@ -196,10 +200,6 @@ "_site/무제 파일 3.canvas", "_site/무제 파일 2.canvas", "_site/무제 파일 1.canvas", - "_site/무제 파일.canvas", - "_site/Pasted image 20231204212405.png", - "_site/Pasted image 20231204195434.png", - "_site/assets/images/스크린샷(753).png", - "_site/assets/images/스크린샷(753) - 복사본.png" + "_site/무제 파일.canvas" ] } \ No newline at end of file diff --git a/Pasted image 20231206191149.png b/Pasted image 20231206191149.png new file mode 100644 index 0000000000000000000000000000000000000000..efa6346607fceabb3e6ec9442513fb132ceb990c GIT binary patch literal 15291 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 literal 0 HcmV?d00001 diff --git a/_posts/2023-12-03-01_C.md b/_posts/2023-12-03-01_C.md index 54db7743f000..978b73298d54 100644 --- a/_posts/2023-12-03-01_C.md +++ b/_posts/2023-12-03-01_C.md @@ -10,16 +10,18 @@ toc: true # 1 프로그램 +- 프로그램 + > 프로그램(program)이란 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 처리 방법과 순서를 기술한 일련의 명령문의 집합체를 의미한다. ## 1.1 프로그래밍 언어 +- 프로그래밍 언어 + > 프로그래밍 언아(programming language)란 기계(컴퓨터)에게 명령이나 연산을 시킬 목적으로 설계되어 기계와 의사소통을 할 수 있게 해주는 언어를 의미한다. ### 1.1.1 프로그래밍 언어의 분류 -- 프로그래밍 언어 - > 프로그래밍 언어는 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나뉜다. > 저급 언어와 고급 언어는 , 기계가 이해하기 쉬운가(저급 언어), 사람이 이해하기 쉬운가(고급 언어)를 상대적으로 나눈 개념이라고 할 수 있다. @@ -40,8 +42,6 @@ toc: true > 대표적으로 자바, 파이썬 등이 있다. -- C 언어 - > C 언어는 저급 언어와 고급 언어의 특징을 모두 가지고 있는 절차 지향 프로그래밍 언어(procedure-oriented programming language)이다. # 2 C 언어 diff --git a/_posts/2023-12-03-21_ValidRangeOfVariable.md b/_posts/2023-12-03-21_ValidRangeOfVariable.md index b2d637a9f9f6..a45ef0fd1bc8 100644 --- a/_posts/2023-12-03-21_ValidRangeOfVariable.md +++ b/_posts/2023-12-03-21_ValidRangeOfVariable.md @@ -9,6 +9,7 @@ tags: excerpt: 변수의 유효 범위에 관한 글입니다. toc: true --- + # 1 변수의 유효 범위(variable scope) > C 언어에서는 변수의 선언 위치에 따라 해당 변수의 유효 범위, diff --git a/_posts/2023-12-04-27_HowToForwardArgument.md b/_posts/2023-12-04-27_HowToForwardArgument.md index 752c62f70bb9..661a7bf04c75 100644 --- a/_posts/2023-12-04-27_HowToForwardArgument.md +++ b/_posts/2023-12-04-27_HowToForwardArgument.md @@ -9,3 +9,102 @@ tags: excerpt: 변수의 유효 범위에 관한 글입니다. toc: true --- +# 1 인수 전달 방법 + +- 인수 전달 방법 + +- 인수 + +>인수(argument)란 함수가 호출될 때 함수로 값을 전달해주는 값을 의미한다. + +>함수를 호출할 때에는 함수에 필요한 데이터를 인수(argument)로 전달해 줄 수 있다. +>함수에 인수를 전달하는 방법에는 크게 다음과 같이 두 가지 방법이 있다. + +1. 값에 의한 전달(call by value) + +2. 참조에 의한 전달(call by reference) + +## 1.1 값에 의한 전달(call by value) + +- 값에 의한 전달(call by value) + +>값에 의한 전달 방법이란 인수로 전달되는 변수가 가지고 있는 값을 +>함수 내의 매개변수에 복사하는 방식을 의미한다. + +> 이렇게 복사된 값으로 초기화된 매개변수는 전달된 변수와는 완전히 별개의 변수가 된다. +> 따라서 함수 내에서의 매개변수 조작은 인수로 전달되는 변수에 아무런 영향을 미치지 않는다. + +- 예제 + +```c +#include    +void local(int);   + +int main(void) +{ +    int var = 10; +    printf("변수 var의 초깃값은 %d입니다.\n", var);   + +    local(var); +    printf("local() 함수 호출 후 변수 var의 값은 %d입니다.\n", var); +    return 0; +}   + +void local(int num) +{ +    num += 10; +} +``` + +- 실행 결과 + +```c +변수 var의 초기값은 10입니다. +local() 함수 호출 후 변수 var의 값은 10입니다. +``` + +>위의 예제에서 local() 함수의 매개변수 num은 인수로 변수 var의 값을 전달받는다. +>따라서 함수 내에서 매개변수 num의 값을 아무리 변경하더라도 원래 인수로 전달된 변수 var의 값은 절대 변경되지 않는다. + +## 1.2 참조에 의한 전달(call by reference) + +- 참조에 의한 전달(call by reference) + +>참조에 의한 전달 방법이란 인수로 변수의 값을 전달하는 것이 아닌, +>해당 변수의 주소 값을 전달하는 방식을 의미한다. + +>즉 함수의 매개변수에 인수로 전달된 변수의 원래 주소값을 저장하는 것이다. +>이 방식을 사용하면 인수로 전달된 변수의 값을 함수 내에서 변경할 수 있게 된다. + +- 예제 + +```c +#include    +void local(int*); + +int main(void) +{ +    int var = 10; +    printf("변수 var의 초깃값은 %d입니다.\n", var);   + +    local(&var); +    printf("local() 함수 호출 후 변수 var의 값은 %d입니다.\n", var); +    return 0; +}   + +void local(int* num) +{ +    *num += 10; +} +``` + +- 실행 결과 + +```c +변수 var의 초기값은 10입니다. +local() 함수 호출 후 변수 var의 값은 20입니다. +``` + +>위의 예제에서 local() 함수의 매개변수 num은 인수로 변수 var의 주소값을 전달받는다. +따라서 함수 내에서 매개변수 num의 값을 변경하면, 원래 인수인 변수 var의 값도 같이 변경된다. + diff --git a/_posts/2023-12-04-28_VariousPointers.md b/_posts/2023-12-04-28_VariousPointers.md index 9dd38228e87f..6a3aabd60ca6 100644 --- a/_posts/2023-12-04-28_VariousPointers.md +++ b/_posts/2023-12-04-28_VariousPointers.md @@ -9,3 +9,153 @@ tags: excerpt: 다양한 포인터에 관한 글입니다. toc: true --- + +# 1 다양한 포인터 + +## 1.1 포인터의 포인터 + +- 포인터의 포인터 + +>포인터의 포인터란 포인터 변수를 가리키는 포인터를 의미한다. +>참조 연산자(*)를 두 번 사용하여 표현하며, 이중 포인터라고도 부른다. + +>다음 그림은 포인터와 포인터의 포인터와의 동작 상 차이점을 보여주고 있다. + +![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/3d7af911-16f5-413a-982b-118c10906e2f) + +>다음 예제는 포인터의 포인터를 선언하고, 포인터의 포인터를 이용한 접근 방법을 보여주고 있다. + +- 예제 + +```c +int num = 10;              // 변수 선언 +int* ptr_num = #       // 포인터 선언 +int** pptr_num = &ptr_num; // 포인터의 포인터 선언   + +printf("변수 num가 저장하고 있는 값은 %d입니다.\n", num); +printf("포인터  ptr_num가 가리키는 주소에 저장된 값은 %d입니다.\n", *ptr_num); +printf("포인터의 포인터 pptr_num가 가리키는 주소에 저장된 포인터가 가리키는 주소에 저장된 값은 %d입니다.\n", **pptr_num); +``` + +- 실행 결과 + +```c +변수 num가 저장하고 있는 값은 10입니다. +포인터 ptr_num가 가리키는 주소에 저장된 값은 10입니다. +포인터의 포인터 pptr_num가 가리키는 주소에 저장된 포인터가 가리키는 주소에 저장된 값은 10입니다. +``` + +## 1.2 void 포인터(void pointer) + +- void 포인터(void pointer) + +>void 포인터란 일반적인 포인트 변수와는 달리 +>대상이 되는 데이터의 타입을 명시하지 않은 포인터를 의미한다. + +>따라서 변수, 함수, 포인터 등 어떠한 값도 가리킬 수 있지만, 포인터 연산이나 메모리 참조와 같은 작업은 할 수 없다. + +>즉 void 포인터는 주소값을 저장하는 것 이외에는 아무것도 할 수 없는 포인터이다. +>또한, void 포인터를 사용할 때에는 반드시 먼저 사용하고자 하는 타입으로 명시적 타입 변환 작업을 거친 후에 사용해야 한다. + +>다음 예제는 void 포인터의 선언 및 void 포인터를 이용한 접근 방법을 보여주고 있다. + +- 예제 + +```c +int num = 10;         // 변수 선언 +void* ptr_num = # // void 포인터 선언   + +printf("변수 num가 저장하고 있는 값은 %d입니다.\n", num); +printf("void 포인터 ptr_num가 가리키는 주소에 저장된 값은 %d입니다.\n", *(int*)ptr_num);   + +*(int*)ptr_num = 20;  // void 포인터를 통한 메모리 접근   +printf("void 포인터 ptr_num가 가리키는 주소에 저장된 값은 %d입니다.\n", *(int*)ptr_num); +``` + +- 실행 결과 + +```c +변수 num가 저장하고 있는 값은 10입니다. +void 포인터 ptr_num가 가리키는 주소에 저장된 값은 10입니다. +void 포인터 ptr_num가 가리키는 주소에 저장된 값은 20입니다. +``` + +> 위의 예제처럼 void 포인터는 사용할 때마다 명시적 타입 변환을 하고 난 뒤에 사용해야 한다. + +## 1.3 함수 포인터(function pointer) + +>프로그램에서 정의된 함수는 프로그램이 실행될 때 모두 메인 메모리에 올라가게 된다. +>이때 함수의 이름은 메모리에 올라간 함수의 시작 주소를 가리키는 +>포인터 상수(constant pointer)가 된다. + +- 함수 포인터(function pointer) + +>함수 포인터(function pointer)란 함수의 시작 주소를 가리키는 포인터 상수를 의미한다. + +>함수 포인터의 포인터 타입은 함수의 반환값과 매개변수에 의해 결정된다. +>즉 함수의 원형을 알아야만 해당 함수에 맞는 함수 포인터를 만들 수 있다. + +- 함수 원형 + +```c +void func (int, int); +``` + +> 위와 같은 함수 원형을 가지는 함수에 대한 함수 포인터는 다음과 같다. + +- 함수 포인터 + +```c +void (*ptr_func) (int, int); +``` + +>함수 포인터 사용시 연산자의 우선순위 때문에 반드시 *ptr_func 부분을 괄호(())로 둘러싸야 한다. + +>함수 포인터는 다음 예제처럼 함수를 또 다른 함수의 인수로 전달할 때 유용하게 사용된다. + +- 예제 + +```c +double (*calc)(double, double) = NULL; // 함수 포인터 선언 +double result = 0;   +double num01 = 3, num02 = 5; +char oper = '*';   + +switch (oper) +{ +    case '+': +        calc = add; +        break; +    case '-': +        calc = sub; +        break; +    case '*': +        calc = mul; +        break; +    case '/': +        calc = div; +        break; +    default: +        puts("사칙연산(+, -, *, /)만을 지원합니다."); +}   + +result = calculator(num01, num02, calc); +printf("사칙 연산의 결과는 %lf입니다.\n", result); +``` + +- 실행 결과 + +```c +사칙 연산의 결과는 15.000000입니다. +``` + +>위의 예제는 함수 포인터를 사용하여 변수 oper의 값에 따라 4개의 사칙연산 함수 중 하나를 선택한다. +>이렇게 선택된 함수는 함수 포인터를 사용하여 calculator() 함수에 인수로 전달되게 된다. + +## 1.4 널 포인터(null pointer) + +- 널 포인터(null pointer) + +>널 포인터(null pointer)란 0이나 NULL을 대입하여 초기화한 포인터를 의미한다. +>널 포인터는 아무것도 가리키지 않는 포인터라는 의미이다. + diff --git a/_posts/2023-12-04-29_PointerToArrayRelationships.md b/_posts/2023-12-04-29_PointerToArrayRelationships.md index a24320196100..e563118d9fac 100644 --- a/_posts/2023-12-04-29_PointerToArrayRelationships.md +++ b/_posts/2023-12-04-29_PointerToArrayRelationships.md @@ -9,3 +9,75 @@ tags: excerpt: 포인터와 배열의 관계에 관한 글입니다. toc: true --- + +# 1 포인터와 배열의 관계 + +>포인터와 배열은 매우 긴밀한 관계를 맺고 있으며, 어떤 부분에서는 서로를 대체할 수도 있다. + +>배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같다. +>따라서 배열의 이름은 포인터 상수(constant pointer)이다. + +>포인터 상수(constant pointer)란 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미하여, 상수 포인터(pointer to constant)란 상수를 가르키는 포인터를 의미한다. + +- 예제 + +```c +int arr[3] = {10, 20, 30}; // 배열 선언 +int* ptr_arr = arr;        // 포인터에 배열의 이름을 대입함   + +printf("배열의 이름을 이용하여 배열 요소에 접근 : %d %d %d\n", arr[0], arr[1], arr[2]); +printf("     포인터를 이용하여 배열 요소에 접근 : %d %d %d\n", ptr_arr[0], ptr_arr[1], ptr_arr[2]);   +printf("배열의 이름을 이용한 배열의 크기 계산 : %d\n", sizeof(arr)); +printf("     포인터를 이용한 배열의 크기 계산 : %d\n", sizeof(ptr_arr)); +``` + +- 실행결과 + +```c +배열의 이름을 이용하여 배열 요소에 접근 : 10 20 30 +     포인터를 이용하여 배열 요소에 접근 : 10 20 30 +배열의 이름을 이용한 배열의 크기 계산 : 12 +     포인터를 이용한 배열의 크기 계산 : 8 +``` + +>위의 예제에서는 포인터에 이름을 대입한 후, 해당 포인터를 배열의 이름처럼 사용한다. +>이처럼 C 언어에서는 배열의 이름을 포인터처럼 사용할 수 있을 뿐만 아니라, 포인터를 배열의 이름처럼 사용할 수도 있다. + +>하지만 배열의 크기를 계산할 때에는 배열의 이름과 포인터 사이에 차이가 발생한다. +>배열의 이름을 이용한 크기 계산에서는 배열의 크기가 int형 배열 요소 3개의 크기인 12바이트로 제대로 출력된다. 하지만 포인터를 이용한 크기 계산에서는 배열의 크기가 아닌 포인터 변수 자체의 크기가 출력되는 차이가 있다. + +# 2 배열의 포인터 연산 + +>다음 예제는 배열의 이름을 포인터처럼 사용하는 예제이다. +>배열의 이름으로 포인터 연산을 수행하여 각각의 배열 요소에 접근한다. + +- 예제 + +```c +int arr[3] = {10, 20, 30}; // 배열 선언   +printf("          배열의 이름을 이용하여 배열 요소에 접근 : %d %d %d\n", arr[0], arr[1], arr[2]); +printf("배열의 이름으로 포인터 연산을 해 배열 요소에 접근 : %d %d %d\n", *(arr+0), *(arr+1), *(arr+2)); +``` + +- 실행 결과 + +```c +          배열의 이름을 이용하여 배열 요소에 접근 : 10 20 30 +배열의 이름으로 포인터 연산을 해 배열 요소에 접근 : 10 20 30 +``` + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/e445ea69-dbb2-47ae-8e4e-43079dcae800) + +>따라서 배열의 이름과 포인터 사이에는 다음과 같은 공식이 성립한다. + +- 공식 + +```c +arr이 배열의 이름이거나 포인터이고 n이 정수일 때, +arr[n] == *(arr + n) +``` + +>위의 공식은 1차원 배열뿐만 아니라 다차원 배열에서도 언제나 성립한다. + +>배열의 관계된 연산을 할 때는 언제나 배열의 크기를 넘어서는 접근을 하지 않도록 주의해야 한다. +>포인터 연산을 이용하여 계산하다가 배열의 크기를 넘어서는 접근을 하는 경우, C 컴파일러는 어떠한 오류도 발생시키지 않는다. 다만 잘못된 결과만을 반환하므로 C 언어로 프로그래밍할 때에는 언제나 배열의 크기에도 주의해야 한다. \ No newline at end of file diff --git a/_posts/2023-12-04-30_PointerArrayAndArrayPointers.md b/_posts/2023-12-04-30_PointerArrayAndArrayPointers.md index 164fc4610967..d5f0951728c9 100644 --- a/_posts/2023-12-04-30_PointerArrayAndArrayPointers.md +++ b/_posts/2023-12-04-30_PointerArrayAndArrayPointers.md @@ -9,3 +9,178 @@ tags: excerpt: 포인터 배열과 배열 포인터에 관한 글입니다. toc: true --- + +# 1 포인터 배열 + +- 포인터 배열 + +>포인터 배열이란 배열 요소로 포인터 변수를 가지는 배열을 의미한다. + +>즉, 포인터 변수를 저장할 수 있는 배열을 의미한다. + +>다음 예제는 세 개의 int형 포인터 변수를 저장할 수 있는 포인터 배열을 선언하는 예제이다. + +- 예제 + +```c +int i, arr_len; +int num01 = 10, num02 = 20, num03 = 30; +int* arr[3] = {&num01, &num02, &num03}; // int형 포인터 배열 선언   + +arr_len = sizeof(arr)/sizeof(arr[0]); +for (i = 0; i < arr_len; i++) +{ +    printf("%d\n", *arr[i]); +} +``` + +- 실행 결과 + +```c +10 +20 +30 +``` + +> 다음 그림은 위의 예제에서 사용된 포인터 배열이 메모리 상에서 어떻게 동작하는지를 보여준다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/00a9bb46-8133-45c6-b0d4-a8710ded7331) + +# 2 배열 포인터 + +- 배열 포인터 + +> 배열 포인터란 배열을 가리킬 수 있는 포인터를 의미한다. + +>배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같다. +이렇게 배열 이름이 있는데도 따로 배열 포인터를 정의하여 사용하는 이유는 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있도록 하기 위함이다. +즉, 포인터를 배열처럼 사용하기 위해서 배열 포인터를 정의하여 사용한다. +따라서 배열 포인터는 1차원 배열에서는 아무런 의미가 없으며, 2차원 이상의 배열에서만 의미를 가진다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/8b901fdf-1e70-466d-8067-4a112886764a) + +>위의 그림에서 보면 2차원 배열의 배열 이름 arr는 부분 배열 arr[0]와 같은 곳을 가리킨다. +2차원 배열의 배열 이름으로 포인터 연산을 하면 배열의 행 단위로 이동하게 된다. +즉, (arr+1)은  arr[1]과 같은 곳을 가리키게 된다. + +>다음 예제는 2차원 배열에서 각 부분 배열의 시작 주소가 가리키는 +>메모리에 저장된 데이터를 출력하는 예제이다. + +- 예제 + +```c +int arr[2][3] = { +    {10, 20, 30}, +    {40, 50, 60} +};   + +printf("%d\n", *arr[0]); +printf("%d\n", *arr[1]); +``` + +- 실행 결과 + +```c +10 +40 +``` + +>2차원 배열에서는 포인터 연산 시 증가하는 값이 행의 길이에 따라 차이를 보이게 된다. +2차원 배열의 행의 길이란 부분 배열의 크기를 의미하며, 다음 수식으로 구할 수 있다. + +- 수식 + +```c +sizeof(arr[0]) / sizeof(타입) +``` + +>다음 예제에서 포인터 연산 시 증감하는 값의 크기는 int형 타입의 크기인 4바이트에 배열 행의 길이인 3를 곱한 12바이트가 된다. + +- 예제 + +```c +int arr[2][3]; +``` + +>따라서 위의 예제에서 배열 이름 arr의 타입은 정확하게 다음과 같이 정의할 수 있다. + +1. 배열의 이름 arr는 int형 데이터를 가리키는 배열 포인터이다. + +2. 이 배열 포인터는 포인터 연산 시 증감하는 값의 크기가 12바이트이다. + +>따라서 위의 예제에서 배열 arr를 가리키는 배열 포인터는 다음과 같이 선언할 수 있다. + +- 예제 + +```c +int (*pArr)[3]; +``` + +>또한, 위 예제의 배열 포인터는 다음과 같은 배열들을 가리킬 수 있다. + +- 예제 + +```c +int arr01[2][3]; +int arr02[3][3]; +int arr03[4][3]; +... +``` + +>다음 예제는 배열 포인터를 사용하여 배열과 같은 인덱싱 방법으로 배열 요소를 참조하는 예제이다. + +- 예제 + +```c +int arr[2][3] =             // 배열의 선언 +{ +    {10, 20, 30}, +    {40, 50, 60} +}; + +int (*pArr)[3] = arr;       // 배열 포인터의 선언   + +printf("%d\n", arr[1][1]);  // 배열 이름으로 참조 +printf("%d\n", pArr[1][1]); // 배열 포인터로 참조 +``` + +- 실행 결과 + +```c +50 +50 +``` + +# 3 포인터 배열과 배열 포인터의 구분 + +>배열 포인터에서 괄호(())를 생략하면 전혀 다른 의미가 된다. + +- 예제 + +```c +1. int (*pArr)[3]; +2. int* pArr[3]; +``` + +>위의 예제 중에서 첫 번째는 int형 데이터를 저장할 수 있는 2차원 배열을 가리키는 배열 포인터이다. +하지만 두 번째는 int형 데이터를 가리킬 수 있는 포인터 변수를 모아 놓은 배열을 가리키는 포인터 배열이 된다. + +>따라서 괄호의 유무가 중요하다. + +# 4 main() 함수의 인수 전달 + +>main() 함수는 프로그램이 실행되면 제일 먼저 자동으로 호출되는 함수이다. +이러한 main() 함수도 함수이기 때문에 인수를 전달받을 수도 있고, 반환값을 가질 수도 있다. + +>C 언어의 main() 함수의 원형은 다음과 같다. + +- 원형 + +```c +void(또는 int) main(int argc, char *argv[]); +``` + +>C 언어의 main() 함수의 첫 번째 인수는 int형 변수인 argc로 main() 함수에 인수로 전달되는 문자열의 개수를 명시한다. + +>두 번째 인수는 char형 포인터 배열인 argv로 main() 함수에 인수로 전달된 각각의 문자열이 저장된 배열을 가리킨다. + diff --git a/_posts/2023-12-04-31_MemoryStructure.md b/_posts/2023-12-04-31_MemoryStructure.md index 99dae788b092..19f0f52f31e7 100644 --- a/_posts/2023-12-04-31_MemoryStructure.md +++ b/_posts/2023-12-04-31_MemoryStructure.md @@ -9,3 +9,61 @@ tags: excerpt: 메모리의 구조에 관한 글입니다. toc: true --- + +# 1 메모리의 구조 + +>프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다. +>또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다. + +>따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다. +>프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다. + +1. 코드(code) 영역 + +2. 데이터(data) 영역 + +3. 스택(stack) 영역 + +4. 힙(heap) 영역 + +>다음 그림은 운영체제가 제공하는 메모리 공간을 표현하고 있다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/3bfcd042-482a-4034-9255-996ad800f281) + +## 1.1 코드(code) 영역 + +- 코드(code) 영역 + +>메모리의 코드(code) 영역이란 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역을 의미한다. + +>CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다. + +## 1.2 데이터(data) 영역 + +- 데이터(data) 영역 + +>메모리의 데이터(data) 영역이란 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역을 의미한다. + +>데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. + +## 1.3 스택(stack) 영역 + +- 스택(stack) 영역 + +>메모리의 스택(stack) 영역이란 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역을 의미한다. + +>스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. +이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다. + +>스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다. +이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다. +스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다. + +## 1.4 힙(heap) 영역 + +- 힙(heap) 영역 + +>메모리의 힙(heap) 영역이란 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역을 의미한다. + +>힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. +힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다. From d7f988b293b3867b14ecaa81b7217db4ad827282 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Thu, 7 Dec 2023 19:23:51 +0900 Subject: [PATCH 26/41] =?UTF-8?q?feat=20:=20=EC=8A=A4=ED=83=9D=20=ED=94=84?= =?UTF-8?q?=EB=A0=88=EC=9E=84=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 16 +++--- Pasted image 20231207191701.png | Bin 0 -> 30934 bytes _posts/2023-12-04-32_StackFrame.md | 76 +++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 Pasted image 20231207191701.png diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 54aeb0a8bb1a..2deed9f718eb 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-04-31_MemoryStructure.md", + "file": "_posts/2023-12-04-33_DynamicMemoryAllocation.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-04-31_MemoryStructure.md", + "file": "_posts/2023-12-04-33_DynamicMemoryAllocation.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-04-31_MemoryStructure.md", + "file": "_posts/2023-12-04-33_DynamicMemoryAllocation.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-04-31_MemoryStructure.md" + "file": "_posts/2023-12-04-33_DynamicMemoryAllocation.md" } } } @@ -148,6 +148,10 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_site/Pasted image 20231207191701.png", + "Pasted image 20231207191701.png", + "_posts/2023-12-04-32_StackFrame.md", + "_posts/2023-12-04-31_MemoryStructure.md", "_posts/2023-12-04-30_PointerArrayAndArrayPointers.md", "_site/Pasted image 20231206205417.png", "Pasted image 20231206205417.png", @@ -175,8 +179,6 @@ "_posts/2023-12-03-14_LogicalOperator.md", "_posts/2023-12-03-15_BitwiseOperator.md", "_posts/2023-12-03-16_OtherOperator.md", - "_posts/2023-12-03-17_ConditionalStatement.md", - "_posts/2023-12-03-19_ControlStatement.md", "_site/language/31_MemoryStructure/index.html", "_site/language/31_MemoryStructure", "_site/language/28_VariousPointers/index.html", @@ -195,8 +197,6 @@ "무제 파일 3.canvas", "무제 파일 2.canvas", "무제 파일 1.canvas", - "Pasted image 20231204212405.png", - "Pasted image 20231204195434.png", "_site/무제 파일 3.canvas", "_site/무제 파일 2.canvas", "_site/무제 파일 1.canvas", diff --git a/Pasted image 20231207191701.png b/Pasted image 20231207191701.png new file mode 100644 index 0000000000000000000000000000000000000000..b38d139c6378da775160ed6931d10241ae18209a GIT binary patch literal 30934 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메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. +스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. + +>함수가 호출되면 스택에는 함수의 매개변수, +>호출이 끝난 뒤 돌아갈 반환 주소값, +>함수에서 선언된 지역 변수 등이 저장된다. + +- 스택 프레임(stack frame) + +>스택 프레임(stack frame)이란 스택 영역에 차례대로 저장되는 함수의 호출 정보를 의미한다. + +>이러한 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, +>해당 함수가 호출되기 이전 상태로 되돌아갈 수 있다. + +## 1.1 스택 프레임의 동작 방식 + +- 예제 + +```c +int main(void) +{ +    func1();  // func1() 호출 +    return 0; +} + +void func1() +{ +    func2();  // func2() 호출 +} + +void func2() +{ + +} +``` + +>다음 그림은 위 예제 코드에서 함수 호출에 의한 스택 프레임의 변화를 보여주고 있다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/591611af-d2c2-45bd-bd49-f87b9b55aa6f) + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/5d0e8a98-fe8e-4538-b9da-55e58059f317) + +Step 1. 프로그램이 실행되면, 가장 먼저 main() 함수가 호출되어 main() 함수의 스택 프레임이 스택에 저장된다. + +Step 2. func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장된다. + +Step 3. func2() 함수를 호출하면 해당 함수의 스택 프레임이 추가로 스택에 저장된다. + +Step 4. func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임만이 스택에서 제거된다. + +Step 5. func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거된다. + +Step 6. main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료된다. + +>이처럼 스택은 가장 나중에 저장된 데이터가 가장 먼저 인출되는 방식으로 동작한다. +이러한 방식을 후입선출(LIFO, Last-In First-Out) 방식이라고 한다. +이때 스택은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다. + +#### 스택 오버플로우(stack overflow) + +>함수의 재귀 호출이 무한히 반복되면,  +>해당 프로그램은 스택 오버플로우(stack overflow)에 의해 종료된다. + +>만약 재귀 호출이 무한히 반복되면, +>위 그림에서 Step 3 이후로는 재귀 호출에 의한 스택 프레임이 계속해서 쌓여만 갈 것이다. +이렇게 스택의 모든 공간을 다 차지하고 난 후 더 이상의 여유 공간이 없을 때 또 다시 스택 프레임을 저장하게 되면, 해당 데이터는 스택 영역을 넘어가서 저장되게 된다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/b2254cc1-87f8-41b8-8ad6-de08d10904df) + +>이렇게 해당 스택 영역을 넘어가도 데이터가 저장될 수 있으면, +>해당 프로그램은 오동작을 하게 되거나 보안상의 크나큰 취약점을 가지게 된다. +따라서 C 언어에서는 실행 중인 프로그램에서 스택 오버플로우가 발생하면, +에러를 발생하고 곧바로 강제 종료시킨다. From fa59e6456c2bbcce9e22b3c61dc069e76f42551f Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Fri, 8 Dec 2023 22:06:10 +0900 Subject: [PATCH 27/41] =?UTF-8?q?feat=20:=20=EC=9D=BC=EB=B6=80=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 33 ++++---- _posts/2023-12-03-01_C.md | 37 +++++---- _posts/2023-12-03-02_CProgramming.md | 22 +++--- _posts/2023-12-03-03_CProgram.md | 41 +++++----- _posts/2023-12-03-04_Printf().md | 35 +++++---- _posts/2023-12-03-05_Scanf().md | 29 ++++--- _posts/2023-12-03-06_Variable.md | 49 +++++++----- _posts/2023-12-03-07_Constant.md | 10 +-- _posts/2023-12-03-08_BasicType.md | 77 ++++++++++--------- .../2023-12-04-33_DynamicMemoryAllocation.md | 43 +++++++++++ 10 files changed, 224 insertions(+), 152 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 2deed9f718eb..e11473ca56e2 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-04-33_DynamicMemoryAllocation.md", + "file": "_posts/2023-12-03-08_BasicType.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-04-33_DynamicMemoryAllocation.md", + "file": "_posts/2023-12-03-08_BasicType.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-04-33_DynamicMemoryAllocation.md", + "file": "_posts/2023-12-03-08_BasicType.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-04-33_DynamicMemoryAllocation.md" + "file": "_posts/2023-12-03-08_BasicType.md" } } } @@ -148,6 +148,19 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_posts/2023-12-03-07_Constant.md", + "_posts/2023-12-03-08_BasicType.md", + "_posts/2023-12-03-06_Variable.md", + "_posts/2023-12-03-05_Scanf().md", + "_posts/2023-12-03-04_Printf().md", + "_posts/2023-12-03-03_CProgram.md", + "_posts/2023-12-03-02_CProgramming.md", + "_posts/2023-12-03-01_C.md", + "_posts/2023-12-04-33_DynamicMemoryAllocation.md", + "_posts/2023-12-04-34_BasicIO.md", + "_posts/2023-12-04-35_CharacterInputOutputFunction.md", + "_posts/2023-12-04-40_PointersAndStructures.md", + "_posts/2023-12-04-43_ConsoleIO.md", "_site/Pasted image 20231207191701.png", "Pasted image 20231207191701.png", "_posts/2023-12-04-32_StackFrame.md", @@ -163,22 +176,10 @@ "_posts/2023-12-04-26_PointerOperation.md", "_site/Pasted image 20231206191149.png", "Pasted image 20231206191149.png", - "_posts/2023-12-03-01_C.md", - "_posts/2023-12-03-02_CProgramming.md", - "_posts/2023-12-03-03_CProgram.md", - "_posts/2023-12-03-04_Printf().md", - "_posts/2023-12-03-05_Scanf().md", - "_posts/2023-12-03-06_Variable.md", - "_posts/2023-12-03-07_Constant.md", - "_posts/2023-12-03-08_BasicType.md", "_posts/2023-12-03-09_TypeCasting.md", "_posts/2023-12-03-10_ArithmeticOperator.md", "_posts/2023-12-03-11_AssignmentOperator.md", "_posts/2023-12-03-12_IncrementAndDecrementOperator.md", - "_posts/2023-12-03-13_ComparisonOperator.md", - "_posts/2023-12-03-14_LogicalOperator.md", - "_posts/2023-12-03-15_BitwiseOperator.md", - "_posts/2023-12-03-16_OtherOperator.md", "_site/language/31_MemoryStructure/index.html", "_site/language/31_MemoryStructure", "_site/language/28_VariousPointers/index.html", diff --git a/_posts/2023-12-03-01_C.md b/_posts/2023-12-03-01_C.md index 978b73298d54..a8ab19a67e8b 100644 --- a/_posts/2023-12-03-01_C.md +++ b/_posts/2023-12-03-01_C.md @@ -8,39 +8,39 @@ excerpt: C 언어에 관한 글입니다. toc: true --- -# 1 프로그램 +# 1 프로그램(program) -- 프로그램 +- 프로그램(program) > 프로그램(program)이란 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 처리 방법과 순서를 기술한 일련의 명령문의 집합체를 의미한다. -## 1.1 프로그래밍 언어 +## 1.1 프로그래밍 언아(programming language) -- 프로그래밍 언어 +- 프로그래밍 언아(programming language) > 프로그래밍 언아(programming language)란 기계(컴퓨터)에게 명령이나 연산을 시킬 목적으로 설계되어 기계와 의사소통을 할 수 있게 해주는 언어를 의미한다. ### 1.1.1 프로그래밍 언어의 분류 -> 프로그래밍 언어는 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나뉜다. +> 프로그래밍 언어는 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나뉜다. +> 저급 언어와 고급 언어는, 기계가 이해하기 쉬운가(저급 언어), 사람이 이해하기 쉬운가(고급 언어)를 상대적으로 나눈 개념이라고 할 수 있다. -> 저급 언어와 고급 언어는 , 기계가 이해하기 쉬운가(저급 언어), 사람이 이해하기 쉬운가(고급 언어)를 상대적으로 나눈 개념이라고 할 수 있다. +- 저급 언어(low-level language) -- 저급 언어 - -> 저급 언어는 컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어이다. +> 저급 언어(low-level language)란 컴퓨터가 이해하기 쉽게 작성된 프로그래밍 언어를 의미한다. > 저급 언어는 실행 속도가 매우 빠르지만, 사람이 배우기에는 매우 어려워 프로그램의 유지보수가 힘들다. > 대표적인 언어로는 기계어(machine language)와 어셈블리어(assembly language) 등이 있다. -- 고급 언어 +- 고급 언어(high-level language) -> 고급 언어는 컴퓨터보다는 사람이 알기 쉽도록 작성된 프로그래밍 언어이다. +> 고급 언어(high-level language)란 컴퓨터보다는 사람이 알기 쉽도록 작성된 프로그래밍 언어를 의미한다. -> 고급 언어는 컴파일러나 인터프리터에 의해 기계가 이해 할 수 있는 언어로 번역되어 실행 된다. 저급 언어보다는 상대적으로 실행 속도가 느리지만, 저급 언어에 비해 가독성이 높고 다루기가 쉽다. +> 고급 언어는 컴파일러나 인터프리터에 의해 기계가 이해 할 수 있는 언어로 번역되어 실행 된다. +> 저급 언어보다 상대적으로 실행 속도가 느리지만, 저급 언어에 비해 가독성이 높고 다루기가 쉽다. -> 대표적으로 자바, 파이썬 등이 있다. +> 대표적인 언어로는 자바와 파이썬 등이 있다. > C 언어는 저급 언어와 고급 언어의 특징을 모두 가지고 있는 절차 지향 프로그래밍 언어(procedure-oriented programming language)이다. @@ -51,18 +51,17 @@ toc: true > C 언어는 1972년 벨 연구소의 켄 톰프슨(Kenneth Thompson)과 데니스 리치(Dennis Ritchie)가 유닉스(UNIX) 운영체제에서 사용하기 위해 개발한 범용적인 고급 언어이다. > A 언어라고 불리는 ALGOL 60부터, CPL, BCPL을 거쳐, -켄 톰프슨이 B 언어를 개발하게 된다. -이후 데니스 리치가 B언어를 좀 더 개선하여 지금의 C 언어를 만들게 된다. +켄 톰프슨이 B 언어를 개발하게 된다. +이후 데니스 리치가 B언어를 좀 더 개선하여 지금의 C 언어를 만들게 된다. C 언어라는 이름의 유래 또한 B 언어 바로 다음에 개발되어서 명명된 이름이다. ## 1.2 C 언어의 탄생 배경 -> C 언어 이전에 유닉스 운영체제는 어셈블리어라는 저급 언어를 사용했다. -하지만 어셈블리어는 특정 하드웨어에 종속적인 언어여서, 이 언어로 작성된 프로그램은 다른 하드웨어로 이식할 수 없었다. 즉, 하나의 기능을 하는 프로그램을 CPU의 종류만큼 여러 번 작성해야만 했던 것이다. -따라서 이식성도 좋고 어셈블리어보다 쉬운 언어가 필요해졌고, +>유닉스 운영체제는 C 언어 이전에 어셈블리어라는 저급 언어를 사용했다. +하지만 어셈블리어는 특정 하드웨어에 종속적인 언어여서, 이 언어로 작성된 프로그램은 다른 하드웨어로 이식할 수 없었다. 즉, 하나의 기능을 하는 프로그램을 CPU의 종류만큼 여러 번 작성해야만 했던 것이다. 따라서 이식성도 좋고 어셈블리어보다 쉬운 언어가 필요해졌고, 그래서 개발된 언어가 바로 C 언어이다. -> 현재 널리 사용되는 모든 운영체제의 커널은 대부분 C 언어를 이용해 구현되어 있다. +> 현재 널리 사용되는 모든 운영체제의 커널은 대부분 C 언어를 이용해 구현되어 있다. 이처럼 C 언어는 시스템 프로그래밍에 가장 잘 어울리지만, 응용 프로그래밍에도 많이 사용되는 프로그래밍 언어이다. ## 1.3 C 언어의 특징 diff --git a/_posts/2023-12-03-02_CProgramming.md b/_posts/2023-12-03-02_CProgramming.md index 22c468508041..a93b3058d8e8 100644 --- a/_posts/2023-12-03-02_CProgramming.md +++ b/_posts/2023-12-03-02_CProgramming.md @@ -10,13 +10,15 @@ toc: true # 1 프로그래밍(programming) +- 프로그래밍(programming) + > 프로그래밍(programming)이란 목적에 맞는 알고리즘으로부터 프로그래밍 언어를 사용하여 구체적인 프로그램을 작성하는 과정을 의미한다. > 작성된 프로그램은 먼저 실행 파일(executable file)로 변환되어야 실행할 수 있다. > C 언어에서 실행 파일을 생성하는 순서는 다음 그림과 같다. -![](https://velog.velcdn.com/images/ecg/post/cd39d837-732c-4c11-a726-4eed99bd3722/image.png) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/42cd72ab-81eb-4917-8a31-9011d450546b) 1. 소스 파일(source file)의 작성 @@ -32,13 +34,15 @@ toc: true > 프로그래밍에서 가장 먼저 해야 할 작업은 바로 프로그램을 작성하는 것이다. -> C 언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 원시 파일 또는 소스 파일이라고 한다. +- 소스 파일(source file) + +> 소스 파일(source file)이란 C 언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 의미한다. 소스 파일을 원시 파일이라고도 한다. > C 언어를 통해 작성된 소스 파일의 확장자는 .c 가 된다. ## 1.2 선행처리기(preprocessor)에 의한 선행처리 -- 선행처리 +- 선행처리(preprocess) > 선행처리(preprocess)란 소스 파일 중에서도 선행처리 문자(#)로 시작하는 선행처리 지시문의 처리 작업을 의미한다. @@ -50,13 +54,13 @@ toc: true > 컴퓨터는 0과 1로 이루어진 이진수로 작성된 기계어만을 이해할 수 있다. -> 소스 파일은 개발자에 의해 C언어로 작성되므로, 컴퓨터는 그것을 바로 이해할 수 없다. +> 소스 파일은 개발자에 의해 C 언어로 작성되므로, 컴퓨터는 그것을 바로 이해할 수 없다. -- 컴파일 +- 컴파일(compile) > 컴파일(compile)이란 소스 파일을 컴퓨터가 알아볼 수 있는 기계어로 변환시키는 작업을 의미한다. -- 오브젝트 파일 +- 오브젝트 파일(object file) > 오브젝트 파일(object file)이란 컴파일러에 의해 수행된 컴파일이 끝나 기계어로 변환된 파일을 의미한다. @@ -66,13 +70,13 @@ toc: true > 컴파일러에 의해 생성된 오브젝트 파일은 운영체제와의 인터페이스를 담당하는 시동 코드(start-up code)를 가지고 있지 않다. -- 시동 코드 +- 시동 코드(start-up code) -> 시동 코드(start-up code)란 운영체제와의 인터페이스를 담당하는 코드이다. +> 시동 코드(start-up code)란 운영체제와의 인터페이스를 담당하는 코드를 의미한다. > 또한, 오브젝트 파일은 대부분의 C 프로그램에서 사용하는 C 표준 라이브러리 파일도 포함되어 있지 않다. -- 링크 +- 링크(link) > 링크(link)란 하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드 등을 합쳐 하나의 파일로 만드는 작업을 의미한다. diff --git a/_posts/2023-12-03-03_CProgram.md b/_posts/2023-12-03-03_CProgram.md index 09af59664218..756eb913652c 100644 --- a/_posts/2023-12-03-03_CProgram.md +++ b/_posts/2023-12-03-03_CProgram.md @@ -22,10 +22,8 @@ toc: true ## 1.1 C 프로그램의 기본 단위는 함수이다. -> C 프로그램은 하나 또는 그 이상의 함수(function)로 이루어진다. - -> 또한, C 언어로 구현되는 모든 프로그램은 반드시 main() 함수를 가지고 있어야 한다. - +> C 프로그램은 하나 또는 그 이상의 함수(function)로 이루어진다. +> 또한, C 언어로 구현되는 모든 프로그램은 반드시 main() 함수를 가지고 있어야 한다. > C 프로그램이 실행되면 컴퓨터는 제일 먼저 main() 함수를 찾아서 호출하기 때문이다. - 예제 @@ -44,9 +42,9 @@ int main() > 함수는 언제나 기능을 가지고 있어야 한다. -- 명령문 +- 명령문(statement) -> 명령문(statement)이란 C언어에서 기능을 정의하기 위해 사용되는 문장을 의미한다. +> 명령문(statement)이란 C 언어에서 기능을 정의하기 위해 사용되는 문장을 의미한다. > 함수 내의 명령문은 언제나 위에서부터 아래로 순차적으로 실행되며, 언제나 세미콜론(;)으로 끝나야 한다. @@ -57,9 +55,9 @@ printf("C 언어"); // 정상적으로 출력됨. printf("C 언어") // 오류가 발생함. ``` -## 1.3 C언어는 대소문자를 구분한다. +## 1.3 C 언어는 대소문자를 구분한다. -> C 언어에서 변수나 함수의 이름을 작성할 때나 키워드나 예약어 등을 사용할 때는 대소문자를 정확히 구분하여 사용해야 한다. +> C 언어에서 변수나 함수의 이름을 작성할 때, 키워드나 예약어 등을 사용할 때는 대소문자를 정확히 구분하여 사용해야 한다. - 예제 @@ -72,7 +70,7 @@ Printf("C 언어") // 오류가 발생함. > C 언어에서는 문법만 맞으면 여러 개의 명령문을 한 줄에 쓸 수도 있고, 하나의 명령문을 여러 줄에 나누어 쓸 수도 있다. -> 하지만 프로그램의 구조를 한눈에 파악할 수 있도록, 될 수 있으면 들여쓰기 등을 잘 활용해 보기 좋게 작성하는 것이 좋다. +> 하지만 프로그램의 구조를 한눈에 파악할 수 있도록, 될 수 있으면 들여쓰기 등을 잘 활용하여 보기 좋게 작성하는 것이 좋다. > 다음 두 예제는 정확히 같은 동작을 수행한다. @@ -86,28 +84,28 @@ int func() { printf("C언어는 재밌어요!"); } ```c int func() - { printf("C언어는 재밌어요!"); - } ``` # 2 주석(comments) -> 주석은 코드에 대한 이해를 돕는 설명을 적거나 디버깅을 위해 작성한다. - -> C 언어 주석의 장점은 프로그램 내의 어디에나 올 수 있다는 점이다. +- 주석(comments) -## 2.1 주석의 정의 +>주석(comment)이란 프로그래머를 위해 소스 코드 상에 직접 기술된 일종의 설명글을 의미한다. -> 주석(comment)이란 프로그래머를 위해 소스 코드 상에 직접 기술된 일종의 설명글을 가리킨다. 주석은 컴파일 시 무시되어 프로그램 수행에는 전혀 영향을 미치지 않는다. +>주석은 컴파일 시 무시되어 프로그램 수행에는 전혀 영향을 미치지 않는다. +> 또한, 코드에 대한 이해를 돕는 설명을 적거나 디버깅을 위해 작성한다. -> C 언어의 한 줄 주석은 시작위치에 //을 사용하고, 여러 줄 주석은 /*로 시작해서 반드시 */로 끝나야 한다. +> C 언어 주석의 장점은 프로그램 내의 어디에나 올 수 있다는 점이다. + 또한, C 언어의 한 줄 주석은 시작위치에 //을 사용하고, + 여러 줄 주석은 /*로 시작해서 반드시 */로 끝나야 한다. -## 2.2 주석의 종류 +## 2.1 주석의 종류 -> C 언어의 한 줄 주석은 시작위치에 //을 사용하고, 여러 줄 주석은 /*로 시작해서 반드시 */로 끝나야 한다. +> C 언어의 한 줄 주석은 시작위치에 //을 사용하고, +> 여러 줄 주석은 /*로 시작해서 반드시 */로 끝나야 한다. - 문법 @@ -121,7 +119,7 @@ int func() 주석 */ ``` -## 2.3 주석의 중첩 +## 2.2 주석의 중첩 > 다음 예제는 여러 줄 주석 안에 또 다른 한 줄 주석을 중첩해서 삽입하는 예제이다. @@ -151,7 +149,7 @@ int func() > 위의 예제처럼 여러 줄 주석 안에 또 다른 여러 줄 주석을 삽입하면, ②번 라인에서 삽입한 주석의 종료 기호(*/)를 ①번 라인에서 시작한 첫 번째 주석이 자신의 종료 기호(*/)로 잘못 인식하게 된다. 위 예제의 ③번 라인은 주석으로 인식되지 못하고, 컴파일 시 오류가 발생하게 된다. -> C 언어에서 여러 줄 주석은 절대로 중첩해서 사용해서는 안 된다. +> C 언어에서 여러 줄 주석은 절대로 중첩하여 사용해서는 안 된다. > 다음 예제는 여러 주석을 추가한 예제이다. @@ -169,6 +167,5 @@ int main() { printf(TEXT); // printf() 함수는 인수로 전달받은 데이터를 출력해주는 함수임. return 0; // main() 함수의 모든 명령문을 수행한 후에는 0을 반환함. - } ``` diff --git a/_posts/2023-12-03-04_Printf().md b/_posts/2023-12-03-04_Printf().md index 1681b51c5353..fbc57656606d 100644 --- a/_posts/2023-12-03-04_Printf().md +++ b/_posts/2023-12-03-04_Printf().md @@ -10,12 +10,16 @@ toc: true # 1 C 언어 표준 입출력 함수 -> 사용자가 프로그램과 대화하기 위해 사용하는 함수를 입출력 함수 또는 I/O 함수라고 한다. -printf() 함수와 scanf() 함수는 C언어 표준 입출력 함수 중 에서도 가장 많이 사용되는 대표적인 입출력 함수이다. +- 입출력 함수(Input Output Function) + +> 입출력 함수(Input Output Function)란 사용자가 프로그램과 대화하기 위해 사용하는 함수를 의미한다. 입출력 함수를 I/O 함수라고도 한다. + +>printf() 함수와 scanf() 함수는 C 언어 표준 입출력 함수 중에서도 가장 많이 사용되는 대표적인 입출력 함수이다. ## 1.1 출력 함수(printf)의 사용법 -> printf() 함수는 C 언어의 표준 출력 함수로, 여러 종류의 데이터(data)를 다양한 서식에 맞춰 출력할 수 있게 해준다. +> printf() 함수는 C 언어의 표준 출력 함수로, +> 여러 종류의 데이터(data)를 다양한 서식에 맞춰 출력할 수 있게 해준다. > printf() 함수의 원형은 다음과 같다. @@ -44,16 +48,19 @@ printf() 함수는 서식 지정자를 통해 출력할 데이터의 서식을 변수에 저장된 숫자는 10입니다. ``` -> 위의 예제에서는 int형 데이터를 나타내기 위해서 '%d'라는 서식 지정자를 사용했다. +> 위의 예제에서는 int형 데이터를 나타내기 위해서 '%d'라는 서식 지정자를 사용했다. 또한, 줄 바꿈은 '\n'라는 이스케이프 시퀀스를 사용하여 표현하고 있다. ## 1.2 이스케이프 시퀀스(escape sequence) +- 이스케이프 시퀀스(escape sequence) + > 이스케이프 시퀀스(escape sequence)란 컴퓨터와 주변 기기의 상태를 바꾸는 데에 쓰이는 일련의 문자열을 의미한다. -이스케이프 시퀀스는 프로그램의 결과가 화면에 출력될 때 사용하게 될 특수한 문자를 위해 만들어졌다. -> C언어에서 사용되는 이스케이프 시퀀스는 다음과 같다. +>이스케이프 시퀀스는 프로그램의 결과가 화면에 출력될 때 사용하게 될 특수한 문자를 위해 만들어졌다. + +> C 언어에서 사용되는 이스케이프 시퀀스는 다음과 같다. ![](https://velog.velcdn.com/images/ecg/post/512d0512-862b-4b0d-8fae-f706261f1190/image.png) @@ -76,8 +83,11 @@ C언어에서 사용하는 "특수 문자"에는 여러가지가 있습니다. ## 1.3 서식 지정자(format specifier) +- 서식 지정자(format specifier) + > 서식 지정자(format specifier)란 컴퓨터가 어떤 정보를 어떻게 해석할 건지를 지정해주는 걸 의미한다. -printf() 함수에서는 이러한 서식 지정자를 통해 출력할 데이터의 서식을 사용자가 직접 지정할 수 있다. + +>printf() 함수에서는 이러한 서식 지정자를 통해 출력할 데이터의 서식을 사용자가 직접 지정할 수 있다. > C 언어에서 사용되는 대표적인 서식 지정자는 다음과 같다. @@ -121,7 +131,6 @@ printf("%%G를 사용한 결과 : %G\n", 0.000001234); // 값에 따라 %f나 - 예제 - ```c printf("저장된 정수는 %d이며, 저장된 문자열은 %s입니다.\n", 123, "C언어"); ``` @@ -136,10 +145,11 @@ printf("저장된 정수는 %d이며, 저장된 문자열은 %s입니다.\n", 12 > 서식 지정자의 '%'기호와 타입을 나타내는 영문자 사이에 숫자를 추가하여 출력되는 필드의 폭을 직접 설정할 수 있다. -> 내부의 숫자는 오른쪽 정렬이 기본이며, 숫자 앞에 '-'기호를 붙이면 왼쪽 정렬로 변경된다. -또한, 숫자 앞에 '+'기호를 붙이면 숫자를 오른쪽 정렬한 상태에서 -양수에는 '+'기호를, 음수에는 '-'기호를 붙여서 출력한다. -이때 소수 부분의 숫자는 출력되는 소수의 자릿수를 명시한다. +> 내부의 숫자는 오른쪽 정렬이 기본이며, +> 숫자 앞에 '-'기호를 붙여 왼쪽 정렬로 변경하거나 +'+'기호를 붙여 숫자를 오른쪽 정렬한 상태에서는 +양수에 '+'기호를, 음수에 '-'기호를 붙여서 출력한다. +이때 소수 부분의 숫자는 출력되는 소수의 자릿수를 명시한다. - 예제 @@ -149,7 +159,6 @@ printf(" %%7d를 사용한 결과 : |%7d|\n", 123); printf(" %%+7d를 사용한 결과 : |%+7d|\n", 123); printf(" %%-7d를 사용한 결과 : |%-7d|\n\n", 123); - printf(" %%f를 사용한 결과 : |%f|\n", 1.23); printf(" %%.1f를 사용한 결과 : |%.1f|\n", 1.23); printf(" %%7.2f를 사용한 결과 : |%7.2f|\n", 1.23); diff --git a/_posts/2023-12-03-05_Scanf().md b/_posts/2023-12-03-05_Scanf().md index 46b2a0601475..fe3c78a8419d 100644 --- a/_posts/2023-12-03-05_Scanf().md +++ b/_posts/2023-12-03-05_Scanf().md @@ -10,7 +10,8 @@ toc: true # 1 scanf() 함수 -> scanf() 함수는 C 언어의 표준 입력 함수로, 사용자로부터 다양한 데이터를 다양한 서식에 맞춰 입력받을 수 있게 해준다. +> scanf() 함수는 C 언어의 표준 입력 함수로, +> 사용자로부터 다양한 데이터를 다양한 서식에 맞춰 입력받을 수 있게 해준다. > scanf() 함수의 원형은 다음과 같다. @@ -21,7 +22,7 @@ toc: true int scanf(const char * restrict format, ...); ``` -> scanf() 함수의 f는 formatted의 약자이며, 서식화된 입력을 받는다는 의미이다. +> scanf() 함수의 f는 formatted의 약자이며, 서식화된 입력을 받는다는 의미이다. 이 함수는 입력받은 데이터를 어떤 서식으로 변환할지 서식 지정자(format specifier)를 통해 직접 지정할 수 있다. > 다음 예제는 사용자로부터 정수를 두 번 입력받아서 그 합을 출력하는 예제이다. @@ -54,19 +55,23 @@ int main(void) ``` > C 언어에서 데이터를 입력받으려면 입력받고자 하는 데이터의 타입에 해당하는 크기의 메모리를 우선 할당받아야 한다. -이처럼 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 변수(variable)라고 한다. -> scanf() 함수에 포함된 '&'기호는 주소 연산자(&)라고 한다. +- 변수(variable) + +>변수(variable)란 데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다. + +> scanf() 함수에 포함된 '&'기호는 주소 연산자(&)라고 한다. 이 주소 연산자는 입력받은 데이터를 뒤에 나오는 변수에 저장하라는 의미이다. # 2 서식 지정자의 동시 사용 -> 여러 개의 서식 지정자를 동시에 사용하여, -여러 데이터를 서로 다른 서식으로 한 번에 입력받을 수 있다. -단, 이때에는 서식 지정자의 순서와 저장할 변수의 순서가 반드시 같아야 한다. -입력받는 데이터의 구분은 공백(줄 바꿈, 탭, 띄어쓰기 등)을 기준으로 삼는다. +> 여러 개의 서식 지정자를 동시에 사용하여, +여러 데이터를 서로 다른 서식으로 한 번에 입력받을 수 있다. +단, 이때에는 서식 지정자의 순서와 저장할 변수의 순서가 반드시 같아야 한다. +입력받는 데이터의 구분은 공백(줄 바꿈, 탭, 띄어쓰기 등)을 기준으로 삼는다. -> 다음 예제는 사용자로부터 두 개의 정수를 한 번에 입력받아, 각각 8진수와 16진수로 출력하는 예제입이다. +> 다음 예제는 사용자로부터 두 개의 정수를 한 번에 입력받아, +> 각각 8진수와 16진수로 출력하는 예제이다. - 예제 @@ -95,9 +100,9 @@ int main(void) # 3 double형 실수의 입력 -> scanf() 함수로 float형 실수를 입력받을 때는 서식 지정자로 '%f'를 사용하면 된다. -하지만 double형 실수를 입력받을 때는 printf() 함수에서처럼 '%f'를 사용하면 안 된다. -scanf() 함수로 double형 실수를 입력받을 때는 반드시 '%lf' 서식 지정자를 사용해야 정확한 값으로 입력받을 수 있다. +> scanf() 함수로 float형 실수를 입력받을 때는 서식 지정자로 '%f'를 사용하면 된다. +하지만 double형 실수를 입력받을 때는 printf() 함수에서처럼 '%f'를 사용하면 안 된다. +scanf() 함수로 double형 실수를 입력받을 때는 반드시 '%lf' 서식 지정자를 사용해야 정확한 값으로 입력받을 수 있다. > 다음 예제는 사용자로부터 두 개의 실수를 한 번에 입력받아 출력하는 예제이다. diff --git a/_posts/2023-12-03-06_Variable.md b/_posts/2023-12-03-06_Variable.md index 287fb017e420..7a59961f6642 100644 --- a/_posts/2023-12-03-06_Variable.md +++ b/_posts/2023-12-03-06_Variable.md @@ -10,19 +10,19 @@ toc: true # 1 변수(variable) -- 변수 +- 변수(variable) > 변수(variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다. 즉, 변수란 데이터(data)를 저장할 수 있는 메모리 공간을 의미하며, 이렇게 저장된 값은 변경될 수 있다. -> C 언어에서 숫자 표현에 관련된 변수는 정수형 변수와 실수형 변수로 구분할 수 있다. +> C 언어에서 숫자 표현에 관련된 변수는 정수형 변수와 실수형 변수로 구분할 수 있다. 또다시 정수형 변수는 char형, int형, long형 변수로, 실수형 변수는 float형, double형 변수로 나눌 수 있다. -> 또한, 데이터가 저장된 메모리의 주소를 저장하고 처리하는 포인터 변수가 있다. +> 또한, 데이터가 저장된 메모리의 주소를 저장하고 처리하는 포인터 변수가 있다. 관련된 정보를 한 번에 묶어서 처리하는 사용자 정의 구조체 변수도 있다. ## 1.1 변수의 이름 생성 규칙 -> C 언어에서는 변수의 이름을 비교적 자유롭게 지을 수 있다. +> C 언어에서는 변수의 이름을 비교적 자유롭게 지을 수 있다. 하지만 변수의 이름은 해당 변수에 저장될 데이터의 의미를 잘 나타내도록 짓는 것이 가장 좋다. > C 언어에서 변수의 이름을 생성할 때에 반드시 지켜야 하는 규칙은 다음과 같다. @@ -37,32 +37,32 @@ toc: true > 다음 표는 변수의 이름을 생성할 때에 지겨야하는 규칙의 예시이다. -![스크린샷(754)](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/f245ce43-4651-4723-b4f0-35c7033932eb) +![스크린샷(754)](https://github.com/EunChong999/EunChong999/assets/136239807/8a2f30b2-a9ef-4b99-adc1-0a338c989299) -> C 언어에서는 변수의 이름에 대소문자를 구분하므로 이 점에 주의해야 한다. +> C 언어에서는 변수의 이름에 대소문자를 구분하므로 이 점에 주의해야 한다. ex) int tcp 과 int Tcp 는 같은 변수가 아니다. > 다음은 C 언어에서 사용되는 키워드(Keyword)들이다. -- 키워드 +- 키워드(Keyword) > 키워드(Keyword)란 고유한 의미를 가지는 예약어를 의미한다. > C 언어에는 32개의 키워드가 있으며, 이러한 키워드들은 미국표준협회 ANSI에서 지정한 키워드들이다. 아래의 키워드들은 위의 예시처럼 변수의 이름으로 사용할 수 없다. -![스크린샷(755)](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/da047eec-1a7e-4b3e-941d-b72bc9018813) +![스크린샷(755)](https://github.com/EunChong999/EunChong999/assets/136239807/f6eec46a-c5c1-4b57-9a4c-704044b3b4e4) ## 1.2 비트(bit)와 바이트(byte) > 컴퓨터는 모든 데이터를 2진수로 표현하고 처리한다. -- 비트 +- 비트(bit) > 비트(bit)란 컴퓨터가 데이터를 처리하기 위해 사용하는 데이터의 최소 단위를 의미한다. > 이러한 비트에는 2진수의 값(0과 1)을 단 하나만 저장할 수 있다. -- 바이트 +- 바이트(byte) > 바이트(byte)란 비트가 8개 모여서 구성되며, 한 문자를 표현할 수 있는 최소 단위를 의미한다. @@ -79,18 +79,19 @@ ex) int tcp 과 int Tcp 는 같은 변수가 아니다. > 다음 그림은 메모리 상에 변수가 어떤 식으로 저장되는지를 보여준다. -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/935fffda-1f28-4c32-aa23-2d206bad5adc) +![스크린샷(756)](https://github.com/EunChong999/EunChong999/assets/136239807/29f0fe48-c5bc-4f6d-8184-5050e35bde2f) -> 위의 그림처럼 하나의 메모리 공간에는 8개의 비트로 이루어진 1바이트의 데이터가 저장된다. -따라서 메모리의 주소 또한 1바이트씩 증가되며, 낮은 주소부터 차례대로 데이터가 저장된다. +> 위의 그림처럼 하나의 메모리 공간에는 8개의 비트로 이루어진 1바이트의 데이터가 저장된다. +따라서 메모리의 주소 또한 1바이트씩 증가되며, 낮은 주소부터 차례대로 데이터가 저장된다. 위의 그림에서 변수의 길이가 총 4개의 메모리 공간을 포함하므로, 해당 변수에는 4바이트의 데이터가 저장되어 있다. -> 이때 변수의 이름은 첫 번째 메모리 주소인 0x10만을 가리키게 된다. +> 이때 변수의 이름은 첫 번째 메모리 주소인 0x10만을 가리키게 된다. 따라서 변수의 길이가 4이며, 변수가 어떤 형태로 구성되는지도 알아야만 해당 변수에서 데이터를 올바르게 참조할 수 있다. ## 1.4 변수의 선언 -> C 언어에서는 변수를 사용하기 전에 반드시 먼저 해당 변수를 저장하기 위한 메모리 공간을 할당받아야 한다. 이렇게 해당 변수만을 위한 메모리 공간을 할당받는 행위를 변수의 선언이라고 부른다. 만약 선언되지 않은 변수를 사용하려고 하면, C 컴파일러는 오류를 발생시킨다. +> C 언어에서는 변수를 사용하기 전에 반드시 먼저 해당 변수를 저장하기 위한 메모리 공간을 할당받아야 한다. 이렇게 해당 변수만을 위한 메모리 공간을 할당받는 행위를 변수의 선언이라고 부른다. +> 만약 선언되지 않은 변수를 사용하려고 하면, C 컴파일러는 오류를 발생시킨다. > C 언어에서 변수를 선언하는 방법은 다음과 같이 두 가지 방법이 있다. @@ -100,7 +101,8 @@ ex) int tcp 과 int Tcp 는 같은 변수가 아니다. ### 1.4.1 변수의 선언만 하는 방법 -> 이 방법은 먼저 변수를 선언하여 메모리 공간만을 할당받고, 나중에 변수를 초기화하는 방법이다. +> 이 방법은 먼저 변수를 선언하여 메모리 공간만을 할당받고, +> 나중에 변수를 초기화하는 방법이다. > C 언어에서 변수를 선언하는 방법은 다음과 같다. @@ -120,9 +122,12 @@ int num; num = 20; ``` -> 위의 예제처럼 정수를 저장하기 위한 메모리 공간을 할당받으면, 반드시 해당 타입의 데이터만을 저장해야 한다. 그렇지 않고 다른 타입의 데이터를 저장할 경우에는 저장된 데이터에 변형 및 손실이 일어날 수도 있다. +> 위의 예제처럼 정수를 저장하기 위한 메모리 공간을 할당받으면, +> 반드시 해당 타입의 데이터만을 저장해야 한다. +> 그렇지 않고 다른 타입의 데이터를 저장할 경우에는 +> 저장된 데이터에 변형 및 손실이 일어날 수도 있다. -> 변수의 초기화란 해당 변수를 사용할 수 있도록 초기값을 설정하는 행위이다. +> 변수의 초기화란 해당 변수를 사용할 수 있도록 초기값을 설정하는 행위이다. 초기화되지 않은 변수에는 아무런 의미 없는 값인 쓰레깃값만이 들어가 있다. - 예제 @@ -132,14 +137,16 @@ int num; printf("%d", num); ``` -> 위의 예제에서 변수 num은 선언만 하고 아직 초기화되지 않았다. +> 위의 예제에서 변수 num은 선언만 하고 아직 초기화되지 않았다. 하지만 printf() 함수에서 변수 num을 사용하여 해당 변수에 저장된 값을 출력하려고 하고 있다. -> 이와 같은 경우에 C 컴파일러는 오류를 발생시키지는 않겠지만, 프로그램은 사용자가 의도하지 않은 결과를 출력할 것dl다. 따라서 C 언어에서는 초기화되지 않은 변수는 절대로 사용해서는 안된다. +> 이와 같은 경우에 C 컴파일러는 오류를 발생시키지는 않겠지만, +> 프로그램은 사용자가 의도하지 않은 결과를 출력할 것이다. +> 따라서 C 언어에서는 초기화되지 않은 변수는 절대로 사용해서는 안된다. ### 1.4.2 변수의 선언과 동시에 초기화하는 방법 -> C언어에서 변수는 선언과 동시에 그 값을 초기화할 수 있다. +> C언어에서 변수는 선언과 동시에 그 값을 초기화할 수 있다. 또한, 선언하고자 하는 변수들의 타입만 같다면 여러 변수를 동시에 선언할 수도 있다. - 문법 diff --git a/_posts/2023-12-03-07_Constant.md b/_posts/2023-12-03-07_Constant.md index f493118d53a1..6c66caf02e27 100644 --- a/_posts/2023-12-03-07_Constant.md +++ b/_posts/2023-12-03-07_Constant.md @@ -10,7 +10,7 @@ toc: true # 1 상수(constant) -- 상수 +- 상수(constant) > 상수(constant)란 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다. @@ -24,7 +24,7 @@ toc: true ## 1.1 리터럴 상수(literal constant) -> 리터럴 상수(literal constant)는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않다. C 언어에서는 적절한 메모리 공간을 할당받기 위하여, +> 리터럴 상수(literal constant)는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않다. C 언어에서는 적절한 메모리 공간을 할당받기 위하여, 기본적으로 변수든 상수든 타입을 가지게 된다. > 리터럴 상수는 타입에 따라 정수형 리터럴 상수, 실수형 리터럴 상수, 문자형 리터럴 상수 등으로 구분할 수 있다. @@ -45,9 +45,9 @@ toc: true ## 1.2 심볼릭 상수(symbolic constant) -> 심볼릭 상수는 변수와 마찬가지로 이름을 가지고 있는 상수이다. -이러한 심볼릭 상수는 반드시 선언과 동시에 초기화되어야 한다. -심볼릭 상수는 const 키워드를 사용하거나, 매크로를 이용하여 선언할 수 있다. +> 심볼릭 상수는 변수와 마찬가지로 이름을 가지고 있는 상수이다. +이러한 심볼릭 상수는 반드시 선언과 동시에 초기화되어야 한다. +심볼릭 상수는 const 키워드를 사용하거나, 매크로를 이용하여 선언할 수 있다. - 예제 diff --git a/_posts/2023-12-03-08_BasicType.md b/_posts/2023-12-03-08_BasicType.md index 28ee986d739f..cc18d020afe3 100644 --- a/_posts/2023-12-03-08_BasicType.md +++ b/_posts/2023-12-03-08_BasicType.md @@ -10,12 +10,18 @@ toc: true # 1 기본 타입 -> C 언어에서 타입(data type)이란 해당 데이터가 메모리에 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 한다. +- 타입(data type) -> C 언어는 여러 형태의 타입을 미리 작성하여 제공하고 있는데, 이것을 기본 타입이라고 한다. 이러한 기본 타입은 크게 정수형, 실수형, 그리고 문자형 타입으로 나눌 수 있다. +> C 언어에서 타입(data type)이란 해당 데이터가 메모리에 어떻게 저장되고, +> 프로그램에서 어떻게 처리되어야 하는지를 명시적으로 알려주는 역할을 의미한다. + +> C 언어는 여러 형태의 타입을 미리 작성하여 제공하고 있는데, 이것을 기본 타입이라고 한다. +> 이러한 기본 타입은 크게 정수형, 실수형, 그리고 문자형 타입으로 나눌 수 있다. ## 1.1 정수형 타입 +- 정수 + > C 언어에서 정수란 부호를 가지고 있고, 소수 부분이 없는 수를 의미한다. > 정수형 데이터에 unsigned 키워드를 추가하면, 부호를 나타내는 @@ -27,7 +33,7 @@ toc: true > 음의 정수까지도 표현할 수 있는 signed 키워드는 모든 타입에서 기본적으로 생략하여 사용할 수 있다. -- 최상위 비트 +- 최상위 비트(MSB, Most Significant Bit) > 최상위 비트(MSB, Most Significant Bit)란 1바이트를 구성하는 8개의 비트 중 최고값을 갖는 비트를 의미한다. @@ -35,19 +41,18 @@ toc: true ![](https://velog.velcdn.com/images/ecg/post/2762a0e4-ea8c-483f-a741-154f260591d3/image.png) -> 정수형 데이터의 타입을 결정할 때에는 반드시 -자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 한다. -해당 타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면, -오버플로우가 발생해 전혀 다른 값이 저장될 수 있기 때문이다. +> 정수형 데이터의 타입을 결정할 때에는 +> 반드시 자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 한다. +해당 타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면, +오버플로우가 발생해 전혀 다른 값이 저장될 수 있기 때문이다. -- 오버플로우 +- 오버플로우(overflow) > 오버플로우(overflow)란 해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상을 의미한다. -> 오버플로우가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 -인접 비트를 덮어쓰므로, 잘못된 결과를 얻을 수 있다. +> 오버플로우가 발생하면 최상위 비트(MSB)를 벗어난 데이터가 인접 비트를 덮어쓰므로, 잘못된 결과를 얻을 수 있다. -- 언더플로우 +- 언더플로우(underflow) > 언더플로우(underflow)란 해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상을 의미한다. @@ -70,21 +75,23 @@ printf("변수 num에 저장된 값은 %d입니다.\n", num); 변수 num에 저장된 값은 -2147483648입니다. ``` -> 위의 두 번째 실행 결과를 살펴보면, 변수 num에 양수를 대입했지만 -음수로 저장된 것을 확인할 수 있다. -이처럼 오버플로우가 발생하면 전혀 예상치 못한 결과를 얻을 수 있으므로, +> 위의 두 번째 실행 결과를 살펴보면, +> 변수 num에 양수를 대입했지만 음수로 저장된 것을 확인할 수 있다. +이처럼 오버플로우가 발생하면 전혀 예상치 못한 결과를 얻을 수 있으므로, 데이터를 저장할 때는 언제나 해당 데이터 타입의 최대 크기까지 고려해야 한다. -> 컴퓨터는 내부적으로 정수형 중에서도 int형의 데이터를 가장 빠르게 처리한다. -따라서 정수형 데이터는 보편적으로 크기에 상관없이 int형을 가장 많이 사용한다. -int형은 운영체제의 환경에 따라 다릅니다. -16bit라면 2바이트, 32bit라면 4바이트, 64bit이상부터 4바이트이다. +> 컴퓨터는 내부적으로 정수형 중에서도 int형의 데이터를 가장 빠르게 처리한다. +따라서 정수형 데이터는 보편적으로 크기에 상관없이 int형을 가장 많이 사용한다. +int형은 운영체제의 환경에 따라 다르다. +16bit라면 2바이트, 32bit라면 4바이트, 64bit이상부터 4바이트이다. ## 1.2 실수형 타입 -> C언어에서 실수란 소수부나 지수가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가진다. -하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계를 지닌다. -이러한 실수형 데이터의 오차는 C 언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제이다. +> C 언어에서 실수란 소수부나 지수가 있는 수를 가리키며, +> 정수보다 훨씬 더 넓은 표현 범위를 가진다. +하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계를 지닌다. +이러한 실수형 데이터의 오차는 C 언어뿐만 아니라 + 모든 프로그래밍 언어에서 발생하는 공통된 문제이다. ![](https://velog.velcdn.com/images/ecg/post/416d2a6d-8a45-48e3-8967-74b248db8e35/image.png) @@ -107,30 +114,30 @@ printf("변수 pi에 저장된 값은 %.20f입니다.\n", num02); 변수 num02에 저장된 값은 3.14159265358979311600입니다. ``` -> 위의 예제에서 변수 num01에는 소수점 6자리까지만 정확한 값이 저장되어 있고, -소수점 7자리부터는 틀린 값이 저장되어 있다. -또한, 변수 num02에는 소수점 15자리까지만 정확한 값이 저장되어 있고, -소수점 16자리부터는 틀린 값이 저장되어 있는 것을 확인할 수 있다. +> 위의 예제에서 변수 num01에는 소수점 6자리까지만 정확한 값이 저장되어 있고, +소수점 7자리부터는 틀린 값이 저장되어 있다. +또한, 변수 num02에는 소수점 15자리까지만 정확한 값이 저장되어 있고, +소수점 16자리부터는 틀린 값이 저장되어 있는 것을 확인할 수 있다. -> 이처럼 실수형 데이터의 타입을 결정할 때는 -표현 범위 이외에도 유효 자릿수를 반드시 고려해야 한다. +> 이처럼 실수형 데이터의 타입을 결정할 때는 표현 범위 이외에도 유효 자릿수를 반드시 고려해야 한다. ![](https://velog.velcdn.com/images/ecg/post/eb3062c9-5630-4003-920e-f8c5ec6f5b8f/image.png) -> 과거에는 실수를 표현할 때 float형을 많이 사용했지만, 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용한다. +> 과거에는 실수를 표현할 때 float형을 많이 사용했지만, +> 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용한다. ## 1.3 문자형 타입 - 문자형 타입 -> C언어에서 문자형 데이터란 문자 하나를 표현할 수 있는 타입을 의미한다.| +>C 언어에서 문자형 타입이란 문자 하나를 표현할 수 있는 타입을 의미한다. -> 컴퓨터는 2진수밖에 인식하지 못하므로, 문자도 숫자로 표현해야 컴퓨터가 인식할 수 있다. +> 컴퓨터는 2진수밖에 인식하지 못하므로, 문자도 숫자로 표현해야 컴퓨터가 인식할 수 있다. 따라서 어떤 문자를 어떤 숫자에 대응시킬 것인가에 대한 약속이 필요하다. -> 이러한 약속 중에서 가장 많이 사용되는 것이 바로 아스키코드(ASCII)이다. +> 이러한 약속 중에서 가장 많이 사용되는 것이 바로 아스키코드(ASCII)이다. -- 아스키코드 +- 아스키코드(ASCII) > 아스키코드(ASCII)란 영문 대소문자를 사용하는 7비트의 문자 인코딩 방식을 의미한다. @@ -161,6 +168,6 @@ printf("변수 ch에 저장된 값은 %d입니다.\n", ch); 변수 ch에 저장된 값은 97입니다. ``` -> 위의 예제에서 서식 지정자 '%c'를 사용하여 출력한 결과는 제대로 문자 'a'가 출력된다. -하지만 서식 지정자 '%d'를 사용하여 출력한 결과는 97이라는 숫자로 출력된다. -즉, 이것은 문자가 내부적으로는 아스키코드에 해당하는 숫자로 저장되어 있음을 보여준다. +> 위의 예제에서 서식 지정자 '%c'를 사용하여 출력한 결과는 제대로 문자 'a'가 출력된다. +하지만 서식 지정자 '%d'를 사용하여 출력한 결과는 97이라는 숫자로 출력된다. +즉, 이것은 문자가 내부적으로는 아스키코드에 해당하는 숫자로 저장되어 있음을 보여준다. diff --git a/_posts/2023-12-04-33_DynamicMemoryAllocation.md b/_posts/2023-12-04-33_DynamicMemoryAllocation.md index e3ca406b6455..f0b5bce5511f 100644 --- a/_posts/2023-12-04-33_DynamicMemoryAllocation.md +++ b/_posts/2023-12-04-33_DynamicMemoryAllocation.md @@ -9,3 +9,46 @@ tags: excerpt: 메모리의 동적 할당에 관한 글입니다. toc: true --- + +# 1 메모리의 동적 할당(dynamic allocation) + +>데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임(compile time)에 미리 결정된다. +하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 런 타임(run time)에 사용자가 직접 결정하게 된다. + +- 메모리의 동적 할당(dynamic allocation) + +>메모리의 동적 할당(dynamic allocation)이란 런 타임에 메모리를 할당받는 것을 의미한다. + +## 1.1 malloc() 함수 + +- malloc() + +>malloc() 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해준다. + +>malloc() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +void *malloc(size_t size);   +``` + +>malloc() 함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받는다. +이 함수는 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 블록을 찾는다. +이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환한다. + +>힙 영역에 할당할 수 있는 적당한 블록이 없을 때에는 널 포인터를 반환한다. +주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용해야 한다. + +>malloc() 함수의 원형에서 볼 수 있는 size_t 타입은 부호없는 정수이다. + +#### free() 함수 + +free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수입니다. +데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되어, 프로그램이 실행되는 내내 고정됩니다. +하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변화됩니다. +따라서 free() 함수를 사용하여 다 사용한 메모리를 해제해 주지 않으면, 메모리가 부족해지는 현상이 발생할 수 있습니다. +이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(memory leak)라고 합니다. + +free() 함수의 원형은 다음과 같습니다. From 1d81269b88fbff30635552010fe748e7501c50e5 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 9 Dec 2023 23:19:08 +0900 Subject: [PATCH 28/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 14 +-- _posts/2023-12-03-09_TypeCasting.md | 167 +++++----------------------- 2 files changed, 35 insertions(+), 146 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index e11473ca56e2..407c39cbb04b 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-03-08_BasicType.md", + "file": "_posts/2023-12-03-09_TypeCasting.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-03-08_BasicType.md", + "file": "_posts/2023-12-03-09_TypeCasting.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-03-08_BasicType.md", + "file": "_posts/2023-12-03-09_TypeCasting.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-03-08_BasicType.md" + "file": "_posts/2023-12-03-09_TypeCasting.md" } } } @@ -148,8 +148,10 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ - "_posts/2023-12-03-07_Constant.md", + "_posts/2023-12-03-10_ArithmeticOperator.md", + "_posts/2023-12-03-09_TypeCasting.md", "_posts/2023-12-03-08_BasicType.md", + "_posts/2023-12-03-07_Constant.md", "_posts/2023-12-03-06_Variable.md", "_posts/2023-12-03-05_Scanf().md", "_posts/2023-12-03-04_Printf().md", @@ -176,8 +178,6 @@ "_posts/2023-12-04-26_PointerOperation.md", "_site/Pasted image 20231206191149.png", "Pasted image 20231206191149.png", - "_posts/2023-12-03-09_TypeCasting.md", - "_posts/2023-12-03-10_ArithmeticOperator.md", "_posts/2023-12-03-11_AssignmentOperator.md", "_posts/2023-12-03-12_IncrementAndDecrementOperator.md", "_site/language/31_MemoryStructure/index.html", diff --git a/_posts/2023-12-03-09_TypeCasting.md b/_posts/2023-12-03-09_TypeCasting.md index 415f3942011c..85feb2cdbdd4 100644 --- a/_posts/2023-12-03-09_TypeCasting.md +++ b/_posts/2023-12-03-09_TypeCasting.md @@ -11,129 +11,15 @@ toc: true # 1 타입 변환(type conversion) > C 언어에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행된다. -이처럼 하나의 타입을 다른 타입으로 바꾸는 행위를 타입 변환(type conversion)이라고 합니다. -> 표현 범위가 좁은 타입에서 표현 범위가 더 넓은 타입으로의 타입 변환은 큰 문제가 되지 않는다. -하지만 반대의 경우인 표현 범위가 좁은 타입으로의 타입 변환에서는 데이터의 손실이 발생한다. +- 타입 변환(type conversion) -> 타입 변환은 크게 다음과 같이 두 가지 방식으로 나눌 수 있다. - -1. 묵시적 타입 변환(자동 타입 변환) - -2. 명시적 타입 변환(강제 타입 변환) - -## 1.1 묵시적 타입 변환(자동 타입 변환, implicit type conversion) - -- 묵시적 타입 변환 - -> 묵시적 타입 변환이란 대입 연산이나 산술 연산에서 -C 컴파일러가 자동으로 실행해주는 타입 변환을 의미한다. - -> C 언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 -연산자의 왼쪽에 존재하는 데이터의 타입으로 묵시적 타입 변환이 진행된다. -또한, 산술 연산에서는 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환이 진행된다. - -> 다음 예제는 대입 연산에서 일어나는 묵시적 타입 변환을 보여준다. - -- 예제 - -```c -char ch = 200; -int num01 = 3.14; -double num02 = 5; - -printf(" ch에 저장된 값은 %d입니다.\n", ch); -printf("num01에 저장된 값은 %d입니다.\n", num01); -printf("num02에 저장된 값은 %f입니다.\n", num02); -``` - -- 실행 결과 - -```c - ch에 저장된 값은 -56입니다. -num01에 저장된 값은 3입니다. -num02에 저장된 값은 5.000000입니다. -``` - -> 위의 예제에서는 char형 변수에 char형 변수가 표현할 수 있는 범위를 넘는 데이터를 저장한다. -따라서 전달된 데이터의 상위 비트가 자동으로 삭제되어 데이터의 손실이 발생한다. -또한, int형 변수에 실수를 저장했기 때문에 -소수 부분이 자동으로 삭제되어 데이터의 손실이 발생한다. -하지만 double형 변수에 int형 데이터를 저장하는 것은 데이터가 double형으로 자동 타입 변환되지만, 데이터의 손실은 발생하지 않는다. - -> 다음 예제는 산술 연산에서 일어나는 묵시적 타입 변환을 보여준다. - -- 예제 - -```c -double result01 = 5 + 3.14; -double result02 = 5.0f + 3.14; - -printf("result01에 저장된 값은 %f입니다.\n", result01); -printf("result02에 저장된 값은 %f입니다.\n", result02); - -``` -- 실행 결과 - -```c -result01에 저장된 값은 8.140000입니다. -result02에 저장된 값은 8.140000입니다. -``` - -> 위의 예제에서 첫 번째 연산은 int형 데이터와 double형 데이터의 산술 연산이다. -따라서 데이터의 손실이 최소화되도록 int형 데이터가 double형 데이터로 자동 타입 변환된다. -두 번째 연산은 float형 데이터와 double형 데이터의 산술 연산이다. -위와 마찬가지로 데이터의 손실이 최소화되도록 -float형 데이터가 double형 데이터로 자동 타입 변환된다. - -> 이렇게 컴파일러가 자동으로 수행하는 타입 변환은 -언제나 데이터의 손실이 최소화되는 방향으로 이루어진다. -따라서 C 컴파일러는 다음과 같은 순서대로 자동 타입 변환을 수행하게 된다. - -> char 형 → short 형 → int 형 → long 형 → float 형 → double 형 → long double 형 - -## 1.2 명시적 타입 변환(강제 타입 변환, explicit type conversion) - -- 명시적 타입 변환 - -> 명시적 타입 변환이란 사용자가 타입 캐스트(type cast) 연산자를 사용하여 강제적으로 수행하는 타입 변환을 의미한다. - -> 변환하고자 하는 데이터의 앞에 괄호(())를 추가하고, 그 안에 변환할 타입을 적으면 된다. -C언어에서는 이 괄호(())를 타입 캐스트(type cast) 연산자라고 한다. - -> 다음 예제는 명시적 타입 변환을 보여주는 예제이다. - -- 예제 - -```c -int num01 = 1; -int num02 = 4; - -double result01 = num01 / num02; -double result02 = (double)num01 / num02; - -printf("result01에 저장된 값은 %f입니다.\n", result01); -printf("result02에 저장된 값은 %f입니다.\n", result02); -``` - -- 실행 결과 - -```c -result01에 저장된 값은 0.000000입니다. -result02에 저장된 값은 0.250000입니다. -``` - -> 위의 예제에서 첫 번째 연산의 결괏값은 0.000000으로 출력된다. -그 이유는 산술 연산에 대한 결괏값의 타입은 피연산자의 타입과 언제나 일치하기 때문이다. -즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터로 나온다. -따라서 두 번째 연산에서처럼 하나의 피연산자를 명시적으로 -double형으로 지정해야만 정확한 결괏값을 얻을 수 있다.# 1 타입 변환(type conversion) - -> C 언어에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행된다. -이처럼 하나의 타입을 다른 타입으로 바꾸는 행위를 타입 변환(type conversion)이라고 합니다. +>타입 변환(type conversion)이란 하나의 타입을 다른 타입으로 바꾸는 행위를 의미한다. -> 표현 범위가 좁은 타입에서 표현 범위가 더 넓은 타입으로의 타입 변환은 큰 문제가 되지 않는다. -하지만 반대의 경우인 표현 범위가 좁은 타입으로의 타입 변환에서는 데이터의 손실이 발생한다. +> 표현 범위가 좁은 타입에서 표현 범위가 +> 더 넓은 타입으로의 타입 변환은 큰 문제가 되지 않는다. +하지만 반대의 경우인 표현 범위가 좁은 타입으로의 타입 변환에서는 +데이터의 손실이 발생한다. > 타입 변환은 크게 다음과 같이 두 가지 방식으로 나눌 수 있다. @@ -148,8 +34,8 @@ double형으로 지정해야만 정확한 결괏값을 얻을 수 있다.# 1 타 > 묵시적 타입 변환이란 대입 연산이나 산술 연산에서 C 컴파일러가 자동으로 실행해주는 타입 변환을 의미한다. -> C언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 -연산자의 왼쪽에 존재하는 데이터의 타입으로 묵시적 타입 변환이 진행된다. +> C 언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 +연산자의 왼쪽에 존재하는 데이터의 타입으로 묵시적 타입 변환이 진행된다. 또한, 산술 연산에서는 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환이 진행된다. > 다음 예제는 대입 연산에서 일어나는 묵시적 타입 변환을 보여준다. @@ -175,10 +61,12 @@ num02에 저장된 값은 5.000000입니다. ``` > 위의 예제에서는 char형 변수에 char형 변수가 표현할 수 있는 범위를 넘는 데이터를 저장한다. -따라서 전달된 데이터의 상위 비트가 자동으로 삭제되어 데이터의 손실이 발생한다. -또한, int형 변수에 실수를 저장했기 때문에 -소수 부분이 자동으로 삭제되어 데이터의 손실이 발생한다. -하지만 double형 변수에 int형 데이터를 저장하는 것은 데이터가 double형으로 자동 타입 변환되지만, 데이터의 손실은 발생하지 않는다. +따라서 전달된 데이터의 상위 비트가 자동으로 삭제되어 데이터의 손실이 발생한다. +또한, int형 변수에 실수를 저장했기 때문에 +소수 부분이 자동으로 삭제되어 데이터의 손실이 발생한다. +하지만 double형 변수에 int형 데이터를 저장하는 것은 +데이터가 double형으로 자동 타입 변환되지만, +데이터의 손실은 발생하지 않는다. > 다음 예제는 산술 연산에서 일어나는 묵시적 타입 변환을 보여준다. @@ -199,14 +87,14 @@ result01에 저장된 값은 8.140000입니다. result02에 저장된 값은 8.140000입니다. ``` -> 위의 예제에서 첫 번째 연산은 int형 데이터와 double형 데이터의 산술 연산이다. -따라서 데이터의 손실이 최소화되도록 int형 데이터가 double형 데이터로 자동 타입 변환된다. -두 번째 연산은 float형 데이터와 double형 데이터의 산술 연산이다. -위와 마찬가지로 데이터의 손실이 최소화되도록 -float형 데이터가 double형 데이터로 자동 타입 변환된다. +> 위의 예제에서 첫 번째 연산은 int형 데이터와 double형 데이터의 산술 연산이다. +따라서 데이터의 손실이 최소화되도록 int형 데이터가 double형 데이터로 자동 타입 변환된다. +두 번째 연산은 float형 데이터와 double형 데이터의 산술 연산이다. +위와 마찬가지로 데이터의 손실이 최소화되도록 +float형 데이터가 double형 데이터로 자동 타입 변환된다. -> 이렇게 컴파일러가 자동으로 수행하는 타입 변환은 -언제나 데이터의 손실이 최소화되는 방향으로 이루어진다. +> 이렇게 컴파일러가 자동으로 수행하는 타입 변환은 +언제나 데이터의 손실이 최소화되는 방향으로 이루어진다. 따라서 C 컴파일러는 다음과 같은 순서대로 자동 타입 변환을 수행하게 된다. > char 형 → short 형 → int 형 → long 형 → float 형 → double 형 → long double 형 @@ -215,9 +103,10 @@ float형 데이터가 double형 데이터로 자동 타입 변환된다. - 명시적 타입 변환 -> 명시적 타입 변환이란 사용자가 타입 캐스트(type cast) 연산자를 사용하여 강제적으로 수행하는 타입 변환을 의미한다. +> 명시적 타입 변환이란 사용자가 타입 캐스트(type cast) 연산자를 사용하여 +> 강제적으로 수행하는 타입 변환을 의미한다. -> 변환하고자 하는 데이터의 앞에 괄호(())를 추가하고, 그 안에 변환할 타입을 적으면 된다. +> 변환하고자 하는 데이터의 앞에 괄호(())를 추가하고, 그 안에 변환할 타입을 적으면 된다. C언어에서는 이 괄호(())를 타입 캐스트(type cast) 연산자라고 한다. > 다음 예제는 명시적 타입 변환을 보여주는 예제이다. @@ -242,8 +131,8 @@ result01에 저장된 값은 0.000000입니다. result02에 저장된 값은 0.250000입니다. ``` -> 위의 예제에서 첫 번째 연산의 결괏값은 0.000000으로 출력된다. -그 이유는 산술 연산에 대한 결괏값의 타입은 피연산자의 타입과 언제나 일치하기 때문이다. -즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터로 나온다. -따라서 두 번째 연산에서처럼 하나의 피연산자를 명시적으로 +> 위의 예제에서 첫 번째 연산의 결괏값은 0.000000으로 출력된다. +그 이유는 산술 연산에 대한 결괏값의 타입은 피연산자의 타입과 언제나 일치하기 때문이다. +즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터로 나온다. +따라서 두 번째 연산에서처럼 하나의 피연산자를 명시적으로 double형으로 지정해야만 정확한 결괏값을 얻을 수 있다. \ No newline at end of file From 7d36f08117f8d925cead81c437378b8d5bfe9de5 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sat, 9 Dec 2023 23:19:59 +0900 Subject: [PATCH 29/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 407c39cbb04b..3beedd2ef473 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-03-09_TypeCasting.md", + "file": "_posts/2023-12-03-10_ArithmeticOperator.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-03-09_TypeCasting.md", + "file": "_posts/2023-12-03-10_ArithmeticOperator.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-03-09_TypeCasting.md", + "file": "_posts/2023-12-03-10_ArithmeticOperator.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-03-09_TypeCasting.md" + "file": "_posts/2023-12-03-10_ArithmeticOperator.md" } } } @@ -148,8 +148,8 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ - "_posts/2023-12-03-10_ArithmeticOperator.md", "_posts/2023-12-03-09_TypeCasting.md", + "_posts/2023-12-03-10_ArithmeticOperator.md", "_posts/2023-12-03-08_BasicType.md", "_posts/2023-12-03-07_Constant.md", "_posts/2023-12-03-06_Variable.md", From 37312cad3cb34fc41aabc4b832a1608e28e62e8b Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sun, 10 Dec 2023 21:59:49 +0900 Subject: [PATCH 30/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=8C=80=EA=B1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/appearance.json | 2 +- .obsidian/workspace.json | 80 ++++++------- .../2023-12-04-33_DynamicMemoryAllocation.md | 54 --------- _posts/{ => Language/C}/2023-12-03-01_C.md | 0 .../C}/2023-12-03-02_CProgramming.md | 0 .../C}/2023-12-03-03_CProgram.md | 0 .../C}/2023-12-03-04_Printf().md | 0 .../{ => Language/C}/2023-12-03-05_Scanf().md | 0 .../C}/2023-12-03-06_Variable.md | 0 .../C}/2023-12-03-07_Constant.md | 0 .../C}/2023-12-03-08_BasicType.md | 0 .../C}/2023-12-03-09_TypeCasting.md | 0 .../C}/2023-12-03-10_ArithmeticOperator.md | 26 ++--- .../C}/2023-12-03-11_AssignmentOperator.md | 8 +- ...-12-03-12_IncrementAndDecrementOperator.md | 14 +-- .../C}/2023-12-03-13_ComparisonOperator.md | 12 +- .../C}/2023-12-03-14_LogicalOperator.md | 14 +-- .../C}/2023-12-03-15_BitwiseOperator.md | 20 ++-- .../C}/2023-12-03-16_OtherOperator.md | 41 ++++--- .../C}/2023-12-03-17_ConditionalStatement.md | 77 +++++++------ .../C}/2023-12-03-18_IterationStatement.md | 55 ++++----- .../C}/2023-12-03-19_ControlStatement.md | 44 ++++--- .../C}/2023-12-03-20_CLanguageFunction.md | 56 ++++----- .../C}/2023-12-03-21_ValidRangeOfVariable.md | 82 +++++++------ .../C}/2023-12-04-22_RecursiveCall.md | 37 +++--- .../C}/2023-12-04-23_1DArrangement.md | 61 +++++----- ...23-12-04-24_MultidimensionalArrangement.md | 51 +++++---- .../C}/2023-12-04-25_PointerConcept.md | 68 +++++------ .../C}/2023-12-04-26_PointerOperation.md | 10 +- .../C}/2023-12-04-27_HowToForwardArgument.md | 24 ++-- .../C}/2023-12-04-28_VariousPointers.md | 31 ++--- ...23-12-04-29_PointerToArrayRelationships.md | 34 ++++-- ...3-12-04-30_PointerArrayAndArrayPointers.md | 44 ++++--- .../C}/2023-12-04-31_MemoryStructure.md | 25 ++-- .../C}/2023-12-04-32_StackFrame.md | 47 ++++---- .../2023-12-04-33_DynamicMemoryAllocation.md | 108 ++++++++++++++++++ .../{ => Language/C}/2023-12-04-34_BasicIO.md | 0 ...3-12-04-35_CharacterInputOutputFunction.md | 0 .../{ => Language/C}/2023-12-04-36_String.md | 0 .../C}/2023-12-04-37_StringIOFunction.md | 0 .../2023-12-04-38_StringProcessingFunction.md | 0 .../C}/2023-12-04-39_BasicStructure.md | 0 .../C}/2023-12-04-40_PointersAndStructures.md | 0 .../2023-12-04-41_UtilizationOfStructures.md | 0 .../C}/2023-12-04-43_CommonAndEnumeration.md | 0 .../C}/2023-12-04-43_ConsoleIO.md | 0 .../{ => Language/C}/2023-12-04-44_FileIO.md | 0 .../C}/2023-12-04-45_FileIOFunction.md | 0 .../C}/2023-12-04-46_Pre-processor.md | 0 .../C}/2023-12-04-47_MacroFunction.md | 0 .../C}/2023-12-04-48_Pre-definedMacro.md | 0 .../C}/2023-12-04-49_HeaderFiles.md | 0 .../C}/2023-12-04-50_SplitCompilation.md | 0 .../2023-12-04-51_ConditionalCompilation.md | 0 .../C}/2023-12-04-52_ByteStorageOrder.md | 0 .../C}/2023-12-04-53_BitOperation.md | 0 ...2-04-54_RepresentationOfNegativeNumbers.md | 0 .../2023-12-04-55_ExpressionsOfRealNumbers.md | 0 58 files changed, 623 insertions(+), 502 deletions(-) delete mode 100644 _posts/2023-12-04-33_DynamicMemoryAllocation.md rename _posts/{ => Language/C}/2023-12-03-01_C.md (100%) rename _posts/{ => Language/C}/2023-12-03-02_CProgramming.md (100%) rename _posts/{ => Language/C}/2023-12-03-03_CProgram.md (100%) rename _posts/{ => Language/C}/2023-12-03-04_Printf().md (100%) rename _posts/{ => Language/C}/2023-12-03-05_Scanf().md (100%) rename _posts/{ => Language/C}/2023-12-03-06_Variable.md (100%) rename _posts/{ => Language/C}/2023-12-03-07_Constant.md (100%) rename _posts/{ => Language/C}/2023-12-03-08_BasicType.md (100%) rename _posts/{ => Language/C}/2023-12-03-09_TypeCasting.md (100%) rename _posts/{ => Language/C}/2023-12-03-10_ArithmeticOperator.md (83%) rename _posts/{ => Language/C}/2023-12-03-11_AssignmentOperator.md (82%) rename _posts/{ => Language/C}/2023-12-03-12_IncrementAndDecrementOperator.md (86%) rename _posts/{ => Language/C}/2023-12-03-13_ComparisonOperator.md (78%) rename _posts/{ => Language/C}/2023-12-03-14_LogicalOperator.md (80%) rename _posts/{ => Language/C}/2023-12-03-15_BitwiseOperator.md (82%) rename _posts/{ => Language/C}/2023-12-03-16_OtherOperator.md (72%) rename _posts/{ => Language/C}/2023-12-03-17_ConditionalStatement.md (75%) rename _posts/{ => Language/C}/2023-12-03-18_IterationStatement.md (75%) rename _posts/{ => Language/C}/2023-12-03-19_ControlStatement.md (77%) rename _posts/{ => Language/C}/2023-12-03-20_CLanguageFunction.md (79%) rename _posts/{ => Language/C}/2023-12-03-21_ValidRangeOfVariable.md (74%) rename _posts/{ => Language/C}/2023-12-04-22_RecursiveCall.md (77%) rename _posts/{ => Language/C}/2023-12-04-23_1DArrangement.md (78%) rename _posts/{ => Language/C}/2023-12-04-24_MultidimensionalArrangement.md (77%) rename _posts/{ => Language/C}/2023-12-04-25_PointerConcept.md (76%) rename _posts/{ => Language/C}/2023-12-04-26_PointerOperation.md (94%) rename _posts/{ => Language/C}/2023-12-04-27_HowToForwardArgument.md (76%) rename _posts/{ => Language/C}/2023-12-04-28_VariousPointers.md (81%) rename _posts/{ => Language/C}/2023-12-04-29_PointerToArrayRelationships.md (67%) rename _posts/{ => Language/C}/2023-12-04-30_PointerArrayAndArrayPointers.md (73%) rename _posts/{ => Language/C}/2023-12-04-31_MemoryStructure.md (67%) rename _posts/{ => Language/C}/2023-12-04-32_StackFrame.md (60%) create mode 100644 _posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md rename _posts/{ => Language/C}/2023-12-04-34_BasicIO.md (100%) rename _posts/{ => Language/C}/2023-12-04-35_CharacterInputOutputFunction.md (100%) rename _posts/{ => Language/C}/2023-12-04-36_String.md (100%) rename _posts/{ => Language/C}/2023-12-04-37_StringIOFunction.md (100%) rename _posts/{ => Language/C}/2023-12-04-38_StringProcessingFunction.md (100%) rename _posts/{ => Language/C}/2023-12-04-39_BasicStructure.md (100%) rename _posts/{ => Language/C}/2023-12-04-40_PointersAndStructures.md (100%) rename _posts/{ => Language/C}/2023-12-04-41_UtilizationOfStructures.md (100%) rename _posts/{ => Language/C}/2023-12-04-43_CommonAndEnumeration.md (100%) rename _posts/{ => Language/C}/2023-12-04-43_ConsoleIO.md (100%) rename _posts/{ => Language/C}/2023-12-04-44_FileIO.md (100%) rename _posts/{ => Language/C}/2023-12-04-45_FileIOFunction.md (100%) rename _posts/{ => Language/C}/2023-12-04-46_Pre-processor.md (100%) rename _posts/{ => Language/C}/2023-12-04-47_MacroFunction.md (100%) rename _posts/{ => Language/C}/2023-12-04-48_Pre-definedMacro.md (100%) rename _posts/{ => Language/C}/2023-12-04-49_HeaderFiles.md (100%) rename _posts/{ => Language/C}/2023-12-04-50_SplitCompilation.md (100%) rename _posts/{ => Language/C}/2023-12-04-51_ConditionalCompilation.md (100%) rename _posts/{ => Language/C}/2023-12-04-52_ByteStorageOrder.md (100%) rename _posts/{ => Language/C}/2023-12-04-53_BitOperation.md (100%) rename _posts/{ => Language/C}/2023-12-04-54_RepresentationOfNegativeNumbers.md (100%) rename _posts/{ => Language/C}/2023-12-04-55_ExpressionsOfRealNumbers.md (100%) diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index ea11cbeba3cc..018e0340ddbd 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1,4 +1,4 @@ { "accentColor": "", - "baseFontSize": 14 + "baseFontSize": 13 } \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 3beedd2ef473..7ea4431e0212 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/2023-12-03-10_ArithmeticOperator.md", + "file": "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/2023-12-03-10_ArithmeticOperator.md", + "file": "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/2023-12-03-10_ArithmeticOperator.md", + "file": "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/2023-12-03-10_ArithmeticOperator.md" + "file": "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md" } } } @@ -148,48 +148,48 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ - "_posts/2023-12-03-09_TypeCasting.md", - "_posts/2023-12-03-10_ArithmeticOperator.md", - "_posts/2023-12-03-08_BasicType.md", - "_posts/2023-12-03-07_Constant.md", - "_posts/2023-12-03-06_Variable.md", - "_posts/2023-12-03-05_Scanf().md", - "_posts/2023-12-03-04_Printf().md", - "_posts/2023-12-03-03_CProgram.md", - "_posts/2023-12-03-02_CProgramming.md", - "_posts/2023-12-03-01_C.md", - "_posts/2023-12-04-33_DynamicMemoryAllocation.md", - "_posts/2023-12-04-34_BasicIO.md", - "_posts/2023-12-04-35_CharacterInputOutputFunction.md", - "_posts/2023-12-04-40_PointersAndStructures.md", - "_posts/2023-12-04-43_ConsoleIO.md", + "_posts/Language/C/2023-12-04-32_StackFrame.md", + "_posts/Language/C/2023-12-04-31_MemoryStructure.md", + "_posts/Language/C/2023-12-04-30_PointerArrayAndArrayPointers.md", + "_posts/Language/C/2023-12-04-29_PointerToArrayRelationships.md", + "_posts/Language/C/2023-12-04-28_VariousPointers.md", + "_posts/Language/C/2023-12-04-27_HowToForwardArgument.md", + "_posts/Language/C/2023-12-04-26_PointerOperation.md", + "_posts/Language/C/2023-12-04-25_PointerConcept.md", + "_posts/Language/C/2023-12-04-24_MultidimensionalArrangement.md", + "_posts/Language/C/2023-12-04-23_1DArrangement.md", + "_posts/Language/C/2023-12-04-22_RecursiveCall.md", + "_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md", + "_posts/Language/C/2023-12-03-20_CLanguageFunction.md", + "_posts/Language/C/2023-12-03-19_ControlStatement.md", + "_posts/Language/C/2023-12-03-18_IterationStatement.md", + "_posts/Language/C/2023-12-03-17_ConditionalStatement.md", + "_posts/Language/C/2023-12-03-16_OtherOperator.md", + "_posts/Language/C/2023-12-03-15_BitwiseOperator.md", + "_posts/Language/C/2023-12-03-14_LogicalOperator.md", + "_posts/Language/C/2023-12-03-13_ComparisonOperator.md", + "_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md", + "_posts/Language/C/2023-12-03-11_AssignmentOperator.md", + "_posts/Language/C/2023-12-03-10_ArithmeticOperator.md", + "_posts/Language/C/2023-12-03-09_TypeCasting.md", + "_posts/Language/C/2023-12-03-08_BasicType.md", + "_posts/Language/C/2023-12-03-01_C.md", + "_posts/Game Development Knowledge/Design Pattern", + "_posts/Game Development Knowledge/Computer Graphic", + "_posts/Game Development Knowledge/Game Math", + "_posts/Language/C#", + "_posts/Language/C++", + "_posts/Basic Development Knowledge/Software Computer Science", + "_posts/Basic Development Knowledge/Algorithm", + "_posts/Game Development Knowledge", + "_posts/Basic Development Knowledge/Data Structure", + "_posts/Basic Development Knowledge", "_site/Pasted image 20231207191701.png", "Pasted image 20231207191701.png", - "_posts/2023-12-04-32_StackFrame.md", - "_posts/2023-12-04-31_MemoryStructure.md", - "_posts/2023-12-04-30_PointerArrayAndArrayPointers.md", "_site/Pasted image 20231206205417.png", "Pasted image 20231206205417.png", - "_posts/2023-12-04-29_PointerToArrayRelationships.md", - "_posts/2023-12-04-28_VariousPointers.md", - "_posts/2023-12-04-24_MultidimensionalArrangement.md", - "_posts/2023-12-03-18_IterationStatement.md", - "_posts/2023-12-04-27_HowToForwardArgument.md", - "_posts/2023-12-04-26_PointerOperation.md", "_site/Pasted image 20231206191149.png", "Pasted image 20231206191149.png", - "_posts/2023-12-03-11_AssignmentOperator.md", - "_posts/2023-12-03-12_IncrementAndDecrementOperator.md", - "_site/language/31_MemoryStructure/index.html", - "_site/language/31_MemoryStructure", - "_site/language/28_VariousPointers/index.html", - "_site/language/28_VariousPointers", - "_site/language/41_UtilizationOfStructures/index.html", - "_site/language/41_UtilizationOfStructures", - "_site/language/38_StringProcessingFunction/index.html", - "_site/language/38_StringProcessingFunction", - "_site/language/37_StringIOFunction/index.html", - "_site/language/37_StringIOFunction", "스크린샷(753).png", "스크린샷(753) 1.png", "스크린샷(753) - 복사본.png", diff --git a/_posts/2023-12-04-33_DynamicMemoryAllocation.md b/_posts/2023-12-04-33_DynamicMemoryAllocation.md deleted file mode 100644 index f0b5bce5511f..000000000000 --- a/_posts/2023-12-04-33_DynamicMemoryAllocation.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -layout: single -title: Chapter 33 메모리의 동적 할당 -date: 2023-12-04 18:56:13 +09:00 -categories: - - Language -tags: - - C -excerpt: 메모리의 동적 할당에 관한 글입니다. -toc: true ---- - -# 1 메모리의 동적 할당(dynamic allocation) - ->데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임(compile time)에 미리 결정된다. -하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 런 타임(run time)에 사용자가 직접 결정하게 된다. - -- 메모리의 동적 할당(dynamic allocation) - ->메모리의 동적 할당(dynamic allocation)이란 런 타임에 메모리를 할당받는 것을 의미한다. - -## 1.1 malloc() 함수 - -- malloc() - ->malloc() 함수는 프로그램이 실행 중일 때 사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해준다. - ->malloc() 함수의 원형은 다음과 같다. - -- 원형 - -```c -#include -void *malloc(size_t size);   -``` - ->malloc() 함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받는다. -이 함수는 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 블록을 찾는다. -이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환한다. - ->힙 영역에 할당할 수 있는 적당한 블록이 없을 때에는 널 포인터를 반환한다. -주소값을 반환받기 때문에 힙 영역에 할당된 메모리 공간으로 접근하려면 포인터를 사용해야 한다. - ->malloc() 함수의 원형에서 볼 수 있는 size_t 타입은 부호없는 정수이다. - -#### free() 함수 - -free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수입니다. -데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되어, 프로그램이 실행되는 내내 고정됩니다. -하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변화됩니다. -따라서 free() 함수를 사용하여 다 사용한 메모리를 해제해 주지 않으면, 메모리가 부족해지는 현상이 발생할 수 있습니다. -이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(memory leak)라고 합니다. - -free() 함수의 원형은 다음과 같습니다. diff --git a/_posts/2023-12-03-01_C.md b/_posts/Language/C/2023-12-03-01_C.md similarity index 100% rename from _posts/2023-12-03-01_C.md rename to _posts/Language/C/2023-12-03-01_C.md diff --git a/_posts/2023-12-03-02_CProgramming.md b/_posts/Language/C/2023-12-03-02_CProgramming.md similarity index 100% rename from _posts/2023-12-03-02_CProgramming.md rename to _posts/Language/C/2023-12-03-02_CProgramming.md diff --git a/_posts/2023-12-03-03_CProgram.md b/_posts/Language/C/2023-12-03-03_CProgram.md similarity index 100% rename from _posts/2023-12-03-03_CProgram.md rename to _posts/Language/C/2023-12-03-03_CProgram.md diff --git a/_posts/2023-12-03-04_Printf().md b/_posts/Language/C/2023-12-03-04_Printf().md similarity index 100% rename from _posts/2023-12-03-04_Printf().md rename to _posts/Language/C/2023-12-03-04_Printf().md diff --git a/_posts/2023-12-03-05_Scanf().md b/_posts/Language/C/2023-12-03-05_Scanf().md similarity index 100% rename from _posts/2023-12-03-05_Scanf().md rename to _posts/Language/C/2023-12-03-05_Scanf().md diff --git a/_posts/2023-12-03-06_Variable.md b/_posts/Language/C/2023-12-03-06_Variable.md similarity index 100% rename from _posts/2023-12-03-06_Variable.md rename to _posts/Language/C/2023-12-03-06_Variable.md diff --git a/_posts/2023-12-03-07_Constant.md b/_posts/Language/C/2023-12-03-07_Constant.md similarity index 100% rename from _posts/2023-12-03-07_Constant.md rename to _posts/Language/C/2023-12-03-07_Constant.md diff --git a/_posts/2023-12-03-08_BasicType.md b/_posts/Language/C/2023-12-03-08_BasicType.md similarity index 100% rename from _posts/2023-12-03-08_BasicType.md rename to _posts/Language/C/2023-12-03-08_BasicType.md diff --git a/_posts/2023-12-03-09_TypeCasting.md b/_posts/Language/C/2023-12-03-09_TypeCasting.md similarity index 100% rename from _posts/2023-12-03-09_TypeCasting.md rename to _posts/Language/C/2023-12-03-09_TypeCasting.md diff --git a/_posts/2023-12-03-10_ArithmeticOperator.md b/_posts/Language/C/2023-12-03-10_ArithmeticOperator.md similarity index 83% rename from _posts/2023-12-03-10_ArithmeticOperator.md rename to _posts/Language/C/2023-12-03-10_ArithmeticOperator.md index a2875d7a6749..4212166f16c2 100644 --- a/_posts/2023-12-03-10_ArithmeticOperator.md +++ b/_posts/Language/C/2023-12-03-10_ArithmeticOperator.md @@ -10,26 +10,26 @@ toc: true # 1 연산자(operator) -- 연산자 +- 연산자(operator) -> 연산자(operator)란 프로그램의 산술식이나 연산식을 +> 연산자(operator)란 프로그램의 산술식이나 연산식을 표현하고 처리하기 위해 제공되는 다양한 기호를 의미한다. > C 언어에서는 여러 종류의 연산을 위해 다양한 연산자를 제공하고 있다. ## 1.1 산술 연산자(arithmetic operator) -- 산술 연산자 +- 산술 연산자(arithmetic operator) -> 산술 연산자란 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자를 의미한다. +> 산술 연산자(arithmetic operator)란 사칙연산을 다루는 기본적이면서도 가장 많이 사용되는 연산자를 의미한다. -> 산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, +> 산술 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, 피연산자들의 결합 방향은 왼쪽에서 오른쪽이다. - 항 -> 항이란 해당 연산의 실행이 가능하기 위해 필요한 값이나 변수를 의미한다. -따라서 이항 연산자란 해당 연산의 실행을 위해서 +> 항이란 해당 연산의 실행이 가능하기 위해 필요한 값이나 변수를 의미한다. +따라서 이항 연산자란 해당 연산의 실행을 위해서 두 개의 값이나 변수가 필요한 연산자를 의미한다. ![](https://velog.velcdn.com/images/ecg/post/8e54c925-26b2-400a-b914-a5dd0280d238/image.png) @@ -59,11 +59,11 @@ printf("% 연산자에 의한 결괏값은 %d입니다.\n", num01 % num02); ## 1.2 연산자의 우선순위(operator precedence)와 결합 방향(associativity) -> 연산자의 우선순위는 수식 내에 여러 연산자가 함께 등장할 때, -어느 연산자가 먼저 처리될 것인가를 결정한다. +> 연산자의 우선순위는 수식 내에 여러 연산자가 함께 등장할 때, +어느 연산자가 먼저 처리될 것인가를 결정한다. -> 다음 그림은 가장 높은 우선순위를 가지고 있는 -괄호(()) 연산자를 사용하여 연산자의 처리 순서를 변경하는 것을 보여준다. +> 다음 그림은 가장 높은 우선순위를 가지고 있는 +괄호(()) 연산자를 사용하여 연산자의 처리 순서를 변경하는 것을 보여준다. ![](https://velog.velcdn.com/images/ecg/post/a43c5d73-8507-4abb-bc7c-749e8bbcc0d6/image.png) @@ -92,7 +92,7 @@ printf("% 연산자에 의한 결괏값은 %d입니다.\n", num01 % num02); ![](https://velog.velcdn.com/images/ecg/post/3f43f584-f53a-4a89-998f-f4477d4a79c6/image.png) -> 위의 표에서 나온 순서대로 우선순위가 빠른 연산자가 가장 먼저 실행된다. -또한, 같은 우선순위를 가지는 연산자가 둘 이상 있을 때에는 +> 위의 표에서 나온 순서대로 우선순위가 빠른 연산자가 가장 먼저 실행된다. +또한, 같은 우선순위를 가지는 연산자가 둘 이상 있을 때에는 결합 순서에 따라 실행 순서가 결정된다. diff --git a/_posts/2023-12-03-11_AssignmentOperator.md b/_posts/Language/C/2023-12-03-11_AssignmentOperator.md similarity index 82% rename from _posts/2023-12-03-11_AssignmentOperator.md rename to _posts/Language/C/2023-12-03-11_AssignmentOperator.md index b21cc749fdce..02ccd8489eed 100644 --- a/_posts/2023-12-03-11_AssignmentOperator.md +++ b/_posts/Language/C/2023-12-03-11_AssignmentOperator.md @@ -10,11 +10,11 @@ toc: true # 1 대입 연산자(assignment operator) -- 대입 연산자 +- 대입 연산자(assignment operator) -> 대입 연산자란 변수에 값을 대입할 때 사용하는 이항 연산자를 의미한다. +> 대입 연산자(assignment operator)란 변수에 값을 대입할 때 사용하는 이항 연산자를 의미한다. -> 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다. +> 피연산자들의 결합 방향은 오른쪽에서 왼쪽이다. 또한, 산술 연산자와 결합한 다양한 복합 대입 연산자가 존재한다. ![](https://velog.velcdn.com/images/ecg/post/261fda28-96ee-4f71-9bf9-5c9695e2ab99/image.png) @@ -43,5 +43,5 @@ printf("=- 연산자에 의한 결괏값은 %d입니다.\n", num03); =- 연산자에 의한 결괏값은 -5입니다. ``` -> 위의 예제에서 num03 =- 5 연산은 단순히 -5를 변수 num03에 대입(=)하는 연산이 되었다. +> 위의 예제에서 num03 =- 5 연산은 단순히 -5를 변수 num03에 대입(=)하는 연산이 되었다. 이처럼 복합 대입 연산자에서 연산자의 순서는 매우 중요하다. diff --git a/_posts/2023-12-03-12_IncrementAndDecrementOperator.md b/_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md similarity index 86% rename from _posts/2023-12-03-12_IncrementAndDecrementOperator.md rename to _posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md index dd10d9cfb4d5..98fdfd642184 100644 --- a/_posts/2023-12-03-12_IncrementAndDecrementOperator.md +++ b/_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md @@ -10,13 +10,13 @@ toc: true # 1 증감 연산자(increment and decrement operator) -- 증감 연산자 +- 증감 연산자(increment and decrement operator) -> 증감 연산자란 피연산자를 1씩 증가 혹은 1씩 감소시킬 때 사용하는 연산자를 의미한다. +> 증감 연산자(increment and decrement operator)란 피연산자를 1씩 증가 혹은 1씩 감소시킬 때 사용하는 연산자를 의미한다. > 이 연산자는 피연산자가 단 하나뿐인 단항 연산자이다. -> 증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 +> 증감 연산자는 해당 연산자가 피연산자의 어느 쪽에 위치하는가에 따라 연산의 순서 및 결과가 달라진다. ![](https://velog.velcdn.com/images/ecg/post/76c0c662-330b-43cb-9c15-5f7957b888ef/image.png) @@ -42,9 +42,9 @@ printf("후위 증가 연산자에 의한 결괏값은 %d이고, 변수의 값 후위 증가 연산자에 의한 결괏값은 2이고, 변수의 값은 8로 변했습니다. ``` -> 위의 예제에서 첫 번째 연산은 변수 num01의 값을 먼저 1 증가시킨 후에 나머지 연산을 수행한다. -하지만 두 번째 연산에서는 먼저 모든 연산을 마친 후에 변수 num02의 값을 1 증가시킨다. -따라서 변수 num02의 증가는 관련된 연산에 아무런 영향도 미치지 않는다. +> 위의 예제에서 첫 번째 연산은 변수 num01의 값을 먼저 1 증가시킨 후에 나머지 연산을 수행한다. +하지만 두 번째 연산에서는 먼저 모든 연산을 마친 후에 변수 num02의 값을 1 증가시킨다. +따라서 변수 num02의 증가는 관련된 연산에 아무런 영향도 미치지 않는다. ## 1.1 증감 연산자의 연산 순서 @@ -71,7 +71,7 @@ printf("변수 x의 값은 %d이고, 변수 y의 값은 %d입니다.\n", x, y); ![](https://velog.velcdn.com/images/ecg/post/657bb35d-f99c-44d6-b90f-8bc2fba1efb3/image.png) -① : 첫 번째 감소 연산자(decrement operator)는 피연산자의 뒤쪽에 위치하므로, +① : 첫 번째 감소 연산자(decrement operator)는 피연산자의 뒤쪽에 위치하므로, 덧셈 연산이 먼저 수행된다. ② : 덧셈 연산이 수행된 후에 감소 연산이 수행된다. (x의 값 : 9) diff --git a/_posts/2023-12-03-13_ComparisonOperator.md b/_posts/Language/C/2023-12-03-13_ComparisonOperator.md similarity index 78% rename from _posts/2023-12-03-13_ComparisonOperator.md rename to _posts/Language/C/2023-12-03-13_ComparisonOperator.md index 820e43c14a44..0e856b7f4490 100644 --- a/_posts/2023-12-03-13_ComparisonOperator.md +++ b/_posts/Language/C/2023-12-03-13_ComparisonOperator.md @@ -10,14 +10,14 @@ toc: true # 1 비교 연산자(comparison operator) -- 비교 연산자 +- 비교 연산자(comparison operator) -> 비교 연산자란 피연산자 사이의 상대적인 크기를 판단하는 연산자를 의미한다. +> 비교 연산자(comparison operator)란 피연산자 사이의 상대적인 크기를 판단하는 연산자를 의미한다. -> 비교 연산자는 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, -어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단한다. -> 비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, -피연산자들의 결합 방향은 왼쪽에서 오른쪽이다. +> 비교 연산자는 왼쪽의 피연산자와 오른쪽의 피연산자를 비교하여, +어느 쪽이 더 큰지, 작은지, 또는 서로 같은지를 판단한다. +> 비교 연산자는 모두 두 개의 피연산자를 가지는 이항 연산자이며, +피연산자들의 결합 방향은 왼쪽에서 오른쪽이다. ![](https://velog.velcdn.com/images/ecg/post/6f4f904d-d9d2-4c49-8e0a-e44d39a726ba/image.png) diff --git a/_posts/2023-12-03-14_LogicalOperator.md b/_posts/Language/C/2023-12-03-14_LogicalOperator.md similarity index 80% rename from _posts/2023-12-03-14_LogicalOperator.md rename to _posts/Language/C/2023-12-03-14_LogicalOperator.md index 16383c3115ea..3d6c5d404af1 100644 --- a/_posts/2023-12-03-14_LogicalOperator.md +++ b/_posts/Language/C/2023-12-03-14_LogicalOperator.md @@ -10,14 +10,14 @@ toc: true # 1 논리 연산자(logical operator) -- 논리 연산자 +- 논리 연산자(logical operator) -> 논리 연산자란 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자를 의미한다. +> 논리 연산자(logical operator)란 주어진 논리식을 판단하여, 참(true)과 거짓(false)을 결정하는 연산자를 의미한다. -> AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, -피연산자들의 결합 방향은 왼쪽에서 오른쪽이다. -NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, -피연산자의 결합 방향은 오른쪽에서 왼쪽이다. +> AND 연산과 OR 연산은 두 개의 피연산자를 가지는 이항 연산자이며, +피연산자들의 결합 방향은 왼쪽에서 오른쪽이다. +NOT 연산자는 피연산자가 단 하나뿐인 단항 연산자이며, +피연산자의 결합 방향은 오른쪽에서 왼쪽이다. ![](https://velog.velcdn.com/images/ecg/post/4a5a994c-e71e-4366-a9bc-4febee2b452a/image.png) @@ -50,6 +50,6 @@ printf(" ! 연산자에 의한 결괏값은 %d입니다.\n", !result02); ! 연산자에 의한 결괏값은 0입니다. ``` -> 컴퓨터에서 참(true)은 보통 1로 표현되고, 거짓(false)은 0으로 표현된다. +> 컴퓨터에서 참(true)은 보통 1로 표현되고, 거짓(false)은 0으로 표현된다. 하지만 C언어에서는 음수를 포함해 0이 아닌 모든 수가 참(true)으로 취급된다. diff --git a/_posts/2023-12-03-15_BitwiseOperator.md b/_posts/Language/C/2023-12-03-15_BitwiseOperator.md similarity index 82% rename from _posts/2023-12-03-15_BitwiseOperator.md rename to _posts/Language/C/2023-12-03-15_BitwiseOperator.md index 2c621b82d05b..e1a0dc806905 100644 --- a/_posts/2023-12-03-15_BitwiseOperator.md +++ b/_posts/Language/C/2023-12-03-15_BitwiseOperator.md @@ -10,34 +10,34 @@ toc: true # 1 비트 연산자(bitwise operator) -- 비트 연산자 +- 비트 연산자(bitwise operator) -> 비트 연산자란 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자를 의미한다. +> 비트 연산자(bitwise operator)란 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자를 의미한다. > 또한, 비트 단위로 전체 비트를 왼쪽이나 오른쪽으로 이동시킬 때도 사용한다. ![](https://velog.velcdn.com/images/ecg/post/24c86468-2b2d-41c5-b9c1-5584c59d6ee8/image.png) -> 다음 그림은 비트 AND 연산자(&)의 동작을 나타낸다. -이처럼 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, +> 다음 그림은 비트 AND 연산자(&)의 동작을 나타낸다. +이처럼 비트 AND 연산자는 대응되는 두 비트가 모두 1일 때만 1을 반환하며, 다른 경우는 모두 0을 반환한다. ![](https://velog.velcdn.com/images/ecg/post/7cec40d3-b84a-4eb5-81b7-a547f59ea2b4/image.png) -> 다음 그림은 비트 OR 연산자(|)의 동작을 나타낸다. -이처럼 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, +> 다음 그림은 비트 OR 연산자(|)의 동작을 나타낸다. +이처럼 비트 OR 연산자는 대응되는 두 비트 중 하나라도 1이면 1을 반환하며, 두 비트가 모두 0일 때만 0을 반환한다. ![](https://velog.velcdn.com/images/ecg/post/8fdf9f18-94e6-48c4-b69a-b50d65b2fe5d/image.png) -> 다음 그림은 비트 XOR 연산자(^)의 동작을 나타낸다. -이처럼 비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, +> 다음 그림은 비트 XOR 연산자(^)의 동작을 나타낸다. +이처럼 비트 XOR 연산자는 대응되는 두 비트가 서로 다르면 1을 반환하고, 서로 같으면 0을 반환한다. ![](https://velog.velcdn.com/images/ecg/post/b18082b3-eeff-4b4a-8c28-8cf88e9ce27f/image.png) -> 다음 그림은 비트 NOT 연산자(~)의 동작을 나타낸다. -이처럼 비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환한다. +> 다음 그림은 비트 NOT 연산자(~)의 동작을 나타낸다. +이처럼 비트 NOT 연산자는 해당 비트가 1이면 0을 반환하고, 0이면 1을 반환한다. ![](https://velog.velcdn.com/images/ecg/post/8872793a-1d5b-4bb6-8bd5-413460192262/image.png) diff --git a/_posts/2023-12-03-16_OtherOperator.md b/_posts/Language/C/2023-12-03-16_OtherOperator.md similarity index 72% rename from _posts/2023-12-03-16_OtherOperator.md rename to _posts/Language/C/2023-12-03-16_OtherOperator.md index b1f41f17fed3..b619000ed5a0 100644 --- a/_posts/2023-12-03-16_OtherOperator.md +++ b/_posts/Language/C/2023-12-03-16_OtherOperator.md @@ -10,10 +10,9 @@ toc: true # 1 삼항 연산자(ternary operator) -- 삼항 연산자 +- 삼항 연산자(ternary operator) -> 삼항 연산자란 다른 언어에는 존재하지 않는 C 언어만의 독특한 연산자를 의미한다. -이 연산자는 C언어에서도 유일하게 피연산자를 세 개나 가지는 조건 연산자이다. +> 삼항 연산자(ternary operator)란 C 언어에서 유일하게 피연산자를 세 개나 가지는 조건 연산자를 의미한다. > 삼항 연산자의 문법은 다음과 같다. @@ -23,9 +22,9 @@ toc: true 조건식 ? 반환값1 : 반환값2 ``` -> 물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, -결괏값이 거짓(false)이면 반환값2를 반환된다. -이때 반환값에는 값뿐만 아니라 수식, 함수 호출 등 +> 물음표(?) 앞의 조건식에 따라 결괏값이 참(true)이면 반환값1을 반환하고, +결괏값이 거짓(false)이면 반환값2를 반환된다. +이때 반환값에는 값뿐만 아니라 수식, 함수 호출 등 여러 가지 형태의 명령문이 올 수 있다. - 예제 @@ -41,20 +40,20 @@ printf("둘 중에 더 큰수는 %d입니다.\n", result); - 실행 결과 -> 둘 중에 더 큰수는 15이다. +> 둘 중에 더 큰수는 15이다. -> 삼항 연산자는 짧은 if / else 문 대신에 사용할 수 있으며, +> 삼항 연산자는 짧은 if / else 문 대신에 사용할 수 있으며, 코드를 간결하게 작성할 수 있도록 도와준다. # 2 쉼표 연산자 - 쉼표 연산자 -> 쉼표(,) 연산자란 얼핏 연산자가 아닌 것처럼 보이지만 다양한 용도로 사용되는 연산자를 의미한다. 이 연산자는 어떠한 연산을 수행하는 것이 아니라 다음과 같은 상황에서 사용된다. +> 쉼표(,) 연산자란 얼핏 연산자가 아닌 것처럼 보이지만 다양한 용도로 사용되는 연산자를 의미한다. 이 연산자는 어떠한 연산을 수행하는 것이 아니라 다음과 같은 상황에서 사용된다. - - 두 연산식을 하나의 연산식으로 나타내고자 할 때 + 1. 두 연산식을 하나의 연산식으로 나타내고자 할 때 - - 둘 이상의 인수를 함수로 전달하고자 할 때 + 2. 둘 이상의 인수를 함수로 전달하고자 할 때 - 예제 @@ -69,15 +68,15 @@ printf("첫 번째 수는 %d이고, 두 번째 수는 %d입니다.\n", num01, nu 첫 번째 수는 15이고, 두 번째 수는 8입니다. ``` -> 위의 예제에서 쉼표 연산자는 둘 이상의 변수를 동시에 선언하기 위해서 사용되었다. +> 위의 예제에서 쉼표 연산자는 둘 이상의 변수를 동시에 선언하기 위해서 사용되었다. 또한, printf() 함수에서는 둘 이상의 인수를 동시에 printf() 함수로 전달하기 위해서 사용되었다. # 3 sizeof 연산자 -> 사용자의 컴퓨터 환경에 따라 타입에 할당되는 메모리의 크기가 달라질 수 있다. -sizeof 연산자는 단항 연산자로 피연산자의 크기를 바이트 단위로 반환한다. -이 연산자는 피연산자로 타입뿐만 아니라 변수나 상수를 전달받을 수도 있다. -sizeof 연산자에 변수나 상수가 피연산자로 전달되면, +> 사용자의 컴퓨터 환경에 따라 타입에 할당되는 메모리의 크기가 달라질 수 있다. +sizeof 연산자는 단항 연산자로 피연산자의 크기를 바이트 단위로 반환한다. +이 연산자는 피연산자로 타입뿐만 아니라 변수나 상수를 전달받을 수도 있다. +sizeof 연산자에 변수나 상수가 피연산자로 전달되면, 해당 변수나 상수에 해당하는 타입의 크기를 반환해 준다. - 예제 @@ -102,18 +101,18 @@ char: 1, short: 2, int: 4, long: 4, long long: 8 # 4 포인터 연산자 -> C언어에서 포인터와 연관되어 사용되는 연산자는 다음과 같다. +> C 언어에서 포인터와 연관되어 사용되는 연산자는 다음과 같다. 1. 주소 연산자(&) 2. 참조 연산자(*) -> 주소 연산자(&)는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다. +> 주소 연산자(&)는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다. '&'기호는 앰퍼샌드(ampersand)라고 읽으며, 번지 연산자라고도 불린다. -> 참조 연산자(*)는 포인터의 이름이나 주소 앞에 사용하여, +> 참조 연산자(*)는 포인터의 이름이나 주소 앞에 사용하여, 포인터에 가리키는 주소에 저장된 값을 반환한다. -> C 언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용된다. -> 이항 연산자로 사용하면 곱셈 연산으로 사용되며, +> C 언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용된다. +> 이항 연산자로 사용하면 곱셈 연산으로 사용되며, 포인터의 선언 시나 메모리에 접근할 때도 사용된다. \ No newline at end of file diff --git a/_posts/2023-12-03-17_ConditionalStatement.md b/_posts/Language/C/2023-12-03-17_ConditionalStatement.md similarity index 75% rename from _posts/2023-12-03-17_ConditionalStatement.md rename to _posts/Language/C/2023-12-03-17_ConditionalStatement.md index c818b29d1bc2..9196bbceef3d 100644 --- a/_posts/2023-12-03-17_ConditionalStatement.md +++ b/_posts/Language/C/2023-12-03-17_ConditionalStatement.md @@ -10,23 +10,23 @@ toc: true # 1 제어문(control flow statements) -> C 프로그램은 절차적 프로그램(procedural program) -또는 명령형 프로그램(Imperative program)에 속한다. -C 프로그램에는 수많은 명령문이 포함되어 있으며, -이 명령문은 처음부터 끝까지 순서대로 실행된다. -따라서 원하는 결과를 얻기 위해서는 프로그램의 +> C 프로그램은 절차적 프로그램(procedural program) +또는 명령형 프로그램(Imperative program)에 속한다. +C 프로그램에는 수많은 명령문이 포함되어 있으며, +이 명령문은 처음부터 끝까지 순서대로 실행된다. +따라서 원하는 결과를 얻기 위해서는 프로그램의 이러한 순차적인 흐름을 제어해야만 한다. -> 이때 사용하는 명령문을 제어문이라고 하며, -제어문에는 조건문, 반복문 등이 있다. -제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있으며, +> 이때 사용하는 명령문을 제어문이라고 하며, +제어문에는 조건문, 반복문 등이 있다. +제어문에 속하는 명령문들은 중괄호({})로 둘러싸여 있으며, 이러한 중괄호 영역을 블록(block)이라고 한다. ## 1.1 조건문(conditional statements) -- 조건문 +- 조건문(conditional statements) -> 조건문이란 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문을 의미한다. +> 조건문(conditional statements)이란 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문을 의미한다. > 조건문 중에서도 가장 기본이 되는 명령문은 바로 if 문이다. @@ -39,7 +39,8 @@ C 프로그램에는 수많은 명령문이 포함되어 있으며, ## 1.2 if 문 -> if 문은 조건식의 결과가 참(true)이면 주어진 명령문을 실행하며, 거짓(false)이면 아무것도 실행하지 않는다. +> if 문은 조건식의 결과가 참(true)이면 주어진 명령문을 실행하며, +> 거짓(false)이면 아무것도 실행하지 않는다. > if 문을 순서도로 표현하면 다음 그림과 같다. @@ -56,12 +57,16 @@ if (조건식) } ``` -> 위의 코드에서 블록에 속한 명령문은 중괄호({})를 기준으로 -오른쪽으로 들여쓰기가 되어 있는 것을 볼 수 있다. -이처럼 들여쓰기를 통해 코드의 가독성을 높이는 것을 인덴트(indent)라고 하며, -될 수 있으면 모든 코드를 인덴트하는 것이 좋다. +> 위의 코드에서 블록에 속한 명령문은 중괄호({})를 기준으로 +오른쪽으로 들여쓰기가 되어 있는 것을 볼 수 있다. -> 다음 예제는 if 문을 3번 연속해서 사용하여, +- 인덴트(indent) + +>인덴트(indent)란 들여쓰기를 통해 코드의 가독성을 높이는 것을 의미한다. + +>될 수 있으면 모든 코드를 인덴트하는 것이 좋다. + +> 다음 예제는 if 문을 3번 연속해서 사용하여, 사용자가 입력한 수와 숫자 5를 비교하여 그 결괏값을 출력하는 예제이다. - 예제 @@ -146,15 +151,15 @@ else ## 1.4 if / else if / else 문 -> else if 문은 if 문처럼 조건식을 가질 수 있기 때문에 -중첩된 if 문을 좀 더 간결하게 표현할 수 있도록 해준다. -하나의 조건문 안에서 if 문과 else 문은 단 한 번만 사용될 수 있다. -하지만 else if 문은 여러 번 사용될 수 있어서 +> else if 문은 if 문처럼 조건식을 가질 수 있기 때문에 +중첩된 if 문을 좀 더 간결하게 표현할 수 있도록 해준다. +하나의 조건문 안에서 if 문과 else 문은 단 한 번만 사용될 수 있다. +하지만 else if 문은 여러 번 사용될 수 있어서 복잡한 조건도 표현할 수 있다. > if / else if / else 문을 순서도로 표현하면 다음 그림과 같다. -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/0f3d12d8-e175-4d81-ae18-a02ce9f73e56) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/03bc8c46-94bd-461c-8032-a2a0e0b58c6d) > C 언어에서 else if 문의 문법은 다음과 같다. @@ -215,12 +220,15 @@ else ## 1.6 switch 문 -> switch 문은 if / else 문과 마찬가지로 주어진 조건 값의 결과에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문이다. -이러한 switch 문은 if / else 문보다 가독성이 더 좋으며, 컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른 편이다. +> switch 문은 if / else 문과 마찬가지로 주어진 조건 값의 결과에 따라 +> 프로그램이 다른 명령을 수행하도록 하는 조건문이다. +이러한 switch 문은 if / else 문보다 가독성이 더 좋으며, +컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른 편이다. -> 하지만 switch 문의 조건 값으로는 int형으로 승격할 수 있는(integer promotion) 값만이 사용될 수 있다. -즉, C언어에서는 char형, short형, int형 변수나 -리터럴과 열거체까지 사용할 수 있다. +> 하지만 switch 문의 조건 값으로는 int형으로 +> 승격할 수 있는(integer promotion) 값만이 사용될 수 있다. +즉, C 언어에서는 char형, short형, int형 변수나 +리터럴과 열거체까지 사용할 수 있다. 따라서 if / else 문보다는 사용할 수 있는 상황이 적은 편이다. > C 언어에서 switch 문의 문법은 다음과 같다. @@ -243,7 +251,7 @@ switch (조건 값) } ``` -> default 절은 조건 값이 위에 나열된 +> default 절은 조건 값이 위에 나열된 어떠한 case 절에도 해당하지 않을 때 실행된다. > 이 구문은 반드시 존재해야 하는 것은 아니며 필요할 때에만 선언할 수 있다. @@ -283,8 +291,11 @@ switch (num) 입력하신 수는 2입니다. ``` -> 각 case 절 및 default 절은 반드시 break 키워드를 포함하고 있어야 한다. break 키워드는 조건 값에 해당하는 case 절이나 default 절이 실행된 뒤에 전체 switch 문을 빠져나가게 해준다. -만약에 break 키워드가 없다면, 조건에 해당하는 switch 문의 case 절 이후의 모든 case 절이 전부 실행될 것이다. +> 각 case 절 및 default 절은 반드시 break 키워드를 포함하고 있어야 한다. +> break 키워드는 조건 값에 해당하는 case 절이나 default 절이 실행된 뒤에 +> 전체 switch 문을 빠져나가게 해준다. +만약에 break 키워드가 없다면, +조건에 해당하는 switch 문의 case 절 이후의 모든 case 절이 전부 실행될 것이다. > 다음 예제는 앞서 살펴본 예제에서 break 키워드를 모두 삭제한 예제이다. @@ -319,10 +330,12 @@ switch (num) 1부터 5까지의 수만 입력해 주세요! ``` -> 위의 예제처럼 break 키워드가 없으면, 조건 값에 해당하는 case 절뿐만 아니라 그 이후에 등장하는 모든 case 절과 default 절이 전부 실행됨을 알 수 있다. +> 위의 예제처럼 break 키워드가 없으면, 조건 값에 해당하는 case 절뿐만 아니라 +> 그 이후에 등장하는 모든 case 절과 default 절이 전부 실행됨을 알 수 있다. -> 다음 예제는 조건 값으로 여러 개의 char형 문자를 검사하는 예제이다. -이렇게 switch 문의 조건으로 여러 개의 case 절을 사용하여 여러 개의 조건을 한 번에 검사할 수 있다. +> 다음 예제는 조건 값으로 여러 개의 char형 문자를 검사하는 예제이다. +이렇게 switch 문의 조건으로 여러 개의 case 절을 사용하여 +여러 개의 조건을 한 번에 검사할 수 있다. - 예제 diff --git a/_posts/2023-12-03-18_IterationStatement.md b/_posts/Language/C/2023-12-03-18_IterationStatement.md similarity index 75% rename from _posts/2023-12-03-18_IterationStatement.md rename to _posts/Language/C/2023-12-03-18_IterationStatement.md index 60d30651db4e..3a1345e1cf45 100644 --- a/_posts/2023-12-03-18_IterationStatement.md +++ b/_posts/Language/C/2023-12-03-18_IterationStatement.md @@ -12,9 +12,9 @@ toc: true # 1 반복문(iteration statements) -- 반복문 +- 반복문(iteration statements) -> 반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문을 의미한다. +> 반복문(iteration statements)이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문을 의미한다. > 프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문 중 하나이다. @@ -30,7 +30,7 @@ toc: true > while 문은 특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행한다. -> C언어에서 while 문의 문법은 다음과 같다. +> C 언어에서 while 문의 문법은 다음과 같다. - 문법 @@ -41,14 +41,14 @@ while (조건식) } ``` -![[Pasted image 20231203135844.png]] +![image](https://github.com/EunChong999/EunChong999/assets/136239807/a65f40e0-df83-4ff0-9be6-c31c1041b430) -> while 문은 우선 조건식이 참(true)인지를 판단하여, - 참이면 내부의 명령문을 실행한다. - 이렇게 내부의 명령문을 전부 실행하고 나면, - 다시 조건식으로 돌아와 또 한 번 참인지를 판단하게 된다. +> while 문은 우선 조건식이 참(true)인지를 판단하여, + 참이면 내부의 명령문을 실행한다. + 이렇게 내부의 명령문을 전부 실행하고 나면, + 다시 조건식으로 돌아와 또 한 번 참인지를 판단하게 된다. -- 루프 +- 루프(loop) > 루프(loop)란 표현식의 검사를 통해 반복해서 실행되는 반복문을 의미한다. @@ -77,26 +77,27 @@ while 문이 5 번째 반복 수행중입니다. while 문이 종료된 후 변수 i의 값은 5입니다. ``` -> while 문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않을 때는 -> 프로그램이 영원히 반복되게 된다. - 이것을 무한 루프(infinite loop)에 빠졌다고 한다. - 반복문에서 조건식의 거짓일때 반복문이 종료가되지만, - 무한루프는 조건식의 거짓이 없이 항상 참이므로 반복문이 종료되지 않고 - 무한히 실행되는 반복문을 말한다. - 무한 루프에 빠진 프로그램은 영원히 종료되지 않는다. +> while 문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않을 때는 +> 프로그램이 영원히 반복되게 된다. + 이것을 무한 루프(infinite loop)에 빠졌다고 한다. + 반복문에서 조건식의 거짓일때 반복문이 종료가되지만, + 무한루프는 조건식의 거짓이 없이 항상 참이므로 반복문이 종료되지 않고 + 무한히 실행되는 반복문을 말한다. + 무한 루프에 빠진 프로그램은 영원히 종료되지 않는다. -> 무한 루프는 특별히 의도한 경우가 아니라면 반드시 피해야 하는 상황이다. - 따라서 while 문을 작성할 때는 조건식의 결과가 어느 순간 거짓(false)을 갖도록 +> 무한 루프는 특별히 의도한 경우가 아니라면 반드시 피해야 하는 상황이다. + 따라서 while 문을 작성할 때는 조건식의 결과가 어느 순간 거짓(false)을 갖도록 조건식의 결과를 변경하는 명령문을 반드시 포함시켜야 한다. -> 위의 예제에서 조건식의 결과를 변경하는 명령문인 i++를 제거하면, 변수 i의 값은 언제나 0이기 때문에 무한 루프에 빠지게 된다. +> 위의 예제에서 조건식의 결과를 변경하는 명령문인 i++를 제거하면, +> 변수 i의 값은 언제나 0이기 때문에 무한 루프에 빠지게 된다. > while 문에서 실행될 명령문이 한 줄 뿐이라면 중괄호({})를 생략할 수 있다. ## 1.2 do / while 문 -> while 문은 루프에 진입하기 전에 먼저 조건식부터 검사한다. -> 하지만 do / while 문은 먼저 루프를 한 번 실행한 후에 조건식을 검사한다. +> while 문은 루프에 진입하기 전에 먼저 조건식부터 검사한다. +> 하지만 do / while 문은 먼저 루프를 한 번 실행한 후에 조건식을 검사한다. > 즉, do / while 문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행한다. > C 언어에서 do / while 문의 문법은 다음과 같다. @@ -109,7 +110,7 @@ do { } while (조건식); ``` -![[Pasted image 20231203140231.png]] +![image](https://github.com/EunChong999/EunChong999/assets/136239807/45ed162d-a3ab-4dcf-bdd2-df22f10f76d1) - 예제 @@ -131,14 +132,14 @@ do / while 문이 1 번째 반복 수행중입니다. while 문이 종료된 후 변수 i의 값은 1입니다. ``` -> 위의 예제가 만약 while 문이었다면 단 한 번의 출력도 없었을 것이다. +> 위의 예제가 만약 while 문이었다면 단 한 번의 출력도 없었을 것이다. > 하지만 do / while 문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행해준다. ## 1.3 for 문 -> for 문은 while 문과는 달리 자체적으로 -> 초기식, 조건식, 증감식을 모두 포함하고 있는 반복문이다. -> 따라서 while 문보다는 좀 더 간결하게 반복문을 표현할 수 있다. +> for 문은 while 문과는 달리 자체적으로 +> 초기식, 조건식, 증감식을 모두 포함하고 있는 반복문이다. +> 따라서 while 문보다는 좀 더 간결하게 반복문을 표현할 수 있다. > C 언어에서 for 문의 문법은 다음과 같다. @@ -151,7 +152,7 @@ for (초기식; 조건식; 증감식)  } ``` -![[Pasted image 20231203142032.png]] +![image](https://github.com/EunChong999/EunChong999/assets/136239807/48b01857-ff32-449b-94eb-c4d7411c7d14) > 이때 for 문을 구성하는 초기식, 조건식, 증감식은 각각 생략될 수 있다. diff --git a/_posts/2023-12-03-19_ControlStatement.md b/_posts/Language/C/2023-12-03-19_ControlStatement.md similarity index 77% rename from _posts/2023-12-03-19_ControlStatement.md rename to _posts/Language/C/2023-12-03-19_ControlStatement.md index 914cbe0402ec..9dbda96dcce2 100644 --- a/_posts/2023-12-03-19_ControlStatement.md +++ b/_posts/Language/C/2023-12-03-19_ControlStatement.md @@ -10,15 +10,15 @@ toc: true # 1 루프의 제어 -> 일반적으로 조건식의 검사를 통해 루프로 진입하면,  -> 다음 조건식을 검사하기 전까지 루프 안에 있는 모든 명령문을 실행한다. -> 하지만 continue 문과 break 문은 이러한 일반적인 루프의 흐름을 +> 일반적으로 조건식의 검사를 통해 루프로 진입하면,  +> 다음 조건식을 검사하기 전까지 루프 안에 있는 모든 명령문을 실행한다. +> 하지만 continue 문과 break 문은 이러한 일반적인 루프의 흐름을 > 사용자가 직접 제어할 수 있도록 해준다. -# 1.1 continue 문 +## 1.1 continue 문 -> continue 문은 루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, - 바로 다음 조건식의 판단으로 넘어가게 한다. +> continue 문은 루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, + 바로 다음 조건식의 판단으로 넘어가게 한다. > 보통 반복문 내에서 특정 조건에 대한 예외 처리를 하고자 할 때 자주 사용된다. > 다음 예제는 1부터 100까지의 정수 중에서 3의 배수를 제외하고 출력하는 예제이다. @@ -53,15 +53,13 @@ for (i = 1; i <= 100; i++) 100 ``` -> 위의 예제에서 변수 i의 값이 3의 배수인 경우에는 continue 문을 이용하여 +> 위의 예제에서 변수 i의 값이 3의 배수인 경우에는 continue 문을 이용하여 > for 문의 printf() 함수 부분을 건너뛰고 있다. ---- - -# 1.2 break 문 +## 1.2 break 문 -> break 문은 루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤, -> 반복문 바로 다음에 위치한 명령문을 실행한다. +> break 문은 루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤, +> 반복문 바로 다음에 위치한 명령문을 실행한다. > 즉 루프 내에서 조건식의 판단 결과에 상관없이 반복문을 완전히 빠져나가고 싶을 때 사용한다. > 다음 예제는 1부터 10까지의 합을 구하는 예제이다. @@ -90,7 +88,8 @@ while (1) 1부터 10까지 더한 값은 55입니다. ``` -> 위의 예제에서는 변수 start_num의 값이 end_num의 값과 같아지면, 무조건 while 문을 종료하게 된다. +> 위의 예제에서는 변수 start_num의 값이 end_num의 값과 같아지면, +> 무조건 while 문을 종료하게 된다. > 다음 예제는 구구단에서 5단까지 각 단의 수만큼만 출력하는 예제이다. @@ -135,15 +134,14 @@ for (i = 2; i <= 5; i++) 5 * 5 = 25 ``` -> 위의 예제는 두 개의 for 문을 중첩해서 사용하여 구구단을 출력하고 있다. - 이때 내부의 for 문은 변수 i와 j의 값이 같아지면, break 문을 호출하여 내부의 for 문을 빠져나간다. - 따라서 구구단의 각 단이 해당 단의 수만큼만 출력될 수 있다. - ---- +> 위의 예제는 두 개의 for 문을 중첩해서 사용하여 구구단을 출력하고 있다. + 이때 내부의 for 문은 변수 i와 j의 값이 같아지면, + break 문을 호출하여 내부의 for 문을 빠져나간다. + 따라서 구구단의 각 단이 해당 단의 수만큼만 출력될 수 있다. -# 1.3 goto 문 +## 1.3 goto 문 -> goto 문은 프로그램의 흐름을 지정된 레이블(label)로 무조건 변경시키는 명령문이다. - goto 문은 다른 제어문과는 달리 아무런 조건 없이 프로그램의 흐름을 옮겨준다. - 따라서 가장 손쉽게 사용할 수 있지만, 반면에 프로그램의 흐름을 매우 복잡하게 만들기도 한다. - 이러한 단점 때문에 현재는 디버깅 이외에는 거의 사용되지 않는다. +> goto 문은 프로그램의 흐름을 지정된 레이블(label)로 무조건 변경시키는 명령문이다. + goto 문은 다른 제어문과는 달리 아무런 조건 없이 프로그램의 흐름을 옮겨준다. + 따라서 가장 손쉽게 사용할 수 있지만, 반면에 프로그램의 흐름을 매우 복잡하게 만들기도 한다. + 이러한 단점 때문에 현재는 디버깅 이외에는 거의 사용되지 않는다. diff --git a/_posts/2023-12-03-20_CLanguageFunction.md b/_posts/Language/C/2023-12-03-20_CLanguageFunction.md similarity index 79% rename from _posts/2023-12-03-20_CLanguageFunction.md rename to _posts/Language/C/2023-12-03-20_CLanguageFunction.md index 76979c901f77..d21d146c9a0c 100644 --- a/_posts/2023-12-03-20_CLanguageFunction.md +++ b/_posts/Language/C/2023-12-03-20_CLanguageFunction.md @@ -14,15 +14,15 @@ toc: true - 함수 -> 프로그래밍에서 함수(function)란 하나의 특별한 목적의 작업을 수행하기 위해  - 독립적으로 설계된 프로그램 코드의 집합을 의미한다. - C 프로그램은 이러한 함수들로 구성되며, 포함된 함수들을 사용하여 프로그램의 목적을 달성하게 된다. +> 프로그래밍에서 함수(function)란 하나의 특별한 목적의 작업을 수행하기 위해  + 독립적으로 설계된 프로그램 코드의 집합을 의미한다. + + >C 프로그램은 이러한 함수들로 구성되며, + 포함된 함수들을 사용하여 프로그램의 목적을 달성하게 된다. -> C언어에서 함수는 크게 표준 함수와 사용자 정의 함수로 구분할 수 있다. +> C 언어에서 함수는 크게 표준 함수와 사용자 정의 함수로 구분할 수 있다. ---- - -# 1.1 함수를 사용하는 이유 +## 1.1 함수를 사용하는 이유 > 함수를 사용하는 가장 큰 이유는 바로 반복적인 프로그래밍을 피할 수 있기 때문이다. > 프로그램에서 특정 작업을 여러 번 반복해야 할 때는 해당 작업을 수행하는 함수를 작성하면 된다. @@ -33,11 +33,9 @@ toc: true > 함수의 크기에 대해서 정확히 명시된 규칙은 없으나, > 대략 하나의 기능을 하나의 함수로 만드는 것이 가장 좋다. ---- - -# 1.2 함수의 정의 +## 1.2 함수의 정의 -> C언어에서 사용자 정의 함수를 정의하는 방법은 다음 그림과 같다. +> C 언어에서 사용자 정의 함수를 정의하는 방법은 다음 그림과 같다. ![함수 선언](https://tcpschool.com/lectures/img_c_function_structure.png) @@ -49,9 +47,11 @@ toc: true 4. 함수 몸체 : 함수의 고유 기능을 수행하는 명령문의 집합이다. -> 함수 호출 시에는 여러 개의 인수를 전달할 수 있지만, 함수가 반환할 수 있는 값은 1개를 넘지 못한다. -> 또한, 함수의 특성에 따라 인수나 반환값이 하나도 없는 함수도 존재할 수 있다. -> 다음 예제에서는 인수로 전달받은 두 수 중에서 더 큰 수를 반환하는 bigNum() 함수를 정의하여 사용한다. +> 함수 호출 시에는 여러 개의 인수를 전달할 수 있지만, +> 함수가 반환할 수 있는 값은 1개를 넘지 못한다. +> 또한, 함수의 특성에 따라 인수나 반환값이 하나도 없는 함수도 존재할 수 있다. + +>다음 예제에서는 인수로 전달받은 두 수 중에서 더 큰 수를 반환하는 bigNum() 함수를 정의하여 사용한다. - 예제 @@ -92,9 +92,7 @@ int main(void) 두 수 중 더 큰수는 7입니다. ``` ---- - -# 1.3 함수의 원형 선언 +## 1.3 함수의 원형 선언 > C언어에서 함수를 정의할 때는 그 위치가 매우 중요하다. @@ -133,17 +131,19 @@ int bigNum(int num01, int num02) // 함수의 정의 > C 언어에서는 가장 먼저 main() 함수가 컴파일러에 의해 컴파일된다. -> 위의 예제에서 컴파일러는 main() 함수에 등장하는 bigNum() 함수를 -> 아직 알지 못하기 때문에 컴파일 오류를 발생시킨다. -> 따라서 컴파일러에 bigNum() 함수는 나중에 정의되어 있다고 알려줘야 한다. -> 그 역할을 하는 것이 바로 함수의 원형(prototype) 선언이다. +> 위의 예제에서 컴파일러는 main() 함수에 등장하는 bigNum() 함수를 +> 아직 알지 못하기 때문에 컴파일 오류를 발생시킨다. +> 따라서 컴파일러에 bigNum() 함수는 나중에 정의되어 있다고 알려줘야 한다. +> 그 역할을 하는 것이 바로 함수의 원형(prototype) 선언이다. + +> 위와 같이 차례대로 한 번에 컴파일하는 방식을 단일 패스(one pass) 컴파일 방식이라고 한다. +> 하지만 하드웨어의 발달로 컴파일러에 따라 여러 번에 걸쳐 컴파일하는 +> 다중 패스(multi-pass) 방식이 많아지고 있다. -> 위와 같이 차례대로 한 번에 컴파일하는 방식을 단일 패스(one pass) 컴파일 방식이라고 한다. -> 하지만 하드웨어의 발달로 컴파일러에 따라 여러 번에 걸쳐 컴파일하는 -> 다중 패스(multi-pass) 방식이 많아지고 있다. -> 다중 패스 방식의 컴파일러에서는 함수의 원형을 선언하지 않아도 컴파일 오류를 발생시키지 않는다. -> 하지만 오래된 컴파일러는 대부분 단일 패스 방식으로 컴파일하므로, -> C 표준에서는 여전히 함수의 원형을 정의하고 있다. +> 다중 패스 방식의 컴파일러에서는 함수의 원형을 선언하지 않아도 +> 컴파일 오류를 발생시키지 않는다. +> 하지만 오래된 컴파일러는 대부분 단일 패스 방식으로 컴파일하므로, +> C 표준에서는 여전히 함수의 원형을 정의하고 있다. > 함수의 원형 선언은 다음과 같은 방식으로 선언된다. @@ -153,7 +153,7 @@ int bigNum(int num01, int num02) // 함수의 정의 반환타입 함수이름(매개변수타입); ``` -> 다음 예제는 함수의 원형 선언을 추가한 예제이다. +> 다음 예제는 함수의 원형 선언을 추가한 예제이다. > 이렇게 함수의 원형은 main() 함수 앞에 미리 선언되어야 한다. - 예제 diff --git a/_posts/2023-12-03-21_ValidRangeOfVariable.md b/_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md similarity index 74% rename from _posts/2023-12-03-21_ValidRangeOfVariable.md rename to _posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md index a45ef0fd1bc8..92914710085c 100644 --- a/_posts/2023-12-03-21_ValidRangeOfVariable.md +++ b/_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md @@ -12,7 +12,7 @@ toc: true # 1 변수의 유효 범위(variable scope) -> C 언어에서는 변수의 선언 위치에 따라 해당 변수의 유효 범위, +> C 언어에서는 변수의 선언 위치에 따라 해당 변수의 유효 범위, > 메모리 반환 시기, 초기화 여부, 저장되는 장소 등이 변경된다. > C 언어에서 변수는 위와 같은 특징들을 기준으로 다음과 같이 나눌 수 있다. @@ -28,7 +28,7 @@ toc: true ## 1,1 메모리의 구조 -> 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공한다. +> 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공한다. C 프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다. 1. 코드(code) 영역 @@ -43,11 +43,13 @@ toc: true ## 1.2 지역 변수(local variable) -> 지역 변수란 '블록' 내에서 선언된 변수를 의미한다. +- 지역 변수(local variable) + +> 지역 변수(local variable)란 '블록' 내에서 선언된 변수를 의미한다. 지역 변수는 변수가 선언된 블록 내에서만 유효하며, 블록이 종료되면 메모리에서 사라진다. -> 이러한 지역 변수는 메모리상의 스택(stack) 영역에 저장되며, -> 초기화하지 않으면 의미 없는 값(쓰레기값)으로 초기화된다. +> 이러한 지역 변수는 메모리상의 스택(stack) 영역에 저장되며, +> 초기화하지 않으면 의미 없는 값(쓰레기값)으로 초기화된다. 함수의 매개변수 또한 함수 내에서 정의되는 지역 변수로 취급된다. - 예제 @@ -89,30 +91,29 @@ if 문 내의 지역 변수 var의 값은 30입니다. 현재 지역 변수 var의 값은 10입니다. ``` -> 위의 예제에서 변수 var은 한 번은 main() 함수 내에서, -> 또 한 번은 if 문에서, 마지막은 local() 함수 내에서 선언된다. -이처럼 같은 이름의 변수 var은 모두 다른 중괄호({}) 영역에서 선언되었으며, -이러한 중괄호 영역을 블록(block)이라고 한다. -이렇게 변수의 유효 범위는 변수가 선언된 블록을 기준으로 설정되며, -해당 블록이 끝나면 모든 지역 변수는 메모리에서 사라지게 된다. +> 위의 예제에서 변수 var은 한 번은 main() 함수 내에서, +> 또 한 번은 if 문에서, 마지막은 local() 함수 내에서 선언된다. +이처럼 같은 이름의 변수 var은 모두 다른 중괄호({}) 영역에서 선언되었으며, +이러한 중괄호 영역을 블록(block)이라고 한다. +이렇게 변수의 유효 범위는 변수가 선언된 블록을 기준으로 설정되며, +해당 블록이 끝나면 모든 지역 변수는 메모리에서 사라지게 된다. ->위의 변수의 이름으로 같은 이름을 여러 번 사용하는 것은 구문 상 에러를 발생시키지는 않지만,  ->바람직하지 못한 방식이다. +>위의 변수의 이름으로 같은 이름을 여러 번 사용하는 것은 +> 구문 상 에러를 발생시키지는 않지만,  +>바람직하지 못한 방식이다. > 한 블록 내에서 같은 이름의 변수를 또다시 선언하려고 하면 컴파일러는 오류를 발생시킨다. - - ## 1.3 전역 변수(global variable) -- 전역 변수 +- 전역 변수(global variable) ->전역 변수란 함수의 외부에서 선언된 변수를 의미한다. +>전역 변수(global variable)란 함수의 외부에서 선언된 변수를 의미한다. -> 전역 변수는 프로그램의 어디에서나 접근할 수 있으며, +> 전역 변수는 프로그램의 어디에서나 접근할 수 있으며, > 프로그램이 종료되어야만 메모리에서 사라진다. -> 이러한 전역 변수는 메모리상의 데이터(data) 영역에 저장되며, +> 이러한 전역 변수는 메모리상의 데이터(data) 영역에 저장되며, > 직접 초기화하지 않아도 0으로 자동 초기화된다. - 예제 @@ -156,26 +157,28 @@ local() 함수 내에서 접근한 전역 변수 var의 값은 20입니다. 더 이상 main() 함수에서는 전역 변수 var에 접근할 수가 없습니다. ``` -> 위의 예제에서 전역 변수 var와 같은 이름의 지역 변수 var가 main() 함수 내부에서 선언된다. -이 지역 변수가 선언되기 전까지는 main() 함수에서도 전역 변수 var에 접근할 수 있다. -하지만 지역 변수 var가 선언된 후에는 main() 함수에서 전역 변수 var로 접근할 방법이 없어진다. -왜냐하면, 블록 내에서 선언된 지역 변수는 같은 이름의 전역 변수를 덮어쓰기 때문이다. +> 위의 예제에서 전역 변수 var와 같은 이름의 지역 변수 var가 main() 함수 내부에서 선언된다. +이 지역 변수가 선언되기 전까지는 main() 함수에서도 전역 변수 var에 접근할 수 있다. +하지만 지역 변수 var가 선언된 후에는 +main() 함수에서 전역 변수 var로 접근할 방법이 없어진다. +왜냐하면, 블록 내에서 선언된 지역 변수는 같은 이름의 전역 변수를 덮어쓰기 때문이다. >따라서 이처럼 전역 변수와 같은 이름으로 지역 변수를 선언하는 것은 좋지 않다. -> 또한, 여러 개의 파일로 구성된 프로그램에서 외부 파일의 전역 변수를 사용하기 위해서는 +> 또한, 여러 개의 파일로 구성된 프로그램에서 외부 파일의 전역 변수를 사용하기 위해서는 > extern 키워드를 사용해 다시 선언해야 줘야한다. ## 1.4 정적 변수(static variable) -- 정적 변수 +- 정적 변수(static variable) ->C 언어에서 정적 변수란 static 키워드로 선언한 변수를 의미한다. +>C 언어에서 정적 변수(static variable)란 static 키워드로 선언한 변수를 의미한다. ->이렇게 선언된 정적 변수는 지역 변수와 전역 변수의 특징을 모두 가지게 된다. -함수 내에서 선언된 정적 변수는 전역 변수처럼 단 한 번만 초기화되며(초기화는 최초 실행 시 단 한번만 수행됨), 프로그램이 종료되어야 메모리상에서 사라진다. +>이렇게 선언된 정적 변수는 지역 변수와 전역 변수의 특징을 모두 가지게 된다. +함수 내에서 선언된 정적 변수는 전역 변수처럼 단 한 번만 초기화되며 +(초기화는 최초 실행 시 단 한번만 수행됨), 프로그램이 종료되어야 메모리상에서 사라진다. 또한, 이렇게 선언된 정적 변수는 지역 변수처럼 해당 함수 내에서만 접근할 수 있다. - 예제 @@ -222,13 +225,15 @@ local() 함수가 1 번째 호출되었습니다. staticVar() 함수가 3 번째 호출되었습니다. ``` ->위의 예제는 지역 변수로 선언된 count와 정적 변수로 선언된 static_count를 서로 비교하는 예제이다. -지역 변수인 count는 함수의 호출이 끝날 때마다 메모리상에서 사라진다. -하지만 정적 변수인 static_count는 함수의 호출이 끝나도 메모리상에서 사라지지 않고, 다음 함수 호출 때 이전의 데이터를 그대로 가지고 있다. +>위의 예제는 지역 변수로 선언된 count와  +>정적 변수로 선언된 static_count를 서로 비교하는 예제이다. +지역 변수인 count는 함수의 호출이 끝날 때마다 메모리상에서 사라진다. +하지만 정적 변수인 static_count는 함수의 호출이 끝나도 메모리상에서 사라지지 않고, +다음 함수 호출 때 이전의 데이터를 그대로 가지고 있다. ->정적 변수 static_count의 초기화를 수행하는 ①번 라인의 코드는 최초로 실행될 때 ->단 한 번만 수행되며, 두 번째부터는 수행되지 않는다. -또한, static_count는 전역 변수와는 달리 자신이 선언된 staticVar() 함수 +>정적 변수 static_count의 초기화를 수행하는 ①번 라인의 코드는 최초로 실행될 때 +>단 한 번만 수행되며, 두 번째부터는 수행되지 않는다. +또한, static_count는 전역 변수와는 달리 자신이 선언된 staticVar() 함수 이외의 영역에서는 호출할 수 없다. --- @@ -241,12 +246,13 @@ staticVar() 함수가 3 번째 호출되었습니다. >이렇게 선언된 레지스터 변수는 CPU의 레지스터(register) 메모리에 저장되어 빠르게 접근할 수 있게 된다. -> 하지만 컴퓨터의 레지스터는 매우 작은 크기의 메모리이므로, -> 이 영역에 변수를 선언하기 힘든 경우도 많다. +> 하지만 컴퓨터의 레지스터는 매우 작은 크기의 메모리이므로, +> 이 영역에 변수를 선언하기 힘든 경우도 많다. 그럴 때 C 컴파일러는 해당 변수를 그냥 지역변수로 선언하게 된다. - 변수의 종류 -![스크린샷(753) - 복사본](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/a9d06cea-66ab-41dd-8650-b4579650ea56) +![스크린샷(753) - 복사본](https://github.com/EunChong999/EunChong999/assets/136239807/2ea267f4-2562-41d8-940e-a0c99367c6f9) + +![스크린샷(753)](https://github.com/EunChong999/EunChong999/assets/136239807/7a0f722f-0ff2-4957-9cf8-b8d878996ed8) -![스크린샷(753)](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/7e16d544-4181-4d9e-8c1d-d9d539323efd) \ No newline at end of file diff --git a/_posts/2023-12-04-22_RecursiveCall.md b/_posts/Language/C/2023-12-04-22_RecursiveCall.md similarity index 77% rename from _posts/2023-12-04-22_RecursiveCall.md rename to _posts/Language/C/2023-12-04-22_RecursiveCall.md index f0ed9b3480ed..f2a4fabeb1d6 100644 --- a/_posts/2023-12-04-22_RecursiveCall.md +++ b/_posts/Language/C/2023-12-04-22_RecursiveCall.md @@ -16,17 +16,17 @@ toc: true >함수란 하나의 작업을 수행하기 위해 독립적으로 설계된 프로그램 코드의 집합을 의미한다. ->C 프로그램은 이러한 함수들로 구성되며, +>C 프로그램은 이러한 함수들로 구성되며, >포함된 함수들을 사용하여 프로그램의 목적을 달성하게 된다. -- 재귀 호출 +- 재귀 호출(recursive call) >재귀 호출(recursive call)이란 함수 내부에서 함수가 자기 자신을 또다시 호출하는 행위를 의미한다. ->이러한 재귀 호출은 자기가 자신을 계속해서 호출하므로, 끝없이 반복되게 된다. +>이러한 재귀 호출은 자기가 자신을 계속해서 호출하므로, 끝없이 반복되게 된다. 따라서 함수 내에 재귀 호출을 중단하도록 조건이 변경될 명령문을 반드시 포함해야 한다. -> 재귀 호출은 알고리즘이나 자료 구조론에서는 매우 중요한 개념 중 하나이다. +> 재귀 호출은 알고리즘이나 자료 구조론에서는 매우 중요한 개념 중 하나이다. 또한, 재귀 호출을 사용하면 복잡한 문제도 매우 간단하게 논리적으로 접근하여 표현할 수 있다. ## 1.1 재귀 호출의 개념 @@ -49,12 +49,12 @@ int sum(int n) { }   ``` ->위의 예제에서 sum() 함수는 재귀 호출을 사용하지 않고 만든 함수이다. -이러한 함수는 그냥 봐서는 그 목적을 바로 알 수 없으며, -코드를 해석해야 무슨 목적으로 만든 함수인지 알 수 있다. +>위의 예제에서 sum() 함수는 재귀 호출을 사용하지 않고 만든 함수이다. +이러한 함수는 그냥 봐서는 그 목적을 바로 알 수 없으며, +코드를 해석해야 무슨 목적으로 만든 함수인지 알 수 있다. 즉 변수 i와 result는 왜 정의됐으며, for 문은 왜 사용되었는지 바로 알 수가 없다. -> 재귀 호출을 사용하여 1부터 n까지의 합을 구하는 rSum() 함수를 만들 수 있다. +> 재귀 호출을 사용하여 1부터 n까지의 합을 구하는 rSum() 함수를 만들 수 있다. 1부터 4까지의 합을 구하는 알고리즘은 다음과 같습니다. 1. 1부터 4까지의 합은 1부터 3까지의 합에 4를 더하면 된다. @@ -65,7 +65,8 @@ int sum(int n) { 4. 1부터 1까지의 합은 그냥 1이다. ->위와 같이 논리적인 재귀 알고리즘을 구상하고 나면, 그것을 토대로 의사 코드를 작성할 수 있다. +>위와 같이 논리적인 재귀 알고리즘을 구상하고 나면, +>그것을 토대로 의사 코드를 작성할 수 있다. 위의 알고리즘을 의사 코드(pseudo code)로 작성하면 다음과 같다. - 의사 코드 @@ -77,9 +78,9 @@ int sum(int n) { 끝 ``` -- 의사 코드 +- 의사 코드(pseudo code) ->의사 코드(pseudo code)란 특정 프로그래밍 언어의 문법에 맞춰 작성된 것이 아닌,  +>의사 코드(pseudo code)란 특정 프로그래밍 언어의 문법에 맞춰 작성된 것이 아닌,  >일반적인 언어로 알고리즘을 표현한 코드를 의미한다. >이렇게 작성된 의사 코드는 재귀 호출을 이용해 다음 예제와 같이 바로 구현할 수 있게 된다. @@ -103,18 +104,20 @@ int rSum(int n) 1부터 5까지의 합은 15입니다. ``` -> 위의 예제에서 if 문이 존재하지 않으면, -> 이 프로그램은 실행 직후 스택 오버플로우(stack overflow)에 의해 종료될 것이다. -따라서 if 문처럼 재귀 호출을 중단하기 위한 조건문을 반드시 포함해야 한다. +> 위의 예제에서 if 문이 존재하지 않으면, +> 이 프로그램은 실행 직후 스택 오버플로우(stack overflow)에 의해 종료될 것이다. +따라서 if 문처럼 재귀 호출을 중단하기 위한 조건문을 반드시 포함해야 한다. - 스택 오버플로우 ->스택 오버플로우(stack overflow)란 메모리 구조 중 스택(stack) 영역에서 해당 프로그램이 사용할 수 있는 메모리 공간 이상을 사용하려고 할 때 발생하는 상황을 의미한다. +>스택 오버플로우(stack overflow)란 메모리 구조 중 스택(stack) 영역에서 +>해당 프로그램이 사용할 수 있는 메모리 공간 이상을 +>사용하려고 할 때 발생하는 상황을 의미한다. ->이처럼 재귀 호출은 다양한 알고리즘을 표현한 의사 코드를 그대로 코드로 옮길 수 있게 해준다. +>이처럼 재귀 호출은 다양한 알고리즘을 표현한 의사 코드를 그대로 코드로 옮길 수 있게 해준다. 따라서 재귀 호출은 직관적인 프로그래밍을 하는 데 많은 도움을 준다. >하지만 이러한 재귀 호출은 비재귀 호출보다 실행 시간이 오래 걸리는 단점을 가지고 있다. ->재귀호출의 장점 : 코드의 간결함 +>재귀호출의 장점 : 코드의 간결함 재귀호출의 단점 : 무한 재귀호출의 위험성, 성능 상의 문제 \ No newline at end of file diff --git a/_posts/2023-12-04-23_1DArrangement.md b/_posts/Language/C/2023-12-04-23_1DArrangement.md similarity index 78% rename from _posts/2023-12-04-23_1DArrangement.md rename to _posts/Language/C/2023-12-04-23_1DArrangement.md index e80b80df42b4..11723ce9d2f0 100644 --- a/_posts/2023-12-04-23_1DArrangement.md +++ b/_posts/Language/C/2023-12-04-23_1DArrangement.md @@ -12,24 +12,25 @@ toc: true # 1 배열(array) -- 배열 +- 배열(array) >배열(array)이란 같은 타입의 변수들로 이루어진 유한 집합을 의미한다. -- 배열 요소 +- 배열 요소(element) > 배열 요소(element)란 배열을 구성하는 각각의 값을 의미한다. -- 인덱스 +- 인덱스(index) >인덱스(index)란 배열에서의 위치를 가리키는 숫자를 의미한다. >C 언어에서 인덱스는 언제나 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있다. -> 배열은 같은 종류의 데이터를 많이 다뤄야 하는 경우에 사용할 수 있는 가장 기본적인 자료 구조이다. +> 배열은 같은 종류의 데이터를 많이 다뤄야 하는 경우에 +> 사용할 수 있는 가장 기본적인 자료 구조이다. ->배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 ->그 이상의 다차원 배열로도 선언할 수 있다. +>배열은 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 +>그 이상의 다차원 배열로도 선언할 수 있다. 하지만 현실적으로 이해하기가 쉬운 2차원 배열까지가 많이 사용된다. @@ -44,12 +45,12 @@ toc: true 타입 배열이름[배열길이]; ``` -> 타입은 배열 요소로 들어가는 변수의 타입을 명시한다. -배열 이름은 배열이 선언된 후에 배열로 접근하기 위해 사용된다. -배열의 길이는 해당 배열이 몇 개의 배열 요소를 가지게 되는지 명시한다. +> 타입은 배열 요소로 들어가는 변수의 타입을 명시한다. +배열 이름은 배열이 선언된 후에 배열로 접근하기 위해 사용된다. +배열의 길이는 해당 배열이 몇 개의 배열 요소를 가지게 되는지 명시한다. ->C언어에서는 배열을 선언만 하고 초기화하지 않으면, ->각 배열 요소에 아무런 의미를 가지지 않는 쓰레기값이 저장되어 있게 된다. +>C 언어에서는 배열을 선언만 하고 초기화하지 않으면, +>각 배열 요소에 아무런 의미를 가지지 않는 쓰레기값이 저장되어 있게 된다. 따라서 초기화되지 않은 배열은 사용하지 않도록 주의를 기울여야 한다. - 예제 @@ -77,12 +78,13 @@ printf("국영수 과목 총 점수 합계는 %d점이고, 평균 점수는 %f 국영수 과목 총 점수 합계는 240점이고, 평균 점수는 80.000000점입니다. ``` ->위의 예제는 길이가 3인 int형 배열을 선언하고 있다. +>위의 예제는 길이가 3인 int형 배열을 선언하고 있다. 또한, 0부터 시작하는 인덱스(index)를 이용하면 각각의 배열 요소에 따로 접근할 수 있다. >다음 그림은 위의 예제에서 사용된 배열 grade가 메모리 상에서 어떻게 저장되는지를 보여준다. -![img_c_onedimensional_array](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/9d7ef0be-cbfc-40c7-919a-b42869f87825) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/a7a858ca-4a3f-4c4b-a559-3586026b8107) + >위의 그림처럼 언제나 배열의 이름은 배열의 첫 번째 요소와 같은 주소를 가리키고 있다. @@ -100,9 +102,10 @@ printf("국영수 과목 총 점수 합계는 %d점이고, 평균 점수는 %f 타입 배열이름[배열길이] = {배열요소1, 배열요소2, ...}; ``` ->단, 초기화 리스트의 타입과 배열의 타입은 반드시 일치해야 한다. -만약에 초기화 리스트의 개수가 배열의 총 길이보다 적으면, 배열의 앞에서부터 차례대로 초기화된다. -이때 초기화되지 못한 나머지 배열 요소는 모두 0으로 자동 초기화된다. +>단, 초기화 리스트의 타입과 배열의 타입은 반드시 일치해야 한다. +만약에 초기화 리스트의 개수가 배열의 총 길이보다 적으면, +배열의 앞에서부터 차례대로 초기화된다. +이때 초기화되지 못한 나머지 배열 요소는 모두 0으로 자동 초기화된다. >다음 예제는 배열을 선언과 동시에 초기화하는 예제이다. @@ -132,7 +135,8 @@ printf("국영수 과목 총 점수 합계는 %d이고, 평균 점수는 %f입 >C 언어에서는 초기화 리스트에 맞춰 자동으로 배열의 길이를 설정할 수도 있다. ->다음과 같이 배열의 길이를 따로 입력하지 않은 배열은 초기화 리스트의 배열 요소의 개수에 맞춰 자동으로 배열의 길이가 설정된다. +>다음과 같이 배열의 길이를 따로 입력하지 않은 배열은 +>초기화 리스트의 배열 요소의 개수에 맞춰 자동으로 배열의 길이가 설정된다. - 문법 @@ -140,7 +144,7 @@ printf("국영수 과목 총 점수 합계는 %d이고, 평균 점수는 %f입 타입 배열이름[] = {배열요소1, 배열요소2, ...}; ``` ->다음 예제에서 int형 배열 arr의 길이는 자동으로 3으로 설정됨과 동시에 +>다음 예제에서 int형 배열 arr의 길이는 자동으로 3으로 설정됨과 동시에 >초기화 리스트에 의해 초기화된다. - 예제 @@ -182,23 +186,24 @@ printf("국영수 과목 총 점수 합계는 %d이고, 평균 점수는 %f입 국영수 과목 총 점수 합계는 340이고, 평균 점수는 113.333333입니다. ``` -> 위의 예제에서는 크기가 3인 int형 배열 grade를 선언하고 있다. -즉, 배열 grade의 배열 요소는 grade[0], grade[1], grade[2]만이 존재한다. -하지만 존재하지도 않는 grade[3]이라는 배열 요소의 초기화를 진행하고, -반복문을 통해 수식에서도 이용한다. +> 위의 예제에서는 크기가 3인 int형 배열 grade를 선언하고 있다. +즉, 배열 grade의 배열 요소는 grade[0], grade[1], grade[2]만이 존재한다. +하지만 존재하지도 않는 grade[3]이라는 배열 요소의 초기화를 진행하고, +반복문을 통해 수식에서도 이용한다. ->이때 C 컴파일러는 오류는커녕 수식에서까지 이 배열 요소를 이용하여 결과를 출력한다. -하지만 이 결과는 개발자가 전혀 의도하지 않은 결과물이며, -이러한 프로그램은 종종 예상치 못한 결과를 내주기도 한다. +>이때 C 컴파일러는 오류는 커녕 수식에서까지 이 배열 요소를 이용하여 결과를 출력한다. +하지만 이 결과는 개발자가 전혀 의도하지 않은 결과물이며, +이러한 프로그램은 종종 예상치 못한 결과를 내주기도 한다. ->위와 같이 C 언어에서는 컴파일러가 일일이 배열의 길이 등을 검사하여 오류를 출력해 주지 않는다. -따라서 C 언어로 프로그래밍할 때에는 이런 계산을 언제나 개발자가 직접 신경 써야 한다. +>위와 같이 C 언어에서는 컴파일러가 +>일일이 배열의 길이 등을 검사하여 오류를 출력해 주지 않는다. +따라서 C 언어로 프로그래밍할 때에는 이런 계산을 언제나 개발자가 직접 신경 써야 한다. ## 1.5 배열이 차지하는 메모리의 크기 ->C 언어에서 배열을 복사하거나 배열 요소에 특정 작업을 하고 싶을 때는  +>C 언어에서 배열을 복사하거나 배열 요소에 특정 작업을 하고 싶을 때는  >해당 배열이 차지하는 메모리의 크기를 정확히 알고 있어야만 한다. >배열이 차지하는 총 메모리의 크기는 다음 수식을 사용하여 구할 수 있다. diff --git a/_posts/2023-12-04-24_MultidimensionalArrangement.md b/_posts/Language/C/2023-12-04-24_MultidimensionalArrangement.md similarity index 77% rename from _posts/2023-12-04-24_MultidimensionalArrangement.md rename to _posts/Language/C/2023-12-04-24_MultidimensionalArrangement.md index 18af99333663..5f07f127db0a 100644 --- a/_posts/2023-12-04-24_MultidimensionalArrangement.md +++ b/_posts/Language/C/2023-12-04-24_MultidimensionalArrangement.md @@ -12,22 +12,22 @@ toc: true # 1 다차원 배열(multi-dimensional array) -- 다차원 배열 +- 다차원 배열(multi-dimensional array) -> 다차원 배열이란 2차원 이상의 배열을 의미하며, +> 다차원 배열(multi-dimensional array)이란 2차원 이상의 배열을 의미하며, > 배열 요소로 또 다른 배열을 가지는 배열을 의미한다. ->즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며, -3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이고, +>즉, 2차원 배열은 배열 요소로 1차원 배열을 가지는 배열이며, +3차원 배열은 배열 요소로 2차원 배열을 가지는 배열이고, 4차원 배열은 배열 요소로 3차원 배열을 가지는 배열인 것이다. ## 1.1 2차원 배열(two dimensional array) -- 2차원 배열 +- 2차원 배열(two dimensional array) ->2차원 배열이란 배열의 요소로 1차원 배열을 가지는 배열을 의미한다. +>2차원 배열(two dimensional array)이란 배열의 요소로 1차원 배열을 가지는 배열을 의미한다. ->C 언어에서는 2차원 배열을 나타내는 타입을 따로 제공하지 않는다. +>C 언어에서는 2차원 배열을 나타내는 타입을 따로 제공하지 않는다. 대신에 1차원 배열의 배열 요소로 또 다른 1차원 배열을 사용하여 2차원 배열을 나타낼 수 있다. >2차원 배열은 다음과 같은 문법에 따라 선언할 수 있다. @@ -38,16 +38,17 @@ toc: true 타입 배열이름[행의길이][열의길이]; ``` ->타입은 배열 요소로 저장되는 변수의 타입을 설정한다. +>타입은 배열 요소로 저장되는 변수의 타입을 설정한다. 배열 이름은 배열이 선언된 후에 배열에 접근하기 위해 사용된다. >다음 그림은 2차원 배열을 이해하기 쉽도록 도식적으로 표현한 그림이다. -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/c0080e9f-68f7-4ea2-8602-717cf12a0208) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/8db566b8-de3f-4f23-913f-24e55a7d3d1f) ->하지만 컴퓨터의 메모리는 위와 같은 입체적 공간이 아닌 선형 공간이므로 실제로는 다음 그림과 같이 저장된다. +>하지만 컴퓨터의 메모리는 위와 같은 입체적 공간이 아닌 +>선형 공간이므로 실제로는 다음 그림과 같이 저장된다. -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/e0506852-e2da-43b1-ac2f-1a2fd1eb061f) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/40176c6f-19e3-4d91-b672-5fdf727017d7) >다음 예제는 앞선 그림을 C 프로그램으로 작성한 예제이다. @@ -71,7 +72,7 @@ arr02의 배열 요소의 값 ## 1.2 배열의 선언과 동시에 초기화하는 방법 ->1차원 배열과 마찬가지로 2차원 배열도 선언과 동시에 초기화할 수 있다. +>1차원 배열과 마찬가지로 2차원 배열도 선언과 동시에 초기화할 수 있다. 2차원 배열은 1차원 배열과는 달리 여러 방식으로 초기화할 수 있다. 1. 1차원 배열의 초기화 형태를 따르는 방식 @@ -92,9 +93,9 @@ arr02의 배열 요소의 값 타입 배열이름[행의길이][열의길이] = {배열요소[0][0], 배열요소[0][1], ..., 배열요소[1][0], 배열요소[1][1], ..., 배열요소[2][0], 배열요소[2][1], ...}; ``` ->이 방식으로는 2차원 배열의 배열 요소 [0][0]부터 차례대로 초기화된다. -만약에 초기화하는 배열 요소의 개수가 배열의 총 길이보다 적으면, -나머지 배열 요소는 모두 0으로 초기화된다. +>이 방식으로는 2차원 배열의 배열 요소 [0][0]부터 차례대로 초기화된다. +만약에 초기화하는 배열 요소의 개수가 배열의 총 길이보다 적으면, +나머지 배열 요소는 모두 0으로 초기화된다. @@ -104,7 +105,7 @@ arr02의 배열 요소의 값 - 문법 -```C +```c 타입 배열이름[행의길이][열의길이] = {     {배열요소[0][0], 배열요소[0][1], ...}, @@ -114,8 +115,9 @@ arr02의 배열 요소의 값 }; ``` ->이 방식은 1차원 배열의 초기화 형태를 따르는 방식과 결과는 똑같다. - 하지만 좀 더 직관적으로 2차원 배열의 모습을 알 수 있으므로 보통 이 방식을 가장 많이 사용한다. +>이 방식은 1차원 배열의 초기화 형태를 따르는 방식과 결과는 똑같다. + 하지만 좀 더 직관적으로 2차원 배열의 모습을 알 수 있으므로  + 보통 이 방식을 가장 많이 사용한다. >다음 예제는 두 가지 방식을 각각 사용하여 배열을 선언하고 초기화하는 예제이다. @@ -144,7 +146,7 @@ arr02의 배열 요소의 값 >C 언어에서는 2차원 배열의 일부 요소만을 초기화할 수도 있다. ->이 방식으로는 다음 예제와 같이 2차원 배열의 원하는 배열 요소만을 초기화할 수 있다. +>이 방식으로는 다음 예제와 같이 2차원 배열의 원하는 배열 요소만을 초기화할 수 있다. 이때 초기화하지 않은 배열 요소는 모두 0으로 자동초기화된다. - 예제 @@ -173,7 +175,7 @@ int arr[3][4] = { arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]); // 2차원 배열의 열의 길이를 계산함 ``` ->열의 길이는 sizeof(arr[0])으로 먼저 2차원 배열 한 행의 길이를 구한 후에, +>열의 길이는 sizeof(arr[0])으로 먼저 2차원 배열 한 행의 길이를 구한 후에, >그 값을 배열 타입의 크기로 나누어서 구합니다. >열의 길이를 이용하면 2차원 배열 행의 길이도 구할 수 있다. @@ -184,15 +186,15 @@ arr_col_len = sizeof(arr[0]) / sizeof(arr[0][0]); // 2차원 배열의 열 arr_row_len = (sizeof(arr) / arr_col_len) / sizeof(arr[0][0]); // 2차원 배열의 행의 길이를 계산함 ``` ->행의 길이는 sizeof(arr) / arr_col_len으로 먼저 2차원 배열 한 열의 길이를 구한 후에, +>행의 길이는 sizeof(arr) / arr_col_len으로 먼저 2차원 배열 한 열의 길이를 구한 후에, >그 값을 배열 타입의 크기로 나누어서 구한다. ### 1.2.4 배열의 길이 자동 설정 ->1차원 배열과 마찬가지로 2차원 배열도 배열의 길이를 명시하지 않고, ->자동으로 배열의 길이를 설정할 수 있다. +>1차원 배열과 마찬가지로 2차원 배열도 배열의 길이를 명시하지 않고, +>자동으로 배열의 길이를 설정할 수 있다. 단, 행의 길이는 생략할 수 있지만, 열의 길이는 반드시 명시해야 한다. >다음 예제는 앞선 예제에서 행의 길이를 생략한 예제로, 같은 결과를 출력한다. @@ -215,5 +217,4 @@ int arr[][4] = {    0   0  70  80 ``` ->위의 예제에서 행의 길이를 명시하고, ->열의 길이를 생략하면 컴파일할 때 오류가 발생한다. \ No newline at end of file +>위의 예제에서 행의 길이를 명시하고, 열의 길이를 생략하면 컴파일할 때 오류가 발생한다. \ No newline at end of file diff --git a/_posts/2023-12-04-25_PointerConcept.md b/_posts/Language/C/2023-12-04-25_PointerConcept.md similarity index 76% rename from _posts/2023-12-04-25_PointerConcept.md rename to _posts/Language/C/2023-12-04-25_PointerConcept.md index 954df8be15a7..5f69b117a92d 100644 --- a/_posts/2023-12-04-25_PointerConcept.md +++ b/_posts/Language/C/2023-12-04-25_PointerConcept.md @@ -16,20 +16,20 @@ toc: true > 데이터의 주소값이란 해당 데이터가 저장된 메모리의 시작 주소를 의미한다. ->C 언어에서는 이러한 주소값을 1바이트 크기의 메모리 공간으로 나누어 표현한다. -예를 들어, int형 데이터는 4바이트의 크기를 가지지만, +>C 언어에서는 이러한 주소값을 1바이트 크기의 메모리 공간으로 나누어 표현한다. +예를 들어, int형 데이터는 4바이트의 크기를 가지지만, int형 데이터의 주소값은 시작 주소 1바이트만을 가리킨다. -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/de869fce-b182-4ce5-8664-707cd99b0a55) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/e322e216-7b18-418f-829a-ae28db873a76) -# 2 포인터 +# 2 포인터(pointer) -- 포인터 +- 포인터(pointer) -> C 언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수를 의미하며, +> C 언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수를 의미하며, > 포인터 변수라고도 부른다. -> char형 변수가 문자를 저장하고, +> char형 변수가 문자를 저장하고, > int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장한다. - 예제 @@ -39,10 +39,10 @@ int n = 100;   // 변수의 선언 int *ptr = &n; // 포인터의 선언 ``` ->다음 그림은 위의 예제에서 사용된 변수와 포인터가 메모리에서 +>다음 그림은 위의 예제에서 사용된 변수와 포인터가 메모리에서 어떻게 저장되는지를 보여주는 예제이다. -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/bb6a43f9-824e-443e-b0eb-3c4c1a269a1c) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/ce6e3641-6b38-4923-b039-af079049a063) ## 2.1 포인터 연산자 @@ -54,16 +54,16 @@ int *ptr = &n; // 포인터의 선언 ### 2.1.1 주소 연산자(&) ->주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다. -'&'기호는 앰퍼샌드(ampersand)라고 읽으며, 번지 연산자라고도 불립니다. +>주소 연산자는 변수의 이름 앞에 사용하여, 해당 변수의 주소값을 반환한다. +'&'기호는 앰퍼샌드(ampersand)라고 읽으며, 번지 연산자라고도 불린다. ### 2.1.2 참조 연산자(*) ->참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, +>참조 연산자는 포인터의 이름이나 주소 앞에 사용하여, >포인터에 가리키는 주소에 저장된 값을 반환한다. ->C 언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용된다. -이항 연산자로 사용하면 곱셈 연산으로 사용되며, +>C 언어에서 '*'기호는 사용하는 위치에 따라 다양한 용도로 사용된다. +이항 연산자로 사용하면 곱셈 연산으로 사용되며, 포인터의 선언 시나 메모리에 접근할 때도 사용된다. ## 2.2 포인터의 선언 @@ -76,11 +76,11 @@ int *ptr = &n; // 포인터의 선언 타입* 포인터이름;   ``` ->타입이란 포인터가 가리키고자 하는 변수의 타입을 명시한다. +>타입이란 포인터가 가리키고자 하는 변수의 타입을 명시한다. 포인터 이름은 포인터가 선언된 후에 포인터에 접근하기 위해 사용된다. ->포인터를 선언한 후 참조 연산자(*)를 사용하기 전에 포인터는 반드시 먼저 초기화되어야 한다. -그렇지 않으면 의도하지 않은 메모리의 값을 변경하게 되기 때문이다. +>포인터를 선언한 후 참조 연산자(*)를 사용하기 전에 포인터는 반드시 먼저 초기화되어야 한다. +그렇지 않으면 의도하지 않은 메모리의 값을 변경하게 되기 때문이다. 따라서 C 컴파일러는 초기화하지 않은 포인터에 참조 연산자를 사용하면 오류를 발생시킨다. >따라서 다음과 같이 포인터의 선언과 동시에 초기화를 함께 하는 것이 좋다. @@ -97,7 +97,7 @@ int *ptr = &n; // 포인터의 선언 >C 언어에서 선언된 포인터는 참조 연산자(*)를 사용하여 참조할 수 있다. ->다음 예제는 포인터의 주소값과 함께 포인터가 가리키고 있는 +>다음 예제는 포인터의 주소값과 함께 포인터가 가리키고 있는 >주소값의 데이터를 참조하는 예제이다. - 예제 @@ -108,7 +108,7 @@ int *ptr = &x;    // 포인터의 선언 int *pptr = &ptr; // 포인터의 참조 ``` -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/63b37f1b-9b98-477e-9730-117d8eeac4d9) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/9584b102-8aaf-41be-92bc-f444d8705be1) - 예제 @@ -137,29 +137,29 @@ printf("포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 %f 포인터 ptr_num02가 가리키고 있는 주소에 저장된 값은 3.140000입니다. ``` ->위 예제의 ①번 라인에서는 sizeof 연산자를 사용하여 포인터 변수의 크기를 구하고 있다. +>위 예제의 ①번 라인에서는 sizeof 연산자를 사용하여 포인터 변수의 크기를 구하고 있다. ->포인터 변수는 메모리에서 변수의 위치를 나타내는 주소를 다루는 변수이므로, ->그 크기는 일반적으로 CPU에 따라 결정된다. -따라서 32비트 CPU에서는 1워드(word)의 크기가 4바이트이므로, +>포인터 변수는 메모리에서 변수의 위치를 나타내는 주소를 다루는 변수이므로, +>그 크기는 일반적으로 CPU에 따라 결정된다. +따라서 32비트 CPU에서는 1워드(word)의 크기가 4바이트이므로, 포인터 변수의 크기 또한 4바이트가 될 것이다. ->하지만 이러한 포인터 변수의 크기는 컴파일러로 컴파일할 때 그 크기까지 직접 명시할 수 있다. -따라서 포인터 변수의 크기는 CPU의 종류와 컴파일할 때 +>하지만 이러한 포인터 변수의 크기는 컴파일러로 컴파일할 때 그 크기까지 직접 명시할 수 있다. +따라서 포인터 변수의 크기는 CPU의 종류와 컴파일할 때 사용된 컴파일러의 정책에 따라서 달라질 수 있다. ->또한, ②번과 ③번 라인에서처럼 포인터가 가리키는 ->변수의 타입에 따라 포인터의 타입도 같이 바꿔주고 있다. -포인터의 타입은 참조 연산자를 통해 값을 참조할 때, +>또한, ②번과 ③번 라인에서처럼 포인터가 가리키는 +>변수의 타입에 따라 포인터의 타입도 같이 바꿔주고 있다. +포인터의 타입은 참조 연산자를 통해 값을 참조할 때, 참조할 메모리의 크기를 알려주는 역할을 하기 때문이다. ->다음 그림은 char형 포인터와 int형 포인터가 각각 메모리 상에서 +>다음 그림은 char형 포인터와 int형 포인터가 각각 메모리 상에서 >해당 타입의 변수를 가리키는 것을 보여준다. -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/62eb0f37-6ede-4efa-ae08-eaf72c652293) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/2217656e-9e96-4995-9446-f14c820cf68e) ->워드(word)란 CPU가 한 번에 처리할 수 있는 데이터의 크기이다. -1바이트는 8비트이므로 32비트 시스템에서는 32비트 / 8비트 = 4, -즉 4바이트가 1워드(word)로 처리된다. -64비트 시스템에서는 64비트 / 8비트 = 8, +>워드(word)란 CPU가 한 번에 처리할 수 있는 데이터의 크기이다. +1바이트는 8비트이므로 32비트 시스템에서는 32비트 / 8비트 = 4, +즉 4바이트가 1워드(word)로 처리된다. +64비트 시스템에서는 64비트 / 8비트 = 8, 즉 8바이트가 1워드(word)로 처리된다. \ No newline at end of file diff --git a/_posts/2023-12-04-26_PointerOperation.md b/_posts/Language/C/2023-12-04-26_PointerOperation.md similarity index 94% rename from _posts/2023-12-04-26_PointerOperation.md rename to _posts/Language/C/2023-12-04-26_PointerOperation.md index 1ec7fb8b3914..8016dac65bda 100644 --- a/_posts/2023-12-04-26_PointerOperation.md +++ b/_posts/Language/C/2023-12-04-26_PointerOperation.md @@ -53,14 +53,14 @@ printf("포인터 ptr_double이 1 증가 후에 가리키고 있는 주소값은 포인터 ptr_double이 1 증가 후에 가리키고 있는 주소값은 0x8입니다. ``` ->위의 예제에서 모든 포인터에 저장된 초기 주소값은 0x00 이다. -하지만 1을 증가시키는 포인터 연산 후 포인터가 가리키고 있는 주소는 -각각의 포인터 타입에 따라 달라진다. -그 증가 폭은 포인터가 가리키는 변수의 타입의 크기와 같게 된다. +>위의 예제에서 모든 포인터에 저장된 초기 주소값은 0x00 이다. +하지만 1을 증가시키는 포인터 연산 후 포인터가 가리키고 있는 주소는 +각각의 포인터 타입에 따라 달라진다. +그 증가 폭은 포인터가 가리키는 변수의 타입의 크기와 같게 된다. ![포인터 연산](https://tcpschool.com/lectures/img_c_pointer_calculation.png) ->예를 들어, int형 포인터의 증가폭은 int형 타입의 크기인 4바이트만큼 증가하게 된다. +>예를 들어, int형 포인터의 증가폭은 int형 타입의 크기인 4바이트만큼 증가하게 된다. 이 법칙은 포인터의 뺄셈에서도 똑같이 적용된다. > 다음 예제는 포인터끼리의 비교 연산과 대입 연산을 보여주는 예제이다. diff --git a/_posts/2023-12-04-27_HowToForwardArgument.md b/_posts/Language/C/2023-12-04-27_HowToForwardArgument.md similarity index 76% rename from _posts/2023-12-04-27_HowToForwardArgument.md rename to _posts/Language/C/2023-12-04-27_HowToForwardArgument.md index 661a7bf04c75..10a13298f819 100644 --- a/_posts/2023-12-04-27_HowToForwardArgument.md +++ b/_posts/Language/C/2023-12-04-27_HowToForwardArgument.md @@ -11,13 +11,11 @@ toc: true --- # 1 인수 전달 방법 -- 인수 전달 방법 - -- 인수 +- 인수(argument) >인수(argument)란 함수가 호출될 때 함수로 값을 전달해주는 값을 의미한다. ->함수를 호출할 때에는 함수에 필요한 데이터를 인수(argument)로 전달해 줄 수 있다. +>함수를 호출할 때에는 함수에 필요한 데이터를 인수(argument)로 전달해 줄 수 있다. >함수에 인수를 전달하는 방법에는 크게 다음과 같이 두 가지 방법이 있다. 1. 값에 의한 전달(call by value) @@ -28,10 +26,10 @@ toc: true - 값에 의한 전달(call by value) ->값에 의한 전달 방법이란 인수로 전달되는 변수가 가지고 있는 값을 +>값에 의한 전달(call by value) 방법이란 인수로 전달되는 변수가 가지고 있는 값을 >함수 내의 매개변수에 복사하는 방식을 의미한다. -> 이렇게 복사된 값으로 초기화된 매개변수는 전달된 변수와는 완전히 별개의 변수가 된다. +> 이렇게 복사된 값으로 초기화된 매개변수는 전달된 변수와는 완전히 별개의 변수가 된다. > 따라서 함수 내에서의 매개변수 조작은 인수로 전달되는 변수에 아무런 영향을 미치지 않는다. - 예제 @@ -63,17 +61,18 @@ void local(int num) local() 함수 호출 후 변수 var의 값은 10입니다. ``` ->위의 예제에서 local() 함수의 매개변수 num은 인수로 변수 var의 값을 전달받는다. ->따라서 함수 내에서 매개변수 num의 값을 아무리 변경하더라도 원래 인수로 전달된 변수 var의 값은 절대 변경되지 않는다. +>위의 예제에서 local() 함수의 매개변수 num은 인수로 변수 var의 값을 전달받는다. +>따라서 함수 내에서 매개변수 num의 값을 아무리 변경하더라도 +>원래 인수로 전달된 변수 var의 값은 절대 변경되지 않는다. ## 1.2 참조에 의한 전달(call by reference) - 참조에 의한 전달(call by reference) ->참조에 의한 전달 방법이란 인수로 변수의 값을 전달하는 것이 아닌, +>참조에 의한 전달(call by reference) 방법이란 인수로 변수의 값을 전달하는 것이 아닌, >해당 변수의 주소 값을 전달하는 방식을 의미한다. ->즉 함수의 매개변수에 인수로 전달된 변수의 원래 주소값을 저장하는 것이다. +>즉 함수의 매개변수에 인수로 전달된 변수의 원래 주소값을 저장하는 것이다. >이 방식을 사용하면 인수로 전달된 변수의 값을 함수 내에서 변경할 수 있게 된다. - 예제 @@ -105,6 +104,7 @@ void local(int* num) local() 함수 호출 후 변수 var의 값은 20입니다. ``` ->위의 예제에서 local() 함수의 매개변수 num은 인수로 변수 var의 주소값을 전달받는다. -따라서 함수 내에서 매개변수 num의 값을 변경하면, 원래 인수인 변수 var의 값도 같이 변경된다. +>위의 예제에서 local() 함수의 매개변수 num은 인수로 변수 var의 주소값을 전달받는다. +따라서 함수 내에서 매개변수 num의 값을 변경하면, +원래 인수인 변수 var의 값도 같이 변경된다. diff --git a/_posts/2023-12-04-28_VariousPointers.md b/_posts/Language/C/2023-12-04-28_VariousPointers.md similarity index 81% rename from _posts/2023-12-04-28_VariousPointers.md rename to _posts/Language/C/2023-12-04-28_VariousPointers.md index 6a3aabd60ca6..84cb7634acbd 100644 --- a/_posts/2023-12-04-28_VariousPointers.md +++ b/_posts/Language/C/2023-12-04-28_VariousPointers.md @@ -16,12 +16,12 @@ toc: true - 포인터의 포인터 ->포인터의 포인터란 포인터 변수를 가리키는 포인터를 의미한다. +>포인터의 포인터란 포인터 변수를 가리키는 포인터를 의미한다. >참조 연산자(*)를 두 번 사용하여 표현하며, 이중 포인터라고도 부른다. >다음 그림은 포인터와 포인터의 포인터와의 동작 상 차이점을 보여주고 있다. -![image](https://github.com/EunChong999/Project-SHOOTER/assets/136239807/3d7af911-16f5-413a-982b-118c10906e2f) +![image](https://github.com/EunChong999/EunChong999/assets/136239807/37cc2625-89df-4c38-9e13-9365d34ec85d) >다음 예제는 포인터의 포인터를 선언하고, 포인터의 포인터를 이용한 접근 방법을 보여주고 있다. @@ -49,13 +49,15 @@ printf("포인터의 포인터 pptr_num가 가리키는 주소에 저장된 포 - void 포인터(void pointer) ->void 포인터란 일반적인 포인트 변수와는 달리 +>void 포인터(void pointer)란 일반적인 포인트 변수와는 달리 >대상이 되는 데이터의 타입을 명시하지 않은 포인터를 의미한다. ->따라서 변수, 함수, 포인터 등 어떠한 값도 가리킬 수 있지만, 포인터 연산이나 메모리 참조와 같은 작업은 할 수 없다. +>따라서 변수, 함수, 포인터 등 어떠한 값도 가리킬 수 있지만, +> 포인터 연산이나 메모리 참조와 같은 작업은 할 수 없다. ->즉 void 포인터는 주소값을 저장하는 것 이외에는 아무것도 할 수 없는 포인터이다. ->또한, void 포인터를 사용할 때에는 반드시 먼저 사용하고자 하는 타입으로 명시적 타입 변환 작업을 거친 후에 사용해야 한다. +>즉 void 포인터는 주소값을 저장하는 것 이외에는 아무것도 할 수 없는 포인터이다. +>또한, void 포인터를 사용할 때에는 반드시 먼저 사용하고자 하는 타입으로 +>명시적 타입 변환 작업을 거친 후에 사용해야 한다. >다음 예제는 void 포인터의 선언 및 void 포인터를 이용한 접근 방법을 보여주고 있다. @@ -84,15 +86,15 @@ void 포인터 ptr_num가 가리키는 주소에 저장된 값은 20입니다. ## 1.3 함수 포인터(function pointer) ->프로그램에서 정의된 함수는 프로그램이 실행될 때 모두 메인 메모리에 올라가게 된다. ->이때 함수의 이름은 메모리에 올라간 함수의 시작 주소를 가리키는 +>프로그램에서 정의된 함수는 프로그램이 실행될 때 모두 메인 메모리에 올라가게 된다. +>이때 함수의 이름은 메모리에 올라간 함수의 시작 주소를 가리키는 >포인터 상수(constant pointer)가 된다. - 함수 포인터(function pointer) >함수 포인터(function pointer)란 함수의 시작 주소를 가리키는 포인터 상수를 의미한다. ->함수 포인터의 포인터 타입은 함수의 반환값과 매개변수에 의해 결정된다. +>함수 포인터의 포인터 타입은 함수의 반환값과 매개변수에 의해 결정된다. >즉 함수의 원형을 알아야만 해당 함수에 맞는 함수 포인터를 만들 수 있다. - 함수 원형 @@ -109,7 +111,8 @@ void func (int, int); void (*ptr_func) (int, int); ``` ->함수 포인터 사용시 연산자의 우선순위 때문에 반드시 *ptr_func 부분을 괄호(())로 둘러싸야 한다. +>함수 포인터 사용시 연산자의 우선순위 때문에 +>반드시 *ptr_func 부분을 괄호(())로 둘러싸야 한다. >함수 포인터는 다음 예제처럼 함수를 또 다른 함수의 인수로 전달할 때 유용하게 사용된다. @@ -149,13 +152,15 @@ printf("사칙 연산의 결과는 %lf입니다.\n", result); 사칙 연산의 결과는 15.000000입니다. ``` ->위의 예제는 함수 포인터를 사용하여 변수 oper의 값에 따라 4개의 사칙연산 함수 중 하나를 선택한다. ->이렇게 선택된 함수는 함수 포인터를 사용하여 calculator() 함수에 인수로 전달되게 된다. +>위의 예제는 함수 포인터를 사용하여 변수 oper의 값에 따라 +>4개의 사칙연산 함수 중 하나를 선택한다. +>이렇게 선택된 함수는 함수 포인터를 사용하여 +>calculator() 함수에 인수로 전달되게 된다. ## 1.4 널 포인터(null pointer) - 널 포인터(null pointer) ->널 포인터(null pointer)란 0이나 NULL을 대입하여 초기화한 포인터를 의미한다. +>널 포인터(null pointer)란 0이나 NULL을 대입하여 초기화한 포인터를 의미한다. >널 포인터는 아무것도 가리키지 않는 포인터라는 의미이다. diff --git a/_posts/2023-12-04-29_PointerToArrayRelationships.md b/_posts/Language/C/2023-12-04-29_PointerToArrayRelationships.md similarity index 67% rename from _posts/2023-12-04-29_PointerToArrayRelationships.md rename to _posts/Language/C/2023-12-04-29_PointerToArrayRelationships.md index e563118d9fac..2f70b6ac0aeb 100644 --- a/_posts/2023-12-04-29_PointerToArrayRelationships.md +++ b/_posts/Language/C/2023-12-04-29_PointerToArrayRelationships.md @@ -14,10 +14,16 @@ toc: true >포인터와 배열은 매우 긴밀한 관계를 맺고 있으며, 어떤 부분에서는 서로를 대체할 수도 있다. ->배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같다. +>배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같다. >따라서 배열의 이름은 포인터 상수(constant pointer)이다. ->포인터 상수(constant pointer)란 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미하여, 상수 포인터(pointer to constant)란 상수를 가르키는 포인터를 의미한다. +- 포인터 상수(constant pointer) + +>포인터 상수(constant pointer)란 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미한다. + +- 상수 포인터(pointer to constant) + +>상수 포인터(pointer to constant)란 상수를 가르키는 포인터를 의미한다. - 예제 @@ -40,15 +46,19 @@ printf("     포인터를 이용한 배열의 크기 계산 : %d\n", sizeof(p      포인터를 이용한 배열의 크기 계산 : 8 ``` ->위의 예제에서는 포인터에 이름을 대입한 후, 해당 포인터를 배열의 이름처럼 사용한다. ->이처럼 C 언어에서는 배열의 이름을 포인터처럼 사용할 수 있을 뿐만 아니라, 포인터를 배열의 이름처럼 사용할 수도 있다. +>위의 예제에서는 포인터에 이름을 대입한 후, 해당 포인터를 배열의 이름처럼 사용한다. +>이처럼 C 언어에서는 배열의 이름을 포인터처럼 사용할 수 있을 뿐만 아니라, +>포인터를 배열의 이름처럼 사용할 수도 있다. ->하지만 배열의 크기를 계산할 때에는 배열의 이름과 포인터 사이에 차이가 발생한다. ->배열의 이름을 이용한 크기 계산에서는 배열의 크기가 int형 배열 요소 3개의 크기인 12바이트로 제대로 출력된다. 하지만 포인터를 이용한 크기 계산에서는 배열의 크기가 아닌 포인터 변수 자체의 크기가 출력되는 차이가 있다. +>하지만 배열의 크기를 계산할 때에는 배열의 이름과 포인터 사이에 차이가 발생한다. +>배열의 이름을 이용한 크기 계산에서는 +>배열의 크기가 int형 배열 요소 3개의 크기인 12바이트로 제대로 출력된다. +>하지만 포인터를 이용한 크기 계산에서는 배열의 크기가 아닌 +>포인터 변수 자체의 크기가 출력되는 차이가 있다. # 2 배열의 포인터 연산 ->다음 예제는 배열의 이름을 포인터처럼 사용하는 예제이다. +>다음 예제는 배열의 이름을 포인터처럼 사용하는 예제이다. >배열의 이름으로 포인터 연산을 수행하여 각각의 배열 요소에 접근한다. - 예제 @@ -77,7 +87,11 @@ arr이 배열의 이름이거나 포인터이고 n이 정수일 때, arr[n] == *(arr + n) ``` ->위의 공식은 1차원 배열뿐만 아니라 다차원 배열에서도 언제나 성립한다. +>위의 공식은 1차원 배열뿐만 아니라 다차원 배열에서도 언제나 성립한다. ->배열의 관계된 연산을 할 때는 언제나 배열의 크기를 넘어서는 접근을 하지 않도록 주의해야 한다. ->포인터 연산을 이용하여 계산하다가 배열의 크기를 넘어서는 접근을 하는 경우, C 컴파일러는 어떠한 오류도 발생시키지 않는다. 다만 잘못된 결과만을 반환하므로 C 언어로 프로그래밍할 때에는 언제나 배열의 크기에도 주의해야 한다. \ No newline at end of file +>배열의 관계된 연산을 할 때는 언제나 +>배열의 크기를 넘어서는 접근을 하지 않도록 주의해야 한다. +>포인터 연산을 이용하여 계산하다가 배열의 크기를 넘어서는 접근을 하는 경우, +>C 컴파일러는 어떠한 오류도 발생시키지 않는다. +>다만 잘못된 결과만을 반환하므로 +>C 언어로 프로그래밍할 때에는 언제나 배열의 크기에도 주의해야 한다. \ No newline at end of file diff --git a/_posts/2023-12-04-30_PointerArrayAndArrayPointers.md b/_posts/Language/C/2023-12-04-30_PointerArrayAndArrayPointers.md similarity index 73% rename from _posts/2023-12-04-30_PointerArrayAndArrayPointers.md rename to _posts/Language/C/2023-12-04-30_PointerArrayAndArrayPointers.md index d5f0951728c9..2fd1775419be 100644 --- a/_posts/2023-12-04-30_PointerArrayAndArrayPointers.md +++ b/_posts/Language/C/2023-12-04-30_PointerArrayAndArrayPointers.md @@ -42,7 +42,8 @@ for (i = 0; i < arr_len; i++) 30 ``` -> 다음 그림은 위의 예제에서 사용된 포인터 배열이 메모리 상에서 어떻게 동작하는지를 보여준다. +> 다음 그림은 위의 예제에서 사용된 포인터 배열이  +> 메모리 상에서 어떻게 동작하는지를 보여준다. ![image](https://github.com/EunChong999/EunChong999/assets/136239807/00a9bb46-8133-45c6-b0d4-a8710ded7331) @@ -52,18 +53,21 @@ for (i = 0; i < arr_len; i++) > 배열 포인터란 배열을 가리킬 수 있는 포인터를 의미한다. ->배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같다. -이렇게 배열 이름이 있는데도 따로 배열 포인터를 정의하여 사용하는 이유는 2차원 이상의 배열을 가리킬 때 포인터를 통해 배열과 같은 인덱싱을 할 수 있도록 하기 위함이다. -즉, 포인터를 배열처럼 사용하기 위해서 배열 포인터를 정의하여 사용한다. -따라서 배열 포인터는 1차원 배열에서는 아무런 의미가 없으며, 2차원 이상의 배열에서만 의미를 가진다. +>배열의 이름은 그 값을 변경할 수 없는 상수라는 점을 제외하면 포인터와 같다. +이렇게 배열 이름이 있는데도 따로 배열 포인터를 정의하여  +사용하는 이유는 2차원 이상의 배열을 가리킬 때 포인터를 통해 +배열과 같은 인덱싱을 할 수 있도록 하기 위함이다. +즉, 포인터를 배열처럼 사용하기 위해서 배열 포인터를 정의하여 사용한다. +따라서 배열 포인터는 1차원 배열에서는 아무런 의미가 없으며, +2차원 이상의 배열에서만 의미를 가진다. ![image](https://github.com/EunChong999/EunChong999/assets/136239807/8b901fdf-1e70-466d-8067-4a112886764a) ->위의 그림에서 보면 2차원 배열의 배열 이름 arr는 부분 배열 arr[0]와 같은 곳을 가리킨다. -2차원 배열의 배열 이름으로 포인터 연산을 하면 배열의 행 단위로 이동하게 된다. -즉, (arr+1)은  arr[1]과 같은 곳을 가리키게 된다. +>위의 그림에서 보면 2차원 배열의 배열 이름 arr는 부분 배열 arr[0]와 같은 곳을 가리킨다. +2차원 배열의 배열 이름으로 포인터 연산을 하면 배열의 행 단위로 이동하게 된다. +즉, (arr+1)은  arr[1]과 같은 곳을 가리키게 된다. ->다음 예제는 2차원 배열에서 각 부분 배열의 시작 주소가 가리키는 +>다음 예제는 2차원 배열에서 각 부분 배열의 시작 주소가 가리키는 >메모리에 저장된 데이터를 출력하는 예제이다. - 예제 @@ -85,7 +89,7 @@ printf("%d\n", *arr[1]); 40 ``` ->2차원 배열에서는 포인터 연산 시 증가하는 값이 행의 길이에 따라 차이를 보이게 된다. +>2차원 배열에서는 포인터 연산 시 증가하는 값이 행의 길이에 따라 차이를 보이게 된다. 2차원 배열의 행의 길이란 부분 배열의 크기를 의미하며, 다음 수식으로 구할 수 있다. - 수식 @@ -94,7 +98,8 @@ printf("%d\n", *arr[1]); sizeof(arr[0]) / sizeof(타입) ``` ->다음 예제에서 포인터 연산 시 증감하는 값의 크기는 int형 타입의 크기인 4바이트에 배열 행의 길이인 3를 곱한 12바이트가 된다. +>다음 예제에서 포인터 연산 시 증감하는 값의 크기는 +>int형 타입의 크기인 4바이트에 배열 행의 길이인 3를 곱한 12바이트가 된다. - 예제 @@ -127,7 +132,8 @@ int arr03[4][3]; ... ``` ->다음 예제는 배열 포인터를 사용하여 배열과 같은 인덱싱 방법으로 배열 요소를 참조하는 예제이다. +>다음 예제는 배열 포인터를 사용하여 배열과 같은 +>인덱싱 방법으로 배열 요소를 참조하는 예제이다. - 예제 @@ -162,14 +168,16 @@ printf("%d\n", pArr[1][1]); // 배열 포인터로 참조 2. int* pArr[3]; ``` ->위의 예제 중에서 첫 번째는 int형 데이터를 저장할 수 있는 2차원 배열을 가리키는 배열 포인터이다. -하지만 두 번째는 int형 데이터를 가리킬 수 있는 포인터 변수를 모아 놓은 배열을 가리키는 포인터 배열이 된다. +>위의 예제 중에서 첫 번째는 int형 데이터를 저장할 수 있는 +>2차원 배열을 가리키는 배열 포인터이다. +하지만 두 번째는 int형 데이터를 가리킬 수 있는 포인터 변수를 모아 놓은 +배열을 가리키는 포인터 배열이 된다. >따라서 괄호의 유무가 중요하다. # 4 main() 함수의 인수 전달 ->main() 함수는 프로그램이 실행되면 제일 먼저 자동으로 호출되는 함수이다. +>main() 함수는 프로그램이 실행되면 제일 먼저 자동으로 호출되는 함수이다. 이러한 main() 함수도 함수이기 때문에 인수를 전달받을 수도 있고, 반환값을 가질 수도 있다. >C 언어의 main() 함수의 원형은 다음과 같다. @@ -180,7 +188,9 @@ printf("%d\n", pArr[1][1]); // 배열 포인터로 참조 void(또는 int) main(int argc, char *argv[]); ``` ->C 언어의 main() 함수의 첫 번째 인수는 int형 변수인 argc로 main() 함수에 인수로 전달되는 문자열의 개수를 명시한다. +>C 언어의 main() 함수의 첫 번째 인수는 int형 변수인 argc로  +>main() 함수에 인수로 전달되는 문자열의 개수를 명시한다. ->두 번째 인수는 char형 포인터 배열인 argv로 main() 함수에 인수로 전달된 각각의 문자열이 저장된 배열을 가리킨다. +>두 번째 인수는 char형 포인터 배열인 argv로  +>main() 함수에 인수로 전달된 각각의 문자열이 저장된 배열을 가리킨다. diff --git a/_posts/2023-12-04-31_MemoryStructure.md b/_posts/Language/C/2023-12-04-31_MemoryStructure.md similarity index 67% rename from _posts/2023-12-04-31_MemoryStructure.md rename to _posts/Language/C/2023-12-04-31_MemoryStructure.md index 19f0f52f31e7..9c0c1bd575f0 100644 --- a/_posts/2023-12-04-31_MemoryStructure.md +++ b/_posts/Language/C/2023-12-04-31_MemoryStructure.md @@ -12,10 +12,10 @@ toc: true # 1 메모리의 구조 ->프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다. +>프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 한다. >또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요하다. ->따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다. +>따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있다. >프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같다. 1. 코드(code) 영역 @@ -34,7 +34,8 @@ toc: true - 코드(code) 영역 ->메모리의 코드(code) 영역이란 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code) 영역을 의미한다. +>메모리의 코드(code) 영역이란 실행할 프로그램의 코드가 저장되는 영역으로 +>텍스트(code) 영역을 의미한다. >CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리하게 된다. @@ -42,7 +43,8 @@ toc: true - 데이터(data) 영역 ->메모리의 데이터(data) 영역이란 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역을 의미한다. +>메모리의 데이터(data) 영역이란 +>프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역을 의미한다. >데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다. @@ -50,20 +52,23 @@ toc: true - 스택(stack) 영역 ->메모리의 스택(stack) 영역이란 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역을 의미한다. +>메모리의 스택(stack) 영역이란 +>함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역을 의미한다. ->스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. +>스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다. ->스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다. -이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출된다. +>스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다. +이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, +가장 늦게 저장된 데이터가 가장 먼저 인출된다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다. ## 1.4 힙(heap) 영역 - 힙(heap) 영역 ->메모리의 힙(heap) 영역이란 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역을 의미한다. +>메모리의 힙(heap) 영역이란 사용자가 직접 관리할 수 있는 +>'그리고 해야만 하는' 메모리 영역을 의미한다. ->힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. +>힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다. diff --git a/_posts/2023-12-04-32_StackFrame.md b/_posts/Language/C/2023-12-04-32_StackFrame.md similarity index 60% rename from _posts/2023-12-04-32_StackFrame.md rename to _posts/Language/C/2023-12-04-32_StackFrame.md index 981154308623..32c90d42155f 100644 --- a/_posts/2023-12-04-32_StackFrame.md +++ b/_posts/Language/C/2023-12-04-32_StackFrame.md @@ -12,18 +12,19 @@ toc: true # 1 스택 프레임(stack frame) ->메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. -스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. - ->함수가 호출되면 스택에는 함수의 매개변수, ->호출이 끝난 뒤 돌아갈 반환 주소값, +>메모리의 스택(stack) 영역은 함수의 호출과 관계되는 +>지역 변수와 매개변수가 저장되는 영역이다. +스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. + +>함수가 호출되면 스택에는 함수의 매개변수, +>호출이 끝난 뒤 돌아갈 반환 주소값, >함수에서 선언된 지역 변수 등이 저장된다. - 스택 프레임(stack frame) >스택 프레임(stack frame)이란 스택 영역에 차례대로 저장되는 함수의 호출 정보를 의미한다. ->이러한 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, +>이러한 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, >해당 함수가 호출되기 이전 상태로 되돌아갈 수 있다. ## 1.1 스택 프레임의 동작 방식 @@ -54,34 +55,40 @@ void func2() ![image](https://github.com/EunChong999/EunChong999/assets/136239807/5d0e8a98-fe8e-4538-b9da-55e58059f317) -Step 1. 프로그램이 실행되면, 가장 먼저 main() 함수가 호출되어 main() 함수의 스택 프레임이 스택에 저장된다. +Step 1. 프로그램이 실행되면, 가장 먼저 main() 함수가 호출되어 +main() 함수의 스택 프레임이 스택에 저장된다. -Step 2. func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장된다. +Step 2. func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, +지역 변수 등의 스택 프레임이 스택에 저장된다. Step 3. func2() 함수를 호출하면 해당 함수의 스택 프레임이 추가로 스택에 저장된다. -Step 4. func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임만이 스택에서 제거된다. +Step 4. func2() 함수의 모든 작업이 완료되어 반환되면, +func2() 함수의 스택 프레임만이 스택에서 제거된다. -Step 5. func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거된다. +Step 5. func1() 함수의 호출이 종료되면, +func1() 함수의 스택 프레임이 스택에서 제거된다. -Step 6. main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료된다. +Step 6. main() 함수의 모든 작업이 완료되면, +main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료된다. ->이처럼 스택은 가장 나중에 저장된 데이터가 가장 먼저 인출되는 방식으로 동작한다. -이러한 방식을 후입선출(LIFO, Last-In First-Out) 방식이라고 한다. +>이처럼 스택은 가장 나중에 저장된 데이터가 가장 먼저 인출되는 방식으로 동작한다. +이러한 방식을 후입선출(LIFO, Last-In First-Out) 방식이라고 한다. 이때 스택은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다. #### 스택 오버플로우(stack overflow) ->함수의 재귀 호출이 무한히 반복되면,  +>함수의 재귀 호출이 무한히 반복되면,  >해당 프로그램은 스택 오버플로우(stack overflow)에 의해 종료된다. ->만약 재귀 호출이 무한히 반복되면, ->위 그림에서 Step 3 이후로는 재귀 호출에 의한 스택 프레임이 계속해서 쌓여만 갈 것이다. -이렇게 스택의 모든 공간을 다 차지하고 난 후 더 이상의 여유 공간이 없을 때 또 다시 스택 프레임을 저장하게 되면, 해당 데이터는 스택 영역을 넘어가서 저장되게 된다. +>만약 재귀 호출이 무한히 반복되면, +>위 그림에서 Step 3 이후로는 재귀 호출에 의한 스택 프레임이 계속해서 쌓여만 갈 것이다. +이렇게 스택의 모든 공간을 다 차지하고 난 후 더 이상의 여유 공간이 없을 때 +또 다시 스택 프레임을 저장하게 되면, 해당 데이터는 스택 영역을 넘어가서 저장되게 된다. ![image](https://github.com/EunChong999/EunChong999/assets/136239807/b2254cc1-87f8-41b8-8ad6-de08d10904df) ->이렇게 해당 스택 영역을 넘어가도 데이터가 저장될 수 있으면, ->해당 프로그램은 오동작을 하게 되거나 보안상의 크나큰 취약점을 가지게 된다. -따라서 C 언어에서는 실행 중인 프로그램에서 스택 오버플로우가 발생하면, +>이렇게 해당 스택 영역을 넘어가도 데이터가 저장될 수 있으면, +>해당 프로그램은 오동작을 하게 되거나 보안상의 크나큰 취약점을 가지게 된다. +따라서 C 언어에서는 실행 중인 프로그램에서 스택 오버플로우가 발생하면, 에러를 발생하고 곧바로 강제 종료시킨다. diff --git a/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md b/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md new file mode 100644 index 000000000000..0ca49381bedf --- /dev/null +++ b/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md @@ -0,0 +1,108 @@ +--- +layout: single +title: Chapter 33 메모리의 동적 할당 +date: 2023-12-04 18:56:13 +09:00 +categories: + - Language +tags: + - C +excerpt: 메모리의 동적 할당에 관한 글입니다. +toc: true +--- + +# 1 메모리의 동적 할당(dynamic allocation) + +>데이터 영역과 스택 영역에 할당되는 메모리의 크기는 +> 컴파일 타임(compile time)에 미리 결정된다. +하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 +런 타임(run time)에 사용자가 직접 결정하게 된다. + +- 메모리의 동적 할당(dynamic allocation) + +>메모리의 동적 할당(dynamic allocation)이란 런 타임에 메모리를 할당받는 것을 의미한다. + +## 1.1 malloc() 함수 + +- malloc() + +>malloc() 함수는 프로그램이 실행 중일 때 +>사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해준다. + +>malloc() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +void *malloc(size_t size);   +``` + +>malloc() 함수는 인수로 할당받고자 하는 메모리의 크기를 바이트 단위로 전달받는다. +이 함수는 전달받은 메모리 크기에 맞고, 아직 할당되지 않은 적당한 블록을 찾는다. +이렇게 찾은 블록의 첫 번째 바이트를 가리키는 주소값을 반환한다. + +>힙 영역에 할당할 수 있는 적당한 블록이 없을 때에는 널 포인터를 반환한다. +주소값을 반환받기 때문에 힙 영역에 할당된 +메모리 공간으로 접근하려면 포인터를 사용해야 한다. + +>malloc() 함수의 원형에서 볼 수 있는 size_t 타입은 부호없는 정수이다. + +#### free() 함수 + +free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수입니다. + +데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되어, 프로그램이 실행되는 내내 고정됩니다. + +하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변화됩니다. + +따라서 free() 함수를 사용하여 다 사용한 메모리를 해제해 주지 않으면, 메모리가 부족해지는 현상이 발생할 수 있습니다. + +이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(memory leak)라고 합니다. + +free() 함수의 원형은 다음과 같습니다. + +##### 원형 + +#include + +void free(void *ptr); + +free() 함수는 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달받습니다. + +인수의 타입이 void형 포인터로 선언되어 있으므로, 어떠한 타입의 포인터라도 인수로 전달될 수 있습니다. + +다음 예제는 크기가 고정된 배열이 아닌 런 타임에 크기가 결정되는 배열을 생성하는 예제입니다. + +##### 예제 + +ptr_arr = (int*) malloc(arr_len * sizeof(int)); // 메모리의 동적 할당   + +if (ptr_arr == NULL) // 메모리의 동적 할당이 실패할 경우 + +{ + +    printf("메모리의 동적 할당에 실패했습니다.\n"); + +    exit(1); + +}   + +printf("동적으로 할당받은 메모리의 초깃값은 다음과 같습니다.\n"); + +for (i = 0; i < arr_len; i++) + +{ + +    printf("%d ", ptr_arr[i]); + +} + +free(ptr_arr);       // 동적으로 할당된 메모리의 반환   + +[코딩연습 ▶](https://tcpschool.com/examples/tryit/tryC.php?filename=c_memory_malloc_01) + +##### 실행 결과 + +동적으로 할당받은 메모리의 초기값은 다음과 같습니다. + +0 0 0 \ No newline at end of file diff --git a/_posts/2023-12-04-34_BasicIO.md b/_posts/Language/C/2023-12-04-34_BasicIO.md similarity index 100% rename from _posts/2023-12-04-34_BasicIO.md rename to _posts/Language/C/2023-12-04-34_BasicIO.md diff --git a/_posts/2023-12-04-35_CharacterInputOutputFunction.md b/_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md similarity index 100% rename from _posts/2023-12-04-35_CharacterInputOutputFunction.md rename to _posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md diff --git a/_posts/2023-12-04-36_String.md b/_posts/Language/C/2023-12-04-36_String.md similarity index 100% rename from _posts/2023-12-04-36_String.md rename to _posts/Language/C/2023-12-04-36_String.md diff --git a/_posts/2023-12-04-37_StringIOFunction.md b/_posts/Language/C/2023-12-04-37_StringIOFunction.md similarity index 100% rename from _posts/2023-12-04-37_StringIOFunction.md rename to _posts/Language/C/2023-12-04-37_StringIOFunction.md diff --git a/_posts/2023-12-04-38_StringProcessingFunction.md b/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md similarity index 100% rename from _posts/2023-12-04-38_StringProcessingFunction.md rename to _posts/Language/C/2023-12-04-38_StringProcessingFunction.md diff --git a/_posts/2023-12-04-39_BasicStructure.md b/_posts/Language/C/2023-12-04-39_BasicStructure.md similarity index 100% rename from _posts/2023-12-04-39_BasicStructure.md rename to _posts/Language/C/2023-12-04-39_BasicStructure.md diff --git a/_posts/2023-12-04-40_PointersAndStructures.md b/_posts/Language/C/2023-12-04-40_PointersAndStructures.md similarity index 100% rename from _posts/2023-12-04-40_PointersAndStructures.md rename to _posts/Language/C/2023-12-04-40_PointersAndStructures.md diff --git a/_posts/2023-12-04-41_UtilizationOfStructures.md b/_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md similarity index 100% rename from _posts/2023-12-04-41_UtilizationOfStructures.md rename to _posts/Language/C/2023-12-04-41_UtilizationOfStructures.md diff --git a/_posts/2023-12-04-43_CommonAndEnumeration.md b/_posts/Language/C/2023-12-04-43_CommonAndEnumeration.md similarity index 100% rename from _posts/2023-12-04-43_CommonAndEnumeration.md rename to _posts/Language/C/2023-12-04-43_CommonAndEnumeration.md diff --git a/_posts/2023-12-04-43_ConsoleIO.md b/_posts/Language/C/2023-12-04-43_ConsoleIO.md similarity index 100% rename from _posts/2023-12-04-43_ConsoleIO.md rename to _posts/Language/C/2023-12-04-43_ConsoleIO.md diff --git a/_posts/2023-12-04-44_FileIO.md b/_posts/Language/C/2023-12-04-44_FileIO.md similarity index 100% rename from _posts/2023-12-04-44_FileIO.md rename to _posts/Language/C/2023-12-04-44_FileIO.md diff --git a/_posts/2023-12-04-45_FileIOFunction.md b/_posts/Language/C/2023-12-04-45_FileIOFunction.md similarity index 100% rename from _posts/2023-12-04-45_FileIOFunction.md rename to _posts/Language/C/2023-12-04-45_FileIOFunction.md diff --git a/_posts/2023-12-04-46_Pre-processor.md b/_posts/Language/C/2023-12-04-46_Pre-processor.md similarity index 100% rename from _posts/2023-12-04-46_Pre-processor.md rename to _posts/Language/C/2023-12-04-46_Pre-processor.md diff --git a/_posts/2023-12-04-47_MacroFunction.md b/_posts/Language/C/2023-12-04-47_MacroFunction.md similarity index 100% rename from _posts/2023-12-04-47_MacroFunction.md rename to _posts/Language/C/2023-12-04-47_MacroFunction.md diff --git a/_posts/2023-12-04-48_Pre-definedMacro.md b/_posts/Language/C/2023-12-04-48_Pre-definedMacro.md similarity index 100% rename from _posts/2023-12-04-48_Pre-definedMacro.md rename to _posts/Language/C/2023-12-04-48_Pre-definedMacro.md diff --git a/_posts/2023-12-04-49_HeaderFiles.md b/_posts/Language/C/2023-12-04-49_HeaderFiles.md similarity index 100% rename from _posts/2023-12-04-49_HeaderFiles.md rename to _posts/Language/C/2023-12-04-49_HeaderFiles.md diff --git a/_posts/2023-12-04-50_SplitCompilation.md b/_posts/Language/C/2023-12-04-50_SplitCompilation.md similarity index 100% rename from _posts/2023-12-04-50_SplitCompilation.md rename to _posts/Language/C/2023-12-04-50_SplitCompilation.md diff --git a/_posts/2023-12-04-51_ConditionalCompilation.md b/_posts/Language/C/2023-12-04-51_ConditionalCompilation.md similarity index 100% rename from _posts/2023-12-04-51_ConditionalCompilation.md rename to _posts/Language/C/2023-12-04-51_ConditionalCompilation.md diff --git a/_posts/2023-12-04-52_ByteStorageOrder.md b/_posts/Language/C/2023-12-04-52_ByteStorageOrder.md similarity index 100% rename from _posts/2023-12-04-52_ByteStorageOrder.md rename to _posts/Language/C/2023-12-04-52_ByteStorageOrder.md diff --git a/_posts/2023-12-04-53_BitOperation.md b/_posts/Language/C/2023-12-04-53_BitOperation.md similarity index 100% rename from _posts/2023-12-04-53_BitOperation.md rename to _posts/Language/C/2023-12-04-53_BitOperation.md diff --git a/_posts/2023-12-04-54_RepresentationOfNegativeNumbers.md b/_posts/Language/C/2023-12-04-54_RepresentationOfNegativeNumbers.md similarity index 100% rename from _posts/2023-12-04-54_RepresentationOfNegativeNumbers.md rename to _posts/Language/C/2023-12-04-54_RepresentationOfNegativeNumbers.md diff --git a/_posts/2023-12-04-55_ExpressionsOfRealNumbers.md b/_posts/Language/C/2023-12-04-55_ExpressionsOfRealNumbers.md similarity index 100% rename from _posts/2023-12-04-55_ExpressionsOfRealNumbers.md rename to _posts/Language/C/2023-12-04-55_ExpressionsOfRealNumbers.md From 7a86cc824d82e4332b7cd5ecad6bd5ece62e0a28 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sun, 10 Dec 2023 23:01:38 +0900 Subject: [PATCH 31/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2023-12-04-33_DynamicMemoryAllocation.md | 147 +++++++++++++++--- 1 file changed, 122 insertions(+), 25 deletions(-) diff --git a/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md b/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md index 0ca49381bedf..dab093587fee 100644 --- a/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md +++ b/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md @@ -47,62 +47,159 @@ void *malloc(size_t size);   >malloc() 함수의 원형에서 볼 수 있는 size_t 타입은 부호없는 정수이다. -#### free() 함수 +## 1.2 free() 함수 -free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수입니다. +>free() 함수는 힙 영역에 할당받은 메모리 공간을 다시 운영체제로 반환해 주는 함수이다. +데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 +컴파일 타임에 결정되어, 프로그램이 실행되는 내내 고정된다. +하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변화된다. +따라서 free() 함수를 사용하여 다 사용한 메모리를 해제해 주지 않으면, +메모리가 부족해지는 현상이 발생할 수 있다. -데이터 영역이나 스택 영역에 할당되는 메모리의 크기는 컴파일 타임에 결정되어, 프로그램이 실행되는 내내 고정됩니다. +- 메모리 누수(memory leak) -하지만 메모리의 동적 할당으로 힙 영역에 생성되는 메모리의 크기는 런 타임 내내 변화됩니다. +>메모리 누수(memory leak)란 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 의미한다. -따라서 free() 함수를 사용하여 다 사용한 메모리를 해제해 주지 않으면, 메모리가 부족해지는 현상이 발생할 수 있습니다. +>free() 함수의 원형은 다음과 같다. -이처럼 사용이 끝난 메모리를 해제하지 않아서 메모리가 부족해지는 현상을 메모리 누수(memory leak)라고 합니다. +- 원형 -free() 함수의 원형은 다음과 같습니다. +```c +#include +void free(void *ptr); +``` + +>free() 함수는 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달받는다. +인수의 타입이 void형 포인터로 선언되어 있으므로, +어떠한 타입의 포인터라도 인수로 전달될 수 있다. + +>다음 예제는 크기가 고정된 배열이 아닌 런 타임에 크기가 결정되는 배열을 생성하는 예제이다. + +- 예제 + +```c +ptr_arr = (int*) malloc(arr_len * sizeof(int)); // 메모리의 동적 할당   +if (ptr_arr == NULL) // 메모리의 동적 할당이 실패할 경우 +{ +    printf("메모리의 동적 할당에 실패했습니다.\n"); +    exit(1); +}   + +printf("동적으로 할당받은 메모리의 초깃값은 다음과 같습니다.\n"); +for (i = 0; i < arr_len; i++) +{ +    printf("%d ", ptr_arr[i]); +} -##### 원형 +free(ptr_arr);       // 동적으로 할당된 메모리의 반환   +``` + +- 실행 결과 + +```c +동적으로 할당받은 메모리의 초기값은 다음과 같습니다. +0 0 0 +``` + +## 1.3 calloc() 함수 + +>calloc() 함수는 malloc() 함수와 마찬가지로 힙 영역에 메모리를 동적으로 할당해주는 함수이다. +이 함수가 malloc() 함수와 다른 점은 할당하고자 하는 메모리의 크기를 +두 개의 인수로 나누어 전달받는 점이다. + +>또한, calloc() 함수는 메모리를 할당받은 후에 +>해당 메모리의 모든 비트값을 전부 0으로 초기화해준다. +calloc() 함수도 malloc() 함수와 마찬가지로 free() 함수를 통해 +할당받은 메모리를 해제해 주어야 한다. + +>calloc() 함수의 원형은 다음과 같다. + +- 원형 +```c #include +void *calloc(size_t nmemb, size_t size); +``` -void free(void *ptr); +>calloc() 함수의 첫 번째 인수는 메모리 블록의 개수를 나타내며, +>두 번째 인수는 각 블록의 바이트 수를 나타낸다. +따라서 calloc() 함수는 힙 영역에 +size 크기의 메모리 블록을 nmemb개 할당받을 수 있도록 요청한다. -free() 함수는 인수로 해제하고자 하는 메모리 공간을 가리키는 포인터를 전달받습니다. +>앞선 예제에서 사용한 malloc() 함수와 다음 예제의 calloc() 함수는 똑같은 동작을 수행한다. -인수의 타입이 void형 포인터로 선언되어 있으므로, 어떠한 타입의 포인터라도 인수로 전달될 수 있습니다. +- 예제 -다음 예제는 크기가 고정된 배열이 아닌 런 타임에 크기가 결정되는 배열을 생성하는 예제입니다. +```c +1. ptr_arr = (int*) malloc(arr_len * sizeof(int)); +2. ptr_arr = (int*) calloc(arr_len, sizeof(int)); +``` -##### 예제 +## 1.4 realloc() 함수 -ptr_arr = (int*) malloc(arr_len * sizeof(int)); // 메모리의 동적 할당   +>realloc() 함수는 이미 할당된 메모리의 크기를 바꾸어 재할당할 때 사용하는 함수이다. -if (ptr_arr == NULL) // 메모리의 동적 할당이 실패할 경우 +>realloc() 함수의 원형은 다음과 같다. -{ +- 원형 -    printf("메모리의 동적 할당에 실패했습니다.\n"); +```c +#include +void *realloc(void *ptr, size_t size); +``` -    exit(1); +>realloc() 함수의 첫 번째 인수는 +>크기를 바꾸고자 하는 메모리 공간을 가리키는 포인터를 전달받는다. +두 번째 인수로는 해당 메모리 공간에 재할당할 크기를 전달한다. +따라서 첫 번째 인수로 NULL이 전달되면, malloc() 함수와 정확히 같은 동작을 하게 된다. + +>다음 예제는 런 타임에 크기가 결정된 배열의 크기를 +>realloc() 함수를 사용해 다시 한 번 늘려주는 예제이다. +- 예제 + +```c +ptr_arr = (int*) malloc(arr_len * sizeof(int)); // 메모리의 동적 할당   +if (ptr_arr == NULL) // 메모리의 동적 할당이 실패할 경우 +{ +    printf("메모리의 동적 할당에 실패했습니다.\n"); +    exit(1); }   printf("동적으로 할당받은 메모리의 초깃값은 다음과 같습니다.\n"); - for (i = 0; i < arr_len; i++) +{ +    printf("%d ", ptr_arr[i]); +} +total_len = arr_len + add_len; +ptr_arr = (int*) realloc(ptr_arr, (total_len * sizeof(int))); // 메모리의 추가 할당 +if (ptr_arr == NULL) // 메모리의 추가 할당에 실패할 경우 { +    printf("메모리의 추가 할당에 실패했습니다.\n"); +    exit(1); +}   +printf("\n추가로 할당받은 메모리의 초깃값은 다음과 같습니다.\n"); +for (i = 0; i < total_len; i++) +{     printf("%d ", ptr_arr[i]); - } -free(ptr_arr);       // 동적으로 할당된 메모리의 반환   - -[코딩연습 ▶](https://tcpschool.com/examples/tryit/tryC.php?filename=c_memory_malloc_01) +free(ptr_arr); // 동적으로 할당된 메모리의 반환 +``` -##### 실행 결과 +- 실행 결과 +```c 동적으로 할당받은 메모리의 초기값은 다음과 같습니다. +0 0 0  +추가로 할당받은 메모리의 초기값은 다음과 같습니다. +0 0 0 0 0  +``` -0 0 0 \ No newline at end of file +>realloc() 함수는 만약 기존의 메모리 위치에 충분한 공간이 있다면 +>바로 이어서 추가 메모리 공간을 할당해준다. +하지만 기존의 메모리 위치에 충분한 공간이 없으면 +메모리의 다른 공간에 기존의 데이터를 복사한 후, +이어서 추가 메모리 공간을 할당하게 된다. \ No newline at end of file From d5216a8bafa8c639396612e4a3c0be48f6357aed Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sun, 10 Dec 2023 23:13:46 +0900 Subject: [PATCH 32/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 12 +-- .../2023-12-04-33_DynamicMemoryAllocation.md | 2 - _posts/Language/C/2023-12-04-34_BasicIO.md | 78 +++++++++++++++++++ 3 files changed, 84 insertions(+), 8 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 7ea4431e0212..1e7146a66c19 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", + "file": "_posts/Language/C/2023-12-04-34_BasicIO.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", + "file": "_posts/Language/C/2023-12-04-34_BasicIO.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", + "file": "_posts/Language/C/2023-12-04-34_BasicIO.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md" + "file": "_posts/Language/C/2023-12-04-34_BasicIO.md" } } } @@ -148,6 +148,8 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", + "_posts/Language/C/2023-12-04-34_BasicIO.md", "_posts/Language/C/2023-12-04-32_StackFrame.md", "_posts/Language/C/2023-12-04-31_MemoryStructure.md", "_posts/Language/C/2023-12-04-30_PointerArrayAndArrayPointers.md", @@ -172,8 +174,6 @@ "_posts/Language/C/2023-12-03-11_AssignmentOperator.md", "_posts/Language/C/2023-12-03-10_ArithmeticOperator.md", "_posts/Language/C/2023-12-03-09_TypeCasting.md", - "_posts/Language/C/2023-12-03-08_BasicType.md", - "_posts/Language/C/2023-12-03-01_C.md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", diff --git a/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md b/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md index dab093587fee..69c5eb590e50 100644 --- a/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md +++ b/_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md @@ -23,8 +23,6 @@ toc: true ## 1.1 malloc() 함수 -- malloc() - >malloc() 함수는 프로그램이 실행 중일 때 >사용자가 직접 힙 영역에 메모리를 할당할 수 있게 해준다. diff --git a/_posts/Language/C/2023-12-04-34_BasicIO.md b/_posts/Language/C/2023-12-04-34_BasicIO.md index 632b80dae266..a50198e33778 100644 --- a/_posts/Language/C/2023-12-04-34_BasicIO.md +++ b/_posts/Language/C/2023-12-04-34_BasicIO.md @@ -9,3 +9,81 @@ tags: excerpt: 기본적인 입출력에 관한 글입니다. toc: true --- + +# 1 기본적인 입출력 + +>C 언어에서는 기억장치에 저장되는 파일을 다루는 것과 +마찬가지 방식으로 입출력 장치를 다룬다. +따라서 키보드, 모니터와 같은 대부분의 콘솔 장치도  +C 프로그램에서는 자동으로 열리는 파일처럼 다뤄진다. +C 언어에서는 stdin 표준 스트림을 통해 입력 장치를 다루며, +stdout 표준 스트림을 통해 출력 장치를 다루게 된다. + +## 1.1 스트림(stream) + +>C 프로그램은 파일이나 콘솔의 입출력을 직접 다루지 않고, +스트림(stream)이라는 것을 통해 다룬다. + +- 스트림(stream) + +>스트림(stream)이란 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름을 의미한다. +즉, 스트림은 운영체제에 의해 생성되는 가상의 연결 고리를 의미한다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/9db0fd13-ca5b-4866-948e-bef07a41a283) + +>C 언어에서 파일과의 연결을 위한 스트림은 사용자가 직접 생성하고 소멸시켜야 한다. +하지만 콘솔 장치에 대한 스트림은 프로그램 실행 시 자동으로 생성되며, +프로그램 종료 시 자동으로 소멸한다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/5b75a5c5-f2d2-4251-8ebe-ee8fb2006613) + +>C 언어에서 기본적으로 제공되는 표준 스트림(standard stream)은 다음과 같다. + +![스크린샷(757)](https://github.com/EunChong999/EunChong999/assets/136239807/21f61ecc-bc9c-46e9-8671-65fb76a41b5c) + +## 1.2 EOF(End Of File) + +>운영체제에서 파일의 끝을 탐지하는 방법은 운영체제마다 약간씩 다르다. +하지만 C 언어는 운영체제와 상관없이, +파일의 끝에 도달했을 때 언제나 특별한 값을 반환하도록 한다. +그 값을 EOF(End Of File)라고 하며, 실제로 이 값은 -1을 나타낸다. + +>파일뿐만 아니라 키보드를 통한 입력 시에도 입력의 끝을 알려주는 방법이 필요하다. +대부분의 유닉스(UNIX) 시스템에서는 +라인의 시작 위치에서 Ctrl+D를 누르면 EOF를 발생시킬 수 있다. +윈도우 명령창에서는 해당 라인의 어디에서든 Ctrl+Z를 누르고 나서 +Enter를 누르면 EOF를 발생시킬 수 있다. + +>다음 예제는 사용자가 EOF를 입력할 때까지 계속해서 영문자를 한 문자씩 입력받는 예제이다. + +- 예제 + +```c +#include +int main(void) +{ +    char ch; +    printf("EOF가 입력될 때까지 영문자를 계속 입력받습니다 :\n"); +    printf("(윈도우에서 EOF의 강제 발생은 Ctrl+Z를 누르고 나서 Enter를 누르면 됩니다)\n"); + +    while ((ch = getchar()) != EOF) +    { +        putchar(ch); +    } +    return 0; +} +``` + +- 실행 결과 + +```c +EOF가 입력될 때까지 영문자를 계속 입력받습니다 :  +(윈도우에서 EOF의 강제 발생은 Ctrl+Z를 누르고 나서 Enter를 누르면 됩니다) +a +a +b +b +-1 +-1 +^Z +``` \ No newline at end of file From 76e29fc98632944fe2d8ed3d9bd3d23e0d2203e1 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Sun, 10 Dec 2023 23:29:59 +0900 Subject: [PATCH 33/41] =?UTF-8?q?feat=20:=20=20=ED=8F=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 10 +- ...3-12-04-35_CharacterInputOutputFunction.md | 102 ++++++++++++++++++ 2 files changed, 107 insertions(+), 5 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 1e7146a66c19..b7b6a2c10590 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-34_BasicIO.md", + "file": "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-34_BasicIO.md", + "file": "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-34_BasicIO.md", + "file": "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-34_BasicIO.md" + "file": "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md" } } } @@ -148,8 +148,8 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ - "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", "_posts/Language/C/2023-12-04-34_BasicIO.md", + "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", "_posts/Language/C/2023-12-04-32_StackFrame.md", "_posts/Language/C/2023-12-04-31_MemoryStructure.md", "_posts/Language/C/2023-12-04-30_PointerArrayAndArrayPointers.md", diff --git a/_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md b/_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md index 2d169af6501e..6a302dbea374 100644 --- a/_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md +++ b/_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md @@ -9,3 +9,105 @@ tags: excerpt: 문자 입출력 함수에 관한 글입니다. toc: true --- +# 1 단일 문자 입력 함수 + +>C 언어에서 하나의 문자를 입력할 때에는 getchar() 함수나 fgetc() 함수를 사용한다. + +## 1.1 getchar() 함수 + +>getchar() 함수는 표준 입력 스트림(stdin)인 키보드로부터 하나의 문자를 입력받는 함수이다. + +>getchar() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +int getchar(void); +``` + +## 1.2 fgetc() 함수 + +>fgetc() 함수는 getchar() 함수와 마찬가지로  +>표준 입력 스트림(stdin)인 키보드로부터 하나의 문자를 입력받는 함수이다. + +>하지만 getchar() 함수와는 달리 문자를 입력받을 스트림을 +>인수로 전달하여 직접 지정할 수 있다. +따라서 fgetc() 함수는 키보드뿐만 아니라 파일을 통해서도 문자를 입력받을 수 있다. + +>fgetc() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +int fgetc(FILE *stream); +``` + +# 2 단일 문자 출력 함수 + +>C 언어에서 하나의 문자를 출력할 때에는 putchar() 함수나 fputc() 함수를 사용한다. + +## 2.1 putchar() 함수 + +>putchar() 함수는 표준 출력 스트림(stdout)인 모니터에 하나의 문자를 출력하는 함수이다. + +>putchar() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +int putchar(int c); +``` + +## 2.2 fputc() 함수 + +>fputc() 함수는 putchar() 함수와 마찬가지로 +>표준 출력 스트림(stdout)인 모니터에 하나의 문자를 출력하는 함수이다. + +>하지만 putchar() 함수와는 달리 문자를 출력할 스트림을 +>인수로 전달하여 직접 지정할 수 있다. +따라서 fputc() 함수는 모니터뿐만 아니라 파일을 통해서도 문자를 출력(저장)할 수 있다. + +>fputc() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +int fputc(int c, FILE *stream); +``` + +>다음 예제는 단일 문자 입출력 함수를 사용하여, +>'x'문자가 입력될 때까지 계속해서 영문자를 입력받고 출력하는 예제이다. + +- 예제 + +```c +#include    +int main(void) +{ +    char ch; +    printf("x가 입력될 때까지 영문자를 계속 입력받습니다 :\n");   + +    while ((ch = getchar()) != 'x') +    { +        putchar(ch); +    }   +    printf("x를 입력하셨습니다.\n");   +    return 0; +} +``` + +- 실행 결과 + +```c +x가 입력될 때까지 영문자를 계속 입력받습니다 :  +c +c +d +d +x +x를 입력하셨습니다. +``` \ No newline at end of file From e371e2508a558396d496d03cefcd079d276a18f5 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Mon, 11 Dec 2023 18:28:57 +0900 Subject: [PATCH 34/41] =?UTF-8?q?feat=20:=20Chapter=2036=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 12 ++-- _posts/Language/C/2023-12-04-36_String.md | 71 +++++++++++++++++++++++ 2 files changed, 77 insertions(+), 6 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index b7b6a2c10590..195c27a8723e 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", + "file": "_posts/Language/C/2023-12-04-36_String.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", + "file": "_posts/Language/C/2023-12-04-36_String.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", + "file": "_posts/Language/C/2023-12-04-36_String.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md" + "file": "_posts/Language/C/2023-12-04-36_String.md" } } } @@ -148,6 +148,8 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_posts/Language/C/2023-12-04-37_StringIOFunction.md", + "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", "_posts/Language/C/2023-12-04-34_BasicIO.md", "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", "_posts/Language/C/2023-12-04-32_StackFrame.md", @@ -172,8 +174,6 @@ "_posts/Language/C/2023-12-03-13_ComparisonOperator.md", "_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md", "_posts/Language/C/2023-12-03-11_AssignmentOperator.md", - "_posts/Language/C/2023-12-03-10_ArithmeticOperator.md", - "_posts/Language/C/2023-12-03-09_TypeCasting.md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", diff --git a/_posts/Language/C/2023-12-04-36_String.md b/_posts/Language/C/2023-12-04-36_String.md index 154e2755c634..3ca7b37b1201 100644 --- a/_posts/Language/C/2023-12-04-36_String.md +++ b/_posts/Language/C/2023-12-04-36_String.md @@ -9,3 +9,74 @@ tags: excerpt: 문자열에 관한 글입니다. toc: true --- +# 1 문자열(string) + +- 문자열 상수(string constant) + +>C 언어에서 문자열 상수(string constant)란 큰따옴표("")를 사용해 표현되는 문자열을 의미한다. + +>상수라고 표현하는 이유는 해당 문자열이 이름을 가지고 있지 않으며, +>문자열의 내용 또한 변경할 수 없기 때문입니다. + +- 문자열(string) + +>C 언어에서 문자열(string)이란 메모리에 저장된 일련의 연속된 문자(character)들의 집합을 의미한다. + +>따라서 문자형 배열을 선언하면 이 배열이 곧 문자열 변수가 된다. + +>다음 예제는 문자열 상수 및 변수를 선언하는 여러 방법을 보여주는 예제이다. + +- 예제 + +```c +char str01[] = "This is a string.";    // 크기를 지정하지 않은 문자열 변수 선언 +char str02[7] = "string";              // 크기를 지정한 문자열 변수 선언 + +printf("이것은 문자열 상수입니다.\n"); // 문자열 상수 +printf("문자열 str01에 저장되어 있는 문자열은 \"%s\"입니다.\n", str01); +printf("문자열 str02에 저장되어 있는 문자열은 \"%s\"입니다.\n", str02);   +``` + +- 실행 결과 + +```c +이것은 문자열 상수입니다. +문자열 str01에 저장되어 있는 문자열은 "This is a string."입니다. +문자열 str02에 저장되어 있는 문자열은 "string"입니다. +``` + +>printf() 함수에서 사용된 '%s'는 문자열을 표현하기 위한 입출력 서식 문자이다. + +# 2 널(NULL) 문자 + +>문자형 배열로 선언된 문자열 변수는 문자열의 끝을 프로그램에 따로 알려주어야 한다. +그래야만 프로그램이 실제 문자열에 속한 값과 그 외의 쓰레깃값을 구분할 수 있다. + +>따라서 C 언어에서는 문자열에 속한 데이터가 끝나면, +>문자열의 끝을 의미하는 문자를 하나 더 삽입해 준다. +이 문자를 널(NULL) 문자라고 하며, '\0'으로 표시하고 아스키코드값은 0이다. + +>다음 예제는 널 문자를 이용하여 널 문자를 제외한 문자열의 길이를 계산하여 출력해주는 예제이다. + +- 예제 + +```c +int str_len = 0; +char str[] = "string"; + +while (str[str_len] != '\0') // 널 문자가 나올 때까지 길이를 증가함 +{ +    str_len++; +} +printf("이 문자열의 길이는 %d입니다.\n", str_len); +``` + +- 실행 결과 + +```c +이 문자열의 길이는 6입니다. +``` + +>다음 그림은 위 예제에서 사용된 문자열이 메모리 상에 어떻게 저장되어 있는지를 보여준다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/d5868786-d696-420d-b075-429488d7b303) From 6f535eda9d86f5c671eb0c714509791f1e3da766 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Wed, 13 Dec 2023 23:29:46 +0900 Subject: [PATCH 35/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 14 +- _posts/Language/C/2023-12-04-36_String.md | 2 +- .../C/2023-12-04-37_StringIOFunction.md | 94 +++++ .../2023-12-04-38_StringProcessingFunction.md | 360 ++++++++++++++++++ .../C/2023-12-04-39_BasicStructure.md | 36 ++ 5 files changed, 498 insertions(+), 8 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 195c27a8723e..70a91811c041 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-36_String.md", + "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", "mode": "source", "source": false } @@ -48,7 +48,7 @@ "state": { "type": "search", "state": { - "query": "Chapter 1 C 언어", + "query": "", "matchingCase": false, "explainSearch": false, "collapseAll": false, @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-36_String.md", + "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-36_String.md", + "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-36_String.md" + "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md" } } } @@ -148,7 +148,9 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "_posts/Language/C/2023-12-04-37_StringIOFunction.md", + "_posts/Language/C/2023-12-04-36_String.md", "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", "_posts/Language/C/2023-12-04-34_BasicIO.md", "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", @@ -172,8 +174,6 @@ "_posts/Language/C/2023-12-03-15_BitwiseOperator.md", "_posts/Language/C/2023-12-03-14_LogicalOperator.md", "_posts/Language/C/2023-12-03-13_ComparisonOperator.md", - "_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md", - "_posts/Language/C/2023-12-03-11_AssignmentOperator.md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", diff --git a/_posts/Language/C/2023-12-04-36_String.md b/_posts/Language/C/2023-12-04-36_String.md index 3ca7b37b1201..7815ce87619a 100644 --- a/_posts/Language/C/2023-12-04-36_String.md +++ b/_posts/Language/C/2023-12-04-36_String.md @@ -16,7 +16,7 @@ toc: true >C 언어에서 문자열 상수(string constant)란 큰따옴표("")를 사용해 표현되는 문자열을 의미한다. >상수라고 표현하는 이유는 해당 문자열이 이름을 가지고 있지 않으며, ->문자열의 내용 또한 변경할 수 없기 때문입니다. +>문자열의 내용 또한 변경할 수 없기 때문이다. - 문자열(string) diff --git a/_posts/Language/C/2023-12-04-37_StringIOFunction.md b/_posts/Language/C/2023-12-04-37_StringIOFunction.md index a3a44f56de9d..423be28bdea4 100644 --- a/_posts/Language/C/2023-12-04-37_StringIOFunction.md +++ b/_posts/Language/C/2023-12-04-37_StringIOFunction.md @@ -9,3 +9,97 @@ tags: excerpt: 문자열 입출력 함수에 관한 글입니다. toc: true --- + +# 1 문자열 입력 함수 + +>C 언어에서 문자열을 입력할 때에는 fgets() 함수를 사용한다. + +## 1.1 fgets() 함수 + +>fgets() 함수는 키보드뿐만 아니라 파일에서도 문자열을 입력받을 수 있는 함수이다. + +>fgets() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +char *fgets(char * restrict s, int n, FILE * restrict stream);   +``` + +>fgets() 함수의 첫 번째 인수는 입력받는 문자열을 +>저장하기 위해 선언한 배열의 시작 주소를 전달한다. +두 번째 인수로는 입력받을 수 있는 문자열의 최대 길이를 전달하고, +마지막 인수로는 문자열을 입력받을 스트림을 전달한다. + +# 2 문자열 출력 함수 + +>C 언어에서 문자열을 입력할 때에는 puts()함수나 fputs() 함수를 사용한다. + +## 2.1 puts() 함수 + +>puts() 함수는 표준 출력 스트림(stdout)인 모니터에 하나의 문자열을 출력하는 함수이다. +이 함수는 모니터에 문자열을 출력한 다음에 자동으로 줄을 바꿔준다. + +>puts() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +int puts(const char *s);   +``` + +>puts() 함수는 인수로 출력할 문자열을 가리키는 포인터를 전달한다. + +## 2.2 fputs() 함수 + +>fputs() 함수는 모니터뿐만 아니라 파일을 통해서도 문자를 출력(저장)할 수 있는 함수이다. +이 함수는 puts() 함수와는 달리 문자열을 출력한 다음에 자동으로 줄을 바꿔주지 않는다. + +>fputs() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +int fputs(const char * restrict s, FILE * restrict stream); +``` + +>fputs() 함수의 첫 번째 인수는 출력할 문자열을 가리키는 포인터를 전달한다. +>두 번째 인수로는 문자열을 출력할 스트림을 전달한다. + +>다음 예제는 문자열 입출력 함수를 사용하여,  +>사용자가 입력한 문자열을 그대로 출력하는 예제이다. + +- 예제 + +```c +#include +int main(void) +{ +    char str[100]; + +    fputs("문자열을 입력해 주세요 :\n", stdout); +    fgets(str, sizeof(str), stdin); +    puts("입력하신 문자열 : "); +    puts(str); +    fputs("입력하신 문자열 : ", stdout); +    fputs(str, stdout); +    return 0; +} +``` + +- 실행 결과 + +```c +문자열을 입력해 주세요 :  +C언어 문자열 입출력 +입력하신 문자열 :  +C언어 문자열 입출력 + +입력하신 문자열 : C언어 문자열 입출력 +``` + +>위의 예제에서 puts() 함수는 문자열을 출력한 후에 자동으로 줄 바꿈을 해준다. +하지만 fputs() 함수는 문자열을 출력한 후에 줄 바꿈을 하지 않는다. \ No newline at end of file diff --git a/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md b/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md index 066853a34bcd..866f656f2339 100644 --- a/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md +++ b/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md @@ -9,3 +9,363 @@ tags: excerpt: 문자열 처리 함수에 관한 글입니다. toc: true --- + +# 1 문자열 처리 함수 + +>C 언어에서 문자열은 마지막에 널 문자를 가지는 문자형 배열로 표현되며, +>기본 타입에는 포함되지 않는다. +따라서 C 컴파일러가 기본 타입을 위해 +제공하는 다양한 연산자를 자유롭게 사용할 수 없다. + +>이 때문에 C 언어는 문자열을 처리하기 위한 다양한 함수를 별도로 제공하고 있다. +C 언어에서 제공하는 대표적인 문자열 처리 함수는 다음과 같다. + +1. strlen() 함수 + +2. strcat(), strncat() 함수 + +3. strcpy(), strncpy() 함수 + +4. strcmp(), strncmp() 함수 + +5. atoi(), atol(), atoll(), atof() 함수 + +6. toupper(), tolower() 함수 + + +## 1.1 strlen() 함수 + +>strlen() 함수는 인수로 전달된 문자열의 길이를 반환하는 함수이다. +이때 문자열 여부를 구분하는 마지막 문자인 널 문자는 문자열의 길이에서 제외된다. + +>strlen() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +size_t strlen(const char *s);  +``` + +>다음 예제는 strlen() 함수를 이용하여 문자열의 길이를 구하는 예제이다. + +- 예제 + +```c +char str[] = "C언어";   +printf("이 문자열의 길이는 %d입니다.\n", strlen(str)); +``` + +- 실행 결과 + +```c +이 문자열의 길이는 7입니다. +``` + +>utf-8 인코딩 환경에서 한글은 한 문자당 3바이트로 처리된다. + +## 1.2 strcat()함수와 strncat() 함수 + +>strcat()함수와 strncat() 함수는 하나의 문자열에 다른 문자열을 연결해주는 함수이다. + +>strcat() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +char *strcat(char * restrict s1, const char * restrict s2);   +``` + +>strcat() 함수의 첫 번째 인수로 전달된 문자열은 기준 문자열이 된다. +두 번째 인수로 전달된 추가하고자 하는 문자열의 복사본이 기준 문자열 뒤에 추가된다. + +>위의 원형에서 볼 수 있는 restrict 키워드는 +>포인터의 선언에서만 사용할 수 있는 C99부터 추가된 키워드이다. +포인터를 선언할 때 이 키워드를 명시하면, +컴파일러는 해당 포인터가 가리키는 메모리에 대한 최적화를 실시한다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/72507d7f-4be9-48fd-bc1c-53713cd3dbdf) + +>이때 기준 문자열이 저장된 배열의 공간이 충분하지 않으면, +>배열을 채우고 남은 문자들이 배열 외부로 흘러넘칠 수 있다. +이러한 현상을 배열 오버플로우(overflow)라고 한다. +배열 오버플로우 현상을 방지하기 위해서는 strcat() 함수 대신에 +strncat() 함수를 사용하는 것이 좋다. + +>strncat() 함수는 strcat() 함수와 하는 일은 같지만, +>세 번째 인수로 추가할 문자열의 최대 길이를 지정할 수 있다. +이 함수는 널 문자를 만나거나, +추가하는 문자의 개수가 세 번째 인수로 전달된 최대 길이에 +도달할 때까지 추가를 계속한다. + +>strncat() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +char *strncat(char * restrict s1, const char * restrict s2, size_t n);   +``` + +- 예제 + +```c +char str01[20] = "C language is "; // 널 문자를 포함하여 15문자 +char str02[] = "Cool! and funny!";   +//strcat(str01, str02);   // 이 부분의 주석 처리를 삭제한 후 실행시키면 배열 오버플로우우가 발생함 +strncat(str01, str02, 5); // 이렇게 최대 허용치를 설정해 놓으면 배열 오버플로우우에 대해서는 안전해짐 +puts(str01); +``` + +- 실행 결과 + +```c +C language is Cool! +``` + +>위의 예제에서는 우선 널 문자를 포함한 총 14바이트 크기의 문자열을 +>19바이트 크기의 배열에 저장한다. +그리고 그 문자열에 정확히 5바이트 크기의 문자열을 추가하는 예제이다. +이때 strncat() 함수가 아닌 strcat() 함수를 사용해도 괜찮지만, +만약 5바이트 이상의 문자열을 추가하려고 한다면 배열 오버플로우가 발생할 것이다. + +## 1.3 strcpy() 함수와 strncpy() 함수 + +>strcpy() 함수와 strncpy() 함수는 문자열을 복사하는 함수이다. + +>strcpy() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +char *strcpy(char * restrict s1, const char * restrict s2);   +``` + +>strcpy() 함수는 첫 번째 인수로 전달된 배열에, +>두 번째 인수로 전달된 문자열을 복사한다. +하지만 이때 첫 번째 인수로 전달된 배열의 크기가 복사할 문자열의 길이보다 작으면, +배열 오버플로우가 발생한다. +배열 오버플로우 현상을 방지하기 위해서는 strcpy() 함수 대신에  +strncpy() 함수를 사용하는 것이 좋다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/99883c4f-a851-4cfc-87c5-79a37b58b304) + +>strncpy() 함수는 strcpy() 함수와 하는 일은 같지만, +>세 번째 인수로 복사할 문자열의 최대 길이를 지정할 수 있다. +이 함수는 널 문자를 만나거나, +복사하는 문자의 개수가 세 번째 인수로 전달된 최대 길이에 +도달할 때까지 복사를 계속한다. + +>strncpy() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +char *strncpy(char * restrict s1, const char * restrict s2, size_t n);    +``` + +>다음 예제는 strncpy() 함수를 이용하여 문자열의 일부분만을 복사하는 예제이다. +이렇게 복사한 문자열의 마지막에는 반드시 널 문자를 삽입해 주어야만 +C 프로그램이 제대로 문자열로 인식할 수 있다. + +- 예제 + +```c +char str01[20] = "C is Cool!"; +char str02[11];   + +// str02 배열의 크기만큼만 복사를 진행하며, 마지막 한 문자는 널 문자를 위한 것임 +strncpy(str02, str01, sizeof(str02)-1); +str02[sizeof(str02)-1] = '\0'; // 이 부분을 주석 처리하면, 맨 마지막에 널 문자를 삽입하지 않음 +puts(str02); +``` + +- 실행 결과 + +```c +C is Cool! +``` + +>다음 예제는 strncpy() 함수를 이용하여 문자열의 일부분만을 수정하는 예제이다. +strncpy() 함수의 첫 번째 인수에 배열 이름을 이용한 포인터 연산을 사용하여  +수정을 시작할 지점을 지정할 수 있다. + +- 예제 + +```c +char str[20] = "C is cool!";   +strncpy(str+5, "nice", 4); // 배열 이름을 이용한 포인터 연산으로 수정할 부분의 시작 부분을 지정함 +puts(str); +``` + +- 실행 결과 + +```c +C is nice! +``` + +## 1.4 strcmp() 함수와 strncmp() 함수 + +>strcmp() 함수와 strncmp() 함수는 문자열의 내용을 비교하는 함수이다. + +>strcmp() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +int strcmp(const char *s1, const char *s2);   +``` + +>strcmp() 함수는 인수로 두 개의 문자열 포인터를 전달받아, +>해당 포인터가 가리키는 문자열의 내용을 서로 비교한다. +두 문자열의 모든 문자는 아스키 코드값으로 자동 변환되며, +문자열의 맨 앞에서부터 순서대로 비교된다. + +>strcmp() 함수의 상황별 반환값은 다음과 같다. + +![스크린샷(758)](https://github.com/EunChong999/EunChong999/assets/136239807/ac5e1774-44b8-4594-be85-2d9b43150553) + +>strncmp() 함수는 strcmp() 함수와 하는 일은 같지만, +>세 번째 인수로 비교할 문자의 개수를 지정할 수 있다. +이 함수는 일치하지 않는 문자를 만나거나, +세 번째 인수로 전달된 문자의 개수만큼 비교를 계속한다. + +>strncmp() 함수의 원형은 다음과 같다. + +- 원형 + +```c +#include +int strncmp(const char *s1, const char *s2, size_t n);   +``` + +>다음 예제는 strcmp() 함수를 이용하여 두 문자열을 비교하는 예제이다. +strcmp() 함수는 문자열을 비교하는 함수이므로,  +문자를 비교할 때에는 관계연산자 '=='를 사용해야 한다. + +##### 예제 + +```c +#include +#include    +int main(void) +{ +    char str[20]; +    char ch;   + +    while (1) +    { +        puts("미국의 수도를 입력하세요 :"); +        scanf("%s", str); +        if (strcmp(str, "워싱턴") == 0 || strcmp(str, "washington") == 0) // 문자열의 비교 +        { +            puts("정답입니다!"); +            break; +        } +        else +            puts("아쉽네요~"); +        fflush(stdin);   + +        puts("\n이 프로그램을 끝내고자 한다면 'q'를 눌러주세요!"); +        puts("계속 도전하고자 하시면 Enter를 눌러주세요!"); +        scanf("%c", &ch);   +        if (ch == 'q') // 문자의 비교 +        { +            break; +        } +        fflush(stdin); +    } +    return 0; +} +``` + +##### 실행 결과 + +```c +미국의 수도를 입력하세요 :  +뉴욕 +아쉽네요~ + +이 프로그램을 끝내고자 한다면 'q'를 눌러주세요! +계속 도전하고자 하시면 Enter를 눌러주세요! + +미국의 수도를 입력하세요 :  +워싱턴 +정답입니다! +``` + +## 1.5 atoi(), atol(), atoll(), atof() 함수 + +>이 함수들은 인수로 전달된 문자열을 해당 타입의 숫자로 변환시켜주는 함수이다. + +>atoi(), atol(), atoll(), atof() 함수의 원형은 각각 다음과 같다. + +##### 원형 + +```c +#include +int atoi(const char *nptr);            // int형 정수로 변환함. +long int atol(const char *nptr);       // long형 정수로 변환함. +long long int atoll(const char *nptr); // long long형 정수로 변환함. +double atof(const char *nptr);         // double형 실수로 변환함.   +``` + +>다음 예제는 숫자로 이루어진 문자열을 숫자로 변환하여, +> 곱셈 연산을 수행하는 예제이다. + +- 예제 + +```c +char str01[] = "10"; +char str02[] = "20";   +printf("문자열을 숫자로 변환해서 곱한 값은 %d입니다.\n", atoi(str01) * atoi(str02)); +``` + +- 실행 결과 + +```c +문자열을 숫자로 변환해서 곱한 값은 200이다. +``` + +## 1.6 toupper() 함수와 tolower() 함수 + +>이 함수들은 인수로 전달된 문자열의 영문자를 +>모두 대문자나 소문자로 변환시켜주는 함수이다. + +>toupper(), tolower() 함수의 원형은 각각 다음과 같다. + +- 원형 + +```c +#include +int toupper(int c); // 문자열의 모든 영문자를 대문자로 변환함. +int tolower(int c); // 문자열의 모든 영문자를 소문자로 변환함.   +``` + +>다음 예제는 문자열 내의 모든 영문자를 대문자로 변환하는 예제이다. + +- 예제 + +```c +int i, str_len; +char str[] = "Hello C World!";   +printf("원래 문자열 : %s\n", str); + +str_len = strlen(str); +for (i = 0; i < str_len; i++) +{ +    str[i] = toupper(str[i]); +} +printf("바뀐 문자열 : %s\n", str); +``` + +- 실행 결과 + +```c +원래 문자열 : Hello C World! +바뀐 문자열 : HELLO C WORLD! +``` \ No newline at end of file diff --git a/_posts/Language/C/2023-12-04-39_BasicStructure.md b/_posts/Language/C/2023-12-04-39_BasicStructure.md index ccf2e0779847..10eb9eda2c44 100644 --- a/_posts/Language/C/2023-12-04-39_BasicStructure.md +++ b/_posts/Language/C/2023-12-04-39_BasicStructure.md @@ -9,3 +9,39 @@ tags: excerpt: 구조체의 기본에 관한 글입니다. toc: true --- + +# 1 구조체(structure type) + +- 구조체(structure type) + +>구조체(structure type)란 사용자가 C 언어의 기본 타입을 가지고 +>새롭게 정의할 수 있는 사용자 정의 타입을 의미한다. + +>구조체는 기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있다. + +>배열이 같은 타입의 변수 집합이라고 한다면, +>구조체는 다양한 타입의 변수 집합을 하나의 타입으로 나타낸 것이다. +이때 구조체를 구성하는 변수를  +구조체의 멤버(member) 또는 멤버 변수(member variable)라고 한다. + +--- + +## 1.1 구조체의 정의와 선언 + +>C 언어에서 구조체는 struct 키워드를 사용하여 다음과 같이 정의한다. + +- 문법 + +```c +struct 구조체이름 +{ +    멤버변수1의타입 멤버변수1의이름; +    멤버변수2의타입 멤버변수2의이름; +    ... +}; +``` + +>다음은 book이라는 이름의 구조체를 정의하는 그림이다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/18e39362-0630-4c39-9ff0-8a63445dae60) + From 6da74a011ba7e0e6e11523b5a8328cc20a0c61d3 Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Fri, 15 Dec 2023 00:05:01 +0900 Subject: [PATCH 36/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 10 +++++----- .../C/2023-12-04-38_StringProcessingFunction.md | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 70a91811c041..f66d19fc37ca 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", + "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", + "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", + "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md" + "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md" } } } @@ -148,6 +148,7 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_posts/Language/C/2023-12-04-39_BasicStructure.md", "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "_posts/Language/C/2023-12-04-37_StringIOFunction.md", "_posts/Language/C/2023-12-04-36_String.md", @@ -173,7 +174,6 @@ "_posts/Language/C/2023-12-03-16_OtherOperator.md", "_posts/Language/C/2023-12-03-15_BitwiseOperator.md", "_posts/Language/C/2023-12-03-14_LogicalOperator.md", - "_posts/Language/C/2023-12-03-13_ComparisonOperator.md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", diff --git a/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md b/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md index 866f656f2339..6af9a30090ce 100644 --- a/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md +++ b/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md @@ -247,7 +247,7 @@ int strncmp(const char *s1, const char *s2, size_t n);   strcmp() 함수는 문자열을 비교하는 함수이므로,  문자를 비교할 때에는 관계연산자 '=='를 사용해야 한다. -##### 예제 +- 예제 ```c #include @@ -283,7 +283,7 @@ int main(void) } ``` -##### 실행 결과 +- 실행 결과 ```c 미국의 수도를 입력하세요 :  From 3878a36fc4a49100d4633cada0c7c63e513b45ce Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Fri, 15 Dec 2023 00:08:59 +0900 Subject: [PATCH 37/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 16 ++++---- _posts/Language/C/2023-12-03-01_C.md | 37 ++++++++++++------- .../Language/C/2023-12-03-02_CProgramming.md | 18 ++++++--- 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index f66d19fc37ca..6cd3662891a7 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", + "file": "_posts/Language/C/2023-12-03-01_C.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", + "file": "_posts/Language/C/2023-12-03-01_C.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", + "file": "_posts/Language/C/2023-12-03-01_C.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md" + "file": "_posts/Language/C/2023-12-03-01_C.md" } } } @@ -148,8 +148,11 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ - "_posts/Language/C/2023-12-04-39_BasicStructure.md", + "_posts/Language/C/2023-12-03-03_CProgram.md", + "_posts/Language/C/2023-12-03-02_CProgramming.md", + "_posts/Language/C/2023-12-03-01_C.md", "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", + "_posts/Language/C/2023-12-04-39_BasicStructure.md", "_posts/Language/C/2023-12-04-37_StringIOFunction.md", "_posts/Language/C/2023-12-04-36_String.md", "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", @@ -171,9 +174,6 @@ "_posts/Language/C/2023-12-03-19_ControlStatement.md", "_posts/Language/C/2023-12-03-18_IterationStatement.md", "_posts/Language/C/2023-12-03-17_ConditionalStatement.md", - "_posts/Language/C/2023-12-03-16_OtherOperator.md", - "_posts/Language/C/2023-12-03-15_BitwiseOperator.md", - "_posts/Language/C/2023-12-03-14_LogicalOperator.md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", diff --git a/_posts/Language/C/2023-12-03-01_C.md b/_posts/Language/C/2023-12-03-01_C.md index a8ab19a67e8b..e7f8a2116291 100644 --- a/_posts/Language/C/2023-12-03-01_C.md +++ b/_posts/Language/C/2023-12-03-01_C.md @@ -12,18 +12,21 @@ toc: true - 프로그램(program) -> 프로그램(program)이란 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 처리 방법과 순서를 기술한 일련의 명령문의 집합체를 의미한다. +> 프로그램(program)이란 어떤 문제를 해결하기 위해 컴퓨터에게 주어지는 +> 처리 방법과 순서를 기술한 일련의 명령문의 집합체를 의미한다. ## 1.1 프로그래밍 언아(programming language) - 프로그래밍 언아(programming language) -> 프로그래밍 언아(programming language)란 기계(컴퓨터)에게 명령이나 연산을 시킬 목적으로 설계되어 기계와 의사소통을 할 수 있게 해주는 언어를 의미한다. +> 프로그래밍 언아(programming language)란 기계(컴퓨터)에게 +> 명령이나 연산을 시킬 목적으로 설계되어 기계와 의사소통을 할 수 있게 해주는 언어를 의미한다. ### 1.1.1 프로그래밍 언어의 분류 -> 프로그래밍 언어는 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나뉜다. -> 저급 언어와 고급 언어는, 기계가 이해하기 쉬운가(저급 언어), 사람이 이해하기 쉬운가(고급 언어)를 상대적으로 나눈 개념이라고 할 수 있다. +> 프로그래밍 언어는 크게 저급 언어(low-level language)와 고급 언어(high-level language)로 나뉜다. +> 저급 언어와 고급 언어는, 기계가 이해하기 쉬운가(저급 언어), +> 사람이 이해하기 쉬운가(고급 언어)를 상대적으로 나눈 개념이라고 할 수 있다. - 저급 언어(low-level language) @@ -37,32 +40,38 @@ toc: true > 고급 언어(high-level language)란 컴퓨터보다는 사람이 알기 쉽도록 작성된 프로그래밍 언어를 의미한다. -> 고급 언어는 컴파일러나 인터프리터에 의해 기계가 이해 할 수 있는 언어로 번역되어 실행 된다. +> 고급 언어는 컴파일러나 인터프리터에 의해 기계가 이해 할 수 있는 언어로 번역되어 실행 된다. > 저급 언어보다 상대적으로 실행 속도가 느리지만, 저급 언어에 비해 가독성이 높고 다루기가 쉽다. > 대표적인 언어로는 자바와 파이썬 등이 있다. -> C 언어는 저급 언어와 고급 언어의 특징을 모두 가지고 있는 절차 지향 프로그래밍 언어(procedure-oriented programming language)이다. +> C 언어는 저급 언어와 고급 언어의 특징을 모두 가지고 있는 +> 절차 지향 프로그래밍 언어(procedure-oriented programming language)이다. # 2 C 언어 ## 1.1 C 언어의 역사 -> C 언어는 1972년 벨 연구소의 켄 톰프슨(Kenneth Thompson)과 데니스 리치(Dennis Ritchie)가 유닉스(UNIX) 운영체제에서 사용하기 위해 개발한 범용적인 고급 언어이다. +> C 언어는 1972년 벨 연구소의 켄 톰프슨(Kenneth Thompson)과 데니스 리치(Dennis Ritchie)가 +> 유닉스(UNIX) 운영체제에서 사용하기 위해 개발한 범용적인 고급 언어이다. -> A 언어라고 불리는 ALGOL 60부터, CPL, BCPL을 거쳐, -켄 톰프슨이 B 언어를 개발하게 된다. -이후 데니스 리치가 B언어를 좀 더 개선하여 지금의 C 언어를 만들게 된다. -C 언어라는 이름의 유래 또한 B 언어 바로 다음에 개발되어서 명명된 이름이다. +> A 언어라고 불리는 ALGOL 60부터, CPL, BCPL을 거쳐, +켄 톰프슨이 B 언어를 개발하게 된다. +이후 데니스 리치가 B언어를 좀 더 개선하여 지금의 C 언어를 만들게 된다. +C 언어라는 이름의 유래 또한 B 언어 바로 다음에 개발되어서 명명된 이름이다. ## 1.2 C 언어의 탄생 배경 ->유닉스 운영체제는 C 언어 이전에 어셈블리어라는 저급 언어를 사용했다. -하지만 어셈블리어는 특정 하드웨어에 종속적인 언어여서, 이 언어로 작성된 프로그램은 다른 하드웨어로 이식할 수 없었다. 즉, 하나의 기능을 하는 프로그램을 CPU의 종류만큼 여러 번 작성해야만 했던 것이다. 따라서 이식성도 좋고 어셈블리어보다 쉬운 언어가 필요해졌고, +>유닉스 운영체제는 C 언어 이전에 어셈블리어라는 저급 언어를 사용했다. +하지만 어셈블리어는 특정 하드웨어에 종속적인 언어여서, +이 언어로 작성된 프로그램은 다른 하드웨어로 이식할 수 없었다. +즉, 하나의 기능을 하는 프로그램을 CPU의 종류만큼 여러 번 작성해야만 했던 것이다. +따라서 이식성도 좋고 어셈블리어보다 쉬운 언어가 필요해졌고, 그래서 개발된 언어가 바로 C 언어이다. > 현재 널리 사용되는 모든 운영체제의 커널은 대부분 C 언어를 이용해 구현되어 있다. -이처럼 C 언어는 시스템 프로그래밍에 가장 잘 어울리지만, 응용 프로그래밍에도 많이 사용되는 프로그래밍 언어이다. +이처럼 C 언어는 시스템 프로그래밍에 가장 잘 어울리지만, +응용 프로그래밍에도 많이 사용되는 프로그래밍 언어이다. ## 1.3 C 언어의 특징 diff --git a/_posts/Language/C/2023-12-03-02_CProgramming.md b/_posts/Language/C/2023-12-03-02_CProgramming.md index a93b3058d8e8..4af1de108548 100644 --- a/_posts/Language/C/2023-12-03-02_CProgramming.md +++ b/_posts/Language/C/2023-12-03-02_CProgramming.md @@ -12,7 +12,8 @@ toc: true - 프로그래밍(programming) -> 프로그래밍(programming)이란 목적에 맞는 알고리즘으로부터 프로그래밍 언어를 사용하여 구체적인 프로그램을 작성하는 과정을 의미한다. +> 프로그래밍(programming)이란 목적에 맞는 알고리즘으로부터 프로그래밍 언어를 사용하여 +> 구체적인 프로그램을 작성하는 과정을 의미한다. > 작성된 프로그램은 먼저 실행 파일(executable file)로 변환되어야 실행할 수 있다. @@ -36,7 +37,8 @@ toc: true - 소스 파일(source file) -> 소스 파일(source file)이란 C 언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 의미한다. 소스 파일을 원시 파일이라고도 한다. +> 소스 파일(source file)이란 C 언어를 사용하여 문법에 맞게 논리적으로 작성된 프로그램을 의미한다. +> 소스 파일을 원시 파일이라고도 한다. > C 언어를 통해 작성된 소스 파일의 확장자는 .c 가 된다. @@ -48,7 +50,8 @@ toc: true > 선행처리 작업은 선행처리기(preprocessor)가 수행한다. -> 선행처리기는 코드를 생성하는 것이 아닌, 컴파일하기 전 컴파일러가 작업하기 좋도록 소스를 재구성해주는 역할만을 한다. +> 선행처리기는 코드를 생성하는 것이 아닌, 컴파일하기 전 컴파일러가 작업하기 좋도록 +> 소스를 재구성해주는 역할만을 한다. ## 1.3 컴파일러(compiler)에 의한 컴파일 @@ -68,7 +71,8 @@ toc: true ## 1.4 링커(linker)에 의한 링크 -> 컴파일러에 의해 생성된 오브젝트 파일은 운영체제와의 인터페이스를 담당하는 시동 코드(start-up code)를 가지고 있지 않다. +> 컴파일러에 의해 생성된 오브젝트 파일은 운영체제와의 인터페이스를 담당하는 +> 시동 코드(start-up code)를 가지고 있지 않다. - 시동 코드(start-up code) @@ -78,7 +82,8 @@ toc: true - 링크(link) -> 링크(link)란 하나 이상의 오브젝트 파일과 라이브러리 파일, 시동 코드 등을 합쳐 하나의 파일로 만드는 작업을 의미한다. +> 링크(link)란 하나 이상의 오브젝트 파일과 라이브러리 파일, +> 시동 코드 등을 합쳐 하나의 파일로 만드는 작업을 의미한다. > 링크는 링커(linker)에 의해 수행되며, 링크가 끝나면 하나의 새로운 실행 파일이나 라이브러리 파일이 생성된다. @@ -90,6 +95,7 @@ toc: true > 소스 파일은 선행처리기, 컴파일러 그리고 링커에 의해 일정한 과정을 거쳐 실행 파일로 변환된다. -> 최근 사용되는 개발 툴은 대부분 위에서 소개한 선행처리기, 컴파일러, 링커를 모두 내장하고 있으므로, 소스 파일에서 한 번에 실행 파일을 생성해 준다. +> 최근 사용되는 개발 툴은 대부분 위에서 소개한 선행처리기, 컴파일러, 링커를 모두 내장하고 있으므로, +> 소스 파일에서 한 번에 실행 파일을 생성해 준다. > 이렇게 생성된 실행 파일의 확장자는 .exe 가 된다. From 77128cd51cf40b18811f6045aec4c2dd3b61f32e Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Fri, 15 Dec 2023 00:10:40 +0900 Subject: [PATCH 38/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 16 ++++++++-------- .../C/2023-12-04-38_StringProcessingFunction.md | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 6cd3662891a7..71cb59271979 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-03-01_C.md", + "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-03-01_C.md", + "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-03-01_C.md", + "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-03-01_C.md" + "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md" } } } @@ -148,11 +148,13 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_posts/Language/C/2023-12-04-39_BasicStructure.md", + "_posts/Language/C/2023-12-04-43_CommonAndEnumeration.md", + "_posts/Language/C/2023-12-04-48_Pre-definedMacro.md", + "_posts/Language/C/2023-12-03-01_C.md", "_posts/Language/C/2023-12-03-03_CProgram.md", "_posts/Language/C/2023-12-03-02_CProgramming.md", - "_posts/Language/C/2023-12-03-01_C.md", "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", - "_posts/Language/C/2023-12-04-39_BasicStructure.md", "_posts/Language/C/2023-12-04-37_StringIOFunction.md", "_posts/Language/C/2023-12-04-36_String.md", "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", @@ -172,8 +174,6 @@ "_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md", "_posts/Language/C/2023-12-03-20_CLanguageFunction.md", "_posts/Language/C/2023-12-03-19_ControlStatement.md", - "_posts/Language/C/2023-12-03-18_IterationStatement.md", - "_posts/Language/C/2023-12-03-17_ConditionalStatement.md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", diff --git a/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md b/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md index 6af9a30090ce..50745e87220b 100644 --- a/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md +++ b/_posts/Language/C/2023-12-04-38_StringProcessingFunction.md @@ -304,7 +304,7 @@ int main(void) >atoi(), atol(), atoll(), atof() 함수의 원형은 각각 다음과 같다. -##### 원형 +- 원형 ```c #include From 6f8c543b0c6765f8c69b1420555d48afc9a729ed Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Fri, 15 Dec 2023 18:32:55 +0900 Subject: [PATCH 39/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 38 +++++++++---------- _posts/Language/C/2023-12-03-04_Printf().md | 11 +++--- _posts/Language/C/2023-12-03-06_Variable.md | 23 +++++++---- _posts/Language/C/2023-12-03-07_Constant.md | 3 +- _posts/Language/C/2023-12-03-08_BasicType.md | 10 ++--- .../Language/C/2023-12-03-09_TypeCasting.md | 8 ++-- .../C/2023-12-03-10_ArithmeticOperator.md | 2 +- ...-12-03-12_IncrementAndDecrementOperator.md | 3 +- .../Language/C/2023-12-03-16_OtherOperator.md | 3 +- .../C/2023-12-03-18_IterationStatement.md | 3 +- .../C/2023-12-03-20_CLanguageFunction.md | 12 +++--- .../C/2023-12-03-21_ValidRangeOfVariable.md | 5 --- 12 files changed, 64 insertions(+), 57 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 71cb59271979..2e2658249b8f 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", + "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", + "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", + "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md" + "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md" } } } @@ -148,25 +148,10 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ - "_posts/Language/C/2023-12-04-39_BasicStructure.md", - "_posts/Language/C/2023-12-04-43_CommonAndEnumeration.md", - "_posts/Language/C/2023-12-04-48_Pre-definedMacro.md", - "_posts/Language/C/2023-12-03-01_C.md", - "_posts/Language/C/2023-12-03-03_CProgram.md", - "_posts/Language/C/2023-12-03-02_CProgramming.md", "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "_posts/Language/C/2023-12-04-37_StringIOFunction.md", - "_posts/Language/C/2023-12-04-36_String.md", - "_posts/Language/C/2023-12-04-35_CharacterInputOutputFunction.md", "_posts/Language/C/2023-12-04-34_BasicIO.md", - "_posts/Language/C/2023-12-04-33_DynamicMemoryAllocation.md", - "_posts/Language/C/2023-12-04-32_StackFrame.md", - "_posts/Language/C/2023-12-04-31_MemoryStructure.md", "_posts/Language/C/2023-12-04-30_PointerArrayAndArrayPointers.md", - "_posts/Language/C/2023-12-04-29_PointerToArrayRelationships.md", - "_posts/Language/C/2023-12-04-28_VariousPointers.md", - "_posts/Language/C/2023-12-04-27_HowToForwardArgument.md", - "_posts/Language/C/2023-12-04-26_PointerOperation.md", "_posts/Language/C/2023-12-04-25_PointerConcept.md", "_posts/Language/C/2023-12-04-24_MultidimensionalArrangement.md", "_posts/Language/C/2023-12-04-23_1DArrangement.md", @@ -174,6 +159,21 @@ "_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md", "_posts/Language/C/2023-12-03-20_CLanguageFunction.md", "_posts/Language/C/2023-12-03-19_ControlStatement.md", + "_posts/Language/C/2023-12-03-18_IterationStatement.md", + "_posts/Language/C/2023-12-03-17_ConditionalStatement.md", + "_posts/Language/C/2023-12-03-16_OtherOperator.md", + "_posts/Language/C/2023-12-03-15_BitwiseOperator.md", + "_posts/Language/C/2023-12-03-14_LogicalOperator.md", + "_posts/Language/C/2023-12-03-13_ComparisonOperator.md", + "_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md", + "_posts/Language/C/2023-12-03-11_AssignmentOperator.md", + "_posts/Language/C/2023-12-03-10_ArithmeticOperator.md", + "_posts/Language/C/2023-12-03-09_TypeCasting.md", + "_posts/Language/C/2023-12-03-08_BasicType.md", + "_posts/Language/C/2023-12-03-07_Constant.md", + "_posts/Language/C/2023-12-03-06_Variable.md", + "_posts/Language/C/2023-12-03-05_Scanf().md", + "_posts/Language/C/2023-12-03-04_Printf().md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", diff --git a/_posts/Language/C/2023-12-03-04_Printf().md b/_posts/Language/C/2023-12-03-04_Printf().md index fbc57656606d..52c127bb783e 100644 --- a/_posts/Language/C/2023-12-03-04_Printf().md +++ b/_posts/Language/C/2023-12-03-04_Printf().md @@ -12,13 +12,14 @@ toc: true - 입출력 함수(Input Output Function) -> 입출력 함수(Input Output Function)란 사용자가 프로그램과 대화하기 위해 사용하는 함수를 의미한다. 입출력 함수를 I/O 함수라고도 한다. +> 입출력 함수(Input Output Function)란 사용자가 프로그램과 대화하기 위해 사용하는 함수를 의미한다. +> 입출력 함수를 I/O 함수라고도 한다. >printf() 함수와 scanf() 함수는 C 언어 표준 입출력 함수 중에서도 가장 많이 사용되는 대표적인 입출력 함수이다. ## 1.1 출력 함수(printf)의 사용법 -> printf() 함수는 C 언어의 표준 출력 함수로, +> printf() 함수는 C 언어의 표준 출력 함수로, > 여러 종류의 데이터(data)를 다양한 서식에 맞춰 출력할 수 있게 해준다. > printf() 함수의 원형은 다음과 같다. @@ -48,14 +49,14 @@ printf() 함수는 서식 지정자를 통해 출력할 데이터의 서식을 변수에 저장된 숫자는 10입니다. ``` -> 위의 예제에서는 int형 데이터를 나타내기 위해서 '%d'라는 서식 지정자를 사용했다. +> 위의 예제에서는 int형 데이터를 나타내기 위해서 '%d'라는 서식 지정자를 사용했다. 또한, 줄 바꿈은 '\n'라는 이스케이프 시퀀스를 사용하여 표현하고 있다. ## 1.2 이스케이프 시퀀스(escape sequence) - 이스케이프 시퀀스(escape sequence) -> 이스케이프 시퀀스(escape sequence)란 컴퓨터와 주변 기기의 상태를 +> 이스케이프 시퀀스(escape sequence)란 컴퓨터와 주변 기기의 상태를 바꾸는 데에 쓰이는 일련의 문자열을 의미한다. >이스케이프 시퀀스는 프로그램의 결과가 화면에 출력될 때 사용하게 될 특수한 문자를 위해 만들어졌다. @@ -126,7 +127,7 @@ printf("%%G를 사용한 결과 : %G\n", 0.000001234); // 값에 따라 %f나 ### 1.3.1 서식 지정자의 동시 사용 -> 여러 개의 서식 지정자를 동시에 사용하여, 여러 개의 데이터에 서로 다른 서식을 지정해 출력할 수 있다. +> 여러 개의 서식 지정자를 동시에 사용하여, 여러 개의 데이터에 서로 다른 서식을 지정해 출력할 수 있다. 단, 이때 서식 지정자의 순서와 타입은 출력할 데이터의 순서와 타입과 반드시 일치해야 한다. - 예제 diff --git a/_posts/Language/C/2023-12-03-06_Variable.md b/_posts/Language/C/2023-12-03-06_Variable.md index 7a59961f6642..31cb6ba4352c 100644 --- a/_posts/Language/C/2023-12-03-06_Variable.md +++ b/_posts/Language/C/2023-12-03-06_Variable.md @@ -12,7 +12,8 @@ toc: true - 변수(variable) -> 변수(variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다. 즉, 변수란 데이터(data)를 저장할 수 있는 메모리 공간을 의미하며, 이렇게 저장된 값은 변경될 수 있다. +> 변수(variable)란 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미한다. +> 즉, 변수란 데이터(data)를 저장할 수 있는 메모리 공간을 의미하며, 이렇게 저장된 값은 변경될 수 있다. > C 언어에서 숫자 표현에 관련된 변수는 정수형 변수와 실수형 변수로 구분할 수 있다. 또다시 정수형 변수는 char형, int형, long형 변수로, 실수형 변수는 float형, double형 변수로 나눌 수 있다. @@ -39,7 +40,7 @@ toc: true ![스크린샷(754)](https://github.com/EunChong999/EunChong999/assets/136239807/8a2f30b2-a9ef-4b99-adc1-0a338c989299) -> C 언어에서는 변수의 이름에 대소문자를 구분하므로 이 점에 주의해야 한다. +> C 언어에서는 변수의 이름에 대소문자를 구분하므로 이 점에 주의해야 한다. ex) int tcp 과 int Tcp 는 같은 변수가 아니다. > 다음은 C 언어에서 사용되는 키워드(Keyword)들이다. @@ -48,7 +49,8 @@ ex) int tcp 과 int Tcp 는 같은 변수가 아니다. > 키워드(Keyword)란 고유한 의미를 가지는 예약어를 의미한다. -> C 언어에는 32개의 키워드가 있으며, 이러한 키워드들은 미국표준협회 ANSI에서 지정한 키워드들이다. 아래의 키워드들은 위의 예시처럼 변수의 이름으로 사용할 수 없다. +> C 언어에는 32개의 키워드가 있으며, 이러한 키워드들은 미국표준협회 ANSI에서 지정한 키워드들이다. +> 아래의 키워드들은 위의 예시처럼 변수의 이름으로 사용할 수 없다. ![스크린샷(755)](https://github.com/EunChong999/EunChong999/assets/136239807/f6eec46a-c5c1-4b57-9a4c-704044b3b4e4) @@ -72,10 +74,13 @@ ex) int tcp 과 int Tcp 는 같은 변수가 아니다. - 메모리 주소 -> 메모리 주소란 물리적인 메모리 공간을 서로 구분하기 위해 사용되는 일종의 식별자를 의미한다. +> 메모리 주소란 물리적인 메모리 공간을 서로 구분하기 위해 사용되는 일종의 식별자를 의미한다. 즉, 메모리 주소란 메모리 공간에서의 정확한 위치를 식별하기 위한 고유 주소를 의미한다. -> 변수를 참조할 때는 메모리의 주소를 참조하는 것이 아닌, 해당 주소에 저장된 데이터를 참조하게 된다. 따라서 변수는 데이터가 저장된 메모리의 주소뿐만 아니라, 저장된 데이터의 길이와 형태에 관한 정보도 같이 기억해야 한다. +> 변수를 참조할 때는 메모리의 주소를 참조하는 것이 아닌, +> 해당 주소에 저장된 데이터를 참조하게 된다. +> 따라서 변수는 데이터가 저장된 메모리의 주소뿐만 아니라, +> 저장된 데이터의 길이와 형태에 관한 정보도 같이 기억해야 한다. > 다음 그림은 메모리 상에 변수가 어떤 식으로 저장되는지를 보여준다. @@ -86,14 +91,16 @@ ex) int tcp 과 int Tcp 는 같은 변수가 아니다. 위의 그림에서 변수의 길이가 총 4개의 메모리 공간을 포함하므로, 해당 변수에는 4바이트의 데이터가 저장되어 있다. > 이때 변수의 이름은 첫 번째 메모리 주소인 0x10만을 가리키게 된다. -따라서 변수의 길이가 4이며, 변수가 어떤 형태로 구성되는지도 알아야만 해당 변수에서 데이터를 올바르게 참조할 수 있다. +따라서 변수의 길이가 4이며, 변수가 어떤 형태로 구성되는지도 알아야만 +해당 변수에서 데이터를 올바르게 참조할 수 있다. ## 1.4 변수의 선언 -> C 언어에서는 변수를 사용하기 전에 반드시 먼저 해당 변수를 저장하기 위한 메모리 공간을 할당받아야 한다. 이렇게 해당 변수만을 위한 메모리 공간을 할당받는 행위를 변수의 선언이라고 부른다. +> C 언어에서는 변수를 사용하기 전에 반드시 먼저 해당 변수를 저장하기 위한 메모리 공간을 할당받아야 한다. +> 이렇게 해당 변수만을 위한 메모리 공간을 할당받는 행위를 변수의 선언이라고 부른다. > 만약 선언되지 않은 변수를 사용하려고 하면, C 컴파일러는 오류를 발생시킨다. -> C 언어에서 변수를 선언하는 방법은 다음과 같이 두 가지 방법이 있다. +> C 언어에서 변수를 선언하는 방법은 다음과 같이 두 가지 방법이 있다. 1. 변수의 선언만 하는 방법 diff --git a/_posts/Language/C/2023-12-03-07_Constant.md b/_posts/Language/C/2023-12-03-07_Constant.md index 6c66caf02e27..23c210bac67a 100644 --- a/_posts/Language/C/2023-12-03-07_Constant.md +++ b/_posts/Language/C/2023-12-03-07_Constant.md @@ -24,7 +24,8 @@ toc: true ## 1.1 리터럴 상수(literal constant) -> 리터럴 상수(literal constant)는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않다. C 언어에서는 적절한 메모리 공간을 할당받기 위하여, +> 리터럴 상수(literal constant)는 변수와는 달리 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않다. +> C 언어에서는 적절한 메모리 공간을 할당받기 위하여, 기본적으로 변수든 상수든 타입을 가지게 된다. > 리터럴 상수는 타입에 따라 정수형 리터럴 상수, 실수형 리터럴 상수, 문자형 리터럴 상수 등으로 구분할 수 있다. diff --git a/_posts/Language/C/2023-12-03-08_BasicType.md b/_posts/Language/C/2023-12-03-08_BasicType.md index cc18d020afe3..16ccad294420 100644 --- a/_posts/Language/C/2023-12-03-08_BasicType.md +++ b/_posts/Language/C/2023-12-03-08_BasicType.md @@ -24,13 +24,13 @@ toc: true > C 언어에서 정수란 부호를 가지고 있고, 소수 부분이 없는 수를 의미한다. -> 정수형 데이터에 unsigned 키워드를 추가하면, 부호를 나타내는 +> 정수형 데이터에 unsigned 키워드를 추가하면, 부호를 나타내는 최상위 비트(MSB, Most Significant Bit)까지도 크기를 나타내는 데 사용할 수 있다. -> unsigned 정수는 음수를 표현할 수는 없게 되지만, +> unsigned 정수는 음수를 표현할 수는 없게 되지만, 0을 포함한 양의 정수는 두 배 더 많이 표현할 수 있게 된다. -> 음의 정수까지도 표현할 수 있는 signed 키워드는 +> 음의 정수까지도 표현할 수 있는 signed 키워드는 모든 타입에서 기본적으로 생략하여 사용할 수 있다. - 최상위 비트(MSB, Most Significant Bit) @@ -41,7 +41,7 @@ toc: true ![](https://velog.velcdn.com/images/ecg/post/2762a0e4-ea8c-483f-a741-154f260591d3/image.png) -> 정수형 데이터의 타입을 결정할 때에는 +> 정수형 데이터의 타입을 결정할 때에는 > 반드시 자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 한다. 해당 타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면, 오버플로우가 발생해 전혀 다른 값이 저장될 수 있기 때문이다. @@ -89,7 +89,7 @@ int형은 운영체제의 환경에 따라 다르다. > C 언어에서 실수란 소수부나 지수가 있는 수를 가리키며, > 정수보다 훨씬 더 넓은 표현 범위를 가진다. -하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계를 지닌다. +하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계를 지닌다. 이러한 실수형 데이터의 오차는 C 언어뿐만 아니라 모든 프로그래밍 언어에서 발생하는 공통된 문제이다. diff --git a/_posts/Language/C/2023-12-03-09_TypeCasting.md b/_posts/Language/C/2023-12-03-09_TypeCasting.md index 85feb2cdbdd4..cf0bb22a0c41 100644 --- a/_posts/Language/C/2023-12-03-09_TypeCasting.md +++ b/_posts/Language/C/2023-12-03-09_TypeCasting.md @@ -31,7 +31,7 @@ toc: true - 묵시적 타입 변환 -> 묵시적 타입 변환이란 대입 연산이나 산술 연산에서 +> 묵시적 타입 변환이란 대입 연산이나 산술 연산에서 C 컴파일러가 자동으로 실행해주는 타입 변환을 의미한다. > C 언어에서는 대입 연산 시 연산자의 오른쪽에 존재하는 데이터의 타입이 @@ -60,10 +60,10 @@ num01에 저장된 값은 3입니다. num02에 저장된 값은 5.000000입니다. ``` -> 위의 예제에서는 char형 변수에 char형 변수가 표현할 수 있는 범위를 넘는 데이터를 저장한다. +> 위의 예제에서는 char형 변수에 char형 변수가 표현할 수 있는 범위를 넘는 데이터를 저장한다. 따라서 전달된 데이터의 상위 비트가 자동으로 삭제되어 데이터의 손실이 발생한다. -또한, int형 변수에 실수를 저장했기 때문에 -소수 부분이 자동으로 삭제되어 데이터의 손실이 발생한다. +또한, int형 변수에 실수를 저장했기 때문에 +소수 부분이 자동으로 삭제되어 데이터의 손실이 발생한다. 하지만 double형 변수에 int형 데이터를 저장하는 것은 데이터가 double형으로 자동 타입 변환되지만, 데이터의 손실은 발생하지 않는다. diff --git a/_posts/Language/C/2023-12-03-10_ArithmeticOperator.md b/_posts/Language/C/2023-12-03-10_ArithmeticOperator.md index 4212166f16c2..43e195b1c152 100644 --- a/_posts/Language/C/2023-12-03-10_ArithmeticOperator.md +++ b/_posts/Language/C/2023-12-03-10_ArithmeticOperator.md @@ -67,7 +67,7 @@ printf("% 연산자에 의한 결괏값은 %d입니다.\n", num01 % num02); ![](https://velog.velcdn.com/images/ecg/post/a43c5d73-8507-4abb-bc7c-749e8bbcc0d6/image.png) -> 연산자의 결합 방향은 수식 내에 우선순위가 같은 연산자가 둘 이상 있을 때, +> 연산자의 결합 방향은 수식 내에 우선순위가 같은 연산자가 둘 이상 있을 때, 먼저 어느 연산을 수행할 것인가를 결정한다. ![](https://velog.velcdn.com/images/ecg/post/480e8a55-87ff-484a-9b39-384f0364c058/image.png) diff --git a/_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md b/_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md index 98fdfd642184..ff7d2c548bf3 100644 --- a/_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md +++ b/_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md @@ -12,7 +12,8 @@ toc: true - 증감 연산자(increment and decrement operator) -> 증감 연산자(increment and decrement operator)란 피연산자를 1씩 증가 혹은 1씩 감소시킬 때 사용하는 연산자를 의미한다. +> 증감 연산자(increment and decrement operator)란 +> 피연산자를 1씩 증가 혹은 1씩 감소시킬 때 사용하는 연산자를 의미한다. > 이 연산자는 피연산자가 단 하나뿐인 단항 연산자이다. diff --git a/_posts/Language/C/2023-12-03-16_OtherOperator.md b/_posts/Language/C/2023-12-03-16_OtherOperator.md index b619000ed5a0..4c5a7b3bd2c8 100644 --- a/_posts/Language/C/2023-12-03-16_OtherOperator.md +++ b/_posts/Language/C/2023-12-03-16_OtherOperator.md @@ -49,7 +49,8 @@ printf("둘 중에 더 큰수는 %d입니다.\n", result); - 쉼표 연산자 -> 쉼표(,) 연산자란 얼핏 연산자가 아닌 것처럼 보이지만 다양한 용도로 사용되는 연산자를 의미한다. 이 연산자는 어떠한 연산을 수행하는 것이 아니라 다음과 같은 상황에서 사용된다. +> 쉼표(,) 연산자란 얼핏 연산자가 아닌 것처럼 보이지만 다양한 용도로 사용되는 연산자를 의미한다. +> 이 연산자는 어떠한 연산을 수행하는 것이 아니라 다음과 같은 상황에서 사용된다. 1. 두 연산식을 하나의 연산식으로 나타내고자 할 때 diff --git a/_posts/Language/C/2023-12-03-18_IterationStatement.md b/_posts/Language/C/2023-12-03-18_IterationStatement.md index 3a1345e1cf45..4f95635f3d95 100644 --- a/_posts/Language/C/2023-12-03-18_IterationStatement.md +++ b/_posts/Language/C/2023-12-03-18_IterationStatement.md @@ -14,7 +14,8 @@ toc: true - 반복문(iteration statements) -> 반복문(iteration statements)이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문을 의미한다. +> 반복문(iteration statements)이란 프로그램 내에서 +> 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문을 의미한다. > 프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문 중 하나이다. diff --git a/_posts/Language/C/2023-12-03-20_CLanguageFunction.md b/_posts/Language/C/2023-12-03-20_CLanguageFunction.md index d21d146c9a0c..df8db1b54cf1 100644 --- a/_posts/Language/C/2023-12-03-20_CLanguageFunction.md +++ b/_posts/Language/C/2023-12-03-20_CLanguageFunction.md @@ -24,13 +24,13 @@ toc: true ## 1.1 함수를 사용하는 이유 -> 함수를 사용하는 가장 큰 이유는 바로 반복적인 프로그래밍을 피할 수 있기 때문이다. -> 프로그램에서 특정 작업을 여러 번 반복해야 할 때는 해당 작업을 수행하는 함수를 작성하면 된다. +> 함수를 사용하는 가장 큰 이유는 바로 반복적인 프로그래밍을 피할 수 있기 때문이다. +> 프로그램에서 특정 작업을 여러 번 반복해야 할 때는 해당 작업을 수행하는 함수를 작성하면 된다. > 그리고서 프로그램이 필요할 때마다 작성한 함수를 호출하면 해당 작업을 반복해서 수행할 수 있다. -> 또한, 프로그램을 여러 개의 함수로 나누어 작성하면, 모듈화로 인해 전체적인 코드의 가독성이 좋아진다. -> 그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수를 할 수 있다. -> 함수의 크기에 대해서 정확히 명시된 규칙은 없으나, +> 또한, 프로그램을 여러 개의 함수로 나누어 작성하면, 모듈화로 인해 전체적인 코드의 가독성이 좋아진다. +> 그리고 프로그램에 문제가 발생하거나 기능의 변경이 필요할 때에도 손쉽게 유지보수를 할 수 있다. +> 함수의 크기에 대해서 정확히 명시된 규칙은 없으나, > 대략 하나의 기능을 하나의 함수로 만드는 것이 가장 좋다. ## 1.2 함수의 정의 @@ -47,7 +47,7 @@ toc: true 4. 함수 몸체 : 함수의 고유 기능을 수행하는 명령문의 집합이다. -> 함수 호출 시에는 여러 개의 인수를 전달할 수 있지만, +> 함수 호출 시에는 여러 개의 인수를 전달할 수 있지만, > 함수가 반환할 수 있는 값은 1개를 넘지 못한다. > 또한, 함수의 특성에 따라 인수나 반환값이 하나도 없는 함수도 존재할 수 있다. diff --git a/_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md b/_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md index 92914710085c..6163664e48bd 100644 --- a/_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md +++ b/_posts/Language/C/2023-12-03-21_ValidRangeOfVariable.md @@ -40,7 +40,6 @@ toc: true 4. 힙(heap) 영역 - ## 1.2 지역 변수(local variable) - 지역 변수(local variable) @@ -168,8 +167,6 @@ main() 함수에서 전역 변수 var로 접근할 방법이 없어진다. > 또한, 여러 개의 파일로 구성된 프로그램에서 외부 파일의 전역 변수를 사용하기 위해서는 > extern 키워드를 사용해 다시 선언해야 줘야한다. - - ## 1.4 정적 변수(static variable) - 정적 변수(static variable) @@ -236,8 +233,6 @@ staticVar() 함수가 3 번째 호출되었습니다. 또한, static_count는 전역 변수와는 달리 자신이 선언된 staticVar() 함수 이외의 영역에서는 호출할 수 없다. ---- - ## 1.5 레지스터 변수(register variable) - 레지스터 변수 From 4651fc50d007623fba7933e5b2a30f59864ca0be Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Fri, 15 Dec 2023 19:13:58 +0900 Subject: [PATCH 40/41] =?UTF-8?q?feat=20:=20Chapter=2039=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=EC=B2=B4=EC=9D=98=20=EA=B8=B0=EB=B3=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 10 +- .../C/2023-12-04-39_BasicStructure.md | 224 +++++++++++++++++- 2 files changed, 227 insertions(+), 7 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 2e2658249b8f..3386835380d0 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", + "file": "_posts/Language/C/2023-12-04-40_PointersAndStructures.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", + "file": "_posts/Language/C/2023-12-04-40_PointersAndStructures.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md", + "file": "_posts/Language/C/2023-12-04-40_PointersAndStructures.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-39_BasicStructure.md" + "file": "_posts/Language/C/2023-12-04-40_PointersAndStructures.md" } } } @@ -148,6 +148,7 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_posts/Language/C/2023-12-04-39_BasicStructure.md", "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "_posts/Language/C/2023-12-04-37_StringIOFunction.md", "_posts/Language/C/2023-12-04-34_BasicIO.md", @@ -173,7 +174,6 @@ "_posts/Language/C/2023-12-03-07_Constant.md", "_posts/Language/C/2023-12-03-06_Variable.md", "_posts/Language/C/2023-12-03-05_Scanf().md", - "_posts/Language/C/2023-12-03-04_Printf().md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", diff --git a/_posts/Language/C/2023-12-04-39_BasicStructure.md b/_posts/Language/C/2023-12-04-39_BasicStructure.md index 10eb9eda2c44..e878d21c80bb 100644 --- a/_posts/Language/C/2023-12-04-39_BasicStructure.md +++ b/_posts/Language/C/2023-12-04-39_BasicStructure.md @@ -24,8 +24,6 @@ toc: true 이때 구조체를 구성하는 변수를  구조체의 멤버(member) 또는 멤버 변수(member variable)라고 한다. ---- - ## 1.1 구조체의 정의와 선언 >C 언어에서 구조체는 struct 키워드를 사용하여 다음과 같이 정의한다. @@ -45,3 +43,225 @@ struct 구조체이름 ![image](https://github.com/EunChong999/EunChong999/assets/136239807/18e39362-0630-4c39-9ff0-8a63445dae60) +>struct라는 키워드를 사용하여 구조체의 시작을 알리고, +>구조체 이름인 book으로 구조체를 정의하고 있다. +중괄호 사이에 char titile[30], char author[30], int price와 같은 +변수들은 book의 멤버 변수들이다. +마지막 세이콜론은 구조체 정의를 종료한다는 의미이다. +이렇게 정의된 book 구조체는 사용자 정의 자료형이라고 한다. +이렇게 정의된 구조체 타입은 다음과 같이 구조체 변수로 선언하여 사용할 수 있다. + +- 문법 + +```c +struct 구조체이름 구조체변수이름; +``` + +- 예제 + +```c +struct book my_book; +``` + +>또한, 구조체의 정의와 구조체 변수의 선언을 동시에 할 수도 있다. + +- 문법 + +```c +struct 구조체이름 +{ +    멤버변수1의타입 멤버변수1의이름; +    멤버변수2의타입 멤버변수2의이름; +    ... +} 구조체변수이름; +``` + +- 예제 + +```c +struct book +{ +    char title[30]; +    char author[30]; +    int price; +} my_book; +``` + +## 1.2 typedef 키워드 + +>C 언어의 typedef 키워드는 이미 존재하는 타입에 새로운 이름을 붙일 때 사용한다. +구조체 변수를 선언하거나 사용할 때에는 +매번 struct 키워드를 사용하여 구조체임을 명시해야 한다. +하지만 typedef 키워드를 사용하여 구조체에 새로운 이름을 선언하면 +매번 struct 키워드를 사용하지 않아도 된다. + +>typedef 키워드를 사용하여 새로운 이름을 선언하는 방법은 다음과 같다. + +- 문법 + +```c +typedef struct 구조체이름 구조체의새로운이름; +``` + +- 예제 + +```c +typedef struct book TEXTBOOK; +``` + +>또한, 구조체의 정의와 typedef 선언을 동시에 할 수도 있다. + +- 문법 + +```c +typedef struct (구조체이름) +{ +    멤버변수1의타입 멤버변수1의이름; +    멤버변수2의타입 멤버변수2의이름; +    ... +} 구조체의새로운이름; +``` + +- 예제 + +```c +typedef struct { +    char title[30]; +    char author[30]; +    int price; +} TEXTBOOK; +``` + +>구조체의 정의와 typedef 선언을 동시에 할 때에는 구조체의 이름을 생략할 수 있다. + +## 1.3 구조체 멤버로의 접근 방법 + +>배열에서는 인덱스를 이용하여 배열 요소에 접근할 수 있다. +하지만 구조체에서 구조체 멤버로 접근하려고 할 때는 멤버 연산자(.)를 사용해야 한다. + +>구조체에서 구조체 멤버로의 접근 방법은 다음과 같다. + +- 문법 + +```c +구조체변수이름.멤버변수이름 +``` + +- 예제 + +```c +my_book.author +``` + +>구조체의 주소값과 구조체의 첫 번째 멤버 변수의 주소값은 언제나 같다. + +## 1.4 구조체 변수의 초기화 + +>구조체 변수를 초기화할 때에는 멤버 연산자(.)와 중괄호({})를 사용한다. + +>구조체 변수의 초기화 방법은 다음과 같다. + +- 문법 + +```c +구조체변수이름 = {.멤버변수1이름 = 초깃값, .멤버변수2이름 = 초깃값, ...}; +``` + +- 예제 + +```c +my_book = {.title = "HTML과 CSS", .author = "홍길동", .price = 28000}; +``` + +>이 방법을 사용하면 원하는 멤버 변수만을 초기화할 수 있다. +이때 멤버 변수가 정의된 순서와 초기화하는 순서는 아무런 상관이 없으며, +초기화하지 않은 멤버 변수는 0으로 초기화된다. + +>또한, 배열의 초기화와 같은 방법으로 구조체 변수를 초기화할 수도 있다. + +- 문법 + +```c +구조체변수이름 = {멤버변수1의초깃값, 멤버변수2의초깃값, ...}; +``` + +- 예제 + +```c +my_book = {"HTML과 CSS", "홍길동", 28000}; +``` + +>이때 구조체 정의에서 멤버 변수가 정의된 순서에 따라 차례대로 초깃값이 설정되며, +>나머지 멤버 변수는 0으로 초기화된다. + +>다음 예제는 두 가지 방법을 사용하여 각각 구조체 변수를 초기화하는 예제이다. + +- 예제 + +```c +#include    + +struct book +{ +    char title[30]; +    char author[30]; +    int price; +};   + +int main(void) +{ +    struct book my_book = {"HTML과 CSS", "홍길동", 28000}; +    struct book java_book = {.title = "Java language", .price = 30000};   + +    printf("첫 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n", +        my_book.title, my_book.author, my_book.price); +    printf("두 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n", +        java_book.title, java_book.author, java_book.price); +    return 0; +} +``` + +- 실행 결과 + +```c +첫 번째 책의 제목은 HTML과 CSS이고, 저자는 홍길동이며, 가격은 28000원입니다. +두 번째 책의 제목은 Java language이고, 저자는 이며, 가격은 30000원입니다. +``` + +>다음 예제는 구조체에 typedef 키워드를 사용하여 새로운 이름을 선언한 후 사용하는 예제이다. + +- 예제 + +```c +#include    + +typedef struct +{ +    char title[30]; +    char author[30]; +    int price; +}  TEXTBOOK;   + +int main(void) +{ +    TEXTBOOK my_book = {"HTML과 CSS", "홍길동", 28000}; +    TEXTBOOK java_book = {.title = "Java language", .price = 30000};   + +    printf("첫 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n", +        my_book.title, my_book.author, my_book.price); +    printf("두 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n", +        java_book.title, java_book.author, java_book.price); +    return 0; +} +``` + +- 실행 결과 + +```c +첫 번째 책의 제목은 HTML과 CSS이고, 저자는 홍길동이며, 가격은 28000원입니다. +두 번째 책의 제목은 Java language이고, 저자는 이며, 가격은 30000원입니다. +``` + +>위 예제의 실행 결과처럼 typedef 키워드를 사용하여 구조체에 +>새로운 이름을 선언한 후 사용해도 +>structr 키워드를 그대로 사용한 것과 같은 결과를 얻을 수 있다. \ No newline at end of file From 237440bb885b7fcdaf71a1fba25acb550048c07d Mon Sep 17 00:00:00 2001 From: EunChong999 Date: Fri, 15 Dec 2023 20:20:24 +0900 Subject: [PATCH 41/41] =?UTF-8?q?feat=20:=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .obsidian/workspace.json | 23 ++- .../C/2023-12-04-40_PointersAndStructures.md | 122 ++++++++++++ .../2023-12-04-41_UtilizationOfStructures.md | 185 ++++++++++++++++++ ... => 2023-12-04-42_CommonAndEnumeration.md} | 2 +- 4 files changed, 319 insertions(+), 13 deletions(-) rename _posts/Language/C/{2023-12-04-43_CommonAndEnumeration.md => 2023-12-04-42_CommonAndEnumeration.md} (79%) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 3386835380d0..7527278c07d1 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -13,7 +13,7 @@ "state": { "type": "markdown", "state": { - "file": "_posts/Language/C/2023-12-04-40_PointersAndStructures.md", + "file": "_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md", "mode": "source", "source": false } @@ -85,7 +85,7 @@ "state": { "type": "backlink", "state": { - "file": "_posts/Language/C/2023-12-04-40_PointersAndStructures.md", + "file": "_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -102,7 +102,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "_posts/Language/C/2023-12-04-40_PointersAndStructures.md", + "file": "_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -125,7 +125,7 @@ "state": { "type": "outline", "state": { - "file": "_posts/Language/C/2023-12-04-40_PointersAndStructures.md" + "file": "_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md" } } } @@ -148,6 +148,13 @@ }, "active": "61669096ec41de77", "lastOpenFiles": [ + "_posts/Language/C/2023-12-04-42_CommonAndEnumeration.md", + "_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md", + "_posts/Language/C/2023-12-04-43_ConsoleIO.md", + "_site/language/42_CommonAndEnumeration/index.html", + "_site/language/42_CommonAndEnumeration", + "_posts/Language/C/2023-12-04-44_FileIO.md", + "_posts/Language/C/2023-12-04-40_PointersAndStructures.md", "_posts/Language/C/2023-12-04-39_BasicStructure.md", "_posts/Language/C/2023-12-04-38_StringProcessingFunction.md", "_posts/Language/C/2023-12-04-37_StringIOFunction.md", @@ -168,12 +175,6 @@ "_posts/Language/C/2023-12-03-13_ComparisonOperator.md", "_posts/Language/C/2023-12-03-12_IncrementAndDecrementOperator.md", "_posts/Language/C/2023-12-03-11_AssignmentOperator.md", - "_posts/Language/C/2023-12-03-10_ArithmeticOperator.md", - "_posts/Language/C/2023-12-03-09_TypeCasting.md", - "_posts/Language/C/2023-12-03-08_BasicType.md", - "_posts/Language/C/2023-12-03-07_Constant.md", - "_posts/Language/C/2023-12-03-06_Variable.md", - "_posts/Language/C/2023-12-03-05_Scanf().md", "_posts/Game Development Knowledge/Design Pattern", "_posts/Game Development Knowledge/Computer Graphic", "_posts/Game Development Knowledge/Game Math", @@ -182,8 +183,6 @@ "_posts/Basic Development Knowledge/Software Computer Science", "_posts/Basic Development Knowledge/Algorithm", "_posts/Game Development Knowledge", - "_posts/Basic Development Knowledge/Data Structure", - "_posts/Basic Development Knowledge", "_site/Pasted image 20231207191701.png", "Pasted image 20231207191701.png", "_site/Pasted image 20231206205417.png", diff --git a/_posts/Language/C/2023-12-04-40_PointersAndStructures.md b/_posts/Language/C/2023-12-04-40_PointersAndStructures.md index d87e2519cce1..fe919c8c8155 100644 --- a/_posts/Language/C/2023-12-04-40_PointersAndStructures.md +++ b/_posts/Language/C/2023-12-04-40_PointersAndStructures.md @@ -9,3 +9,125 @@ tags: excerpt: 포인터와 구조체에 관한 글입니다. toc: true --- + +# 1 구조체 배열 선언 + +>C 언어에서 배열의 요소가 될 수 있는 타입에는 제한이 없으므로, +>구조체 역시 배열의 한 요소가 될 수 있다. +이러한 구조체 배열을 선언하는 방법은 다른 타입의 배열을 선언하는 방법과 같다. +또한, 구조체 배열에서 각 배열 요소로 접근하는 방법도 +일반 배열의 접근 방법과 완전히 같다. + +>다음 예제는 구조체 배열의 선언 및 초기화를 보여주는 예제이다. + +- 예제 + +```c +struct book text_book[3] = +{ +    {"국어", "홍길동", 15000}, +    {"영어", "이순신", 18000}, +    {"수학1", "강감찬", 10000} +};   + +puts("각 교과서의 이름은 다음과 같습니다."); +printf("%s, %s, %s\n", text_book[0].title, text_book[1].title, text_book[2].title);   +``` + +- 실행 결과 + +```c +각 교과서의 이름은 다음과 같습니다. +국어, 영어, 수학1 +``` + +>위의 예제처럼 구조체 배열은 2차원 배열의 초기화 방법과 똑같은 방법으로 초기화할 수 있다. +또한, 멤버 연산자(.)를 사용하여 각 배열 요소의 멤버에 접근할 수 있다. + +>다음 그림은 위의 예제에서 사용된 구조체 배열 text_book의 메모리 상태를 보여준다. + +![image](https://github.com/EunChong999/EunChong999/assets/136239807/e313798e-979a-4515-95f0-6c02fb14984e) + +# 2 구조체를 가리키는 포인터 + +>구조체 변수를 가리키는 구조체 포인터는 다음과 같이 선언한다. + +- 문법 + +```c +struct 구조체이름* 구조체포인터이름; +``` + +- 예제 + +```c +struct book* ptr_my_book; +``` + +>배열의 경우와는 달리 구조체의 이름은 구조체를 가리키는 주소가 아니다. +따라서 포인터에 할당할 때에는 반드시 주소 연산자(&)를 사용해야 한다. + +>구조체 포인터를 이용하여 구조체의 멤버에 접근하는 방법에는 +>다음과 같이 두 가지 방법이 있다. + +1. 참조 연산자(*)를 이용하는 방법 + +2. 화살표 연산자(->)를 이용하는 방법 + +>참조 연산자를 이용하는 방법은 다음과 같다. + +- 문법 + +```c +(*구조체포인터).멤버변수이름 +``` + +- 예제 + +```c +(*ptr_my_book).author +``` + +>참조 연산자(*)는 멤버 연산자(.)보다 연산자 우선순위가 낮으므로 +>반드시 괄호(())를 사용해야 한다. + +>구조체의 멤버에 접근하기 위해서 화살표 연산자(->)를 사용할 수도 있다. +화살표 연산자의 앞쪽에는 구조체 포인터를, +뒤쪽에는 접근하고자 하는 구조체의 멤버 변수 이름을 사용하면 된다. + +- 문법 + +```c +구조체포인터 -> 멤버변수이름 +``` + + - 예제 + +```c +ptr_my_book -> author   +``` + +>위의 두 가지 방법은 완전히 같은 동작을 하며, +>일반적으로 화살표 연산자가 좀 더 많이 사용된다. + +- 예제 + +```c +struct book my_book = {"C언어 완전 해부", "홍길동", 35000}; +struct book* ptr_my_book; // 구조체 포인트 선언   + +ptr_my_book = &my_book;   + +strcpy((*ptr_my_book).title, "C언어 마스터"); // 참조 연산자(*)를 이용하는 방법 +strcpy(ptr_my_book->author, "이순신");        // 화살표 연산자(->)를 이용하는 방법 +my_book.price = 32000;                        // 구조체 변수을 이용한 직접 수정   + +printf("책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n", +    my_book.title, my_book.author, my_book.price); +``` + +- 실행 결과 + +```c +책의 제목은 C 언어 마스터이고, 저자는 이순신이며, 가격은 32000원입니다. +``` \ No newline at end of file diff --git a/_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md b/_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md index b853a3892685..e46bf0c90de0 100644 --- a/_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md +++ b/_posts/Language/C/2023-12-04-41_UtilizationOfStructures.md @@ -9,3 +9,188 @@ tags: excerpt: 구조체의 활용에 관한 글입니다. toc: true --- + +# 1 함수와 구조체 + +>C 언어에서는 함수를 호출할 때 전달되는 인수나, +함수가 종료될 때 반환되는 반환값으로 구조체를 사용할 수 있다. +그 방식은 기본 타입과 완전히 같으며, +구조체를 가리키는 포인터나 구조체의 한 멤버 변수만을 사용할 수도 있다. + +>다음 예제는 구조체의 멤버 변수를 함수의 인수로 전달하는 예제이다. + +- 예제 + +```c +typedef struct +{ +    int savings; +    int loan; +} PROP;   + +int main(void) +{ +    int hong_prop; +    PROP hong = {10000000, 4000000};   + +    hong_prop = calcProperty(hong.savings, hong.loan); // 구조체의 멤버 변수를 함수의 인수로 전달함   + +    printf("홍길동의 재산은 적금 %d원에 대출 %d원을 제외한 총 %d원입니다.\n", +        hong.savings, hong.loan, hong_prop); +    return 0; +} +``` + +- 실행 결과 + +```c +홍길동의 재산은 적금 10000000원에 대출 4000000원을 제외한 총 6000000원입니다. +``` + +>위와 같이 구조체를 인수로 전달하는 방식은 함수가 +>원본 구조체의 복사본을 가지고 작업하므로 안전하다는 장점을 가진다. + +>다음 예제는 함수의 인수로 구조체의 주소를 직접 전달하는 예제이다. + +- 예제 + +```c +int hong_prop; +PROP hong = {10000000, 4000000};   + +hong_prop = calcProperty(&hong); // 구조체의 주소를 함수의 인수로 전달함.   +printf("홍길동의 재산은 적금 %d원에 대출 %d원을 제외한 총 %d원입니다.\n", hong.savings, hong.loan, hong_prop); +``` + +- 실행 결과 + +```c +홍길동의 재산은 적금 100원에 대출 4000000원을 제외한 총 -3999900원입니다. +``` + +>위와 같이 구조체 포인터를 인수로 전달하는 방식은 구조체의 복사본이 아닌 +>주소 하나만을 전달하므로 처리가 빠르다. +하지만 호출된 함수에서 원본 구조체에 직접 접근하므로 +원본 데이터의 보호 측면에서는 매우 위험하다. + +>따라서 다음 예제의 calcProperty() 함수처럼 const 키워드를 사용하여 +>함수에 전달된 인수를 함수 내에서는 직접 수정할 수 없도록 하는 것이 좋다. + +- 예제 + +```c +PROP prop; +int hong_prop;   + +prop = initProperty(); +hong_prop = calcProperty(&prop);   + +printf("홍길동의 재산은 적금 %d원에 대출 %d원을 제외한 총 %d원입니다.\n", prop.savings, prop.loan, hong_prop); +``` + +- 실행 결과 + +```c +홍길동의 재산은 적금 10000000원에 대출 4000000원을 제외한 총 6000000원입니다. +``` + +>위의 예제에서 initProperty() 함수는 반환값으로 구조체를 직접 반환한다. +기본적으로 C 언어의 함수는 한 번에 하나의 데이터만을 반환할 수 있다. +하지만 이렇게 구조체를 사용하면 여러 개의 데이터를 한 번에 반환할 수 있다. + +# 2 중첩된 구조체 + +>C 언어에서는 구조체를 정의할 때 멤버 변수로 또 다른 구조체를 포함할 수 있다. + +- 예제 + +```c +struct name +{ +    char first[30]; +    char last[30]; +};   +struct friends +{ +    struct name friend_name; +    char address[30]; +    char job[30]; +};   + +int main(void) +{ +    struct friends hong = +    { +        { "길동", "홍" }, +        "서울시 강남구 역삼동", +        "학생" +    };   + +    printf("%s\n\n", hong.address); +    printf("%s%s에게,\n", hong.friend_name.last, hong.friend_name.first); +    printf("그동안 잘 지냈니? 아직 %s이지?\n", hong.job); +    puts("공부 잘 하고, 다음에 꼭 한번 보자.\n잘 지내^^"); +    return 0; +}   +``` + +- 실행 결과 + +```c +서울시 강남구 역삼동 + +홍길동에게, +그동안 잘 지냈니? 아직 학생이지? +공부 잘 하고, 다음에 꼭 한번 보자. +잘 지내^^ +``` + +>위의 예제에서 friends 구조체는 또 다른 구조체인 name 구조체를 멤버 변수로 포함하고 있다. + +# 3 구조체의 크기 + +>일반적으로 구조체의 크기는 멤버 변수들의 크기에 따라 결정된다. +하지만 구조체의 크기가 언제나 멤버 변수들의 크기 총합과 일치하는 것은 아니다. + +- 예제 + +```c +typedef struct +{ +    char a; +    int b; +    double c; +} TYPESIZE;   + +int main(void) +{ +    puts("구조체 TypeSize의 각 멤버의 크기는 다음과 같습니다."); +    printf("%d %d %d\n", sizeof(char), sizeof(int), sizeof(double));   + +    puts("구조체 TypeSize의 크기는 다음과 같습니다."); +    printf("%d\n", sizeof(TYPESIZE)); +    return 0; +} +``` + +- 실행 결과 + +```c +구조체 TYPESIZE의 각 멤버의 크기는 다음과 같습니다. +1 4 8 +구조체 TYPESIZE의 크기는 다음과 같습니다. +16 +``` + +>위의 예제에서 구조체 멤버 변수의 크기는 각각 1, 4, 8바이트이다. +하지만 구조체의 크기는 멤버 변수들의 크기 총합인 13바이트가 아니라 16바이트가 된다. + +#### 바이트 패딩(byte padding) + +구조체를 메모리에 할당할 때 컴파일러는 프로그램의 속도 향상을 위해 바이트 패딩(byte padding)이라는 규칙을 이용합니다. + +구조체는 다양한 크기의 타입을 멤버 변수로 가질 수 있는 타입입니다. + +하지만 컴파일러는 메모리의 접근을 쉽게 하기 위해 크기가 가장 큰 멤버 변수를 기준으로 모든 멤버 변수의 메모리 크기를 맞추게 됩니다. + +이것을 바이트 패딩이라고 하며, 이때 추가되는 바이트를 패딩 바이트(padding byte)라고 합니다. \ No newline at end of file diff --git a/_posts/Language/C/2023-12-04-43_CommonAndEnumeration.md b/_posts/Language/C/2023-12-04-42_CommonAndEnumeration.md similarity index 79% rename from _posts/Language/C/2023-12-04-43_CommonAndEnumeration.md rename to _posts/Language/C/2023-12-04-42_CommonAndEnumeration.md index 72977984352c..f6196ac1681a 100644 --- a/_posts/Language/C/2023-12-04-43_CommonAndEnumeration.md +++ b/_posts/Language/C/2023-12-04-42_CommonAndEnumeration.md @@ -1,6 +1,6 @@ --- layout: single -title: Chapter 43 공용체와 열거체 +title: Chapter 42 공용체와 열거체 date: 2023-12-04 19:03:17 +09:00 categories: - Language