Udemy
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Development
Web Development Data Science Mobile Development Programming Languages Game Development Database Design & Development Software Testing Software Engineering Development Tools No-Code Development
Business
Entrepreneurship Communications Management Sales Business Strategy Operations Project Management Business Law Business Analytics & Intelligence Human Resources Industry E-Commerce Media Real Estate Other Business
Finance & Accounting
Accounting & Bookkeeping Compliance Cryptocurrency & Blockchain Economics Finance Finance Cert & Exam Prep Financial Modeling & Analysis Investing & Trading Money Management Tools Taxes Other Finance & Accounting
IT & Software
IT Certification Network & Security Hardware Operating Systems Other IT & Software
Office Productivity
Microsoft Apple Google SAP Oracle Other Office Productivity
Personal Development
Personal Transformation Personal Productivity Leadership Career Development Parenting & Relationships Happiness Esoteric Practices Religion & Spirituality Personal Brand Building Creativity Influence Self Esteem & Confidence Stress Management Memory & Study Skills Motivation Other Personal Development
Design
Web Design Graphic Design & Illustration Design Tools User Experience Design Game Design Design Thinking 3D & Animation Fashion Design Architectural Design Interior Design Other Design
Marketing
Digital Marketing Search Engine Optimization Social Media Marketing Branding Marketing Fundamentals Marketing Analytics & Automation Public Relations Advertising Video & Mobile Marketing Content Marketing Growth Hacking Affiliate Marketing Product Marketing Other Marketing
Lifestyle
Arts & Crafts Beauty & Makeup Esoteric Practices Food & Beverage Gaming Home Improvement Pet Care & Training Travel Other Lifestyle
Photography & Video
Digital Photography Photography Portrait Photography Photography Tools Commercial Photography Video Design Other Photography & Video
Health & Fitness
Fitness General Health Sports Nutrition Yoga Mental Health Dieting Self Defense Safety & First Aid Dance Meditation Other Health & Fitness
Music
Instruments Music Production Music Fundamentals Vocal Music Techniques Music Software Other Music
Teaching & Academics
Engineering Humanities Math Science Online Education Social Science Language Teacher Training Test Prep Other Teaching & Academics
AWS Certification Microsoft Certification AWS Certified Solutions Architect - Associate AWS Certified Cloud Practitioner CompTIA A+ Cisco CCNA Amazon AWS CompTIA Security+ AWS Certified Developer - Associate
Graphic Design Photoshop Adobe Illustrator Drawing Digital Painting InDesign Character Design Canva Figure Drawing
Life Coach Training Neuro-Linguistic Programming Personal Development Mindfulness Personal Transformation Meditation Life Purpose Coaching Neuroscience
Web Development JavaScript React CSS Angular PHP WordPress Node.Js Python
Google Flutter Android Development iOS Development Swift React Native Dart Programming Language Mobile Development Kotlin SwiftUI
Digital Marketing Google Ads (Adwords) Social Media Marketing Google Ads (AdWords) Certification Marketing Strategy Internet Marketing YouTube Marketing Email Marketing Retargeting
SQL Microsoft Power BI Tableau Business Analysis Business Intelligence MySQL Data Analysis Data Modeling Data Science
Business Fundamentals Entrepreneurship Fundamentals Business Strategy Online Business Business Plan Startup Freelancing Blogging Home Business
Unity Game Development Fundamentals Unreal Engine C# 3D Game Development C++ 2D Game Development Unreal Engine Blueprints Blender
30-Day Money-Back Guarantee

This course includes:

  • 38 hours on-demand video
  • Full lifetime access
  • Access on mobile and TV
Development Programming Languages C

C 언매니지드 프로그래밍

이 강좌는 선수 과목인 '실무 프로그래밍 입문'에서 배운 절차적 프로그래밍 지식을 기반으로 C언어가 언매니지드 언어로서 가지는 기능들에 대해서 알아봅니다
Rating: 4.5 out of 54.5 (132 ratings)
287 students
Created by Pope Kim
Last updated 12/2020
Korean
30-Day Money-Back Guarantee

What you'll learn

  • C 언어 사용법
  • 하드웨어 동작 원리
  • C 언어가 언매니지드 언어로서 가지는 기능들

Course content

