/date 24.10.24.
📌 연산자
- 산술 연산자: 사칙 연산이 기본
- 대입 연산자: 오른쪽에 잇는 값을 왼쪽에 대입하는 역할. 대입 연산자와 산술 연산자를 혼용해서 사용하기도 한다.
- 증감 연산자: ++a(a의 값을 1 증가시킨 후 연산 진행) / a++(연산을 진행한 수 a값을 1 증가)
#include <studio.h>
int main()
{
int a = 5;
int b = 10;
printf("%d", ++a);
return 0;
}
- 관계 연산자: 관계에 대한 결괏값은 bool 타입으로 전달된다.
#include <studio.h>
int main()
{
int a = 10;
int b = 11;
printf("%d", a == b); //0(false의 %d표현)
return 0;
}
- 논리 연산자: 두 개의 조건식 등을 결합하여 하나의 결괏값을 만들어낸다.
#include <studio.h>
int main()
{
int a = 10;
int b = 11;
int c = 12;
int d = 13;
printf("%d", !(a == 10)); //0(false의 %d표현)
return 0;
}
📌 분기문 1: if문
- 조건: 어떤 의미를 이루게 하거나 이루지 못하게 하기 위하여 갖추어야 할 상태나 요소
- 대표적인 분기문이 바로 if문이다.
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
if(a > 5){
printf("입력값은 5보다 큽니다. \n");
}
return 0;
}
📌 분기문 2: if-else문
- else: else문을 추가함으로써 양자택일이 가능하게 된다. 수행 조건이 참이라면 if문의 수행문으로 들어가고, 거짓이라면 else문의 수행문으로 들어간다.
- else if문을 사용하면 조건 자체가 계속 늘어날 수 있다.
- 평가문제: 사용자로부터 하나의 정수를 입력받는다. 입력한 값이 짝수이면 출력 결과로 “입력한 수는 짝수입니다.”라는 문자열을 출력하고, 입력한 값이 홀수이면 출력 결과로 “입력한 수는 홀수입니다.”라는 문자열을 출력하라.
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
if(a%2==0) {
printf("입력한 값은 짝수입니다. \n");
} else {
printf("입력한 값은 홀수입니다. \n");
}
return 0;
}
📌 반복문
- while문: if문과 유사한 형식을 갖되, 반복 조건이 false가 될 때까지 중괄호 안에 있는 문장을 수행한다.
#include <stdio.h>
int main()
{
int i = 0;
while (i < 5) {
printf("Programming\n");
i++;
}
return 0;
}
- 반복문을 활용해서 1월부터 12월까지 출력을 해보면 아래와 같다.
#include <stdio.h>
int main()
{
int i = 1;
while (i < 13) {
printf("%d월", i);
i++;
}
return 0;
}
- 구구단 2단 출력하기
#include <stdio.h>
int main()
{
int i = 1;
while (i < 10) {
printf("2 * %d = %d\n", i, 2*i);
i++;
}
return 0;
}
- 사용자로부터 입력받은 숫자에 해당하는 구구단을 출력하려면?
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
int k = 1;
while (k < 10) {
printf("%d * %d = %d\n", i, k, k*i);
k++;
}
return 0;
}
📌 for문
- 변수의 초기화 연산과 증감 연산이 추가되었다. 초기화 이후 참이면 반복하고자 하는 내용을 수행하고 증감 연산을 한다. 이후 조건을 보고 또 참이라면 위의 루프를 반복한다.
//구구단 구현
#include <stdio.h>
int main()
{
int dan, i;
scanf("%d", &dan);
for(i = 1; i < 10; i++){
printf("%d * %d = %d\n", dan, i, dan*i);
}
return 0;
}
📌 break와 continue
- while 내에서의 break 발동 -> while 반복문을 탈출한다.
- continue의 경우 continue 이하의 수행은 무시하고, 다시 반복의 시작점으로 돌아간다. 일종의 skip 기능이라고 볼 수 있다.
📌 함수
- 함수는 나누어서 처리하기 위한 목적을 갖는다. 코드의 가독성을 향상시키고, 코드의 유지 보수 및 확장을 용이하게 한다.
- 표준 함수: 언어에서 기본적으로 제공해주는 함수를 의미한다. 함수를 라이브러리화 시켜서 편리하게 사용할 수 있게 한다.
- 사용자 정의 함수: 사용자가 자신이 원하는 기능을 직접 만들 수 있다. 표준함수의 기능에는 한계가 있기 때문에 사용자 정의 함수를 활용한다.
- 함수의 기본 형태는 아래와 같다.
자료형 함수이름(인수목록)
{
함수의 내용
}
- 인수 목록: 함수에 필요한 값을 전달할 때 사용한다. 인수 = 매개변수 = 전달인자 = 파라미터
- 데이터 타입(자료형) : 함수가 리턴하는 값의 타입을 의미한다.
- 함수 이름: 함수의 기능과 밀접한 이름으로 만드는 것이 좋다.
- 함수의 내용: 중괄호 사이의 영역 안에서 작성한다.
- void 타입: 결과값을 리턴하지 않아도 되는 함수의 리턴 타입으로 주로 사용된다.
📌 변수의 범위
- 지역변수: 함수 안쪽에 선언된 변수를 의미한다. 함수의 호출 순서와 지역변수의 소멸 순서는 반대 순서를 가지며, 이름이 같더라도 다른 곳에서 호출하면 다른 변수이다. 매개변수도 지역변수에 해당한다.
- 전역변수: 함수의 바깥쪽에 선언된 변수를 의미한다. 때문에 어디에서도 접근할 수 있다는 것이 특징이다. 데이터 영역에 할당되어 프로그램이 종료될 때 전역변수는 소멸된다.
int global; //전역변수
void main(void)
{
int val = 0; //지역변수
}
- Static 변수: 지역변수와 전역변수를 반반 섞어둔 변수라고 볼 수 있다. 지역변수와 같이 중괄호 영역에서 선언되지만, 중괄호를 벗어나도 메모리 상에 고정되어 소멸되지 않고 프로그램이 종료될 때 전역변수와 함께 소멸된다. 전역변수와 마찬가지로 데이터 영역에서 관리된다.
#include <stdio.h>
void func(){
int value = 0;
value++;
printf("%d\n", value);
}
int main()
{
int i = 0;
while(i<5){
func();
i++;
}
return 0;
}
//1 1 1 1 1
위의 코드에서는 func을 호출할 때마다 0으로 초기화되어서 1이 다섯 번 호출된다. 이걸 해결하려면 value를 전역변수로 사용하거나, 함수가 끝나도 소멸되지 않도록 static 변수로 만들어 주어야 한다.
#include <stdio.h>
void func(){
static int value = 0;
value++;
printf("%d\n", value);
}
int main()
{
int i = 0;
while(i<5){
func();
i++;
}
return 0;
}
//1 2 3 4 5
- 메모리 생명 주기
- 지역변수 : 함수 안에서 생성 - 함수가 끝나면 소멸
- 전역변수 : 프로그램이 시작할 때 생성 - 프로그램 종료 시 소멸
- static 변수 : 함수 안에서 생성 - 프로그램 종료시 소멸
📌 배열
- 배열이란 같은 속성을 가진 것들을 나열해 놓은 것을 말한다. 요소가 순서대로 여러 개 모인 것!
- 왜 배열을 사용해야 하는가? 많은 변수를 한 번에 선언하고 싶으니까!
- 배열의 선언 구조: 배열의타입 배열의 이름 배열길이
- 타입: 배열 요소들의 타입
- 이름: 각 배열 요소에 접근하기 위해 배열 이름을 나타낸다
- 배열 길이: 변수의 개수
즉 int array[5]의 경우 배열의 타입은 int, 배열의 이름은 array, 길이는 5
- 배열의 초기화: 배열의 길이와 초기값의 개수가 일치하도록 입력해 주면 된다.
int array[5] = {1,2,3,4,5};
- 실무에서 사용하는 데이터는 엄청 크다. 일일이 세어서 배열의 길이를 지정하는 것은 효율성이 떨어지므로, 배열의 크기를 비워 두고 초기값을 넣는 방식을 사용한다.
int array[] = {1,2,3,4,5,6,7,7,8,8,8,9,10};
#include <stdio.h>
int main()
{
int total = 5;
int array[5] = {1, 2, 3, 4, 5};
total = array[0] + array[1] + array[2] + array[3] + array[4];
printf("%d\n", total);
return 0;
}
- 배열의 복사: 배열의 이름 자체는 상수이기 때문에 대입 연산자를 통해 값을 넘겨받을 수는 없고, 요소끼리 복사를 해야 한다.
#include <stdio.h>
int main()
{
int i;
int arr1[5] = {1, 2, 3, 4, 5};
int arr2[5];
//arr2 = arr1; -> 에러 발생
for(i = 0; i < 5; i++){
arr2[i] = arr1[i];
}
for(i = 0; i < 5; i++){
printf("%d\n", arr2[i]);
}
return 0;
}
- 문자열 변수: 문자열에 이름을 붙여 주면 변수로 사용이 가능하다.
- char str[12] = "Hello World";
- 문자열의 끝에 null문자가 추가되기 때문에 문자열 길이 + 1이 배열의 크기이다.
- 컴퓨터가 문자열의 끝을 인식하기 위해 Null을 끝에 붙여준다.
📌 포인터
- 변수를 선언하면 각각의 크기별로 메모리 상에 배치된다.
- 포인터는 포인터 변수의 줄임말로, 메모리의 주소값을 저장하고 있는 변수이다. 보통 주소값을 저장한다는 표현을 반대로 해당 메모리를 가리킨다고도 표현한다. 어느 특정 메모리 주소를 가리키거나 향하고 있다는 뜻이다(간접 참조).
- 포인터 사용방법: 포인터 변수 선언 시 일반 변수명 앞에 * 기호를 붙여준다. 주소값만 저장하겠다는 의미이다.
- 배열의 이름 == 포인터이지만 배열의 이름은 주소값을 갖는 포인터이자 상수이므로 주소값을 변경할 순 없다.
int main(void)
{
int arr[] = {1,2,3,4,5};
int temp = 10;
arr = temp; //오류발생
return 0;
}
'학습 기록 > 데브코스 웹 풀스택 4기' 카테고리의 다른 글
프론트엔드 기초: 타입스크립트 입문하기 (0) | 2024.10.28 |
---|---|
프론트엔드: 객체 지향 프로그래밍 (1) | 2024.10.26 |
프론트엔드 기초: 프로그래밍의 개념, 변수와 상수 (2) | 2024.10.23 |
프론트엔드 기초: JavaScript (1) (0) | 2024.10.21 |
백엔드 프로젝트: API 설계해보기 (0) | 2024.09.30 |