우아한테크코스 웹 백엔드 7기 프리코스 1주차 회고
우테코 웹 백엔드 7기를 지원하여 프리코스 1주차를 보냈다.
프리코스 1주차 과제는 깃허브에 익숙해지는 것, 간단한 문제를 해결하는 것이었다. (간단하지 않을수도?)
코딩 컨벤션은 많이 들어봤고, 평소 실제 내가 코딩할때, 특정 코딩 컨벤션을 지켜서 코딩했지만, 커밋 컨벤션은 처음 들어보는 개념이었다. 이를 통해서 커밋목록에서 내가 어떤 커밋들을 했는지 알아보기 수월해졌다. Angular js git commit convention이라는 커밋 컨벤션을 사용했다.
기능 요구사항을 훝고 처음 든 생각은 c언어로 구현할 수 있겠다는 생각이었다. 문자열을 입력받고, 반복문안에 sscanf("%d", &num)을 넣고.. 하면 될것같았다. 자바에서 sscanf와 같은 메서드가 있나 궁금해서 gpt에게 물어보니 정규표현식에 대해 알려줬다.
정규표현식(Regular Expression, 줄여서 regex 또는 regexp)은 문자열에서 특정 패턴을 찾거나, 일치하는 부분을 추출하거나, 대체하는 등의 작업을 할 때 사용되는 텍스트 패턴을 정의하는 언어 <- 라고 한다. 자바에만 있는 문법은 아니다.
"정규표현식 자바" 라는 키워드로 구글링을 해봤고, 이를 위의 문제 해결에 쓸지에 대해 고민해보았다. 정규표현식을 쓰면 문제를 간단하게 해결할 순 있겠다만, 정규표현식을 보았을 때, 이게 무엇을 하는 코든지 눈에 바로 들어오지 않는다. (후에 stackoverflow사이트에서 찾아보니,
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.
(attributed to Jamie Zawinski)
이런 약간의 농담섞인 격언(?)이 있었다. 대충 해석하자면, 한 문제를 맞닥드렸을때, "정규 표현식을 사용해야겠다!"라고 하는 사람들이 있다. 그들은 이제 두 문제를 가지게 되었다.는 것이다..
이거 정규표현식으로 해결하면 되겠는데? 어디 정규표현식을 검색해볼까..
정규표현식은 아주 효율적인 문제해결 방법이 될 수 있다. 정규표현식을 사용함으로서 효율적으로 문제해결을 할 수 있었던 사례를 클릭해서 Area Number Three: Scripting and Regular Expressions을 찾아 보면 그 예시가 나온다. 스택오버플로우에서 본 몇몇 토론들을 통해 정규표현식을 어떻게 써야하는지 알아보았다. 정규표현식을 사용하는 것이 문제해결 방식중 가장 최선인 경우가 있고, 정규표현식을 쓰는게 그닥 적절하지 않은 경우가 있다. (닭 잡는데, 소잡는 칼을 쓰는 격일 수 있다) 정규표현식을 쓰는게 가장 적절한 접근일 순 있어도, 가독성 측면에선 다른 방식으로 문제해결하는 것이 가독성 측면에서 나을 수 있다고 한다.
우테코 프리코스 설계자분들이 참가자들에게 정규표현식에 대해 빠삭하게 아는게 중요하다고 이런 과제를 내주셨을까? 물론 정규표현식은 알면 좋겠지만, gpt가 나온 이 시점에서 달달 외울만한 가치가 있을까? 회사에 들어가서 코드를 짠다면 정규표현식에 대해 중요하게 여기는 팀에 들어간다면 정규표현식을 잘 아는게 중요하겠지만 내가 어떤 팀에 들어갈 지 모르고, 그 때가 온다면 학습하면 될 일이다. 또 나는 우테코 프리코스가 끝난 후 최종 코딩테스트에서 정규표현식을 이용할 자신이 없다. 고로 정규표현식은 사용하지 않았다.
c에 있는 strtok함수를 생각했고, 이 함수를 변형해 만들면 되겠다는 생각이 들었다.
1. 문자열을 입력받고
2. 문자열이 //로 시작해서 문자열.lastIndexOf("\\n") == 3이라면 커스텀구분자를 추가
3. 그후 문자열을 반복문을 이용해서 순회하며 숫자가 나온다면 StringBuilder를 이용해서 숫자를 만든다.
- 구분자가 나온다면, 구분자 이전의 숫자를 Integer.parseInt(num.toString())을 통해 StringBuilder -> int로 만든 숫자의 타입을 바꾸고, 숫자합에 더한다.
- 구분자도, 숫자도 아닌 문자가 나온다면 Exeption을 던진다.
이런식으로 메서드를 만들었고, 제출했다.
커스텀구분자를 만들고, 문자열을 순회하며 숫자를 만들때, StringBuilder와 StringBuffer에 대해 학습하게 되었다. 내 코드에선 StringBuilder를 사용했는데, 커스텀구분자가 구분자목록에 추가될때, String은 기존 문자열에 다른 문자열이 추가될때 새 객체가 만들어지는 반면 StringBuffer,StringBuilder는과 달리 새 객체가 만들어지지 않아 성능상의 이점을 가진다. StringBuffer를 사용하지 않고 StringBuilder를 사용한 이유는 StringBuffer는 thread-safe하지만 StringBuilder보다 조금 느리다고 한다. StringBuilder는 thread-safe하지 않지만 StringBuffer보다 좀 더 빠르다고 한다. 이 프로그램은 항상 thread-safe하기때문에 StringBuilder를 사용했다.
디스코드에서 보니까 이번 과제에서 OOP와 MVC패턴을 적용하려고 하는 분들을 많이 보았다.
나는 이에 반대하는데, 그 이유는 다음과 같다.
자바는 OOP언어라고 하지만, 모든 프로그램을 객체지향적으로 짤필요는 없다고 생각한다. 객체간에 상호작용을 할 만한 부분을 찾지 못했다. 단순히 메서드 하나(안에서 작용하는 메서드를 나눈다면 그 이상이겠지만) 작성하는데 MVC패턴을 위해 클래스를 여러개 나누고, 각 클래스파일을 돌아다니며 기능이 어떻게 작동하는지 봐야한다는 것도 비효율적이고 불필요하다고 생각한다.
아래는 과제 제출한 깃허브 Repository