
지난 시간에 실습 환경을 구축했으니 이번 시간에는 본격적으로 Dart 강의를 시작했다. Flutter 프레임워크 클래스라 Dart 언어는 짧게 하고 넘어갈 거지만 사실 언어가 더 중요하다고. (응용도 중요하지만 국영수 기본 베이스가 더 중요한 것과 비슷한 느낌.) 5년 차쯤 되면 표면적인 기술, 프레임워크 실력은 비슷해지지만 언어, 베이스 지식에서 실력이 갈린다고 하시더라.
첫 시간에 안내해 주신 수준별 공부 방식에 대해서 더 이야기하셨다. 대체적으로 공통 미션을 주겠지만 중급자 이상은 필요에 따라 개별 미션을 주실 수도 있다고. 개발에 직접적으로 영향을 주지 않기에 강의를 듣지 않으면 공부하지 않게 되는 영역이 있는데 이 강의에서도 그런 부분이 좀 있을 거라고 하시더라.
IDE에 대한 이야기도 하고. 현업 Flutter 개발자들은 IDE를 쓰기 보다는 코드 에디터인 VSC에 필요한 플러그인만 설치해서 사용하는 비중이 가장 높지만, 어차피 안드로이드 앱 개발을 위해서는 안드로이드 스튜디오를 설치해야 하니 수업에서는 안드로이드 스튜디오를 사용하기로 했다. (현업자들도 VSC 다음으로 많이 쓴다.) VSC로 개발하는 사람들도 안드로이드 앱 개발을 위해서는 안드로이드 스튜디오를 설치는 해 놔야 하고 아이폰 앱 개발을 위해서는 xCode를 설치는 해 놓아야 한다.
naming convention(주로 '명명 규칙' 정도로 번역되곤 하는데, 강사님은 용어들을 번역하느라 사고의 과정을 한 번 더 거치지 말고 업계에서 쓰이는 일반적인 영문 표현을 사용하길 권하신다.)을 살펴 보았다. 언어마다 기본 규칙이 다른데, Dart에서는 다음 세 가지를 혼합하여 사용한다.
- camelCase (공식 용어는 lowerCamelCase) | variable, parameter, function name
- PascalCase (공식 용어는 UpperCamelCase) | class, enum type, typedef, type parameter
- snake_case | file name, import prefix, name library, package, directory
잘못 사용한다고 문제되지는 않지만 협업에서 불편함을 느낄 수 있으며, 잘못 사용하더라도 IDE가 "이런 건 이런 방식으로 작성하는 게 일반적이다" 하고 경고를 띄워주니 크게 걱정하진 않아도 된다고. 생각해 보면 이런 건 그냥 "글쿤" 하며 적당히 맞춰 사용해 왔던 것 같다.
CLI와 터미널에 대한 것도 그냥 아는 이야기. Windows는 대중을 위해 만들어진 OS라 개발자/전문가가 쓰기엔 신경쓸 게 많은 반면, Mac은 전문가를 위한 OS가 대중화에 성공한 거라 대중이 쓰기엔 어려울 수 있어도 개발자/전문가가 쓰기엔 편하다는 이야기도 하고. 안드로이드 스튜디오 같은 IDE의 콘솔 영역에도 내장 되어 있다는 등의 설명을 가볍게 흘려 들었다.
주석에 대해 설명을 하며 한 줄 주석 사용을 지양하라고 하셨다. 주석이 아니라 코드로 보여주라고. 그리고 문서 주석을 남기길 권장하신다. 나는 "문서화 주석"이라는 번역 표현으로 익숙한 그것. 듣자 하니 초보 개발자들은 내가 생각하는 것보다 주석을 많이 쓰고 문서 주석을 잘 안 쓰는 모양이다. 코드에 구현해야 할 제약사항도 그냥 주석으로 "이 함수는 이케이케 쓰시면 안 되고 저케저케 쓰셔야 합니다" 하기도 한다나.
누군가의 질문으로 인해 프로그래밍 언어의 역사도 러프하게 들었다. 전반적인 흐름과 Dart/Flutter에 대한 이야기까지. 모바일은 Flutter, Kotlin, Swift가 1/3씩 차지하고 있다는 모양이다. Flutter는 네이티브 코드에 비해 성능이 살짝 떨어지지만, 기술이 시장의 전부는 아니며 기술이 조금 떨어져도 사용자가 불편하지 않을 정도로 디바이스가 발전했기에 시장에 잘 자리잡았다고. 조금 느려도 사람이 인지하기 어려운 수준의 차이라나.
variable과 type, null-safety에 대한 이야기도 적당히 흘려 듣는데, var 과 dynamic 의 차이에 대해 설명해 보라고 하셨다. 그럭저럭 대답할 수 있었다. 아무래도 강사 님은 날 이 수업에서 "(상대적) 고수"로 취급하고 계신 모양이다. 실제로 졸업한 지 한참 되었어도 많은 기반 지식들이 무의식 저편에 남아있더라. 누가 물어보면 두루뭉술하게 이야기할 수 있는 정도.
variables & keywords
type description int정수값 (크기 상관 없이 모든 정수값) double실수값 ( float없고 모든 실수값)String문자열 ( char없고 모든 문자열)booltrue혹은falsevar모든 타입의 값 지정 후 해당 타입의 값 대입 가능 dyncamic모든 타입의 값 지정 후 모든 타입의 값 대입 가능 final실행 시점에 변수에 한 번만 값 할당 const절대 변경 불가능한 컴파일 타임 상수 Wildcard ( _)값은 받지만 사용하지 않겠다고 명시 (콜백함수 사용할 때 매개변수에서 사용)
하여간 다양한 자료형의 값을 담을 수 있는 공통점이 있지만 한 번 값을 넣으면 그것과 같은 자료형만 담을 수 있는 var 과 달리 dynamic 은 다른 자료형의 값으로 바꿔치기 할 수 있다는 이야기. null 은 상당히 오랜만에 보는 개념이다. 아무래도 Rust에는 null 이 없다 보니 ㅋㅋ ? 라던가 ! 같은 건 익숙한 개념이라 어려울 건 없었다. 다른 분들도 Dart가 아닌 다른 프로그래밍 언어 경험이 있는 수강생이라면 문제 없이 따라갈 수 있을 것 같은 정도...인데 확실히 뉴비 친화성은 떨어진다. 실습 페이지부터가 "로직은 알지? Dart에선 그걸 이런 문법으로 사용해" 하는 느낌인 곳이 많고.
variable에 대한 설명을 가볍게 들은 후 라이브 코딩 실습 시간이 이어졌다. 초급자는 다 풀어보고, 중고급자는 패스해도 된다고. 나는 강사 님이 설명하시는 동안 variables 실습을 후딱 풀어버리고 놀러 다녔다(!) ㅋㅋ
개발 뉴비 수강생 분 실습 도와드리다 보니 대학생 때 멘토링 장학생 활동 하던 것도 생각나고 그러더라. 절대 먼저 안 알려주고 "일단 님이 쓰고 싶은 대로 써 보세요" 한 후 "이게 왜 실행이 안 될까요?" 하며 답을 찾아가는 과정을 유도하는 방식을 선호한다. 그냥 "이렇게 하면 됩니다"만 보여주면 어차피 높은 확률로 기억 못 한다는 걸 많이 봐왔기에 ㅋㅋ 스스로 고민하고 떠올려봐야 조금이라도 기억에 남는다고 주장해 본다. 너무 헤매고 어려워하면 좀 더 직접적으로 제시해 주기도 하는데 누군가에게 무언가를 설명해 보는 것도 오랜만이라 적절한 지점은 잘 모르겠다.
뉴비와의 시간이 주는 좋은 점 중 하나는 내가 너무 당연하게 여겼던 부분들을 "그냥 그런 거다" 하고 넘어가지 않고 "이건 왜 이렇지?" 하고 생각해 볼 수 있다는 거다. Dart에는 char 가 없으니까 기본 자료형에서 String 혼자 뜬금없이 대문자로 시작하는 게 되는구나, 같은 거. wildcard에 대한 어느 수강생의 질문에 강사 님이 답변하는 것을 들으면서도 "이건 프레임워크나 API에 대한 이해도가 있어야 이해하기 수월할 것 같은데" 하며 강사 님은 어떤 식으로 설명하시나 구경해 보기도 하고.
강의 튜토리얼 페이지 — Dart Basic: Variables(권한이 없는 이에게는 난독화된 페이지로 보일 거다)에 있는 열 개의 실습은 나에게 있어서는 "이걸 Dart에서는 어떻게 하더라"에 대한 가벼운 문법 살펴보기 느낌이었다. 문자열 보간법 같은 건 다른 언어에서도 많이 봐서 익숙하고. 소숫점 이하는 버리는 나눗셈은 // 이 익숙한데 Dart에서는 ~/ 로 하더라. (홈 디렉토리 같이 생겼군 ㅋㅋ) 출력 후 그 줄에서 마칠 거면 dart:io 패키지의 stdout.write() 함수를 사용하고 출력 후 다음 줄로 넘길 거면 print() 함수를 쓰면 되는군, 같은 걸 생각하는 거다.
[실습 예시]
lib/variables/practice01.dartimport 'dart:io'; void answer() { stdout.write('이름을 입력하세요: '); String name = stdin.readLineSync()!; print('당신의 이름은 $name입니다.'); }
[실습 예시]
lib/variables/practice05.dartimport 'dart:io'; void answer() { stdout.write('첫 번째 값을 입력하세요: '); int num1 = int.parse(stdin.readLineSync()!); stdout.write('두 번째 값을 입력하세요: '); int num2 = int.parse(stdin.readLineSync()!); print('첫 번째 값: $num1, 두 번째 값: $num2, 합: ${num1 + num2}'); }
[실습 예시]
lib/variables/practice07.dartimport 'dart:io'; void answer() { stdout.write('첫 번째 값: '); int num1 = int.parse(stdin.readLineSync()!); stdout.write('두 번째 값: '); int num2 = int.parse(stdin.readLineSync()!); int div = num1 ~/ num2; print('첫 번째 값: $num1, 두 번째 값: $num2, 몫: $div'); }
Java랑 닮은 부분도 보이고 Python과 닮은 부분도 보이고... 오늘은 가볍게 놀면서 들었는데 언제까지 그럴 수 있으려나.