C 이론(3)

Hi Beck·2023년 4월 18일

TIL-Language(C & C++)

목록 보기
4/34

교육 복습

1.들여쓰기는 보통 1tab(=스페이스4칸)하면 된다.
들여쓰기 하는 이유 : 가독성을 높히기위하여

2.내가 이해한 함수의구조는 출력형 + 함수명 + 입력명인데 입력명과 매게변수의 개념이 충돌 되어서 함수 옆에 입력형이 오고 변수 옆에 오는게 매게변수인지의 식으로 햇갈린다.

-> 함수를 호출할 때는 자료형없이 변수만 들어간다.
반환 자료형 + 함수명 + 입력 자료형이 있는데 입력 자료형을 매게변수라고 한다.이게 뭔말이냐면 두개가 차이가 있는게 아니라 입력 자료형=매게변수형이라고 이해하면 됨.즉 입력 자료형은 "어떠한 형태의 매게변수가 필요한가"로 보면됨.
여기서 변수이름이 왜 있냐면 안에서 변수이름을 컨트롤 할 것이기 때문에

호출할때는 그냥 딱 변수만 {int=i를 inc라는 함수에 inc(i)이런식으로} 넣는데 int형 변수를 넣을 수 있는 입력형(=매게변수형)에다가 변수 i만 넣은 것임
-> 함수를 호출할때는 간략하게 끝나지만 함수를 정의할땐 반환형,변수 등 여러가지가 들어가는 차이가 있음

3.코드를 짤 때 별도의 단어는 띄는데 왜 함수의 입력형은 붙히는지?
보통은 컴퓨터한테 단어마다 띄어줘서 말해줘야되는건데 입력형이 붙혀지는것은 괄호가 구분을 해주기때문에 그냥 붙힌 것(일종의 규약)

4.로컬 windows 디버거는 실행시키는건데 빌드 먼저안하고 해도되는건지?
로컬 windows 디버거를 누르면 자동으로 빌드까지 실행된다.

5.컴파일 시간 오류에서 시간이랑 문법적은 무슨연관이 있는지
코드를 잘못짜면 컴파일이 영원히 되는 경우가 있는데(로직이 잘 못된 경우)
결국은 코드가 잘못된거니 문법적으로 잘못된거란 이야기임

실행시간 오류
= 실행까지해서 코드가 실행되고있는데 갑자기 멈출 때가 있음.(크래시)
크래시가 일어나서 꺼질때있음(런타임 오류)
문법적으로는 문제가 없지만 논리적으로 잘못되었을 때 일어남
예시 나누기연산을 하는데 10나누기0 같은 말도 안되는 것을 실행시킨경우
컴퓨터가 실행 파일을 꺼버림 메모리 공간이 0과1로 되어있는데 맞는지 틀린지 실행해보기전까진 몰라서(여기서 나누기는 이진법 계산을 계속 해야되는애 근데 논리적으로 안되니 컴퓨터는 오류를 내버림)

이런게 안일어날 것 같지만 변수를 변수로 나누는 경우에서 변수가 0이 안된다는 보장이 없기에 이런 오류가 일어날 수 있음

6.IDE창 왼쪽에 숫자로 채워진 수직선 = 코드라인 =에러가발견된라인번호
아래 빌드 메세지 창에 이 번호가 뜸
오류 : 실행 자체가 안됨 / 경고 : 실행은 됨 다만, 되도록 경고도없어야됨

밑에 코드넘버 4자리를 유심히 봐라
마이크로소프트는 좀 어려움
구글링하는 법은 'C2060 C언어' or 'Error C2060 C언어'이렇게 검색하기
(영어로 검색하는 것은 코드를 짠 사람마다의 변수들이 다르기에 잘 안나옴)

