생각보다 엄청 많은 것을 학습할 수 있는 기회였다. 1주일만에 이렇게 성장한 적은 처음이었던 것 같다 😂
아래에는 일주일 동안 내가 깨달은 것, 학습한 것들을 작성하고자 한다!
커밋 컨벤션
이전까지는 커밋에 의미만 잘 전달되면 좋은 것이라 생각했다.
하지만 내가 간과했던 게 있는데, 코드는 나만 보는 것이 아니라는 것이다.
peer review, 혹은 누군가가 나의 코드를 재사용 한다던지, 아니면 내가 누군가의 코드를 사용한다던지 ..
이 경우 커밋 컨벤션은 당연히 지켜져야 할 필요 요소이다!
따라서 중간부터나마 커밋 컨벤션을 적용하려고 했고, 이제는 어느정도 습관이 베인 것 같다.
아래는 내가 커밋 컨벤션에 대해 짧게 작성한 내용이다. (udacity commit convention 기준)
<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
기본적으로는 위와 같은 구조이다. scope, body, footer는 필요에 따라 적어주면 된다.
나 같은 경우는 scope를 항상 적어줘서, 어떤 부분에서 커밋이 발생한 것인지 꼭 나타내려고 했다.
매직 넘버
매직 넘버는 소스코드 안에서 나타나는 구체적인 수치 값을 의미한다.
아래는 내가 이번 프리코스를 진행하면서 작성한 실제 코드이다. 매직 넘버를 제거하기 전 버전과 비교해서 살펴보자.
// 제거 전
public static int getWinner(int user_1, int user_2) {
if (user_1 > user_2) {
return 1;
}
else if (user_1 < user_2) {
return 2;
}
return 0;
}
// 제거 후
private static final int USER1_WINNER = 1;
private static final int USER2_WINNER = 2;
private static final int DRAW = 0;
public static int getWinner(int user_1, int user_2) {
if (user_1 > user_2) {
return USER1_WINNER;
}
else if (user_1 < user_2) {
return USER2_WINNER;
}
return DRAW;
}
제거 전의 경우, 1, 2, 0이 각각 무엇을 의미하는지 알 수 없다. 그러나 상수화시키면 의미가 명확하다.
하지만 값 그자체로써 의미를 가지지 않는 경우는 상수화시키지 않았다.. 매직 넘버인지 아닌지의 기준은 '의미가 명확한지 아닌지' 라고 생각한다. 값 자체로써 의미를 갖고 있다면 상수화를 시켜도 될 것이지만, for문의 i = 0 을 i = ZERO 로 상수화 시키는 것은 불필요한 일이라고 판단했다.
상수 클래스
매직 넘버를 제거하려면 상수를 선언해줘야 하는데, 상수 값 관리에서도 고려사항이 있었다.
우선 나는 상수들을 모두 모아 하나의 클래스로 뺄 고민을 했었지만, 그것이 효율적이지 못하다는 것을 알게 되었다.
시스템이 커지고, 상수가 많아지게 되면 상수 클래스를 관리하는 일은 굉장히 어려울 것이다.
물론 Constant 클래스만 보면 된다는 장점이 있지만, 만약 Car 클래스에서 사용하는 CAR_SIZE 상수를 수정해야 한다고 생각해보자.
그러면 Constant 클래스에서 CAR_SIZE를 찾으면 될 일이다. 하지만 CAR_SIZE라는 이름을 모른다면?
어쩔 수 없이 Car 클래스로 이동해 로직 부분에서 CAR_SIZE 라는 이름을 확인하고 나서야, Constant 클래스에 접근할 수 있다.
또한 상수마다 이름을 겹치지 않게 부여하는 일도 번거로운 일이다.
즉, 이와 같은 이유 때문에 나는 시스템 관련 상수와 로직 관련 상수를 분리했다.
로직 관련 상수는 로직에서 가까운 곳(해당 클래스 내)에 위치시키고, 예외처리, 유효성 검증 등에 사용되는 시스템 관련 상수는 Constant 클래스에 위치시켰다. 아래는 내가 직접 작성한 코드 중 일부이다.
// Constant 클래스 내 시스템 상수들
public class Constant {
static final String EXCEPTION = "[ERROR]";
static final String VALIDATION_REGEX = "[a-z]*$";
static final int LENGTH_UPPERBOUND = 1000;
static final int LENGTH_LOWERBOUND = 1;
}
// 로직 관련 상수들은 해당 로직에 가까운 곳에 위치!
public class Game {
private static final int USER1_WINNER = 1;
private static final int USER2_WINNER = 2;
private static final int DRAW = 0;
public static int getWinner(int user_1, int user_2) {
if (user_1 > user_2) {
return USER1_WINNER;
}
else if (user_1 < user_2) {
return USER2_WINNER;
}
return DRAW;
}
}
객체지향적으로 사고하기
사실 이번 프리코스를 진행하면서 가장 많은 시간을 투자하고 (80%는 이쪽)
가장 많은 고민을 한 부분은 객체지향 설계이다.
기능 구현에 앞서 문제를 보고, 대략 어떤 메소드가 필요한지 작성하는 것은 크게 어렵지 않았다.
즉, 로직을 구성하는 것에 있어서는 그렇게 문제는 없었던 것 같다.
그렇지만 이런 로직을 '분리하는 데 있어' 굉장한 애를 먹었다 😭
객체지향적 사고가 아닌 절차지향적 사고를 했다 보니,
이렇게 무작정 생각해낸 로직대로 구현을 하고 이를 클래스로 분리하려니 상당히 애매했다.
따라서 클래스 - 클래스 혹은 객체 - 객체 간 통신으로 문제를 해결하는 것에서는 조금 멀어졌다.
이는 내가 객체지향의 원칙을 고려하지 않았기 때문이라고 생각한다.
이런 문제점을 자각하고 나서, 끊임없는 리팩토링을 통해 함수를 분리하고, 클래스를 분리하고..
함수의 재사용성을 높이기 위해 많은 노력을 기울였다.
(특히 depth가 2가 넘어가지 않고, 메소드가 15줄이 넘어가지 않게 노력했다)
그럼에도 로직이 복잡한 함수의 경우에는 분리하기에는 어려웠고, 해결책이 쉽게 떠오르지 않았어서 아쉬움이 남는 것은 사실이다.
따라서 앞으로 2주차 프리코스가 시작하기 전까지는 SOLID 원칙이나 기타 객체지향 패턴을 학습해 보아야겠다.
Java 에 대해서도
위와 같은 개념들 뿐만 아니라, Java 그 자체에 대해서도 많이 학습할 수 있는 시간이었다.
사실 Java를 배운지 2주밖에 안되어서, 이미 만들어진 내장 메소드 등을 사용하는 데 애를 먹었던 것은 사실이다.
(구글링의 힘으로 이겨내기는 했음)
그러나 stream, 람다식 등의 문법 요소가 손에 익어서 내 코드에 많이 적용되었으면 하는 어떨까 생각하긴 한다.
그렇다고 stream, 람다식 등을 적용하지 않은 건 아닌데, 숙련도 이슈로 제한 시간 내에 적용하지 못한 부분도 많아 아쉬움이 남는다.
사실 이전에는 크게 신경쓰지 않았던 부분인데, 이미 만들어진 문법등을 사용하면 메소드 길이를 크게 줄일 수 있고, 클린 코드에 가까워 질 수 있다는 것을 느끼고 나서 중요성을 깨달았다.
그러나 stream이나 람다식을 사용하면 메소드 길이를 파격적으로 줄일 수 있지만, 이것이 이해하기 쉽냐는 관점에서 적정선을 찾는 과정이 필요할 것 같다.
또한 메서드명, 변수명에 있어서 이해하기 쉬운 이름이 되게 중요하다는 것도 깨달았다.
다음 날 내 코드를 보고 무슨 일이 일어난건지 모르는 경우를 방지하기 위해
그래서 앞으로 Java 자체에 대해서도 학습해 볼 예정이다! 찾아보니 통용되는 Java convention도 존재하길래
2주차부터는 이를 점차 적용해나갈 생각이다.
마치면서
시험기간과 겹치면서 정말 바쁜 일주일이었다. (사실 아직 시험 두 개 남음)
그럼에도 많은 것들을 배워갈 수 있었고, 앞으로도 학습의 자세를 잃지 않으려 노력할 것이다.
프리코스의 동기가 합격뿐만이 아닌 성장도 될 수 있도록!
(둘 다 이뤄냈음 좋겠다 😎)
클린 코드, 객체지향, 자바에 대해 방향성을 잡을 수 있는 계기였고 앞으로 남은 3주도 즐겁게 성장해보자.
3주 뒤에 나는 지금보다 더 많은 성장을 이룩했길 바라면서
끝!
'우테코 5기' 카테고리의 다른 글
[우테코] 우아한 테크코스 5기 1차 합격 + 최종 합격 (1) | 2022.12.15 |
---|---|
[우테코 프리코스] 4주차 회고 (1) | 2022.11.24 |
[우테코 프리코스] 3주차 회고 (0) | 2022.11.16 |
[우테코 프리코스] 2주차 회고 (3) | 2022.11.08 |
우테코 프리코스를 앞두고 (1) | 2022.10.24 |