우아한테크코스 6기

우아한테크코스 6기(모바일 앱) 프리코스 1주차 공부 기록

Alsong 2023. 10. 31. 09:58

 

이번 우아한 테크코스 6기에 지원하게 되었습니다. 대학에서 임베디드 시스템을 공부했지만 C와 파이썬 말고는 제대로 아는 언어가 없었던 저였는데요, 프로젝트에서 사용할 일이 있어서 안드로이드 어플리케이션을 코틀린으로 개발해 본 경험이 있었는데 나름 재미있었고 앱개발 분야에도 흥미가 생기기 시작해서, 이번 우테코 6기도 모바일 앱 트랙으로 지원해 보았습니다.

 

코틀린을 써보긴 했지만 객체지향의 개념이나 클래스 사용법도 제대로 모르는 상태로 수박 겉핥기 식으로 써봤을 뿐이라.. 지원하기 전에도 고민을 많이 했습니다. '코틀린 생초보인 내가 이걸 지원해서 따라갈 수 있을까?'라는 생각이었죠.. 하지만 앱개발 직무를 지원하려면 어차피 코틀린은 공부해야 하고, 이 참에 빡세게 공부해서 따라가야겠다! 라고 마음을 먹었습니다. 게다가 합격하지 못하더라도 지원자 모두에게 제공되는 프리코스만 잘 따라가도 충분히 많은 성장을 할 수 있을 것 같다는 생각이 들었습니다.

 

이번 포스팅에서는 우테코 프리코스를 진행하며 공부한 것들과 느낀 점에 대해 기록해 보려고 해요! 다만 모든 개념들을 한 번에 100% 이해하기는 어려울 것으로 생각되어.. 어려운 개념의 경우에는 일단 얕게라도 공부하고 넘어가려고 합니다.

 

1. JDK란?

코드를 작성해보기도 전에 모르는 게 나왔습니다. 코틀린 개발환경인 IntelliJ를 사용하기 위해서는 비주얼 스튜디오와는 다르게 JDK라는 것의 설치가 선행되어야 했는데, 저는 당연하게도(?) JDK가 뭔지 모르고 있었습니다.. 그래서 찾아봤죠.

JDK : 자바 개발 키트 (Java Development Kit)

 

Java로 소프트웨어를 개발할 수 있도록 여러 기능들을 제공하는 패키지라고 한다고 하네요! 소프트웨어 개발 키드(SDK)의 일종이고, 이것이 있어야 자바 또는 코틀린이 동작할 수 있다고 합니다. JDK 안에는 JVM, JRE 등이 포함되어 있다고 하는데, 아직은 배우기 시작하는 단계니.. 이 정도만 알아두기로 했습니다.

 

2. gradle이란?

프로그래밍 요구사항에 다음과 같은 내용이 있었습니다.

build.gradle(.kts)을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다.

 

저는 이 중에서 gradle에 대해 모르고 있어서, 이 부분에 대해서도 공부해보았습니다.

Gradle은 그루비를 이용한 빌드 자동화 시스템이다. Groovy와 유사한 도메인 언어를 채용하였으며, 현재 안드로이드 앱을 만드는데 필요한 안드로이드 스튜디오의 공식 빌드 시스템이기도 하다. Java, C/C++, 파이썬 등과 같은 여러 가지 언어를 지원한다. - 위키백과

 

간단하게 말하자면 오픈 소스 빌드 도구라고 합니다. 일단 몰라도 프리코스를 진행하는 데에는 큰 문제가 없어 보이고, 이걸 자세히 공부하는 것이 1주차의 목적이 아닌 것 같아 이 정도만 짚고 넘어가겠습니다.

 

3. 코드 컨벤션 준수

프로그래밍 요구 사항에 다음과 같은 내용이 있네요.

 

  • Kotlin 코드 컨벤션 가이드를 준수하며 프로그래밍한다.

코드 컨벤션이란? 읽고 관리하기 쉬운 코드를 작성하기 위한 코딩 스타일 규약입니다. 즉 변수명이나 함수명 등을 중구남방으로 정하지 않고 정해진 규칙에 따라 정돈되게 코딩해야 하는데, 그 기준인 것이죠.

https://kotlinlang.org/docs/coding-conventions.html

 

Coding conventions | Kotlin

 

kotlinlang.org