네이버는 국내사람 밖에 없으니 비추 / 나중엔 영어로 질문올리면 더 좋은 답변을 받을 수 있음

  1. 오류메세지의 'assuming extern returning int' 뜻?
    외부의 결과값(정수형)에 가정하여?

    일단은 '외부의'는 무시하고 생각 -> int의 자료형을 반환할 것을 가정한다.(=얘 int 자료형 반환할 것 같은데?)사실상 지금 상황에 이건 헛소리고 이 말보다 앞에 나와있는 오류 메세지가 핵심이다.(정의되어있지않다이런거)앞에 문장은 펙트 그리고 뒤에 문장은 컴퓨터가 추측한 가설임(그래서 헛소리일때도 있음)

  2. 논리적인 오류를 찾을때 디버깅을 하면서도 찾아보는데 디버깅하는식이 한줄씩 보고있는데 임의의 줄에서 잘되는 것보고 여기까진 문제없네 하는 행위

디버깅도 프로그래머의 자질을 결정하는 능력 중 하나

9.디버거의 명령어 정의
F5(go) : 실행
F10(Step Over) : 한 문장씩 실행(함수도 하나의 문장 취급)
F11(Step Into) : 한 문장씩 실행(함수 안으로 진입)
F9(Breakpoint) : 현재 문장에 중단점을 설정
디버깅할때 여기에선 무조건 멈췄으면 좋겠을때 설정하는 점임(의심되는 소스코드가 있는 라인에 들어가기직전)
코드넘버 좌측에 회색띠가 있는데(에디터 색상마다 다름)여길 라인에 맞게 찍으면 빨간점이 생긴다.

실행하는데는 두 가지 방법이 있다.첫 번째 방법은 디버깅하고 실행하는 법
두 번째 방법은 디버깅하지 않고 실행하는 법(이때는 안멈추고 실행까지 쭉 동작) 둘 다 아래 빨간줄이 생김

디버깅을 시작하면 빨간 점 안에 화살표가 생기는데 디버깅하면서 실행시키면 이 점에서 화살표가 생기면서 멈춘다.예로 들어 8번 옆에 찍었으면 8번이 실행되기 전에 멈춘 것임 7번째까진 실행한 것(이 화살표는 드래그하면 화살표끼리
움직일 수 있음)

이제 여기서 다음 코드를 보고싶을때 한줄씩 가는건데 여기서 또 나눠짐
F11 스탭 인투는 좀 더 세분화 된 한문장씩 실행임.

F10
일단 F10은 그냥 에디터 창에서 단순하게 이 줄에서 이 줄로 넘어가는것임
(함수 정의 코드를 친 후 코드들이 쭉 있고 그 중에 함수 호출 코드가 있다고 가정했을 때 7번 코드 8번 함수 호출 코드 9번 코드 순으로 코드가 위치해있다고하면 8번 함수 호출 코드로 넘어갔을때 왠지 위에 위치한 함수 정의 코드로 돌아갈 것 같지만 실행은 되면서 스탭오버는 걍 7번 8번 9번 이렇게 넘어간다.물론 오류가 있으면 멈추는거고)

근데 함수 정의한 코드에도 빨간점이 있을 경우(예를들어 3번) 7번 코드 다음 8번 코드에 진입했을 때 함수 정의 코드에 빨간점으로 넘어간다.8번에서 9번으로 넘어가는데 만약 8번에 중단점이 있으면 거기로 가게되는 것임 근데 3번 중단점에서 스탭 오버하면 중단점이 없는데도 불구하고 4번으로 넘어간다.
이렇게 F10은 특수한 경우가 아니면 무조건 한 줄씩 가는 애다.
근데 함수 정의 코드로 다 한줄씩 넘어가면 그 다음엔 무슨 줄로 가냐?
그땐 함수 호출 코드 다음 줄로 넘어감

F11
얘는 만약 함수 호출 코드에서 얠 누르면 중단점 없이도 바로 함수 정의 코드로 넘어옴 그리고 함수 정의 코드에 있는 코드 라인들 한 줄씩 다 넘어옴
그리고 정의 코드 다보면 그때 함수 호출 코드 다음 줄로 넘어감
-> 한쪽 씩 넘어가는데 안쪽으로 들어갈려는 아이다.들어갈 구멍이 있다면 다 들어감.

  • 디버깅 빨간점이 안찍힐 때 : 릴리즈 모드인지 확인해라(플로피디스크 아이콘 옆에 디버그이라고 되어있는 곳) 릴리즈 모드는 의미없는 함수라고 생각하면 자체적으로 생략해버려서 배포할 때 쓰는 모드인 것