15 sections • 342 lectures • 37h 51m total length

  • Preview03:31
  • Preview02:04
  • Preview04:07
  • Preview08:39
  • Preview01:36
  • Preview03:03
  • Preview03:12
  • Preview01:26
  • Preview10:47
  • Preview11:41
  • Preview06:18

  • C89 표준
    04:36
  • Hello World
    01:22
  • #include, stdio.h
    09:21
  • Preview15:43
  • printf() 함수
    06:41
  • 주석(comment)
    01:41
  • 복습 퀴즈
    3 questions
  • C언어의 기본 문법
    09:44
  • 자료형, unsigned와 signed
    04:36
  • char 형
    12:25
  • 복습 퀴즈
    4 questions
  • short 형
    02:15
  • 영상 퀴즈
    1 question
  • int 형, long 형
    10:52
  • 복습 퀴즈
    1 question
  • float 형, double 형, long double 형
    08:19
  • 복습 퀴즈
    1 question
  • 코드보기: 기본 자료형
    02:47
  • C언어의 bool 형
    10:38
  • 열거형(enum)
    05:13
  • 코드보기: 열거형
    03:24
  • 변수 선언
    02:18
  • 복습 퀴즈
    2 questions
  • 연산자
    06:59
  • sizeof 연산자
    03:05
  • size_t
    13:22
  • 역 참조 연산자
    02:55
  • 구조체/공용체 멤버 접근자
    02:39
  • 비교 연산자, 논리 연산자, 조건 연산자
    01:00
  • 복습 퀴즈
    1 question
  • 조건문과 반복문, if 문, switch/case 문
    09:00
  • 코드보기: switch/case
    01:59
  • for 문, while 문, do while 문
    05:47
  • 코드보기: 조건문/반복문
    01:56
  • 복습 퀴즈
    1 question

  • 함수
    07:37
  • 함수 정의의 문제
    01:24
  • 함수 선언
    09:08
  • 복습 퀴즈
    2 questions
  • 함수 매개변수 평가 순서, 피연산자 평가 순서
    20:10
  • 연산자 우선순위와 평가 순서 1
    01:02
  • 연산자 우선순위와 평가 순서 2
    03:18
  • 영상 퀴즈
    1 question
  • 평가 순서를 강제하는 연산자
    09:03
  • 복습 퀴즈
    1 question
  • 범위(scope)
    11:20
  • 코드보기: 전역 변수
    03:40
  • 복습 퀴즈
    3 questions
  • const 키워드
    11:48
  • 복습 퀴즈
    1 question
  • goto 문
    09:00
  • goto 문은 정말로 악마인가요?
    19:38
  • 코드보기: goto 문
    05:30
  • 복습 퀴즈
    1 question
  • 배열
    02:28
  • 코드보기: 배열
    02:04
  • Preview15:05
  • 스택 메모리에 대해서 간단히 알아보자!
    23:58
  • 스택 메모리 안의 배열, 스택 오버플로
    10:11
  • 배열의 요소 개수 구하는 방법
    08:37
  • 길이가 명시된 매개변수 배열
    06:04
  • 매개변수 배열의 길이, 배열 요소의 초기값
    08:54
  • 다차원 배열
    05:50
  • 코드보기: 다차원 배열
    01:20
  • 정리
    02:07
  • 소스코드에서 실행파일까지, C 프로그램의 빌드 과정
    10:59
  • .h와 .c 파일
    05:48
  • Preview05:48
  • #include <>와 #include ""
    02:32
  • 빌드 과정: 전처리 단계
    05:40
  • 트랜슬레이션 유닛 보는 방법
    02:51
  • 빌드 과정: 컴파일 단계
    05:03
  • 어셈블리어 코드 보는 방법
    05:18
  • 빌드 과정: 어셈블 단계
    02:37
  • 오브젝트 코드 보는 방법
    03:12
  • 빌드 과정: 링크 단계
    04:39
  • 링크 단계가 분리되어 있는 이유
    05:32
  • 라이브러리(library), 정적/동적 라이브러리와 링크
    07:41
  • 분할 컴파일과 전역 변수
    02:58
  • 다른 파일에 있는 전역 변수 사용 시 문제점
    04:38
  • extern 키워드
    07:25
  • 코드보기: extern 키워드
    04:57
  • 전역 변수의 문제, static 키워드
    09:04
  • 코드보기: static 키워드
    06:15
  • .c와 .h 파일 정리, 순환 헤더 인클루드와 해결법
    06:17
  • 인클루드 가드 작동법
    02:05
  • 인클루드 가드 예제
    05:00
  • C 컴파일러의 종류와 특징
    05:12
  • 정리
    04:08

  • 포인터 (pointer)
    06:27
  • 주소 연산자 &
    06:12
  • 복습 퀴즈
    1 question
  • 메모리 주소 저장하기
    04:53
  • 포인터의 의미
    01:14
  • 메모리 주소에 저장된 자료형
    03:13
  • 포인터 변수를 선언하는 방법
    01:59
  • 포인터 변수를 부르는 방법
    06:15
  • Preview03:17
  • 포인터의 비유: 현실 세계 예
    03:20
  • 다른 포인터의 예
    04:49
  • 포인터에 저장된 주소도 바꿀 수 있나요?
    01:23
  • 복습 퀴즈
    2 questions
  • 역 참조 연산자 *
    04:06
  • 참조와 역 참조
    03:42
  • 역 참조를 이용한 값 변경 예
    03:57
  • 복습 퀴즈
    1 question
  • 포인터로 두 변수의 값 바꾸기
    04:50
  • 값에 의한 전달 vs 참조에 의한 전달
    03:58
  • 코드보기: Min, Max 한 번에 구하기
    05:02
  • 포인터와 함수 반환 값
    03:10
  • 댕글링 포인터(dangling pointer)
    04:03
  • 널(NULL) 포인터
    04:53
  • NULL이 가지는 문제들
    04:34
  • 널 포인터는 언제 사용하나요?
    07:52
  • 복습 퀴즈
    1 question
  • 포인터의 비교
    02:44
  • 포인터의 크기
    05:30
  • 포인터와 배열의 비교
    00:48
  • 배열 포인터에 대입하기
    04:01
  • 배열 속 각 요소의 위치, 각 요소의 위치 계산하기
    05:57
  • 복습 퀴즈
    3 questions
  • 배열 요소에 포인터로 접근하기
    03:31
  • 포인터 중간 정리, 포인터의 캐스팅
    03:31
  • 영상 퀴즈
    1 question
  • 딱 '한' 바이트만 옮기기
    02:52
  • 코드보기: int 메모리 뷰어
    02:29
  • 코드보기: 두 배열이 겹치는가?
    06:22
  • 두 주소 간의 사칙연산
    02:47
  • 자바와 C#에서는 모든 것이 포인터다
    02:04
  • 포인터를 사용한 안전하지 않은 코드
    03:14
  • Preview08:06
  • 복습 퀴즈
    2 questions
  • 다시 만나는 연산자 결합 법칙
    02:41
  • 영상 퀴즈
    4 questions
  • 포인터와 연산자 우선순위 및 결합 법칙
    04:57
  • 동일한 우선순위를 갖는 연산자들
    01:27
  • 조금 더 빠른 배열의 요소 더하기 함수
    03:28
  • 왜 *p++이 더 빠르죠?
    01:57
  • 복습 퀴즈
    2 questions
  • 포인터와 const
    01:49
  • 주소를 보호하는 const 포인터
    03:44
  • 값을 보호하는 const를 가리키는 포인터
    04:23
  • 두 const의 정리와 예
    01:01
  • 주소와 값 모두 지키는 const
    01:07
  • const 포인터 읽는 방법 정리
    01:42
  • 복습 퀴즈
    3 questions
  • const는 절대 제거하지 말자
    03:03
  • 코드보기: 벡터 덧셈
    03:09
  • 포인터의 용도
    04:02
  • 포인터 배열
    04:45
  • 2차원 포인터 배열
    06:47
  • 코드보기: 2D 배열을 배열의 배열로 바꾸기
    06:50
  • 정리
    05:42

  • 문자열의 표현과 길이
    05:15
  • 문자열 관리 시 길이의 문제
    02:45
  • 문자열 길이 문제 해결방법 1
    05:09
  • Preview09:02
  • 영상 퀴즈
    1 question
  • C 스타일 문자열의 장단점, 문자열 길이 구하기
    19:44
  • 문자열 조작, 두 문자열의 비교
    06:53
  • 문자열 비교 알고리듬
    01:24
  • 더 효율적인 문자열 비교 함수 작성하기 1
    07:11
  • 더 효율적인 문자열 비교 함수 작성하기 2, strcmp()와 strncmp()
    03:52
  • 복습 퀴즈
    1 question
  • 코드보기: 대소문자 구분없는 문자열 비교
    05:22
  • 문자열 복사, strcpy(), strncpy()
    12:07
  • 문자열 합치기, strcat(), strncat()
    06:08
  • 코드보기: 문자열 버퍼를 이용한 출력
    08:31
  • 복습 퀴즈
    2 questions
  • 문자열 찾기
    07:01
  • 문자열 찾기 함수가 메모리 주소를 반환하는 이유
    04:38
  • 문자열 토큰화
    11:10
  • 복습 퀴즈
    1 question
  • 코드보기: 문자열을 대문자 또는 소문자로 바꾸기
    12:14
  • 출력, 서식 지정(formatted) 출력, 서식 문자열(format string)
    08:01
  • 일반적인 서식 문자열 형식, 서식 지정자(format specifier)
    17:55
  • 복습 퀴즈
    1 question
  • 코드보기: ASCII 표 그리기
    08:05
  • 코드보기: 바이트 단위 변환 표
    04:56
  • 서식 문자열이 필요한 이유, fprintf(), stdout, 버퍼링, sprintf()
    10:08
  • 출력 함수의 안정성, 기타 출력 함수
    04:07
  • 정리
    04:14

  • 입력
    06:11
  • 한 글자씩 읽기, 한 글자씩 읽는 알고리듬 1
    05:55
  • getchar()와 EOF 키
    05:23
  • 한 글자씩 읽기 알고리듬 2, EOF 키는 어디 있나요?
    07:35
  • 복습 퀴즈
    2 questions
  • 코드보기: 공백(whitespace)과 줄 수 세기
    03:52
  • Preview13:45
  • fgets()로 안전하게 한 줄 읽기
    09:36
  • 한 줄씩 읽는 방법이 유용한 경우
    01:44
  • 복습 퀴즈
    1 question
  • 한 데이터씩 읽기, scanf()
    07:48
  • scanf()의 일반적인 서식 문자열 형식
    06:46
  • scanf() 사용 예
    05:25
  • 문자를 읽을 때 scanf()의 문제점과 해결책, clearerr()
    09:49
  • 코드보기: 게임 전적 쓰고 읽기
    15:42
  • 복습 퀴즈
    1 question
  • 한 블록씩 읽기
    05:52
  • 파일 입출력
    01:33
  • 파일 열기
    07:49
  • 파일에 쓰기/읽기 예, fflush(), 파일에 이어 쓰기 예
    08:25
  • 파일 닫기, 파일 오류처리, stderr, strerror(), perror()
    14:45
  • 복습 퀴즈
    1 question
  • 코드보기: 파일 복사하기
    04:46
  • 파일 탐색
    14:26
  • 코드보기: 도돌이표
    08:17
  • 입출력 리디렉션
    09:22
  • 커맨드 라인 인자
    05:23
  • 복습 퀴즈
    1 question
  • 커맨드 라인 인자 메모리 뷰
    03:53
  • 코드보기: 제대로 된 파일복사
    03:39
  • 정리
    03:53

  • Preview13:50
  • 구조체의 선언 및 사용
    06:30
  • typedef 이란?, typedef 사용법
    08:00
  • 구조체 변수 초기화 하기
    10:04
  • 구조체 매개변수
    12:12
  • 복습 퀴즈
    2 questions
  • 함수 반환값으로서의 구조체, 구조체 배열
    08:51
  • 영상 퀴즈
    1 question
  • 얕은 복사, 깊은 복사
    09:49
  • 구조체 사용 시 포인터 저장의 문제
    07:01
  • 구조체를 다른 구조체의 멤버로 사용하기, 바이트 정렬
    14:36
  • 복습 퀴즈
    1 question
  • 코드보기: 점, 선, 사각형
    14:16
  • 비트 필드
    08:39
  • 공용체
    05:41
  • 코드보기: 색상 표현하기
    06:52
  • 메모리 공유만을 위한 공용체의 예
    05:38
  • 복습 퀴즈
    1 question
  • 함수 포인터, 함수를 변수에 저장할 수 있을까?
    10:45
  • Preview10:40
  • 함수 포인터 읽는 방법, 오른쪽-왼쪽 규칙(Right-Left Rule)
    07:12
  • 함수 포인터 쉽게 읽기
    04:58
  • 복습 퀴즈
    3 questions
  • 코드보기: 콜백 함수
    14:31
  • 배열의 포인터, 퀵 정렬, void 포인터
    15:55
  • 코드보기: 구조체를 사용한 퀵 정렬
    10:08
  • 코드보기: 기수(radix) 정렬
    11:35
  • 정리
    08:10

  • 가변 인자 함수
    09:15
  • va_로 시작하는 매크로 함수들
    12:30
  • 가변 인자 함수가 인자를 읽어오는 방법
    08:52
  • 함수에서 매개변수로 가변 인자만 받을 수 있을까?
    08:25
  • 코드보기: 초간단 서식 지정자
    11:10
  • Preview10:09
  • 안 좋은 오류 처리의 예
    08:53
  • 버그와 오류의 차이, 올바른 오류 처리 전략
    20:43
  • 오류 처리 후에도 발생하는 예외 상황
    03:39
  • 정리
    04:40

  • 메모리의 종류
    09:40
  • 스택 메모리
    01:57
  • 레지스터
    07:39
  • 어셈블리어로 보는 레지스터
    05:55
  • register 키워드
    10:55
  • 힙 메모리
    17:23
  • Preview06:11
  • 메모리 할당 및 해제 함수, malloc()
    03:31
  • free(), malloc() 사용 예
    19:19
  • 동적 메모리 할당 시 문제
    11:10
  • 복습 퀴즈
    1 question
  • free()는 몇 바이트를 해제할지 어떻게 알지?, calloc(), memset(), realloc()
    13:54
  • realloc()의 메모리 누수 문제, memcpy()
    08:30
  • 복습 퀴즈
    1 question
  • memcmp(), 정적 vs 동적 메모리
    16:13
  • Preview12:05
  • 복습 퀴즈
    2 questions
  • 다중 포인터, 이중 포인터
    10:20
  • 영상 퀴즈
    1 question
  • 다중 포인터를 쓰는 이유, 다중 포인터 예
    08:59
  • 코드보기: 단어 정렬
    05:15
  • 복습 퀴즈
    3 questions
  • 정리
    06:19

  • Preview18:55
  • 배열, 배열의 삽입
    08:30
  • 배열의 삭제
    04:26
  • 배열의 검색, 배열의 접근
    03:16
  • 복습 퀴즈
    4 questions
  • 코드보기: 빠른 배열
    06:46
  • 스택(stack)
    06:53
  • 스택의 삽입
    01:56
  • 스택의 제거
    02:20
  • 스택의 검색
    04:14
  • 스택의 용도
    09:00
  • 복습 퀴즈
    2 questions
  • 큐(queue)
    05:05
  • 큐의 삽입
    03:48
  • 큐의 삭제
    02:18
  • 큐의 검색
    02:39
  • 복습 퀴즈
    3 questions
  • 연결 리스트, 연결 리스트의 삽입/제거/검색
    10:10
  • 연결 리스트: 전체 출력 예 & 노드 메모리 해제 예, 헤드 노드,
    09:40
  • 연결 리스트: 삽입하기 예
    10:19
  • 연결 리스트: 오름차 순으로 삽입하기 예
    08:48
  • 연결 리스트: 노드 삭제
    07:14
  • 연결 리스트의 용도
    07:16
  • 복습 퀴즈
    3 questions
  • 해시 테이블
    06:48
  • 해시 테이블의 크기는 2배 이상인 소수로
    06:09
  • 중복 색인 문제의 해결
    17:34
  • 해시란 무엇인가?
    11:21
  • 해시 테이블에 문자열 저장하기
    09:07
  • 해시 맵
    05:13
  • 해시 충돌과 훌륭한 해시 함수
    05:39
  • 해시 충돌 방지와 성능 향상
    15:27
  • 코드보기: 여러 데이터형과 해시 함수
    06:14
  • 정리
    07:13

