언어는 언제 사용하는가?
- 소통, 대화할 때
사람 <-> 컴퓨터
대화내용 : 명령(계산)
프로그래밍 : 진행순서
코딩 : 약속된 부호, 기호, 키워드 등을 나열하는 행위 또는 작업을 말함.
에러 : 컴퓨터가 알아들을 수 없는 표현
버그 : 작성자의 의도와 맞지 않는 결과가 나오는 것.
진행순서에 있어서 가장 먼저 해야 할 것 (집을 짓는다는 비유 하에)
- 구상
컴퓨터 언어 분류 1)
■ 원시언어
- 기계 친화적 언어
- 기계어, 어셈블리어
- 길다
- 어렵다
■ 고급언어
- 인간 친화적 언어
- 코볼, 포트란 이후의 모든 언어
- 짧고 간결하다
- 쉽다
컴퓨터 언어의 분류 2)
코딩 과정 : 설계 -> 문서작성 -> 번역(컴파일) -> 목적프로그램 생성 -> 실행파일링크
(문서작성 ~ 번역 단계 : 버그, 에러 수정)
디버깅 : 작성자가 버그가 있는지 검출하는 과정
■ 컴파일러 언어
- c, c++
- 번역을 컴파일러로 진행
- 문서 전체를 한번에 번역함 -> 에러가 2개 이상 검출될 수 있다는 특징을 가진다
- 실행속도가 빠름
■ 인터프리터 언어
- basic, python
- 번역을 인터프리터(번역기)로 진행
- 한 명령씩 번역 후 실행하는 방식으로 진행
-> 에러는 오직 한 개만 검출
- 실행속도가 느림
컴퓨터 언어의 분류 3)
■ Unmanaged 언어 (자동관리가 안 됨, 수동관리)
- c, c++
- 하드웨어를 효율적으로 운영가능 (메모리-ram)
- 주로 운영체제나 유틸리티를 만드는 데 사용됨
-> 단, 많이 알려져 있는 것이 많아 보안에 취약함
- 어렵다. (포인터 사용 등)
■ Managed 언어 (자동관리가 됨)
- python, java
- 대체적으로 프로그램이 무거워지는 경향이 있다.
- 주로 전체적인 작동에 관련된 코드를 작성
-> 하드웨어를 효율적으로 운영할 필요가 있는 부분은 unmanaged 언어로 만든 후 접착함.
- 쉽다.
예를 들어 a=10 이후 a+=10 을 하면 10과 20 모두 메모리를 차지한다. (python)
하지만 c언어는 덮는다. 즉 20만 남는다.
포인터는 메모리를 더 효율적으로 사용할 수 있게 해줌.
C언어의 특징
- 높은 호환성을 가진 언어
- 양면성 기능을 가진 언어
- 범용 프로그래밍 언어
- 영어 소문자를 기반으로 하는 언어
- 다양한 연산자를 가지는 언어
- 모듈러 프로그래밍 언어
- Free format 코딩 형식을 가지는 언어
- 전처리기를 사용하는 언어
- 포인터를 사용하는 언어
#include<stdio.h>
int main(void)
{
printf("Hello world ! \n");
return 0;
}
빌드업 : 빌드라는 메뉴에 솔루션 빌드 확인 (기본값은 ctrl + shift + B)
현재 문서 번역해서 저장까지 하는 과정.
#include : 전처리기
<stdio.h> : 헤더파일, 표준 입출력 함수가 정의되어 있는 파일.
헤더파일은 공구상자라고 생각하면 된다. 헤더파일 안에 또 다른 헤더파일을 선언하는 경우도 있다.
헤더 파일은 무조건 하나 이상 존재할 수밖에 없다.
int main(void) : 함수의 한 종류, 프로그램의 시작점, 모든 프로젝트의 메인함수(시작지점)는 무조건 하나다.
{} : 프로그램의 영역을 표시
중괄호끼리는 영역이 겹치지 않는다. 감싸는 형태는 가능하다. (와이파이 형태)
; : 세미콜론은 생략가능이지만 생략가능과 자동삽입은 구분해야 한다
생략가능 : 빼고 그만 안 빼고 그만, 한 줄에 하나의 오더면 빼고 된다. 쓰나 안 쓰나 결과 차이 없다.
자동삽입 : \n과 같은, 기본으로 적용되는 이스케이프 문자 같은 것, 즉 내가 직접 기입해주면 2번 적용이 됨.
<함수>
함수 = funtion = 기능
함수란 어떠한 기능을 갖고 있는 소규모의 코드를 정의해놓은 키워드.
함수는 함수의 정의와 호출의 구조를 갖고 있다.
함수는 표준함수와 사용자 정의함수로 나뉘어진다.
표준함수는 C언어를 설치할 때 저장장치에 저장하고, include라는 키워드를 사용해서 문서에 포함시키는 방식으로 사용한다.
사용자 정의함수는 그때그때 마다 필요에 의해서 작성자가 정의하는 함수를 말하며, 표준함수처럼 .h의 헤더파일로 함수나 변수들을 정의해놓은 헤더파일을 사용해서 코드를 간소화 할 수 있다.
<입출력 그림>
x=2 -> 함수의 인자값 또는 인수 (넣어주는 재료)
x를 꼭 넣어줘야 하는 건 아니다.
(함수의 정의) 2x+3 이 함수를 감싸는 틀이 '함수명'(printf와 같은)
y= -> 꼭 넣어줘야 한다, 즉 있을 수밖에 없다.
시작은 디버그 - 디버그하지 않고 시작 클릭하면 코드 실행된다. ( ctrl + f5)
-------------------------------------------------------------------------------------------------------------------------
구문오류 : 있어야 할 게 없거나, 없어야 할 게 있는 경우.
() : printf의 시작과 끝.
" " : 문자열, 각각의 문자를 순서대로 나열해 놓은 것.
C언어는 홀따옴표와 쌍따옴표의 용도가 다르다.
' ' : 홀따옴표는 단일 문자 한 글자만 가능하다. (문자상수)
` ` : 역따옴표는 무시해도 된다.
; : 모든 명령줄의 끝에 붙여주는데, 5줄의 명령어에서 ;를 지우면 6번째 줄에서 오류가 뜬다.
즉, 세미콜론의 위치는 중요하지 않다. 단 한 명령이 끝날 때마다 '무조건' 써줘야 한다. (절대규칙)
하지만 명령줄의 끝에 붙이는 게 좋다. 그래야 자신이 세미콜론을 쳤는지 안 쳤는지 쉽게 파악할 수 있다.
또 한 줄에 여려 명령을 붙인다고 했을 때, 일단 가독성이 떨어지고 결과 예측도 쉽지 않다. 에러 또한 찾기 어렵다.
그래서 '가급적' 한 줄에는 한 명령어를 사용하는 것이 일반적이다.
* 코드를 지우는 습관이 있다면 버릴 것.
주석이란??
주석은 컴퓨터에게 전달하는 명령에서 예외처리된다.
즉, 주석은 컴퓨터가 읽지도 번역하지도 않는다.(무시)
주석은 줄(행)주석과 블럭주석으로 나뉜다.
줄주석은 //뒤로 모두 주석처리된다.
단, 행이 바뀌면 주석은 해제된다. 그 행에서만 적용되는 것.
블럭주석은 /*으로 시작지점을 정해주고 */으로 끝을 지정해주면, 그 사이의 모든 내용을 주석처리한다. (여러 행을 한번에 주석처리함.)
//include<stdio.h>
//int main(void)
//{
// printf("Hello world !\n"); // 줄 주석은 이렇게 특정행의 설명을 작성
// // 또는 특정 코드를 예외처리하는 용도로 사용한다. printf("Hello world !\n");
// printf("Hello world !\n");
// printf("Hello world !\n");
// printf("Hello world !\n");
// return 0;
//}
/*
include<stdio.h>
int main(void)
{
printf("Hello world !\n");
return 0;
}
*/
ctrl + shift + / = 토글방식으로 주석 설정 / 해제
% 토글 = on/off, 설정/해제
ctrl + k + c 주석이 누적 적용됨
ctrl + k + u 주석이 누적 해제됨
-------------------------------------------------------------------------------------------------------------------------
int main(void) : 프로그램의 시작
int : 반환자료형
main : 함수명
(void) : 인수
return : 프로그램의 끝 없어도 실행은 되지만 비공식적인 종료라 할 수 있다.컴퓨터에게 프로세스가 종료됨을 알려주고 끝내는 것.
근데 왜 return이 없어도 실행되는가 ? c언어는 절차 지향 언어.그냥 프로세스가 더 이상 없기 때문에.
return -> int 기 때문에 정수값이 입력되어야 한다.근데 0과 100을 쓸 때의 차이는 무엇일까.
실행하면 코드의 개수가 다르다. return 뒤에 아무것도 안 쓰려면 int 대신 void가 들어가면 된다.
(void)는()로 비워놔도 된다.하지만 정석적인 문법은 아니다.
<ESCAPE 문자>
\n : 파이썬에서는 \n이 자동삽입 되어있지 않기 떄문에 필요하면 넣어야 한다.
\r : 그냥 그 줄의 처음으로 이동
\b : backspace와 다르게 커서만 이동, 문자를 삭제하지는 않습니다.
\t : tab 크기 만큼 이동, tab키를 누르면 8칸 이동 (윈도우) 8의 배수 단위로 칸 수가 확보됨. 일정한 간격으로 열을 맞춰서 출력하고자 할 때 사용하면 유용함.
\a : 알람소리. 부저음. 비프음.
\" : " "영희야 안녕" " -> 적용되지가 않음. 붙어있는 큰따옴표끼리 열고 닫는 게 적용되기 때문에 \"쓸 써줘야 한다.
- // " '영희야 안녕' " 은 가능하다.
\n을 띄어주면 n만 문자열로 인식돼서 출력된다. c언어에서는 \ 기호가 나오지 않는다.
\ 기호를 출력하고자 하면 \\로 입력하면 된다. 하지만 \\n 으로하면 줄 바꿈이 되지 않는다.
-------------------------------------------------------------------------------------------------------------------------
<예제>
#include<stdio.h>
int main(void)
{
printf("이름 : 홍길동\n");
printf("나이 : 27\n");
printf("주소 : 경기도 수원시\n");
return 0;
}
#include<stdio.h>
#include<Windows.h> // 윈도우 명령어들을 정리해놓은 헤더파일.
int main(void)
{
printf("□□□□□0%%\r");
Sleep(1000);
printf("■□□□□20%%\r");
Sleep(1000);
printf("■■□□□40%%\r");
Sleep(1000);
printf("■■■□□60%%\r");
Sleep(1000);
printf("■■■■□80%%\r");
Sleep(1000);
printf("■■■■■100%%\r");
}
// 왜 %%를 쓰는가. % 기호도 약속되어 있는 특수문자라서 %를 쓰고 싶으면 %%를 써야 한다.
// Sleep은 딜레이 시켜주는 함수인데 천분의 일초이기 때문에 1000을 해줘야 1초가 된다. 특징은 대문자를 써줘야 한다.
-------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
int main(void)
{
printf("1234567812345678123456781234567812345678\n");
printf("1234567\t123\t12345678\t123\n"); //왼쪽으로 8칸해서 왼쪽 끝정렬
printf("abcdefg\tabc\tabcdefgh\tabc\n");
return 0;
}
한글은 2바이트 문자.
-------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
int main(void)
{
printf("====================\n");
printf("\t /)/)\n");
printf("\t( ..)\n");
printf("\t( >♡\n");
printf(" Have a Good Time.\n");
printf("====================\n");
return 0;
}
-------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
int main(void)
{
printf("\t #### 회비 정보 ####\n");
printf("========================================\n");
printf("이름\t나이\t전화번호\t회비\n");
printf("홍길동\t\"15\"\t010-123-1234\t\\20,000\n");
printf("임꺽정\t\"20\"\t010-234-2345\t\\30,000\n");
printf("김말이\t\"28\"\t010-345-3456\t\\50,000\n");
printf("========================================\n");
printf("총합계\t\t\t\t\\100,000\n");
printf("========================================\n");
}
#include<stdio.h>
int main(void)
{
printf("Hello Everybody\n");
printf("%d\n", 1234); // 연산이 가능한 숫자
printf("%d%d\n", 10, 20);
printf("1234\n"); // 문자
return 0;
}
run type error : 문법에는 이상이 없어서 빌드업 단계에서는 에러가 안 나지만 실행도중 나오는 에러.
-------------------------------------------------------------------------------------------------------------------------
서식문자
%d 10진(Decimal) 정수
%o 8진(Octal) 정수
%x 16진(hexa_decimal) 정수
%p 포인터 정수(16진수)
%u 부호없는(Unsigned) 10진 정수
%f 10진형 부동(Floating) 소수점수
%e 지수형(Exponential) 부동소수점수
%c 단일문자(Character)
%s 문자열(String)
#include<stdio.h>
int main(void)
{
printf("%d\n", 123);
printf("%d%d\n", 123); // python에서는 에러지만 C언어에서는 메모리에 있는 아무 값이 두 번째에 들어간다. 쓰레기값이라고 한다.
printf("%d\n", 123,321); // 두 번째 321은 호출될 %d가 없기 떄문에 그냥 무시된다. 123만 출력된다.
printf("%d%d\n", 123,321);
printf("%d+%d=%d\n", 123, 321, 123 + 321);
return 0;
}
#include<stdio.h>
int main(void)
{
printf("정수 표현:%d\n", 123);
printf("정수 표현:%d\n", 123.123); // 소수점이 존재하는 실수를 %d로 표현하려 하면 쓰레기 값 출력. 자료형에 대한 규칙이 까다롭다. 메모리에 할당되는 크기가 다르다. 참고로 출력만 이렇게 하는 거지 데이터를 변형시키지는 않는다. 바깥에 정해진 값을 지정된 형식으로 출력만 하는 것.
printf("정수 표현:%d %d\n", 123,456);
printf("실수 표현:%f\n", 456); // 0 처리가 된다. 메모리에 할당되는 크기 문제 때문에. 정수-> 실수 호출하면 0처리 된다. 쓰레기값이랑 다름.
printf("실수 표현:%f\n", 456.456);
printf("실수 표현:%f %f\n",456.456,123.123); // 완벽하게 2진수로 실수를 표현할 수 있는 방법이 없기 때문에 , short 소숫점 6자리까지, long 15자리까지 정확도를 높인다.
return 0;
}
#include<stdio.h>
int main(void)
{
printf("문자열 표현: %s\n", "안녕");
printf("문자열 표현: %s\t%s\n", "문자열", "표현방식"); // printf("문자열 표현: %s\t%s\n", "문자열""표현방식") 로 표현하면 컴퓨터는 하나의 문자열로 인식한다. 따라서 바깥에 있는 아무값이 들어온다.
// 데이터와 데이터를 구분할 때는 , (콤마) 연산자를 사용하라는 규칙.
return 0;
}
'IT&코딩 > C' 카테고리의 다른 글
C언어 2주차 복습-2 (0) | 2022.08.24 |
---|---|
C언어 2주차 복습-1 (0) | 2022.08.19 |
C언어 1주차 복습-4 (0) | 2022.08.17 |
C언어 1주차 복습-3 (0) | 2022.08.12 |
C언어 1주차 복습-2 (0) | 2022.08.10 |