배포판이니까 쓸모없는 애는 정리해버리자 (모든 함수가 재기능을 못할때도 있는거임 호출하나 안하나 결과가 달라지는게 없으니깐)

F5는 실행인데 얘는 중단점이 있으면 중단점까지 쭉 실행되고 만약 없으면 그냥 쭉 실행 됨

10.디버깅이 쓰이는 예시

int num1 = 3; 이렇게 변수를 정의하고
int num2 = 5;

num1 = num2; 넘2의값을 넘1에 대입했을 때

num2 = 0;

중단점이 있는 디버깅 과정이란 가정하에 변수명에 마우스 커서를 갖다대면 임의의 값이 나오는데 이건 실행되기 전이라 값이 랜덤(쓰레기값)으로 나오는 것이고 실행하고 다시 갖다대면 값이 3으로 제대로 나옴(실행하면서 3을 대입해줬으니깐 3으로 뜬 것)
-> 이런 이유 때문에 변수를 선언할 땐 초기화 작업이 필요한 것
-> 이렇게 프로그램을 멈춰놓고 논리적인 오류를 볼 수 있는게 디버깅의 기능이다. 아래같은 것도 디버깅하면서 본다 생각하면 됨

num1 = num2;를 실행하면 num1의 값과 num2의 값은 각각 5,5로 나온다.
-> 오른쪽 값은 고정이다.변하지않아

num2 = 0;가 실행되면 num2는 0으로 덮어짐

디버깅의 다른 기능
디버깅 모드의 창 아래 보면(디버깅이 아니면 안보임) 자동,로컬,조사식이라고 있는데 로컬을 보면 내가 선언해놓은 변수들이 다있다.
자동에도 똑같이 있음(차이는 나중에)
조사식같은 경우는 안에 내가 보고싶은 변수명을 검색하면 그게 뜸.
-> 여튼 이게 장점이 나중에 프로그램이 커지고 복잡해져도 내가 선언한 변수들을 한눈에 손쉽게 볼 수 있다.

이걸 키고 디버깅을 하면 실시간으로 값이 바뀌는 걸 볼 수 있음
아까 실행하기 전 값이 먼저 뜨고 디버깅하면서 코드가 실행되면 아래 값이 실시간으로 바뀌는 것임(뭐가 바뀌었다고 알려주는게 엄청 편하다는 말임)

11.방금 이야기했던 패널 오른쪽에 있는 패널(호출 스택,중단점 등 여러가지)
=함수가 어떤 순서로 호출이 되었는지 나온 곳이며, 예시를 들자면 메인 안에서 임의의 함수가 호출되면 호출 스택에선 함수가 메인에서 호출되었다고 알려준다.

중단점은 내가 중단점을 어디 찍었는지 그리고 리스트 중 하나 더블클릭하면 그 코드로 자동으로 가짐