Requirements

  • '실무 프로그래밍 입문(C#)' 과목 수료
  • '컴퓨터 공학용 수학' 과목 수료

Description

본 비디오 강좌는 POCU 아카데미에서 진행하는 COMP2200 수업의 동영상 강의입니다.


C는 가장 널리 사용되는 언매니지드 언어들 중 하나이며, 2019년 7월 기준 전 세계에서 2번째로 많이 사용되는 언어입니다. (출처: TIOBE)

현존하는 프로그래밍 언어는 크게 매니지드(Managed) 언어와 언매니지드(Unmanaged) 언어로 나눠지며, 이 둘의 차이는 프로그래머가 컴퓨터 하드웨어를 직접 제어할 수 있는지의 여부입니다. (예: 프로그래머가 직접 메모리를 관리하는가?) 대표적인 언매니지드 언어인 C는 하드웨어와 매우 가깝다는장점으로 40년이 넘는 세월 동안 살아남았을 뿐만 아니라 아직도 컴파일러, 운영체제, 임베디드 시스템 등 저수준의 제어 및 메모리 절약이 요구되는 곳에 왕성하게 사용되고 있습니다. 그리고 이런 트렌드는 한 동안 바뀌지 않을 전망입니다.

프로그래머의 지속적인 성장에 반드시 필요한 지식 중 하나는 컴퓨터 하드웨어에 대한 이해입니다. C는 대부분의 매니지드 언어와 달리 언매니지드 언어 특유의 기능 (예: 메모리 관리) 들을 포함하고 있기 때문에, 하드웨어의 동작 원리를 공부하고 싶은 분 들, 혹은 컴퓨터를 더 잘 이해하고 싶은 분들에게 좋은 입문용 언매니지드 언어라고 할 수 있겠습니다.

