Sorry, this page is no longer available
We may earn an affiliate commission when you visit our partners.
Course image
Pope Kim

본 비디오 강좌는 포큐아카데미에서 진행하는C++은 C와 더불어 가장 널리 사용되는 언매니지드 언어일 뿐만 아니라 2018년 7월 기준 전세계에서 3번째로 많이 쓰이는 언어입니다. (출처: TIOBE) 그리고 언매니지드 언어라는 특수성 때문에 한동안 사용률이 떨어지지 않을 전망입니다.

현존하는 프로그래밍 언어를 크게 둘로 나누면 매니지드(Managed) 언어와 언매니지드(Unmanaged) 언어가 있습니다. 이 둘의 차이는 프로그래머가 컴퓨터 하드웨어를 직접 제어할 수 있는지 여부입니다. (예: 프로그래머가 직접 메모리를 관리하는가?)

프로그램의 성능보다 제품을 빨리 개발하는 것이 중요한 분야에서는 C#, Java와 같은 매니지드 언어를 널리 사용합니다. 하지만 운영체제, 비디오 게임, 가상현실, 주식거래소, 머신 러닝 코어, 블록체인 등 성능이 더 중요한 분야에서는 여전히 언매니지드 언어를 사용할 수밖에 없습니다. 따라서 본 강좌는 실제 업계에서 쓰이는 C++ 프로그래밍 기법에 중점을 맞춰 진행합니다.

Read more

본 비디오 강좌는 포큐아카데미에서 진행하는C++은 C와 더불어 가장 널리 사용되는 언매니지드 언어일 뿐만 아니라 2018년 7월 기준 전세계에서 3번째로 많이 쓰이는 언어입니다. (출처: TIOBE) 그리고 언매니지드 언어라는 특수성 때문에 한동안 사용률이 떨어지지 않을 전망입니다.

현존하는 프로그래밍 언어를 크게 둘로 나누면 매니지드(Managed) 언어와 언매니지드(Unmanaged) 언어가 있습니다. 이 둘의 차이는 프로그래머가 컴퓨터 하드웨어를 직접 제어할 수 있는지 여부입니다. (예: 프로그래머가 직접 메모리를 관리하는가?)

프로그램의 성능보다 제품을 빨리 개발하는 것이 중요한 분야에서는 C#, Java와 같은 매니지드 언어를 널리 사용합니다. 하지만 운영체제, 비디오 게임, 가상현실, 주식거래소, 머신 러닝 코어, 블록체인 등 성능이 더 중요한 분야에서는 여전히 언매니지드 언어를 사용할 수밖에 없습니다. 따라서 본 강좌는 실제 업계에서 쓰이는 C++ 프로그래밍 기법에 중점을 맞춰 진행합니다.

언매니지드 언어의 장점은 여기서 그치지 않습니다. 프로그래머의 지속적인 성장에 반드시 필요한 지식 중 하나가 컴퓨터 하드웨어에 대한 이해입니다. 탑 레이서라면 자동차의 동작 원리를 잘 알아야 하듯이 탑 프로그래머는 하드웨어의 동작 원리를 잘 이해해야 합니다. 이걸 돕는 언어가 바로 언매니지드 언어입니다.

'COMP2500: Java 개체지향 프로그래밍 및 설계'와 마찬가지로 이 강좌에서도 개체지향 프로그래밍(OOP)에 대해 배웁니다. 하지만 이 코스를 성공적으로 마무리한 분들은 하드웨어 수준에서 개체지향 프로그래밍이 어떻게 작동하는지까지 자세히 이해하실 수 있을 겁니다.

본 강좌는 다음과 같이 크게 세 부분으로 나뉘며, 강의 진행도 이 순서를 따릅니다.

  1. 코어 C++: 참조, 클래스, 상속 등 C++의 기본이 되는 내용. C++98 표준 ( ~ 5주 차)

  2. 모던 C++: STL 등 C++03 표준에서 추가된 기능 중 업계에서 쓰이는 내용들 (6주 차 ~ 9주 차)

  3. C++1x: C++11/14/17 표준에서 추가된 최신 기능 중 업계에서 쓰이는 내용들 (10주 차 ~ )

