😎
Onemorebottlee's TIL
  • 🤓Introduce
  • 📖DevLog
    • 💣Error
      • npm ERR! Cannot read properties of null (reading 'edgesOut')
      • git
        • src refspec main does not match any
      • NextJS
        • No img element
        • ReferenceError : document is not defined
        • `next/image` Un-configured Host
  • 📺Lecture
    • Nomad Coders
      • 초보자를 위한 리덕스 101
        • #0 Introduction
        • #1 PURE REDUX: COUNTER
        • #2 PURE REDUX: TO DO LIST
        • #3 REACT REDUX
        • #4 Redux Toolkit
      • 바닐라 JS로 그림 앱 만들기
      • React JS 마스터 클래스
        • #2 Styled Componnents
        • #3 TypeScript
        • #4 Crypto Tracker
        • #5 State Management
        • #6 Trello
        • #7 ANIMATIONS
      • Next.js 시작하기
        • #0 INTRODUCTION
        • #1 FRAMEWORK OVERVIEW
        • #2 PRACTICE PROJECT
      • Typescript로 블록체인 만들기
        • #1 Introduction
        • #2 Overview of TypeScript
        • #3 Functions
        • #4 Classes and Interfaces
        • #5 TypeScript Blockchain
      • SQL Master Class
        • #1 Introduction
        • #2 SQLite
        • #3 Data Definition Language
        • #4 Data Manipulation Language
        • #5 Subqueries and CTEs
        • #6 Indexes
        • #7 MySQL
        • #8 Foreign Keys
        • #9 JOINS
        • #10 Nomalization
        • #11 Events & Triggers
        • #12 Full-Text Indexes
        • #13 PostgreSQL
        • #14 Functions And Procedures
        • #15 Transactions
        • #16 Data Control Language
        • #17 PostgreSQL JSON Columns
        • #18 PostgreSQL Extensions
        • #19 MongoDB
        • #20 REDIS
        • #21 Javascript and Python Drivers
    • Udemy
      • TypeScript 마스터 with Webpack & React
        • [S1] 소개
        • [S2] 설치 및 설정
        • [S3] 타입 애너테이션 기초
        • [S4] 함수
        • [S5] 객체 타입
        • [S6] 배열 타입
        • [S7] 유니온타입
        • [S8] Tuple & Enum
        • [S9] 인터페이스
        • [S10] TypeScript 컴파일러
        • [S11] 미니 프로젝트 DOM, 타입 단언, 그리고 더 많은 내용
        • [S12] Class
        • [S13] TS Class
        • [S14] Generics ⭐⭐⭐⭐⭐
        • [S15] Narrowing
        • [S16] Type Declarations
        • [S17] Module
        • [S18] Webpack 과 TypeScript
        • [S19] React
    • 모두를 위한 컴퓨터 과학 CS50
      • 1. 컴퓨팅 사고
      • 2. C언어
      • 3. 배열
      • 4. 알고리즘
      • 5. 메모리
      • 6. 자료구조
    • 생활코딩
      • DATABASE
        • DATABASE1
  • 📚Book
    • 모던 자바스크립트 Deep Dive
      • 1장 프로그래밍
      • 2장 자바스크립트란?
      • 3장 자바스크립트 개발 환경과 실행 방법
      • 4장 변수
      • 5장 표현식과 문
      • 6장 데이터 타입
      • 7장 연산자
      • 8장 제어문
      • 9장 타입 변환과 단축 평가 ⭐⭐⭐
      • 10장 객체 리터럴
      • 11장 원시 값과 객체의 비교
      • 12장 함수 ⭐⭐⭐⭐
      • 13장 스코프
      • 14장 전역 변수의 문제점
      • 15장 let, const 키워드와 블록 레벨 스코프 ⭐⭐⭐
      • 16장 프로퍼티 어트리뷰트
      • 17장 생성자 함수에 의한 객체 생성
      • 18장 함수와 일급 객체 ⭐⭐
      • 19장 프로토타입 ⭐⭐⭐⭐⭐
      • 20장 strict mode
      • 21장 빌트인 객체 ⭐
      • 22장 this ⭐⭐⭐
      • 23장 실행 컨텍스트 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 24장 클로저 ⭐⭐⭐⭐⭐⭐⭐
      • 25장 클래스
      • 26장 ES6 함수의 추가 기능
      • 27장 배열 ⭐⭐⭐
      • 28장 Number
      • 29장 Math
      • 30장 Date
      • 31장 RegExp
      • 32장 String
      • 33장 7번째 데이터 타입 Symbol
      • 34장 이터러블
      • 35장 스프레드 문법
      • 36장 디스트럭처링 할당
      • 37장 Set과 Map
      • 38장 브라우저의 렌더링 과정⭐⭐⭐⭐⭐⭐⭐⭐
      • 39장 DOM ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 40장 이벤트⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 41장 타이머
      • 42장 비동기 프로그래밍 ⭐⭐⭐⭐⭐⭐⭐⭐
      • 43장 Ajax
      • 44장 REST API
      • 45장 프로미스
      • 46장 제너레이터와 async/await
      • 47장 에러 처리
      • 48장 모듈
      • 49장 Babel과 Webpack을 이용한 ES6+/ES.NEXT 개발 환경 구축
    • 러닝 타입스크립트
      • Ch.1 자바스크립트에서 타입스크립트로
      • Ch.2 타입 시스템
      • Ch.3 유니언과 리터럴
      • Ch.4 객체
      • Ch.5 함수
      • Ch.6 배열
      • Ch.7 인터페이스
      • Ch.8 클래스
      • Ch.9 타입 제한자
      • Ch.10 제네릭
      • Ch.11 선언 파일
      • Ch.12 IDE 기능 사용
      • Ch.13 구성 옵션
      • Ch.14 구문 확장
      • Ch.15 타입 운영
      • 용어 사전
    • 자바스크립트 완벽 가이드
    • SQL in 10 Minutes
      • 1장 SQL 이해하기
      • 2장 데이터 가져오기
      • 3장 가져온 데이터 정렬하기
      • 4장 데이터 필터링
      • 5장 고급 데이터 필터링
      • 6장 와일드카드 문자를 이용한 필터링
      • 7장 계산 필드 생성하기
      • 8장 데이터 조작 함수 사용하기
      • 9장 데이터 요약
      • 10장 데이터 그룹핑
      • 11장 서브쿼리 사용하기
      • 12장 테이블 조인
      • 13장 고급 테이블 조인 생성하기
      • 14장 쿼리 결합하기
      • 15장 데이터 삽입하기
      • 16장 데이터 업데이트와 삭제
      • 17장 테이블 생성과 조작
      • 18장 뷰 사용하기
      • 19장 저장 프로시저 사용하기
      • 20장 트랜잭션 처리 관리하기
      • 21장 커서 사용하기
      • 22장 고급 데이터 조작 옵션
    • 면접을 위한 CS 전공지식 노트
      • 4 데이터베이스
        • 4.1 데이터베이스의 기본
    • 2023 이기적 SQL 개발자 이론서 + 기출문제
      • 데이터 모델링 이해
        • S1. 데이터 모델링
  • 💻Study
    • CS 지식 발표
      • 1회차
      • 2회차
      • 3회차
      • 4회차
      • 5회차
      • 6회차
      • 7회차
      • 8회차
      • 9회차
    • TypeScript Exercises
      • Ex 1
      • Ex 2
      • Ex 3
      • Ex 4
      • Ex 5
      • Ex 6
      • Ex 7
      • Ex 8
      • Ex 9
      • Ex 10
  • 🔄ETC
    • Article
      • Atomic Design Pattern
      • 프론트엔드 개발자
    • DATABASE
      • Oracle
        • CEIL() & FLOOR() - 소수점 올림 & 내림
        • DUAL 테이블 - 임시 테이블로 결과 확인하기
    • Ubuntu
      • 어플리케이션 업데이트