이 강좌는 선수 과목인 '프로그래밍 입문'에서 배운 절차적 프로그래밍 지식을 기반으로 C언어가 언매니지드 언어로서 가지는 기능들에 대해서 알 아봅니다. 이 코스를 성공적으로 마무리한 분들은 하드웨어에 대한 더 넓은 시야를 갖출 수 있을 것입니다.

본 강좌는 첫 주에 '프로그래밍 입문'과목에서 배운 기초 프로그래밍 개념들이 C에 어떻게 적용되는지 살펴 본 뒤 다음과 같이 크게 세 부분으로 나뉘며, 강의 진행도 이 순서를 따릅니다.

  1. ANSI C/C89: C의 기본이 되는 내용과 C로 구현하는 자료 구조들. (~11주 차)

  2. C99: C99 표준에서 추가된 기능들 (12주 차 ~ 13주 차)

  3. C++1x: C11/18 표준에서 추가된 최신 기능들 (14주 차~)

위와 같이 강의를 세 부분으로 나눈 이유는 아직도 많은 C 프로젝트들이 89년도의 표준을 사용하기 때문이며, 이런 트렌드는 바뀌지 않을 전망이기 때문입니다. 따라서 모든 프로젝트에서 쓸 수 있는 C의 지식을 중심으로 배우되 가능할 경우 새로 추가된 기능을 사용할 수 있는 실력을 갖추게 하는 것이 강좌의 목표입니다.

Who this course is for:

  • 컴퓨터 공학의 기본기를 배우고 싶은 분들
  • 프로그래머로서 평생 커리어를 꿈꾸는 분들

Instructor

Pope Kim
CTO, Software Architect & Educator
Pope Kim
  • 4.5 Instructor Rating
  • 1,073 Reviews
  • 1,497 Students
  • 5 Courses

Pope Kim is an experienced software engineer, architect, and educator.

After shipping numerous AAA game titles, including FIFA and Halo as a 3D rendering engineer, he moved to the web industry to lead multi-million dollar projects at Staples. Then he accepted a CTO position at a Silicon Valley startup company where he built and managed engineering teams across three different countries. With his strong leadership, the company's valuation had increased over 25,000 times during his stay.

Outside engineering career, he also taught at multiple universities. His most recent position in education was Faculty at BCIT, which he resigned from to make his own computer science education service, https://pocu.academy

  • Udemy for Business
  • Teach on Udemy
  • Get the app
  • About us
  • Contact us
  • Careers
  • Blog
  • Help and Support
  • Affiliate
  • Terms
  • Privacy policy
  • Cookie settings
  • Sitemap
  • Featured courses
Udemy
© 2021 Udemy, Inc.