위와 같이 강의를 세 부분으로 나눈 이유는 회사에 따라 사용하는 C++ 표준이 다르고, 성능 상의 이유로 일부러 과거의 표준을 여전히 사용하는 곳도 많기 때문입니다. 따라서 최신의 C++ 표준만을 사용하는 프로그래머는 업계에서 원하는 프로그래머가 아닌 경우가 많습니다.

Enroll now

What's inside

Syllabus

코스 소개
누가 이 코스를 들을 수 있나요?
POCU 수강생만을 위한 정보
수업 일정
Read more

목차

Hello World 출력하기

  • “Hello World”

  • std::cout, std::endl

네임스페이스(namespace)

  • namespace

  • namespace 예제

  • using 지시문

  • using 예제

목차

<< 연산자(operator)

  • << 연산자

목표

출력형식 지정(Output Formatting)

  • 16진수 출력 - printf()

  • 16진수 출력 – 조정자(Manipulator)

  • 조정자 (1/5)

  • 조정자 (2/5)

  • 조정자 (3/5)

  • 조정자 (4/5)

  • #include <iomanip> 안에 있는 조정자

목표

출력형식 지정(Output Formatting)

  • cout 멤버 메서드 (1/2)

  • cout 멤버 메서드 (2/2)

  • setf(), unsetf()

목차

입력 스트림(Input Stream)

  • 키보드에서 읽기 

  • 정수형 읽기

  • 부동 소수점형 읽기

  • 왜 scanf()는 위험한가?

  • 그렇다면 이제 cin을 살펴보자...

  • C에서는 이렇게 했었죠?

  • C++에서 쓸 수 있는 더 안전한 방법 - setw()

  • 이 변수들에 어떤 값들이 들어 있을까?

  • cin도 마찬가지

목차

스트림 상태(Stream States)

  • 스트림 상태

  • 예제

목차

입력 버리기(Discarding Input)

  • 입력 버리기 (1/2)

  • 입력 버리기 (2/2)

목차

입력 버리기(Discarding Input)

  • get()

  • getline()

목차

  • 초기 C++의 새로운 기능들 

  • C++의 새로운 기능들

Bool 데이터형

  • bool 데이터형

목차

