🎯 오늘은 Dart 프로그래밍 강의 중 인트로, SDK, 기초 & 심화 문법을 들었다.
문법은 학습을 했기도 했지만, 연산자의 경우 개념을 다시 확인해보는 느낌이었고, 다른 부분도 좀 더 헷갈리지 않게 개념을 잡고 가도록 강의가 진행되어 개념을 확립하기 좋았다.
🔍 값을 변경할 수 있는 변수
int name = "hayancode"; //타입 변수이름 = 값; var today = 250623; // 타입추론 > var 변수이름 = 값;
🔍 값을 변경할 수 없는 변수 - 상수(Constant)
final- final [타입][변수 이름] = [값];
const- const [타입][변수 이름] = [값];
✅ 타입 생략 가능 ⭕
🕐 초기화 시점
✅final- 프로그램 실행(런타임)
✅const- 컴파일 시점
💡 용도
✅final- 프로그램 실행 중 값이 결정되는 경우
✅const- 프로그램 실행 전후 상관없이 항상 값이 고정인 경우
⚡
latelate String name; // 타입 생략 불가❌✅ 선언 후 초기화되는 NonNullable
✅ 변수가 사용되는 시점에 초기화(지연 초기화)되는 변수int getTemperature(int temperature) { return temperature; } // void main() { late int temperature = getTemperature(35); }❌
main()에 있는temperature변수가 사용되지 않았기 때문에,getTemperature(35);는 실행되지 않는다.
⭕ 뒤에print(temperatur);를 작성한다면,temperatrure을 사용하기 때문에 실행된다.
📁 숫자형(Numbers)
✅int- 정수int today = 250623;
✅
double- 소수double z = 1; // double z = 1.0 와 같아요. z += 2.5; print(z); // 3.5
✅
numnum a = 1; a += 2.5; print(a); // 3.5✔
int와double의 상위 클래스
✔object의 하위 클래스
📁 문자형
✅StringString name = 'Bob'; print('Hello, my name is $name.'); // Hello, my name is Bob. print('Hello, my name is ${name.toUpperCase()}.'); // Hello, my name is BOB.String word = 'HELLO'; print('hello' == word.toLowerCase()); // true✔
',"둘 다 가능
✔toUpperCase()는 문자열 모두 대문자로 변환
✔toLowerCase()는 문자열 모두 소문자로 변환
String s1 = ''' 이렇게 하면 여러 줄의 문자열을 만들 수 있다 '''; String s2 = """이것도 여러 줄의 문자열이다 !""";✔
''',"""을 사용하면 여러줄의 문자열을 만들 수 있다.
📁 불리언형
✅bool
✔truefalse만 가능
int? a = null;✔
null을 허용하는 변수에?를 붙여 사용한다.
int? nullableInt; print(nullableInt); // null // nullableInt = 1; print(nullableInt); // 1 // nullableInt = null; print(nullableInt); // null // int nonNullableInt; print(nonNullableInt); // Error✔
null을 허용하는 변수는 초기값이 설정되지 않으면 기본적으로null을 가진다.
💡 ?. 연산자
String? name; print(name?.length); // null // name = 'Bob'; print(name?.length); // 3✔
null을 오류 없이 안전하게 쓰고 싶다면?.를 사용한다.
isOdd 의 경우 홀수냐는 뜻으로, 값 4을 print(num?.isOdd); 하면 false로 값이 나온다.
📁
+int two = 2; int three = 3; print(two + three); // 5
📁
-int two = 2; int three = 3; print(three - two); // 1 print(two - three); // -1
📁
*int two = 2; int three = 3; print(two * three); // 6
📁
/int five = 5; int two = 2; print(five / two); // 2.5
📁
~/int five = 5; int two = 2; print(five ~/ two); // 2✔
/와 동일하게 값을 나누지만, 정수만 반환한다.
📁
%int six = 6; int four = 4; print(six % four); // 2✔ 값을 나누었을 때 나오는 나머지 를 구할 때 사용한다.
📁
==int a = 4; int b = 4; print(a == b); // true // int c = 2; int d = 4; print(c == d); // false // int? e = null; int? f = null; print(e == f); // true // int? g = null; int? h = 2; print(g == h); // false✔ 2개의 값이 같으면
true, 다르면false를 반환한다.
📁
!=int a = 2; int b = 4; print(a != b); // true // int c = 4; int d = 4; print(c != d); // false // int? e = null; int? f = 2; print(e != f); // true // int? g = null; int? h = null; print(g != h); // false✔
==과 반대로 2개의 값이 다르면true, 같으면false를 반환한다.
📁
>int a = 4; int b = 2; print(a > b); // true // int c = 2; int d = 4; print(c > d); // false
📁
<int a = 2; int b = 4; print(a < b); // true // int c = 4; int d = 2; print(c < d); // false
📁
>=int a = 4; int b = 2; print(a >= b); // true // int c = 3; int d = 3; print(c >= d); // true // int e = 2; int f = 4; print(e >= f); // false✔ 왼쪽 값이 오른쪽 값보다 크거나 같으면
true, 작으면false를 반환한다.
📁
<=int a = 2; int b = 4; print(a <= b); // true // int c = 3; int d = 3; print(c <= d); // true // int e = 4; int f = 2; print(e <= f); // false✔ 왼쪽 값이 오른쪽 값보다 작거나 같으면
true, 크면false를 반환한다.
✅ 프로그램 실행 중(런타임)에 타입을 검사할 때 사용한다.
📁
as- 형변환(Type Casting)int a = 2; print(a as double); // 2 // String b = '2'; print(b as double); // TypeError 발생✔ 타입을 변환할 때 사용한다.
✔ 단, 형변환이 가능할 때만 사용해야 하며, 형변환이 불가능한 경우 오류가 발생한다.
📁
isint? a = 2; print(a is int); // true // int? b = null; print(b is int); // false✔ 특정 타입을 가지고 있는지 판별할 때 사용한다.
✔ 해당할 경우true, 아닐 경우false를 반환한다.
📁
is!int? a = null; print(a is! int); // true // int? b = 2; print(b is! int); // false✔
is와 반대로 특정 타입을 가지고 있지 않는지 판별한다.
✔ 해당되지 않을 경우true, 해당될 경우false를 반환한다.
📁
=int a = 2; print(a); // 2
📁
??=int? a = null; a ??= 2; print(a); // 2 // int b = 3; b ??= 2; print(b); // 3✔
??=왼쪽에 있는 것이 null일 때 오른쪽 값을 대입한다.
📁
+=int a = 2; int b = 3; a += b; // a = a + b print(a); // 5✔
+=왼쪽과 오른쪽 값을 더해서 왼쪽에 대입한다.
📁
-=int a = 3; int b = 2; a -= b; // a = a - b print(a); // 1✔
-=왼쪽 값에서 오른쪽 값을 빼서 왼쪽에 대입한다.
📁
*=int a = 2; int b = 3; a *= b; // a = a * b print(a); // 6✔
*=왼쪽 값에서 오른쪽 값을 곱해서 왼쪽에 대입한다.
📁
/=double a = 6; int b = 3; a /= b; // a = a / b print(a); // 2✔
/=왼쪽 값에서 오른쪽 값을 나눠서 왼쪽에 대입한다.
📁
~/=int a = 5; int b = 3; a ~/= b; a = a ~/ b print(a); // 1✔ 위와 동일하게 나누되 정수만 반환한다.
📁
%=int a = 5; int b = 3; a %= b; // a = a % b print(a); // 2
✅ 참 또는 거짓으로 판별할 수 있는 표현식을 반전하거나 결합할 때 사용한다.
📁
!bool a = true; print(!a); // false✔
!오른쪽에 있는 판별식을 반전한다.
📁
||bool a = true; bool b = true; print(a || b); // true // bool c = true; bool d = false; print(c || d); // true // bool e = false; bool f = false; print(e || f); // false✔
||왼쪽 판별식과 오른쪽 판별식 중 하나라도 참이면true, 모두 거짓이면false를 반환한다.
📁
&&bool a = true; bool b = true; print(a && b); // true // bool c = true; bool d = false; print(c && d); // false // bool e = false; bool f = false; print(e && f); // false✔
&&왼쪽과 오른쪽 판별식 둘 다 참이면true, 하나라도 거짓이면false를 반환한다.
📁
ifint a = -1; if (a < 0) { print('a 는 음수입니다.'); // a 는 음수입니다. }
📁
else ifint a = 0; if (a < 0) { print('a 는 음수입니다.'); } else if (a >= 0) { print('a 는 0 이거나 양수입니다.'); // a 는 0 이거나 양수입니다. }
📁
elseint a = 3; if (a < 0) { print('a 는 음수입니다.'); } else if (a == 0) { print('a 는 0 입니다.'); } else { print('a 는 양수입니다.'); // a 는 양수입니다. }
int dayOfWeek = 1; // switch (dayOfWeek) { case 1: print('오늘은 월요일입니다.'); break; case 2: print('오늘은 화요일입니다.'); break; case 3: print('오늘은 수요일입니다.'); break; case 4: print('오늘은 목요일입니다.'); break; case 5: print('오늘은 금요일입니다.'); break; case 6: print('오늘은 토요일입니다.'); break; case 7: print('오늘은 일요일입니다.'); break; default: print('유효하지 않은 숫자입니다.'); }✔ 어떤 특정 값에 대한 경우를 모두 생각해 주어야 할 때 사용한다.
📁
조건문 ? 표현식1 : 표현식2조건식 ? 참일 때 값 : 거짓일 때 값;bool isPublic = true; String visibility1 = isPublic ? 'public' : 'private'; print(visibility1); // public // bool isPrivate = false; String visibility2 = isPrivate ? 'public' : 'private'; print(visibility2); // private✔
조건문이 참이면표현식1을, 조건문이 거짓이면표현식2를 따른다.
✔ ✏️ 삼항 연산자(Ternary Operator) 지난 시간에 학습한 내용이다.
📁
표현식1 ?? 표현식2int? a = null; print(a ?? 2); // 2 // int b = 3; print(b ?? 2); // 3✔
표현식1이 null 값을 갖지 않으면 표현식1 을, 표현식1 이null값을 가지면표현식2를 따른다.
✔??→null이면 기본값 사용
📁
for
👉for (초기화식, 조건식, 증감식) { … }String message = 'Dart 공부'; for (var i = 0; i < 5; i++) { message += '!'; } print(message); // Dart 공부!!!!!✔ 초기화 식에는
final i = 0;처럼 상수로 선언할 수 없다.
📁
while
👉while (조건식) { … }int count = 1; // while (count <= 5) { print('count : $count'); count += 1; } /* count : 1 count : 2 count : 3 count : 4 count : 5 */
📁
do while
👉do { … } while (조건식);int count = 1; // do { print('count : $count'); count += 1; } while (count <= 5); /* count : 1 count : 2 count : 3 count : 4 count : 5 */int count = 6; // do { print('count : $count'); // count : 6 count += 1; } while (count <= 5);✔ 우선
do문의 코드 블록을 실행한다.
✔while문의 조건식이 참이면do문의 코드 블록을 다시 실행하고, 조건식이 거짓이면do문을 빠져나온다.
⚡
for-in
👉for (순회식) { … }List<String> fruits = ['사과', '바나나', '귤']; // for (var fruit in fruits) { print(fruit); } /* 사과 바나나 귤 */✔
for문만 있는 형태의 초기화식에 있는 변수를 사용하지 않으면서 Collection(List,Set,Map)의 요소를 순회할 때 사용한다.
✔in이 포함된for문의 오른쪽 옆에 있는 변수는 for 문의 코드 블록이 1번 실행되는 동안 값이 바뀌지 않기 때문에 for (final fruit in fruits)상수로 선언해도 된다.
⚡
breakint count = 1; // while (count <= 6) { count += 1; if (count == 5) { print('count = $count'); // count = 5 break; } }✔ 반복문 실행 중에 실행을 멈출 때 사용한다.
📁
continuefinal fruits = ['사과', '파인애플', '오렌지', '귤', '복숭아']; for (final fruit in fruits) { if (fruit == '파인애플') { continue; } print('맛있는 $fruit'); } /* 맛있는 사과 맛있는 오렌지 맛있는 귤 맛있는 복숭아 */✔ 반복문 실행 중에 특정 조건인 경우 건너뛰고 싶을 때 사용한다.
📁
//- 한줄 주석
📁/**/- 여러줄 주석
📁///- 문서 주석
✅ 각각의 요소는 모두 같은 타입이어야 한다.
📋
List<[타입]> [변수 이름] = [요소];List<int> numbers = [1, 2, 3, 4, 5];List<int> numbers = [];👉
[변수 이름] = [요소];var numbers = [1, 2, 3, 4, 5];final numbers = [1, 2, 3, 4, 5]; const names = ['Alice', 'Bob', 'Henry'];✔
List요소에 변동이 없는 경우에는final이나const로 선언 가능하다.
✅
IndexList<int> numbers = [1, 2, 3, 4, 5]; print(numbers[0]); // 1var numbers = [1, 2, 3, 4, 5]; print(numbers[3]); // 4 // numbers[3] = 2; print(numbers[3]); // 2✔
Index의 첫번째 요소는 0부터 시작하며, 음수를 넣을 경우 오류가 난다.
✔Index를 통해 요소를 바꿀 수 있다.(당연히 상수 선언을 했을 경우는 불가능)
📁
lengthvar fruits = ['사과', '파인애플', '오렌지']; print(fruits.length); // 3 print(fruits[fruits.length - 1]); // 오렌지✔
length를 통해 요소의 개수를 구할 수 있으며, 배열에서-1을 잊지 않아야 한다.
📁
isEmptyvar numbers = []; print(numbers.isEmpty); // true print(numbers.length); // 0 // var fruits = ['사과', '파인애플', '오렌지']; print(fruits.isEmpty); // false✔
List에 요소가 없어 비어있는지 확인할 수 있다.
⚡
isNotEmptyvar numbers = []; print(numbers.isNotEmpty); // false // var fruits = ['사과', '파인애플', '오렌지']; print(fruits.isNotEmpty); // true✔
List에 요소가 있는지 판별한다.
📁
indexOf()var fruits = ['사과', '파인애플', '오렌지']; print(fruits.indexOf('파인애플')); // 1 print(fruits.indexOf('포도')); // -1✔ 특정 요소의
Index를 알 수 있으며, 없는 요소는-1을 반환한다.
📁
add(), addAll()var fruits = ['사과', '파인애플', '오렌지']; fruits.add('복숭아'); print(fruits[3]); // 복숭아 // fruits.addAll(['포도', '귤']); print(fruits); // [사과, 파인애플, 오렌지, 복숭아, 포도, 귤] // final additionalFruits = ['샤인머스켓', '수박']; fruits.addAll(additionalFruits); print(fruits); // [사과, 파인애플, 오렌지, 복숭아, 포도, 귤, 샤인머스켓, 수박]✔
add()는 요소를 하나 추가할 수 있으며,addAll()은 여러개를 추가할 때 사용한다.
✔ 배열을 만들어 다른 배열에 추가할 수도 있다.
📁
remove(), removeAt()var fruits = ['사과', '파인애플', '오렌지']; fruits.remove('파인애플'); print(fruits); // [사과, 오렌지] // var appleIndex = fruits.indexOf('사과'); fruits.removeAt(appleIndex); print(fruits); // [오렌지]✔
remove()는 삭제할 요소를()에 넣고,removerAt()은 삭제할 요소의 Index를 넣는다.
📁
clear()var fruits = ['사과', '파인애플', '오렌지']; fruits.clear(); print(fruits); // [] print(fruits.isEmpty); // true print(fruits.isNotEmpty); // false✔ 배열 안에 있는 모든 요소를 없앤다.
✅ 각각의 요소는 모두 같은 타입이어야 한다.
📋
Set<타입> [변수 이름] = {요소};Set<int> numbers = {1, 2, 3, 4, 5};Set<int> numbers = {};👉
변수 이름 = {요소};var numbers = {1, 2, 3, 4, 5};final numbers = {1, 2, 3, 4, 5}; const names = {'Alice', 'Bob', 'Henry'};var names = <String>{};✔
List와 동일하게 요소에 변동이 없는 경우,final이나const로 선언 가능하다.
❗ List 처럼 var numbers = {}; 형태로 선언하면 numbers는 Map 타입이 된다.
var fruits = {'사과', '파인애플', '오렌지'}; print(fruits[2]); // Error: The operator '[]' isn't defined for the class 'Set<String>'.❌ 요소들의 순서가 없으며,
Index개념이 없어 사용하면 오류가 난다.
var fruits = {'사과', '파인애플', '사과'}; print(fruits); // {사과, 파인애플}✔ 중복된 값이 있으면 하나를 제외하고는 모두 제외한다.
📁
legthfinal fruits = {'사과', '파인애플', '오렌지'}; print(fruits.length); // 3✔
List와 동일하게 요소의 개수를 구할 수 있다.
📁
isEmptyvar numbers = <int>{}; print(numbers.isEmpty); // true print(numbers.length); // 0 // var fruits = {'사과', '파인애플', '오렌지'}; print(fruits.isEmpty); // false✔
Set에 요소가 없어 비어있는지 확인할 수 있다.
⚡
isNotEmptyvar numbers = <int>{}; print(numbers.isNotEmpty); // false // var fruits = {'사과', '파인애플', '오렌지'}; print(fruits.isNotEmpty); // true✔
Set에 요소가 있는지 판별한다.
📁
add(), addAll()var fruits = {'사과', '파인애플', '오렌지'}; fruits.add('복숭아'); print(fruits); // {사과, 파인애플, 오렌지, 복숭아} // fruits.addAll({'포도', '귤'}); print(fruits); // {사과, 파인애플, 오렌지, 복숭아, 포도, 귤} // final additionalFruits = {'샤인머스켓', '수박'}; fruits.addAll(additionalFruits); print(fruits); // {사과, 파인애플, 오렌지, 복숭아, 포도, 귤, 샤인머스켓, 수박}✔
add()는 요소를 하나 추가할 수 있으며,addAll()은 여러개를 추가할 때 사용한다.
✔ 배열을 만들어 다른 배열에 추가할 수도 있다.
📁
remove()var fruits = {'사과', '파인애플', '오렌지'}; fruits.remove('파인애플'); print(fruits); // {사과, 오렌지}✔ 요소를 삭제할 수 있다.(
Index가 없기 때문에removeAt은 사용할 수 없음❌)
📁
contains(), containsAll()var fruits = {'사과', '파인애플', '오렌지'}; print(fruits.contains('사과')); // true print(fruits.contains('포도')); // false // print(fruits.containsAll({'사과', '오렌지'})); // true print(fruits.containsAll({'사과', '귤'})); // false✔ 특정 요소가 포함되어 있는지 알 수 있다.
✅ 키와 값들은 각각 타입이 같아야 한다.
📋
Map<key 타입, value 타입> 변수 이름 = {key: value};Map<String, String> people = {'Alice': 'Teacher', 'Bob': 'Student'};Map<String, String> people = {};👉
변수 이름 = {key: value};var people = {'Alice': 'Teacher', 'Bob': 'Student'};final people = {'Alice': 'Teacher', 'Bob': 'Student'}; const animals = {'Dog': 3, 'Cat': 5};var people = {};✔
키(Key)와값(Value)이 묶인 하나의 쌍으로 이루어진 형태이다.
Map<String, int> people = {'Alice': 25, 'Bob': 30};✅ 키와 값을 서로 다른 타입으로 구성할 수 있다.
Map<String, int> people = {'Alice': 25, 'Bob': 25, 'Alice': 23}; print(people); // {Alice: 23, Bob: 25}✅ 키는 중복될 수 없지만, 값은 중복될 수 있다.
📁
lengthMap<String, int> people = {'Alice': 25, 'Bob': 30}; print(people.length); // 2✔ 요소의 개수를 구할 수 있다.
📁
isEmptyvar names = {}; print(names.isEmpty); // true print(names.length); // 0 // var people = {'Alice': 25, 'Bob': 30}; print(people.isEmpty); // false✔
Map에 요소가 없는지 즉, 비어있는지 판별한다.
⚡
isNotEmptyvar names = {}; print(names.isNotEmpty); // false // var people = {'Alice': 25, 'Bob': 30}; print(people.isNotEmpty); // true✔
Map에 요소가 있는지 판별한다.
📁
[변수 이름][[키 이름]]Map<String, int> people = {'Alice': 25, 'Bob': 30}; print(people['Alice']); // 25✔ 값을 검색할 수 있다.
✔Map에 없는 키를 넣을 경우null을 반환한다.
📁
[변수 이름][[키 이름]] = [값];Map<String, int> people = {'Alice': 25, 'Bob': 30}; people['Alice'] = 28; print(people); // {Alice: 28, Bob: 30} print(people['Alice']); // 28✔ 키의 값을 수정한다.
📁
[변수 이름][[키 이름]] = [값];Map<String, int> people = {'Alice': 25, 'Bob': 30}; people['Charlie'] = 35; print(people); // {Alice: 25, Bob: 30, Charlie: 35}✔ 새로운 키와 값의 쌍을 추가한다.
📁
remove()Map<String, int> people = {'Alice': 25, 'Bob': 30}; people.remove('Bob'); print(people); // {Alice: 25} print(people['Bob']); // null✔ 요소를 삭제한다.
📁
containsKey()Map<String, int> people = {'Alice': 25, 'Bob': 30}; print(people.containsKey('Alice')); // true print(people.containsKey('Paul')); // false✔ 특정 요소가 있는지 알 수 있다.
📁
keysMap<String, int> people = {'Alice': 25, 'Bob': 30}; print(people.keys); // (Alice, Bob)✔ 모든 키들을 알 수 있다.
📁
valuesvar students = {'Alice': 25, 'Bob': 30}; print(students.values); // (25, 30) // var teachers = {'Paul': 35, 'Henry': 37, 'Bella': 35}; print(teachers.values); // (35, 37, 35)✔ 모든 값을 알 수 있다.
ListSet순서 유무 O X Index 유무 O X 중복 허용 여부 O X
📋
enum [열거형 이름] {요소}enum Color { red, green, blue }enum Animal { cat, dog, tiger, elephant }
enum Color { red, green, blue } var myFavoriteColor = Color.blue; print(myFavoriteColor); // Color.blue✔ 열거형 이름을 통해 열거형에 포함된 값에 접근할 수 있다.
📁
switchenum Color { red, green, blue } // var myFavoriteColor = Color.green; var result = '내가 제일 좋아하는 색은 '; // switch (myFavoriteColor) { case Color.red: result += '빨간색'; case Color.green: result += '초록색'; case Color.blue: result += '파란색'; } // print(result); // 내가 제일 좋아하는 색은 초록색✔ 열거형에 포함된 값을 각각 다룰 수 있다.
⚡
ifenum Color { red, green, blue } // var myFavoriteColor = Color.green; var result = '내가 제일 좋아하는 색은 '; // if (myFavoriteColor == Color.red) { result += '빨간색'; } else if (myFavoriteColor == Color.green) { result += '초록색'; } else if (myFavoriteColor == Color.blue) { result += '파란색'; } // print(result); // 내가 제일 좋아하는 색은 초록색✔
if문도 사용 가능하지만, 열거형은 주로switch문을 사용한다.
📁
indexenum Color { red, green, blue } // print(Color.red.index); // 0 print(Color.green.index); // 1 print(Color.blue.index); // 2✔ 열거형에 포함된 값이 몇 번째에 있는지 알 수 있다.
📁
valuesenum Color { red, green, blue } // var colors = Color.values; print(colors); // [Color.red, Color.green, Color.blue] print(colors[1]); // Color.green✔ 열거형에 포함된 값들을 알 수 있다.
📁
nameenum Color { red, green, blue } print(Color.red.name); // red✔ 열거형에 포함된 값의 이름을 알 수 있다.
📌 vs
Set
✅ Index 개념이 존재하기 때문에 순서가 있다.
❗ 처음 정의된 상태에서 값 추가 또는 제거가 불가능하다.
❗ 중복된 값을 넣었을 경우 오류가 발생한다.
🌱 오늘은 기초 문법까지 들을 예정이었으나, 과제 내용이 생각보다 복잡하고 어렵고, 강의 분량도 많아서 강의를 타이트하게 들었다.
빠르게 강의를 완강하고 개인 과제를 시작해야될 것 같다. 그리고 여유가 된다면.. 아마 없을테지만 강의에서 어려웠던 부분이 있다면 추가 학습을 진행하면 될 것 같다.
개인 과제는 구상이나 Git 사용이나 코멘트, 주석 같은 것들이 필요하기 때문에 얼마나 걸릴지 가늠이 되지 않는다.
슬쩍 보기로는 과제 내용이 어려워보여서 어떻게 구현을 해야될지 감이 잡히지 않았는데, 오늘 강의를 들어보니 '어 과제에서 이거 활용하는건가..?' 싶은 내용도 있었다. 우선은 기초와 기반 다지기에 집중을 하고 과제 생각은 나중에 해야겠다.
🚀 내일은 심화 문법을 들을 예정이었지만, 오늘 심화 3까지 들었기 때문에, 심화 4와 함수형 프로그래밍을 들을 예정이다.
만약 여유가 된다면 객체 지향 프로그래밍까지 들을 것 같은데 과연 시간이 될지와 초반은 기초여서 강의를 쭉 들을 수 있었지만 후반에는 어려워져서 시간이 걸리지 않을까 걱정이 된다.