12.주석의 종류
/* / : /가 나올때까지 모든 코드가 주석이 됨(여러 줄로도 가능,쓸 글이 많을 땐 이것 쓰기)
// : 해당 줄마다 주석

주석에 들어갈 내용은 '내가 프로그램을 왜 이렇게 짰는지','이 함수가 무슨 일을 하는 함수인지'등이 있음

주석 주의점
주석이 많으면 코드 고칠때 주석도 많이 고쳐야되는 불상사가 일어남
코드를 수정했는데 무슨 이유로 주석은 안고친 경우도 있어 오해를 하게됨
프로들끼리 주석으로 설명하는게 안좋은 이유가 코드는 잘못되면 무조건 빌드에러나 뭔가 오류가 나는데 주석에다가 뭔가 잘못 설명해놓으면 알 수가 없다.
포폴에도 안좋음, 최대 한 두줄만

13.CPP파일은 한 개가 아니라 여러개가 된다.코드가 엄청 많아지면 나눠서 저장하게 됨

14.해더파일와 소스파일의 용도
해더파일의 용도 : 내가 이런이런 함수들을 구현할거고 저런저런 변수들을 가지고있을거야라고 요약을 해가지고 알려주는 용도
그럼 이 실제코드는 어딨냐? 똑같은 이름의 cpp파일에 있음.
(이걸 첨에 해더파일에서 추가 및 새항목해서 만들 때 소스파일명과 동일명으로 설정하고 만들면 이제 여기에 썼던 함수들을 적어줘야됨

적을 때 중괄호 없이 반환형 함수명();까지만 적음.그럼 해더파일이 여기서 이 함수가 무슨 기능을 하는지 모르지않냐 이건 cpp파일을 가면 있는 것
(CSS 생각하기)대신 이것도 #include"파일명.h" 전처리자 눌러줘야됨
(<>는 스탠다드 표준일때 쓰는것이고 내가 만든 건 큰따옴표 이용)

----> 이건 다른 CPP파일에서 다른 해더파일을 가져올 때 이것을 쓴다.
얘를 끌고 추가로 소스파일에 다른 cpp파일을 만들었을 때 거기에 #include"파일명.h"부터 쓰고 그 안에 있던 함수를 호출하면 불러와진다.
이때 호출된 함수는 기존 cpp파일에 있던 함수

stdio.h 코드 보는법
stdio 중 아무대나 커서 위치시키고 F12 누르면 코드창 열림
사실 이 안에 우리가 몰라도 문제없음 이 안에는 기본적으로 제공되는 것들이 담겨있으니깐 printf가 이 안에 있어서 우리가 굳이 정의하지않아도 쓸 수 있음.프린트풋은 아웃풋 스트린풋은 인풋 이게 stdio의 뜻처럼 안에 들어가있음

15.전처리기 : #으로 시작되는 코드/맨 위에 위치/세미콜론을 안붙힘/인클루드말고 여러가지있음
= 실행되기 전에 처리한다는 뜻
= 코드에서 제일 첫번째로 실행되는 애
='난 이 소스파일에 해더파일을 가져올 것이다.'라는 명령어
= 이게 실행된 다음 main이 실행되는 것
= 내부적동작 : 이제 소스파일에서 빌드하면 해더파일에 있는 소스코드들을 가지고오는데 그게 원래있던 소스파일에서 통채로 가져다놓을 소스파일에 가져다놓는 것, 포함시키는것이자 합친다는 개념으로 보면될 듯 그냥 원격으로 가져오는게 아니라 원시적으로 소스코드 복사해오는 것이라 생각하면됨 그리고 이제 이것들이 오브젝트 파일이 된다.

16.함수
출력타입은 반환형이라고도 말함
입력타입은 매게변수, 인풋, 파라미터라고 부름
함수는 펑션,메서드라고 부름

이렇게 이름이 많은 이유는 언어마다 이걸 지칭하는 이름들이 달라서 그렇다.
내가 쓰고자하는걸 하나 정해서 그렇게 말하고다니면된다.

return은 언제쓰냐?
반환형이 void가 아닐 때는 무조건 써야됨
void는 없다라는걸 명시적으로 보여주는 것으로 출력할 것이 없다는 뜻이다.
(출력할 것이 없다 = 함수의 결과값이 없다)

예시로 오렌지(입력)를 가지고 오렌지주스(결과)를 만드는 기계(함수)가 있는데 내가 기계를 돌리되 오렌지주스가 안나오는 기계를 만들고싶은 경우에는 나오는 구멍(결과값을 출력하는 구멍 = return)을 막아버리면 된다. 즉 구멍이 return이라고 하면 이 리턴을 안써줘서 안나오게 만들면 되는 것
(에외로 void가 있는데 리턴도 있는 경우가 있다 이때 보면 =0;이 없이 ;만 있을것임 이게 그냥 리턴해서 함수를 끝낸다는 뜻임 또한 뒤에걸 실행시키기위해서 리턴이 중간에 들어갈 수도 있음)

17.문장은 코드 한 줄을 의미함

18.printf
안에 큰따옴표 써주는거 잊지말기
출력함수는 사용자가 볼려고 만든 함수

반대로 사용자로부터 입력을 받을려고 만든게 입력함수임(계산기 숫자 생각)
사용자가 프로그램한테 주는 것!

19.오류는 일단 오타부터 체크하자!

profile
Emotional realizer

0개의 댓글