Powered by GitBook
On this page
  • 1) 컴파일링
  • 2) 디버깅
  • 3) 코드의 디자인
  • 4) 배열(1)
  • 5) 배열(2)
  • 6) 문자열과 배열
  • 7) 문자열의 활용
  • 8) 명령행 인자

Was this helpful?

  1. Lecture
  2. 모두를 위한 컴퓨터 과학 CS50

3. 배열

1) 컴파일링

make 나 clang을 사용해 프로그램을 실행할 때 네 개의 단계를 거친다.

  • 전처리

  • 컴파일링

  • 어셈블링

  • 링킹

각 단계가 무엇인지, 단계별로 어떤 작업을 수행하는지 알아보자.

전처리(Precompile)

전처리기에 의해 수행되며, # 으로 시작하는 C 소스 코드는 실질적인 컴파일이 이루어지기 전 무언가를 실행하라고 알려준다.

컴파일(Compile)

전처리기가 전처리한 소스 코드를 생성하고 나면 그 다음 단계는 컴파일이다. 컴파일러라는 프로그램은 C 코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일한다. 컴퓨터가 이해할 수 있는 언어와 최대한 가깝게 프로그램을 변경하는 것이다.

*컴파일이라는 용어는 소스 코드 > 오브젝트 코드로 변환하는 전 과정을 통틀어 일컫기도 하지만, 구체적으로 전처리한 소스 코드를 어셈블리 코드로 변환하는 단계를 말하기도 한다.

어셈블(Assemble)

소스 코드가 어셈블리 코드로 변환되면, 어셈블리 코드를 오브젝트 코드로 변환하는 과정을 거친다. 컴퓨터의 중앙처리장치(CPU)가 이해할 수 있는 0과 1의 형태로 변경하는 과정이다. 이 작업은 어셈블러라는 프로그램이 수행하며, 컴파일할 파일이 하나라면 여기서 작업이 끝나지만 그렇지 않다면 링크라 불리는 단계가 추가된다.

