본문 바로가기
일기/우아한테크코스 3기

[우아한테크코스 3기] 레벨 1 - 3주차 회고

by 검프 2021. 2. 22.

한 주 명언

“One must live the way one thinks or end up thinking the way one has live” 
— paul Bourget
- 생각하는 대로 살지 않으면 사는 대로 생각하게 된다. 

1주알 안에 이렇게 많은 지식을 배울 수 있나 생각하게 되는 한 주였습니다.

많은 것을 배웠고, 또 느낀 한주 였습니다.

 

5Fs란?

1. Facts(한 것)

실제로 했던 일이나 겪었던 일의 사실을 적습니다.

2. Feelings(느낀 것)

일을 하거나 겪으면서 느꼈던 감정이나 느낌을 적습니다.

3. Findings(배운 것)

일을 하거나 겪으면서 새롭게 배운 점이나 알게 된 점을 적습니다.

4. Future Actions(할 것)

배운 점을 토태로 이후엔 어떻게 유지하고 개선할 것인지 적습니다.

5. Feedbacks(시간이 지난후 결과)

적절한 기간 이후 (저는 1달로 정함) 결과가 어떘는지 적습니다.

 

1. Facts(한 것)

리뷰어 제이에게 리뷰를 받았다.

브라운팀의 데일리 미팅에서 게더를 활용한 여러 게임을 진행했다.

학습로그 작성법 수업을 들었다.

포비의 회고에 관한 수업을 들었다.

  • tdd수업을 들었다.

조엘과 페어가 시작됐다.

  • 실제로 만났다. 밥도 먹었다!

조엘에게 나의 기조에 대해 들었다.

제이온의 JCF(Java Collections Framework) 테코톡을 들었다.

시드의 제네릭 테코톡을 들었다.

조엘과 페어가 끝났다.

새로운 리뷰어인 코니에게 PR을 날렸다.

학습로그를 작성했다.

자바 문자열 수업을 들었다.

컬렉션 수업을 들었다.

제네릭 수업을 들었다.

코니에게 피드백을 받았다.

  • 피드백에 따른 리팩토링을 진행했다.

 

2. Feelings(느낀 것)

피드백을 통해 무엇을 배웠는지 정리해야할 필요성을 느꼈다. ( 나중에 까먹는다, 분명! )

데일리 미팅때 여러 게임을 하는것이 좋다.

  • 좋은 감정과 동시에 내가 마스터가 될 때 뭘하지..? 라는 생각이 엄습한다.

학습 로그를 활용해서 코드를 작성하며 무엇을 배웠는지 정리하는 것의 필요성을 느꼈다.

  • 근데 솔직히 아직 좀 익숙하지가 않다.. 힘을줘요 브라운..!

실제로 만나서하는 페어 프로그래밍이 정말 좋았다.

  • 조엘에 대해 더 많은 것을 알게됐고, 나에 대해 더 자세히 말할 수 있었다.
  • 더 친해진 거 같다..ㅎㅎ(조앨도 되게 성격이 좋아서 잘 맞았다.)

조엘과의 페어프로그래밍은 솔직히 조금 힘들었다.

  • 내가 조금 더 알았으면 더 쉽게 얘기해줄 수 있지 않았을까?
  • 내 실력이 형편없다는 것을 느꼈다.

나의 주장이 강하다는것을 알게됐다.

  • 주장은 강한데. 말에 힘이 없다. 장 단점, 사용해야하는 이유가 명확하지 않음인 것 같다.
  • 부끄러웠다.

발표를 어떻게 해야 이해하기 쉬울지 생각했다.

자신이 없는 코드는 많은 피드백을 남기는 것을 알게됐다

  • 근데 시간이 너무 없었다..!

아는 것이 중요한 것이 아닌 적절히 쓸 줄 아는것이 중요하다는 것을 느꼈다.

 

3. Findings(배운 것)

"나중에 사용하겠지"를 피하라

나중에 나는 현재 잘 짜여져 있는 메소드를 더 좋아하지, 의미없이 추가된 메소드를 좋아하지 않는다.

학습 로그를 남겨라

매 pr후 어떤 것을 공부했는지 어떤것을 배웠는지 적자. 적지않으면 까먹는다.

동작하는 쓰레기 코드 vs 동작하지 않는 깔끔한 코드

당연히 동작하는 쓰레기 코드가 더 좋다.

회고를 적나라하게 작성하라

좋았던 점과 안좋았던 점이 확실해야 한다.

좋았던 부분만 있으면 학습의 개선 행복을 얻기 힘들다

회고를 내가 먼저 시작하라

나는 어떤사람인가, 상대는 어떤 사람인가 내가 먼저 물어보자

시작전에 아이스 브레이크 타임을 많이 가지자

TDD란?

프로덕션 코드와 테스트코드가 있을시, 테스트코드먼저 작성하고 프로덕션 코드를 작성하는 것

사용이유?

디버깅 시간을 줄여준다.

동작하는 문서를 작성하게 한다.