지금까지 단순히 끌리는 대로 변수명 정하고, 들여쓰기 지맘대로 코딩했던 저로서는 굉장히 뜨끔한.. 요구사항이었습니다. 그런데 컨벤션 가이드에 들어가 보니, 내용이 너무 많아 전부 읽고 적용하기가 쉽지 않았습니다. 그래서 일단은 다음과 같은 사항들만 우선적으로 지키려고 했습니다. 

 

  • 변수 이름 : lowerCamelCase로 작성한다.
  • 함수 이름 : lowerCamelCase로 작성하며, 동사 혹은 동사구로 작성한다.
  • 클래스 이름 : UpperCamelCase로 작성하며, 명사 혹은 명사구로 작성한다.
  • 줄 바꿈 들여 쓰기 : 스페이스 4자로 한다.
  • 중괄호 생략 금지 : if, for, while 등에서 몸체가 한 줄이어도 중괄호를 생략하지 않는다.
  • else 사용 금지
  • 3항 연산자 사용 금지
  • 열 제한 100

지금까지 변수명이든 함수명이든 구분하지 않고 snake case로 사용해 왔는데 클린 코드를 위해서라면 바꿔야 합니다..! 그 외에 대부분은 놀랍지 않은데, 중괄호 생략 금지, 3항 연산자 금지, else 금지 규칙은 사용하면서 문제를 느끼지 않았던 부분이라 조금 놀랐군요. 앞으로는 사용하지 말아야겠습니다.

 

4. 라이브러리

이번 프리코스 1주차에서는 입력값과 난수생성을 우테코에서 제공하는 라이브러리를 통해 해야 했습니다. 코틀린 표준 라이브러리를 사용하는 것이 아닌 우테코에서 제공하는 라이브러리를 써야 하는 이유는 잘 모르겠지만.. 아마 외부 라이브러리를 가져오는 법을 익혀보라는 취지가 아니었을까 싶네요(뇌피셜임).

 

5. 모듈, 패키지

main() 함수가 있는 Application.kt 파일의 최상단에 보면 package baseball이라는 코드가 있었습니다. 패키지가 무엇인지.. 알아야겠죠? 찾아보니 모듈이라는 개념과도 연관이 있는 것 같아 묶어서 알아두기로 했습니다.

1. 모듈

모듈은 프로젝트의 바로 하위 개념으로 프로젝트의 기능을 나누는 단위입니다. 모듈은 여러 패키지로 구성됩니다.

2. 패키지

패키지는 모듈의 하위 개념입니다. 패키지는 또 여러 개의 소스파일로 구성됩니다.

위의 이미지에서는 main이 모듈, baseball이 패키지가 됩니다. kotlin은 소스 루트라고 하는데, 소스 루트가 무엇인지는 일단은 넘어가겠습니다.

 

6. 객체지향 프로그래밍

저는 지금까지 C언어 위주로 프로그래밍을 해왔고 대부분의 프로젝트도 C기반이었기 때문에 객체지향 프로그래밍에 익숙치 않았습니다. 객체지향의 개념은 어느 정도 두루뭉술하게 알고 있었고 블로그를 통해 알아보기도 했지만 이해가 잘 되지 않는 느낌이더라고요. 그래서 이번 기회에 마음을 다잡고.. 클래스가 무엇인지부터 다시 차근차근 공부했습니다. 메서드는 무엇이고.. 프로퍼티는 무엇이고.. 생성자는 무엇이고.. 이런 것들을 공부하다 보니 일단 IDE에서 클래스 코드를 작성해 볼 수 있게 되었습니다. 그리고 직접 클래스를 만들어 보니 private, public에 대한 개념도 잡히기 시작하더라구요..! (감동)

 

기존의 저라면 소스파일 하나에서 모든 코드를 작성했겠지만, 처음으로 클래스를 나눠 프로그램을 작성해 보았습니다. 그런데 쓸데없이 나눈 클래스가 있을지도? 모르겠군요.. ㅎㅎ

 

다만 아직도 어려운 점이 남아있는데,

  • ConsoleRandom 클래스의 메서드는 어떻게 인스턴스 생성 없이 Console.readLine() 과 같이 사용할 수 있는가?
  • 추상 클래스와 인터페이스의 개념 (왜 굳이 추상 클래스를 만들어서 상속을 하는가?)

아직은 다른 것들을 학습하기도 버거워서 일단 질문으로 남겨두었다가, 나중에 실력이 향상되었을 때 다시 해결해 봐야겠습니다.

 

7. 리스트

리스트를 파이썬에서 사용하는 것에 익숙해지다 보니 코틀린에서는 리스트 하나 만들기도 어색하군요. [1, 2, 3]과 같은 방식으로 생성할 수 없는 건 물론이고 변경 가능한 리스트와 불가능한 리스트를 구분해서 생성해야 하는 등 불편한 점이 있어서 파이썬이 얼마나 쉬운 언어인지 다시금 느끼기도 하였네요..!

MutableList vs ImmutableList