링크(Link)

프로그램이 여러 파일로 이루어져 하나의 오브젝트 파일로 합쳐야 할 때 진행하는 단계이다. 링커는 여러 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐준다.

이 네 단계를 거치면 실행 가능한 파일이 완성된다.

2) 디버깅

버그 = 코드에 들어있는 오류

디버깅 = 코드에 있는 버그를 식별하고 고치는 과정

디버깅의 기본은 실행되는 코드의 특정 행에서 멈춰서 확인하는 것으로 디버거를 사용해 프로그래머는 멈춰진 지점에서 무슨 일이 일어나는지 볼 수 있다. 프로그램이 멈추는 지점을 중지점이라하고, 프로그래머는 프로그램이 내리는 모든 결정을 단계별로 따라갈 수 있게 한다.

printf 를 사용해 확인하는 방법도 있고, IDE에서 브레이크포인트를 설정해 확인하는 방법도 있다.

3) 코드의 디자인

다른 사람들과 프로젝트를 진행하면 코드는 나 혼자의 것이 아니다. 내 코드가 프로그램에 문제 없도록 만들어야 하고, 프로젝트에 참여하는 모든 사람들이 이해하고, 사용할 수 있도록 주의를 기울여야 한다.

내 코드를 다른 사람에게 설명할 수 있어야 한다. 부담스럽다면 작은 인형을 앉혀놓고 설명해보자

4) 배열(1)

메모리

C에는 여러 자료형이 있고 각 자료형은 서로 다른 크기의 메모리를 차지한다.

  • bool 불리언 1바이트

  • char 문자 1바이트

  • int 정수 4바이트

  • float 실수 4바이트

  • long 정수 8바이트

  • double 실수 8바이트

  • string 문자열 ?바이트

RAM이 메모리 역할을 한다. 여러 개의 노란 사각형이 메모리를 의미하고, 각 사각형이 1바이트를 의미한다고 생각하기

배열 Array

배열은 같은 자료형의 데이터를 메모리상에 연이어 저장하고 이를 하나의 변수로 관리하기 위해 사용된다. 이때, 배열에 포함된 데이터는 순서를 가진다.

5) 배열(2)

전역변수

코드 전반에 거쳐 바뀌지 않는 값, 관례적으로 대문자로 표기한다.

배열의 동적 선언 및 저장

#include <cs50.h>
#include <stdio.h>

float average(int length, int array[]);

int main(void)
{
    // 사용자로부터 점수의 갯수 입력
    int n = get_int("Scores:  ");

    // 점수 배열 선언 및 사용자로부터 값 입력
    int scores[n];
    for (int i = 0; i < n; i++)
    {
        scores[i] = get_int("Score %i: ", i + 1);
    }

    // 평균 출력
    printf("Average: %.1f\\n", average(n, scores));
}

//평균을 계산하는 함수
float average(int length, int array[])
{
    int sum = 0;
    for (int i = 0; i < length; i++)
    {
        sum += array[i];
    }
    return (float) sum / (float) length;
}

배열의 크기와 각 인덱스 값을 유저가 입력하면서 다양한 상황에서 사용할 수 있게 된다.

6) 문자열과 배열

문자열(string) 자료형 데이터는 문자(char) 자료형 데이터의 배열이다.

string s = “HI!” 에서 s 는 문자의 배열이기에 메모리상에 다음과 같이 저장되고, 인덱스로 접근할 수 있다.

여러 문자열이 동시에 선언된 경우, 다음과 같이 저장된다.

그래서 name[i][j] 와 같은 표현을 사용할 수 있다.

7) 문자열의 활용

이러한 특징을 가진 문자열은 각 요소와 길이를 이용해 다양한 방법에 사용할 수 있다.

반복문을 활용해 한 글자씩 출력하거나 특정 문자와 비교하거나 대문자, 소문자 변환을 하거나 등등

이러한 방법들은 직접 구현할 수도 있지만, 라이브러리의 다양한 함수를 통해서도 적용할 수 있다.

8) 명령행 인자

main 함수에 void 가 아닌 argc, argv를 입력한다면

#include <cs50.h>
#include <stdio.h>

int main(int argc, string argv[])
{
    if (argc == 2)
    {
        printf("hello, %s\\n", argv[1]);
    }
    else
    {
        printf("hello, world\\n");
    }
}

첫번째 변수 argc는 main 함수가 받을 입력의 개수이다. argv[]는 입력이 포함된 배열이다.

프로그램을 실행할 때 명령행에서 입력 받은 값은 문자열이다. 따라서 argv[]는 string 배열이 된다.

argv[0]는 프로그램의 이름으로 저장되고, 하나의 입력이 더해질 때마다 argv[i]에 저장된다.

Previous2. C언어Next4. 알고리즘

Last updated 1 year ago

Was this helpful?

📺
인류 최초의 버그
RAM(Random Access Memory) 자유롭게 내용을 읽고 쓰고 지울 수 있는 기억장치