https://user-images.githubusercontent.com/48986787/108012207-29708f00-704c-11eb-92ef-67fdff801bb0.pnghttps://user-images.githubusercontent.com/48986787/108012249-3ee5b900-704c-11eb-8c8c-45cf323ca588.pnghttps://user-images.githubusercontent.com/48986787/108012494-df3bdd80-704c-11eb-8ee1-7d90a74d40f7.pnghttps://user-images.githubusercontent.com/48986787/108012614-232ee280-704d-11eb-89f2-3d71ba82a423.pnghttps://user-images.githubusercontent.com/48986787/108012869-c54eca80-704d-11eb-8e45-4f4f48978629.png

TDD에 필요한 것은 새로운 접근 방식에 도전할 수 있는 용기!

일단 시작하자, tdd에선 초록불을 빨리 보는게 중요하니까.

구현할 기능 목록을 먼저 작성하라

리플랙션이란?

객체를 통해 클래스의 정보를 분석해내는 프로그래밍 기법

다이렉트로 변수에 접근하는것 보단 조금 느림 하지만 성능에 치명적이지 않다

https://user-images.githubusercontent.com/48986787/108139902-6304d100-7104-11eb-90a0-750493f49f40.png

그렇다면 언제 쓸까?

리플랙션을 무조건 써야하는 상황애서만, 즉, 프레임웍이나 라이브러리들에서 어떤 클래스들이 올지 모르기 때문에 쓴다 → 공부 필요!

JCF (Java Collections FrameWork)

자바에서 사용할 수 있는 자료구조 모음.

정리하자, 정리하자, 정리하자

제네릭

final List<Animal> animals = new ArrayList<>();

이렇게 List인터페이스를 타입으로 선언하는 이유?

효율 및 다형성을 위해 → 나중에 LinkedList로 변경하고 싶을 수 도 있다!!

 @Test
    void name() {
        final List<Animal> animals = new ArrayList<>();
        final List<Dog> dogs = new ArrayList<>();
        final List<Dog> cats = new ArrayList<>();
        final List<String> strings = new ArrayList<>();
    }

    // 상한 ( 위의 한계선 즉, 얘보다 아래 애들은 다 들고 올 수 있음  )
    private void test1(final List<? extends Animal> animals){
        Animal animal = animals.get(0); // <? extends Animal> `Animal`인 것은 확실
      //  animals.add(new Dog()); // <? extends Animal> 이 Dog라는 보장이 없다.그래서 에러가 발
    }

    // 하한 (아레에 한계선 즉 예보다 위의 애들은 다 들고올 수 있다.)
    private void test2(final List<? super Animal> animals){
        Object object = animals.get(0);     // ? super Animal이 Object의 자식인 것을 확실
        animals.add(new Dog());     //  Dog는 Animal 이기 때문에
    }

    interface Animal {
    }

    class Dog implements Animal {
    }

    class Cat implements Animal {
    }

조회 용도로만 사용한다면 상한을

수정이 필요하다면 하한을 사용한다.

캐스팅 멋지게 사용하는 법

https://user-images.githubusercontent.com/48986787/108451207-c1b77f80-72a9-11eb-944c-3038145fa74e.png

Null 을 피하는 코드 작성법

"" 안의 값은 null이 아닌게 확실하니까. 에러가 안뜸

https://user-images.githubusercontent.com/48986787/108451664-8ff2e880-72aa-11eb-97d3-7b07c4c73442.png

문자열

  • 문자열(String)은 자바 프로그램이 실행되는 동안 가장 많이 생성되는 객체이다.
  • 문자열은 객체이지만 각각의 문자의 나열로 구성된다.
  • 스트링 + 을 하면 내부 로직이 알아서 StringBuilder를 만들어줌 → 바이트 코드로 확인할 수 있다.
  • 스트링 + 을 하면 내부 로직이 알아서 StringBuilder를 만들어줌 → 바이트 코드로 확인할 수 있다.→ 멀티쓰레드에 안전하냐?
  • 스트링 버퍼를 사용하는게 더 안전함
  • 스트링 빌더 vs 스트링 버퍼

StringBuilder API

  • String은 불변하기(immutable)이기 때문에 String과 String을 더하면 새로운 String 객체를 생성한다. 따라서 String과 String을 더하는 시점에 메모리 할당과 메모리 해제가 계속 발생한다.
  • StringBuilder는 String과 다르게 기존 데이터에 새로운 데이터를 더하는 방식을 취하기 때문에 속도가 더 빠르다.
  • 따라서 긴 문자열을 더하는 상황이 발생하는 경우 StringBuilder를 활용해 구현한다.

테스트 코드에서 하드코딩은 취향차이!

해도되고 안해도된다.

 

4. Future Actions(할 것)

정적 팩토리 메서드 패턴은 왜 사용할까?

HashMap 사용법

와일드 카드 vs 제네릭

java call by value?

 

5. Feedbacks(시간이 지난후 결과)

댓글