val listA: MutableList<Int> = mutableListOf(1, 2, 3)
// [1, 2, 3]

val listB: List<Int> = listOf(1, 2)    
// [1, 2]

리스트의 메서드와 프로퍼티들도 기억하기 쉽게 자주 사용되는 것 몇 개만 정리해 두었습니다. 리스트의 요소를 변경하는 메서드는 물론 MutableList에서만 사용 가능합니다.

add(index, element) : 리스트의 index 자리에 element를 추가합니다. 인수를 하나만 넣으면 맨 끝에 값을 추가합니다.

remove(element) : 리스트에서 element를 제거합니다. 없으면 false를 반환합니다.

contains(element) : element가 있다면 true를 반환합니다.

isEmpty() : 비어있다면 true를 반환합니다.

size : 리스트의 크기

코틀린에서 비어있는 리스트를 정의할 때에는 반드시 타입을 명시해 주어야 하는 듯한데, 만약 빈 리스트를 만들고 이 리스트에 다양한 타입의 요소들을 넣고 싶으면 어떻게 해야 될지 아직 모르겠습니다.

 

 

프리코스 1주차를 끝내고 느낀 점

프리코스가 시작되고 디스코드 커뮤니티가 생성되자마자 정말 많은 분들이 활동을 하기 시작하셨습니다. 단순히 잡담만 하는 것이 아니라, 직접 만드신 서비스를 공유하신다거나 자신의 기술 블로그를 업로드하시는 등.. 정말 실력 있고 다양한 경험을 해 보신 분들이 많다는 것을 알게 되었고 위축이 되기도 했습니다. '나는 지금까지 뭘 하며 살았나..' 하고요.. ㅎㅎ 게다가 제가 알아들을 수 없는 전문용어들이 빗발쳐 '여기는 내가 있을 곳이 아닌가?'라는 생각까지 든 것도 사실이었습니다. 하지만 사람마다 실력이 다 다르고 성장 속도가 다른데, 타인과 저를 비교하게 되면 끝이 없다는 것을 금방 깨닫게 되었어요. 실제로 많은 분들의 1주차 회고록을 살펴보니, 저처럼 생각한 분들이 정말 많더라구요! 조바심 내지 않기로 다짐했습니다.

 

미션의 기능구현 자체는 어렵지 않았다고 생각합니다. 대신 코틀린 언어를 학습하고 객체지향 프로그래밍에 익숙해지는 것이 어렵고 오래 걸렸습니다. 컨벤션 가이드에 맞춰 클린 코드를 작성하는 것도 습관이 되어있지 않다 보니 은근 어려웠고요. 하지만 어려웠던 만큼 겨우 1주일 동안의 공부였음에도 불구하고 굉장히 많은 것을 배웠고, 실력이 많이 향상되었음을 느낍니다. 

 

또 처음에는 프로젝트 내에 모르는 코드가 너무 많고 java 파일을 import해서 쓰기도 해서 java문법을 포함해서 '이 모든 내용을 다 알아야 우테코 프리코스를 진행할 수 있는건가?' 라고 생각도 했는데, 어느정도는 몰라도 진행이 가능하고, 운영진 분들도 한 번에 100% 숙지하기를 원하는것은 아닌 것 같았습니다. 따라서 좌절하지 않고 차근차근 배우려는 자세로 임해야겠다고 생각했습니다.

 

다음 미션 목표

물론 이번에 프로그램한 저의 코드에 부족함이 많다는 점은 알고 있기 때문에 다음 주차에서는 더 개선되어야 할 것 같습니다. 일단은 다음과 같은 목표를 세웠습니다.

 

1. 클린코드에 가까워지도록 노력한다.

이번 미션에서도 컨벤션가이드를 참고해 코딩하기는 했지만 일부만 적용했을 뿐이고 제대로 실천하지 못한 부분도 많았습니다. 이 부분에 신경 쓰려고 합니다.

 

2. 테스트코드를 작성해 본다.

1주차 미션을 진행하면서 테스트코드가 무엇인지조차 몰랐습니다. 그저 소스를 실행해서 잘 작동하는지 확인하는 게 전부라고 생각했는데, 다른 분들의 포스팅을 보니 테스트코드가 중요하다는 것을 알게 되었습니다. 

 

공부 많이 해야겠습니다.. ㅎㅎ.. !아래는 제가 작성한 코드입니다!)

https://github.com/songpink/kotlin-baseball-6/tree/songpink

 

GitHub - songpink/kotlin-baseball-6: 숫자 야구 게임 미션을 진행하는 저장소

숫자 야구 게임 미션을 진행하는 저장소. Contribute to songpink/kotlin-baseball-6 development by creating an account on GitHub.

github.com