참조(Reference)

  • 참조

  • 값에 의한 호출 (C/Java/C#)

  • 참조에 의한 호출 (C)

  • Java는 어떨까?

  • 값에 의한 호출은 모든 타입에 똑같이 동작 (C/C++)

  • 참조에 의한 호출도 마찬가지

목차

참조(Reference)

  • Java는 어떨까?

  • 왜...

  • 참조

  • 함수 매개변수로서의 참조

목차

참조(Reference)

  • 컴퓨터는 참조가 뭔지 알까?

목차

코딩표준 쪼오금~

  • 코딩표준에 대해 말해 보자

  • 시도 1

  • 시도 2

  • 여전히 완벽하지 않음

  • 시도 3

  • C#은 이걸 더 잘 고쳤음

목차

문자열(string)

  • 지난번에 본 코드...

  • std::string 클래스

  • 대입(Assignment)과 덧붙이기(Appending)

  • 문자열 합치기(Concatenation)

  • 비교(Relational)연산자

  • size(), length(), c_str()

  • string 속의 한 문자에 접근하기

  • 한 줄 읽기

목차

문자열(string)

  • <sstream>

  • C 헤더를 써도 될까요?

  • 그래서 string이 더 낫다는 거죠?

  • 1단계

  • 2단계

  • 3단계

  • 4단계

  • 5단계

  • 6단계

  • 7단계

  • 어우~ 뭐 이리 많아?

  • c_str() 기억나죠?

목차

파일 입출력(I/O)

  • 파일 입출력 <fstream>

  • 파일 열기

  • open()

  • 파일 열기 모드의 예

  • 파일 닫기

  • 스트림 상태 확인하기

  • close(), is_open()

목차

파일 입출력(I/O)

  • 파일에서 문자 하나씩 읽기

  • get(), getline(), >>

  • 파일에서 한 줄씩 읽기

  • 어떤 결과가 나올까?

  • 빈 파일 읽기

  • 파일에서 한 단어씩 읽기

  • 사례 1 – 문자열 하나와 숫자 하나

  • 사례 2 – 숫자들만 있는 경우

목차

파일 입출력(I/O)

  • 사례 3 – 숫자들과 뉴라인(newline)

  • 사례 4 – 잘못된 입력과 숫자들

목차

파일 입출력(I/O)

  • 시도 1 – 제대로 읽은 것만 출력

  • 시도 2 – 다음 구분 문자까지 건너뛰기

  • 시도 2의 문제

  • 시도 3? 어, 이것도 안돼~

  • 숫자만 읽기 (이 코드는 된다!)

목차

파일 입출력(I/O)

  • 문제가 보이나요?

  • clear() 전에 잘못된 입력을 무시하면…

목차

파일 입출력(I/O)

  • EOF 처리는 까다롭다

  • 베스트 프랙티스(Best Practice)

  • 훌륭한 테스트 케이스

목차

파일 입출력(I/O)

  • 파일에 쓰기

  • put(), <<

  • 바이너리 파일 읽기

  • (char*)&record는 어떻게 작동할까?

  • ifstream::read()

  • 바이너리 파일에 쓰기

  • ofstream::write()

  • 파일 안에서의 탐색

  • 탐색(seek) 유형

  • 파일 쓰기 위치 읽기 및 변경

  • 기타 정보

목차

  • OOP: Java vs C++

  • OOP가 뭔지는 다 알고 있죠?

  • OOP가 뭘까?

목차

  • 하지만 누군가 OOP를 복잡하게 만들었다

  • 걔네들 방식

  • 직관적인 OOP로 돌아가서

목차

클래스(Class)

  • Vector 클래스를 만들어 보자

  • 멤버 변수의 접근권한

  • 접근 제어자(Access Modifier)

  • 보통 제어자 별로 C++ 멤버들을 그룹 지음

목차

클래스(Class)

  • 개체 생성

  • Vector a;를 살펴보자

  • Vector* b = new Vector();를 살펴보자

  • 스택

  • 스택을 다시 살펴보자

  • 힙을 다시 살펴보자

목차

클래스(Class)

  • 개체 배열(Array)

  • 개체 배열 – 메모리를 들여다보자

  • 개체 소멸

  • new를 사용한 뒤에는 꼭 delete를!

목차

클래스(Class)

  • X와 Y의 값은?

  • 기본 값

  • Java가 멤버 변수를 0으로 초기화하는 방법?

목차

클래스(Class)

  • 생성자(Constructor)

  • 초기화 리스트(Initializer List)

  • 더 나은 Vector 클래스를 만들어 보자

목차

클래스(Class)

  • 기본 생성자

  • 컴파일러가 하는 일?

  • 둘 중 컴파일 안 되는 코드는?

목차

클래스(Class)

  • 둘 중 컴파일 안 되는 코드는?

  • 생성자 오버로딩(Overloading)

  • 생성자 오버로딩

  • 소멸자(Destructor)

  • 클래스 안에서의 동적 메모리 할당

  • 다시 말하지만 메모리 해제를 꼭 기억하자!

  • 클래스 안에서의 동적 메모리 할당

목차

클래스(Class)

  • Vector 클래스의 멤버 함수

  • const란?

  • Const 멤버 함수

목차

  • 구조체(Struct) vs 클래스(Class)

  • 구조체에 관한 코딩표준

목차

복사(Copy) 생성자

  • 복사 생성자

  • 암시적(implicit) 복사 생성자

  • 예: ClassRecord 클래스

  • 포인터는 얕은 복사

  • 사용자가 만든 복사 생성자

  • 포인터의 깊은 복사

목차

함수 오버로딩(overloading)

  • 메서드 오버로딩

  • 함수 오버로딩

목차

함수 오버로딩(overloading)

  • 함수 오버로딩

  • 함수 오버로딩 매칭하기

목차

함수 오버로딩(overloading)

  • 함수 오버로딩 매칭하기

  • 함수 매칭 순서

  • 더 자세히 알고 싶다면…

목차

연산자(operator) 오버로딩

  • 연산자

  • 연산자의 종류 – 단항(unary) 연산자

  • 연산자의 종류 – 이항(binary) 연산자

  • 연산자의 종류 – 기타

  • 연산자 오버로딩

  • 멤버 함수를 이용한 연산자 오버로딩

  • Vector의 operator+() 연산자를 오버로딩해보자

  • 멤버 연산자를 작성하는 법

  • 멤버 아닌 함수를 이용한 연산자 오버로딩

목차

연산자(operator) 오버로딩

  • Vector의 operator<<() 연산자를 만들어 보자

  • friend 키워드

  • friend 클래스

  • friend 함수

  • 연산자 오버로딩에 필요한 friend 함수

  • 멤버 아닌 연산자 오버로딩을 작성하는 법

  • Vector를 출력하는 << 연산자

  • 잠… 잠깐만요!

  • operator<<() 를 고쳐보자

  • 완전히 수정한 operator<<()

목차

연산자(operator) 오버로딩

  • 연산자 오버로딩과 const

  • 연산자 오버로딩에 const를 사용하지 않는 경우

  • &를 사용하면 무슨 일이 일어나나?

  • 제한사항

목차

연산자(operator) 오버로딩

  • 연산자 오버로딩을 남용하지 말 것

  • 그래서 어쩌라고요?

  • 대입(assignment) 연산자

  • 암시적 operator=

목차

암시적 함수들을 제거하는 법

  • 클래스에 딸려오는 기본 함수들

  • 클래스에 딸려오는 기본 함수들

  • 기본 생성자를 “지우는” 법

  • 기본 생성자를 “지우는” 법

  • 암시적 복사 생성자를 “지우는” 법

  • 암시적 소멸자를 “지우는” 법

  • 암시적 operator=를 “지우는” 법

Traffic lights

Read about what's good
what should give you pause
and possible dealbreakers
많은 industry에서 C++을 사용하여 성능이 중요한 분야에서 운영체제, 비디오 게임, 가상현실, 주식거래소, 머신러닝 코어, 블록체인 등을 개발 중이다
C++을 사용하면 프로그래머에게 필수적인 하드웨어에 대한 이해도를 쌓을 수 있다
C++, Java 등 매니지드 언어를 널리 사용하는 분야에서는 성능보다도 더 빨리 제품을 개발하는 것이 중요하다
C 언어에서의 개체지향 프로그래밍을 확장하여 하드웨어 수준에서 어떻게 작동하는지 자세히 알아볼 수 있다
이 훈련과정에서는 코어 C++, 모던 C++, C++1x로 나뉘어 강의가 진행된다
미래의 프로그래머는 지속적으로 성장하기 위해 컴퓨터 하드웨어에 대해 이해하는 것이 필수적이다

Save this course

Create your own learning path. Save this course to your list so you can find it easily later.
Save

Reviews summary

C++ 실무 역량 강화

수강생들은 실무에서 사용하는 C++의 핵심을 배울 수 있다고 말합니다. 이 강좌는 언매니지드 메모리 관리하드웨어 동작 원리에 대한 깊은 이해를 제공하여, C++의 근본 원리를 파악하는 데 큰 도움이 됩니다. 코어 C++, 모던 C++, C++1x까지 업계에서 사용되는 다양한 표준을 다루는 점도 장점으로 꼽힙니다. 다만 C++ 자체가 학습 곡선이 가파르고, 방대한 내용을 소화하기 위해 추가적인 노력이 필요하다는 의견도 있습니다. 전체적으로 성능 중심 프로그래밍이나 시스템 레벨 개발에 관심 있는 학습자에게 매우 유용하다는 평이 많습니다.
이론 외 별도의 실습이 중요합니다.
"강의 내용만으로는 부족하고 직접 코드를 많이 짜봐야 실력이 늘어요."
"예제 코드는 있지만, 더 큰 프로젝트 단위의 실습이 아쉽습니다."
"배운 내용을 내 것으로 만들려면 개인적인 노력이 필수입니다."
C++의 핵심 문법과 개념을 깊이 다룹니다.
"참조, 클래스, 연산자 오버로딩 등 C++ 문법을 제대로 배웁니다."
"파일 입출력이나 문자열 같은 기본 기능도 상세하게 설명해줘요."
"OOP가 C++에서는 어떻게 구현되는지 명확히 이해했습니다."
업계에서 쓰이는 다양한 C++ 표준을 다룹니다.
"C++98부터 최신 표준까지 실무에 필요한 내용만 골라 알려줍니다."
"회사가 사용하는 C++ 표준에 맞춰 코딩할 수 있게 되었습니다."
"단순히 최신 기능만 배우는 것이 아니라 과거 표준도 왜 중요한지 알았습니다."
하드웨어와 메모리 동작 원리를 깊이 배웁니다.
"C++에서 메모리를 어떻게 다뤄야 하는지 근본부터 알게 되었어요."
"하드웨어가 코드를 어떻게 처리하는지 이해하는 데 정말 큰 도움이 됩니다."
"C++의 언매니지드 특성을 제대로 파고드는 점이 좋았습니다."
C++ 초보자에게는 다소 어려울 수 있습니다.
"내용이 심도 있어서 따라가기 쉽지 않았지만, 그만큼 얻는 것이 많습니다."
"C++이 처음이라면 추가적인 기초 학습이 필요할 것 같아요."
"개념이 복잡해서 복습과 실습을 많이 해야 이해가 됩니다."

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in C++ 언매니지드 프로그래밍 with these activities:
Review the Udemy C++ course
This activity will help you refresh your knowledge of C++ basics and syntax, which will be essential for success in this course.
Browse courses on C++ Syntax
Show steps
  • Watch the introductory videos
  • Complete the practice exercises
  • Ask questions in the discussion forum
Review the basics of OOP concepts
C++ is a very hands-on OOP language that relies on you already having a foundational understanding of the basic concepts.
Browse courses on OOP
Show steps
  • Read through your notes or textbooks reviewing the basics of OOP
  • If anything is unclear, make sure to solidify your understanding by researching and reading further
Follow a tutorial on basic C++ syntax
C++ has a unique syntax compared to other languages and is considered by many experts to be very difficult to master. It is highly recommended to follow a guided tutorial to get started with the basics of the syntax.
Browse courses on C++ Syntax
Show steps
  • Search online for a guided tutorial to get started with C++ syntax
  • Follow the tutorial and try out the examples
One other activity
Expand to see all activities and additional details
Show all four activities
学习 C++ 标准模板库 (STL)
STL 是 C++ 中一个强大的库,它提供了许多有用的数据结构和算法。学习 STL 将有助于你提高代码的效率和可维护性。
Browse courses on STL
Show steps
  • 阅读有关 STL 的文档或教程
  • 完成一些有关 STL 的教程或练习

Career center

Learners who complete C++ 언매니지드 프로그래밍 will develop knowledge and skills that may be useful to these careers:
Software Engineer
Software engineers design, build, and test software applications, including computer games, operating systems, and web browsers. This course provides a strong foundation in the C++ programming language, which is commonly used in software development. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for software engineers.
Computer Programmer
Computer programmers write and maintain the code that makes computers and software applications work. This course provides a strong foundation in the C++ programming language, which is commonly used in software development. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for computer programmers.
Web Developer
Web developers design and create websites. This course provides a strong foundation in the C++ programming language, which is commonly used in web development. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for web developers.
Database Administrator
Database administrators maintain and administer databases, ensuring that data is stored securely and efficiently. This course provides a strong foundation in the C++ programming language, which is commonly used in database management. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for database administrators.
Information Security Analyst
Information security analysts protect computer systems and networks from unauthorized access, use, disclosure, disruption, modification, or destruction. This course provides a strong foundation in the C++ programming language, which is commonly used in information security. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for information security analysts.
IT Project Manager
IT project managers plan, organize, and manage IT projects. This course provides a strong foundation in the C++ programming language, which is commonly used in IT project management. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for IT project managers.
Systems Analyst
Systems analysts design and implement computer systems and applications. This course provides a strong foundation in the C++ programming language, which is commonly used in systems analysis. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for systems analysts.
Computer Scientist
Computer scientists research and develop new computer technologies and applications. This course provides a strong foundation in the C++ programming language, which is commonly used in computer science research. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for computer scientists.
Data Analyst
Data analysts collect, analyze, and interpret data to help businesses make informed decisions. This course provides a strong foundation in the C++ programming language, which is commonly used in data analysis. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for data analysts.
Machine Learning Engineer
Machine learning engineers design and build machine learning models to solve real-world problems. This course provides a strong foundation in the C++ programming language, which is commonly used in machine learning. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for machine learning engineers.
Software Architect
Software architects design and implement the overall structure and architecture of software systems. This course provides a strong foundation in the C++ programming language, which is commonly used in software architecture. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for software architects.
Computer Systems Analyst
Computer systems analysts analyze and evaluate computer systems to identify and solve problems. This course provides a strong foundation in the C++ programming language, which is commonly used in computer systems analysis. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for computer systems analysts.
Network Administrator
Network administrators design, implement, and maintain computer networks. This course provides a strong foundation in the C++ programming language, which is commonly used in network administration. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for network administrators.
Database Developer
Database developers design and implement databases to store and manage data. This course provides a strong foundation in the C++ programming language, which is commonly used in database development. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for database developers.
Information Technology Specialist
Information technology specialists provide technical support and assistance to users of computer systems and networks. This course provides a strong foundation in the C++ programming language, which is commonly used in information technology support. The course covers basic syntax, data structures, algorithms, and object-oriented programming, all of which are essential skills for information technology specialists.

Reading list

We've selected seven books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in C++ 언매니지드 프로그래밍.
"C++ 语言设计与演化" 是一本关于 C++ 语言设计的书。它由 C++ 的创造者 Bjarne Stroustrup 所撰写。本书是任何想要了解 C++ 语言设计的中文读者的必读之作。
"The C++ Programming Language" is the definitive guide to the C++ programming language. It was written by Bjarne Stroustrup, the creator of C++. must-read for anyone who wants to learn C++ or improve their C++ skills.
"C++ Primer 中文版" 是 "C++ Primer" 的中文译本。它涵盖了 C++ 的各个方面,从基础概念到高级技术。本书是任何想要学习 C++ 或提高其 C++ 技能的中文读者的宝贵资源。
"Effective C++" classic book on C++ programming. It covers a wide range of topics, from basic concepts to advanced techniques. great resource for anyone who wants to improve their C++ skills.
"C++ Primer" comprehensive guide to the C++ programming language. It covers all the basics of C++, from the most basic concepts to the most advanced features. great resource for anyone who wants to learn C++ or improve their C++ skills.
"C++ Concurrency in Action" book about concurrency in C++. It covers a wide range of topics, from the basics of concurrency to the most advanced features. great resource for anyone who wants to learn about concurrency in C++.
"C++ Templates: The Complete Guide" book about templates in C++. It covers a wide range of topics, from the basics of templates to the most advanced features. great resource for anyone who wants to learn about templates in C++.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Similar courses are unavailable at this time. Please try again later.
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2025 OpenCourser