Unit 1. 소프트웨어 교육과 C언어
1.1 컴퓨터와 프로그램
컴퓨터 과학(CS)은 생활과 밀접하게 연결되어 있다.
프로그램은 사람이 원하는 작업을 출력해주는 것이다.
ex) 사진을 특수 문자로 출력하는 프로그램 작성
1.2 문제 해결을 위한 과학적 사고
위에서 나온 사진을 특수 문자로 출력하는 문제는
아스키 아트(ASCII Art)라고 부른다.
사진을 특수 문자로 출력하려면,
사진이 저장되는 방식인 BMP, PNG, JPG, GIF를 파악하고
이미지의 각 점에 대한 정보를 얻은 뒤
픽셀(점의) 색상 정보를 이용하여 특수 문자로 출력한다.
작은 문제들을 이미지 포맷 알아내기, 픽셀 색상 얻기,
픽셀 색상 따른 특수문자 출력하기 등 여러 개로 쪼개서 해결하다보면
큰 문제가 해결되고 이러한 과학적 사고법을 컴퓨테이셔널 씽킹이라 하고,
이렇게 설게한 해결책을 컴퓨터 명령어로 작성하는 것을 컴퓨터 프로그래밍이라고 한다.
✔️ 컴퓨테이셔널 씽킹
큰 문제를 작은 문제로 분해
-> 문제의 패턴 발견 (이미지 파일 읽고 픽셀 색상에 따라 특수문자 출력)
-> 어떤 데이터를 이용할지 결정 (이미지 파일의 픽셀 데이터, 특수문자)
-> 문제를 일반화하고 모델링 (이미지 파일 읽기, 이미지 파일 분석)
1.3 알고리즘과 코딩
알고리즘은 보이지 않지만 널리 쓰이고 있는데,
대표적인 것이 압축 알고리즘이 있다. ex) JPG(JPEG)
문제에서 일정한 패턴을 발견하고,
패턴을 토대로 문제를 해결하는 절차가 알고리즘이며
알고리즘을 코드로 표현하는 것이 코딩이다.
1.4 C 언어란?
1972년 벨 연구소에서 켐 톰프슨이 BCPL을 고쳐서 B 언어를 만들고,
데니스 리치가 B 언어를 개선하여 C 언어를 만들었다.
이러한 C 언어는 C++, Java, C# ... 많은 것이 탄생한 기초가 되었다.
또한, 에어컨과 세탁기 등 가전 제품에 들어있는 작은 컴퓨터가 주로 C 언어를 사용한다.
C 언어는 특히, 메모리 관리나 하드웨어 관련 내용을 배우기 때문에
컴퓨터의 동작 원리를 함께 이해할 수 있다.
1.5 코딩 도장을 학습하는 방법
따라하기, 퀴즈, 연습문제, 심사문제를 활용하여 학습한다.
Unit 2. Visual Studio 설치하기
2.0 Visual Studio 설치하기
C 언어를 사용하려면 컴파일러가 필요한데, Visual Studio를 사용한다.
Unit 3. Hello World!로 시작하기
3.1 새 프로젝트 만들기
Visual Studio를 열고, 파일 > 새로 만들기 > 프로젝트 > Win32 > Win32 콘솔 응용 프로그램을
선택하고 만든다. 이때, Visual Studio는 프로젝트와 솔루션이라는 단위를 사용한다.
솔루션은 프로젝트의 모음이고, 프로젝트는 소스파일과 헤더 파일 등의 모음이다.
설치를 진행할 때, 응용프로그램 설정에서 빈 프로젝트를 체크해줘야한다.
(가장 최근에 올라온 Visual Studio 2022 버전을 다운로드 하였으며,
설치가 완료되면 바로 새 프로젝트 만들기 > 빈 프로젝트로 넘어갈 수 있다.
3.2 프로젝트에 C 언어 소스 파일 추가하기
솔루션 탐색기에 소스 파일 > 추가 > 새 항목을 들어가서 hello.c로 파일을 추가한다.
확장자가 .cpp이면 C++ 컴파일러로 컴파일하게 되고, .c이면 C 컴파일러로 컴파일하게 된다.
(새 항목을 만들때 영상에서는 C밑에 project 디렉터리를 생성하였지만,
나는 D밑에 C Project 디렉터리로 파일을 추가하려고 한다.)
3.3. Hello, world! 출력하기
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
다음 코드를 hello.c 파일에 작성하고 빌드 > 솔루션 빌드를 클릭하여 컴파일한다.
메뉴의 디버그 > 디버그하지 않고 시작을 클릭한다(Ctrl+F5)
(솔루션 빌드를 실행하면 밑 출력에 hello.c, hello.vcxproj -> hello.exe가 출력된다.
해당 내용을 찾아보니 .vcxproj 같은 경우는 프로젝트에서 실행파일이나 dll 등과 같은 파일을
만들어주는 역할을 하게되고, 또 다른 것으로는 .sln이 있는데 솔루션이나 프로젝트를 관리해주는
역할을 한다.)
Ctrl+F5 단축키를 통해 디버깅을 하게 되면 다음과 같이 나온다.
해당 실행 파일의 위치는 D:\C Project\hello\x64\Debug\hello.exe 이고,
cmd에서 해당 실행 파일의 위치로 이동하여 실행시킬 수 있다.
소스 코드를 살펴보면, main이나 printf와 같이 단어 뒤에 괄호가 붙은 단어를
함수(function)이라고 하고 괄호 안에 출력할 내용을 넣은 뒤에
세미콜론을 붙이면 printf 함수가 실행된다. = 함수를 호출(call)한다.
이러한 출력 함수를 사용하기 위해서는 소스 코드의 첫째 줄인
#include <stdio.h>가 들어가게 되는데 #include는 헤더 파일을 포함하는 문법이고
stdio.h라는 헤더 파일을 사용하게 된다.
main() 함수는 C 언어로 프로그램을 만들 때 가장 처음 실행되는 특별한 함수로써
C 언어 프로그램은 항상 main 함수가 있어야 하고 main 함수부터 실행된다.
마지막으로 return 0; 이라는 반환값을 사용하게 된다.
이러한 컴파일은 hello.c -> hello.obj -> hello.exe로 변환되는 순서를 갖게된다.
3.4 서식 지정자 사용하기
서식 지정자는 printf로 문자열을 출력할 때 값으로 바뀌는 부분으로
다양한 함수에서 활용된다.
코드를 다음과 같이 수정해보자.
#include <stdio.h>
int main()
{
printf("%s\n", "Hello, world!");
return 0;
}
해당 코드를 컴파일하고 디버그하면 다음과 같다.
%s는 문자열을 받기 때문에 뒤에 오는 Hello, World를 받는 것이다.
이러한 서식지정자를 사용하는 이유는 변수를 이용해서 값을 여러번 출력할 수 있고,
출력 형태를 바꿀 수 있기 때문에 사용하는 것이다.
위의 내용을 printf("%s %s\n", "Hello", "1234");로 바꾸게 되면 다음과 같이 나온다.
그렇다. 콤마(,)로 구분해주었기 때문에 순서대로 출력된 것이다.
이 때, 서식지정자에서 보여주는 문자열과 뒤에 넣어주는 변수의 문자열에서
각각 독립적으로 저장되기 때문에 %s%s처럼 붙여주면 공백없이,
%s, %s / "Hello," 라고 해버리면 Hello,, 콤마 2개가 붙여서 나오게 된다.
3.5 심사 사이트 사용하기
dojang.io 사이트에서 퀴즈를 하려면 로그인이 필요하다.
강좌 관리 > 이 강좌에 등록시켜 주세요 > 등록 요청 > Unit 3의 3.6 퀴즈를 선택
> 퀴즈 풀기 클릭 > 퀴즈 답안 체크 > 답안 채점 > 다음 버튼으로 문제 풀기
심사 문제는 3.9 심사문제 클릭 > 퀴즈 풀기 클릭 > 문제를 보고 정답 코드 입력
> 다음 버튼을 클릭 > 모두 제출하고 끝냄 > 모두 제출하고 끝냄 > 채점 결과와 해설 출력
> 검토 마침 클릭 > 퀴즈에 재도전도 가능
(현재는 C 언어 코딩 도장 > 강좌 관리 > 수강 등록 순으로 접속이 가능하다.)
3.6 퀴즈
앞선 강의를 듣고 푼 퀴즈 현황은 다음과 같다.
3.7 연습문제: 문자열 출력하기
"Hello, world!"와 "1234567890"을 각 줄에 출력되게 만드는 문제이다.
첫째 줄에서는 앞서 배운 서식지정자로 문자열을 출력했고,
두번째 줄에서는 그대로 출력시켜주었다.
3.8 연습문제: 서식 지정자 사용하기
제시해주는 소스 코드를 완성하여 "Hello, world!'가 출력되게 하는 문제이다.
문자열에 대한 서식지정자가 하나 오기 때문에 그에 맞는 변수도
하나를 지정해주면 되고 나머지 world!를 작성해준다.
3.9 심사문제: 문자열 출력하기
간단히 printf("Hello, world!\n");를 두번 출력하는 내용이였다.
3.10 심사문제: 서식 지정자 사용하기
간단히 문자열에 대한 서식 지정자 3개의 변수를 입력해주는 것으로
"Hello", "C", "Language"를 입력해주었다.
Unit 4. 기본 문법 알아보기
4.1 세미콜론
4.2 주석
4.3 중괄호
4.4 들여쓰기
C언어는 구문이 끝날 때 항상 세미콜론을 붙이지만,
조건문 if, for와 같은 구문들은 붙이지 않는다.
주석은 사람만 알아볼 수 있도록 작성하는 부분으로
컴파일러가 처리하지 않는다.
한 줄 주석은 // 슬래시 2개로 작성한다.
범위 주석은 구문 앞과 뒤에 /* (범위) */을 작성해준다.
{} 중괄호는 코드의 범위를 나타낸다.
중괄호는 if, for 등의 키워드가 영향을 미치는 영역을 정할때와
구조체(공용체, 열거형)를 정의할 때도 사용한다.
중괄호의 위치는 줄의 시작 부분에서 사용한다. (1번 스타일)
줄의 맨 마지막 부분에서 사용하는 것(2번 스타일)은 Java에서 보통 사용한다.
해당 과정에서는 구조체 공용체 열거형 등을 정의할때는 2번 스타일을,
나머지는 1번 스타일을 사용한다.
C 언어 소스 코드는 작성할 때 들여쓰기를 한다.
보통 여는 중괄호가 시작될 때 들여쓰기를 하고,
코드가 한 줄이여서 중괄호가 생략될 때도 들여쓰기를 한다.
들여쓰기는 공백 4칸을 과정의 규칙으로 한다.
Unit. 핵심 정리
- 핵심 정리
Visual Studio에서 소스 코드 컴파일과 실행을 배웠고,
문자열 출력, 문자열 서식 지정자, 줄바꿈 문자(\n),
주석과 들여쓰기 등을 배웠다.
- Q&A
Visual Studio에서의 C/C++ 빌드 모드는 Debug, Release로 나뉘어져 있다.
Debug 모드는 실행 파일에 디버깅 정보가 포함된다.
Release 모드는 실행 파일에 디버깅 정보가 포함되지 않고, 속도와 크기가 최적화된다.
main 함수가 없으면 링크 에러가 발생하게 되고,
main 함수의 이름은 운영체제에 따라 달라질 수 있다.
(ex) Windows에서 WinAPI로 프로그래밍을 하면 WinMain을 사용한다.)
scanf, printf 등의 함수는 컴파일러가 암묵적으로 포함하기 때문에
#include를 안 써도 사용할 수 있지만, 바람직하지 않은 방법이다.
컴퓨테이셔널 씽킹과 알고리즘의 차이점은 문제를 이해하고 분해, 패턴 인식,
추상화, 알고리즘 작성까지를 컴퓨테이셔널 씽킹이라고 한다.
Unit 5. 변수 만들기
5.0 변수 만들기
int num1; 이라고 되어있을때 자료형 변수이름; 형식으로 만들게 된다.
int는 자료형으로 정수를 뜻하는 integer의 축약형이다.
C 언어는 저장할 값의 종류에 따라 자료형이 달라진다.
char, short, int, long 정수 (저장할 수 있는 크기가 다르다.)
float, double 실수
void 형태가 없는 자료형 (포인터를 사용할 때, 함수의 반환값을 표현할 때 사용한다.)
변수를 정의할 때는 영문 뭇자와 숫자를 사용할 수 있다. ex) int num1; int num2;
대소문자를 구분한다. ex) int num1; int Num1;
문자부터 시작해야 하며 숫자부터 시작할 수 없다. ex) int count3; (O) int 3count; (X) int 3; (X)
_(밑줄 문자)로 시작할 수 있다. ex) int _3count; int _3; int _count; int byte_count;
C 언어의 키워드는 사용할 수 없다. ex) int int; int long; int for;
5.1 변수를 만들고 값 저장하기
다음 코드를 작성한다.
#include <stdio.h>
int main()
{
int num1;
int num2;
int num3;
num1 = 10;
num2 = 20;
num3 = 30;
printf("%d %d %d\n", num1, num2, num3);
return 0;
}
등호를 사용하여 값을 저장해준다.
ex) 변수 = 값; 변수1 = 변수2;
변수에 값을 저장하는 과정을 "변수에 값을 할당한다"라고 부른다.
5.2 변수 여러개를 한 번에 선언하기
자료형 변수1, 변수2, 변수3; 처럼 선언하면 된다.
#include <stdio.h>
int main()
{
int num1, num2, num3;
num1 = 10;
num2 = 20;
num3 = 30;
printf("%d %d %d\n", num1, num2, num3);
return 0;
}
5.3 변수를 선언하면서 초기화하기
자료형 변수 = 값; 자료형 변수1 = 값1, 변수2 = 값2; 로 선언해준다.
#include <stdio.h>
int main()
{
int num1 = 10;
int num2 = 20, num3 = 30;
printf("%d %d %d\n", num1, num2, num3);
return 0;
}
변수를 선언하면서 값을 할당하는 과정을 "변수를 초기화한다"라고 부른다.
5.4 퀴즈
5.5 연습문제: 변수 여러 개를 선언하면서 값 초기화하기
5.6 심사문제: 변수를 선언하고 값 할당하기
Unit 6. 디버거 사용하기
6.0 디버거 사용하기
디버거는 프로그램 내부 상황을 들여다 보는 기능이고,
버그는 프로그램이 의도하지 않은 동작을 일으키는 것을 말한다.
디버그는 프로그램 내부 상황을 알 수 있어 버그를 쉽게 찾아낼 수 있다.
6.1 중단점 사용하기
중단점은 브레이크 포인트(Break Point)라고도 하는데,
소스 코드의 특정 지점에서 프로그램 실행을 멈추는데 사용한다.
위에 Debug x64 로컬 Windows 디버거로 설정되어있고,
코드에서 마우스 오른쪽의 중단점 > 중단점 삽입을 클릭한다.
또는, 중단점을 만들 줄의 코드 왼쪽 회색 부분을 클릭하거나 F9를 누르면 생성된다.
그 다음 F5키를 눌러본다.
다음과 같은 디버깅 모드가 활성화 된다.
화살표는 현재 대기중인 상태를 의미한다.
F10키를 누르면 중단점을 기준으로 실행된다.
다음과 같이 순서대로 변수에 값이 저장되는 것을 확인할 수 있다.
디버깅의 단축키는 다음과 같다.
1) 중단점 삽입/삭제: F9
2) 디버깅 시작: F5
3) 디버깅 중지: Shift+F5
4) 프로시저 단위 실행: F10 (코드 한 줄씩 실행)
5) 한 단계씩 코드 실행: F11 (함수 안으로 들어갈 때 사용)
------ Unit 7부터는 소단원 제목을 제외하고 공부 내용만 작성해보려고 한다. ------
Unit 7. 정수 자료형 사용하기
정수 자료형은 부호 + 정수 자료형을 조합해서 사용한다.
ex) signed int, unsigned int (signed는 생략 가능) (int도 생략 가능)
-> signed만 쓰거나 int만 쓰거나이지만 보통 int로 선언
signed char = char, unsigned char
signed short int = short, unsigned short int = unsigned short
signed long int = long, unsigned long int = unsigned long (long int도 많이 씀)
signed long long int = long long, unsigned long long int = unsigned long long
정수 자료형의 크기는 char -> short int -> int -> long int -> long long int 순으로 커진다.
signed는 부호가 있기 때문에 음수가 있지만,
unsigned는 부호가 없기 때문에 양수만 존재한다. (범위는 signed의 양수로 2배만큼)
short는 %d, long은 %ld, long long은 %lld를 사용한다.
unsigned는 다음과 같다.
오버플로우와 언더플로우는 정수 자료형에서 저장할 수 있는 범위를
넘어서는 것으로 char num1 = 128; unsigned char num2 = 256;과 같은 것이다.
char 최댓값은 127, unsigned char 최댓값은 255이기 때문에
127 -> 1이 많아지면 최솟값 -128이 되고, 255 -> 1이 많아지면 최솟값 0이 된다. (오버플로우)
언더플로우는 반대로 -128 -> 127이 되는 것이다.
사이즈를 구하는 것은 다음과 같다.
최솟값과 최댓값을 구할 때는 헤더에 <limits.h> 파일을 include 해준다.
최댓값은 MAX를 사용해준다. MAX + 1;을 해주면 오버플로우가 발생한다.
MIN - 1;을 해주면 언더플로우가 발생한다.
시간이 지나면서 크기가 표시된 정수 자료형을 사용하기 시작했다.
연습문제
오늘의 학습 진척도는 여기까지, 그리고 꾸준히 공부!
내일부터는 강의의 양이 많아서 빠르게 진행하기 위해
강의를 빠르게 듣고 블로그에는 공부한 내용을 압축해서
글로 작성해야할 것 같다.
'Study > C언어' 카테고리의 다른 글
[C언어] HTTP 서버 구현.c (1) (0) | 2022.10.06 |
---|---|
[C언어] 코딩도장 공부 (Unit 61~80) (0) | 2022.09.24 |
[C언어] 코딩도장 공부 (Unit 41~60) (0) | 2022.09.23 |
[C언어] 코딩도장 공부 (Unit 21~40) (0) | 2022.09.22 |
[C언어] 코딩도장 공부 (Unit 8~20) (0) | 2022.09.20 |