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

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

by 검프 2021. 3. 10.

한 주 명언

“The best way to predict your future is to create it - Peter Drucker"
- 미래를 예측하는 가장 좋은 방법은 미래를 창조하는 것이다. 

미래엔 지금보다 더 잘할 수 있을까? 생각하게 되는 한 주였습니다.

고민보다, 하루하루 차근차근 나아가는 것이 알 수 없는 미래를 예측하는 가장 쉬운 길이라 느껴집니다.

 

5Fs란?

1. Facts(한 것)

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

2. Feelings(느낀 것)

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

3. Findings(배운 것)

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

4. Future Actions(할 것)

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

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

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

 

1. Facts(한 것)

상속, 추상화에 대한 수업을 들었다.

인터페이스에 관한 수업을 들었다.

잠실로 출근을 했다!

인터넷으로만 보던 페어와 코치들을 봤다.

입장카드에 들어갈 사진을 찍었다.

포모랑 페어 프로그래밍이 시작됐다.

출근하지 않는날 만나서 코딩을 했다.

모던 자바 인 스터디가 시작됐다.

목요일에도 출근을 했다!

사람들이랑 많은 얘기를 했다.

테코톡을 들었다.

완태의 전략패턴을 들었다.

로키의 상속보다는 Composition을 들었다.

지노에게 첫번쨰 pr을 보냈다.

피드백을 받고 리팩토링을 진행했다.

레거시 코드 리팩토링 강의를 들었다.

생성자 체이닝에 대해 알게됐다.

스터디 질문을 작성했다

 

2. Feelings(느낀 것)

내가짰던 코드가 조금 뒤에 보면 어색한 부분이 많다는 것을 알게됐다.

처음 루터회관에 갔다.

되게 좋은 카페의 느낌이 든다.

이번년도를 여기서 보낸다는 생각에 느낌이 이상하다.

사람들을 실제로 보면서 얘기하니 좋다.

사람들을 처음 본날 사진을 찍으니 조금 부끄러웠지만 재밌게 찍은거 같다

매일 출근했으면 좋겠다.

포모와 페어 프로그래밍이 재밌었다.

서로 맞지않는 의견에 대해서 고민하고 토론하는 과정이 뜻깊었다.

어떠한 주장을 말할 땐, 정확한 이유가 있어야 함을 알게됐다.

이건 저번주에도 얘기했다.

→ 나는 이렇게 생각했다~~ 혹시 상대의 생각은 어떤가?

스터디를 같이 하는사람들의 실력이 엄청나다는 걸 느꼇다.

테코톡 질문이 많은것을 알게됐다. 테코톡을 할땐 정확한 지식을 가지고 있어야겠다.

기술의 사용이유에 대해 더 정확히 알자

이제 pr보내고 브렌치를 새로 만드는건 쉬운거 같다. (기분탓일수도..)

좋은 코드를 짜는거에 너무 깊게 생각하지 말자. 좋은 코드가 바로 나오는게 좋지만, 진흙에서 진주를 찾듯..! 차근차근 좋은 코드로 만들어 나가자

 

3. Findings(배운 것)

상속을 통해 중복 코드를 제거할 수 있다.

중복되는 코드는 추상화를 통해 제거한다.

추상클래스는 미완성 클래스다

추상클래스를 사용하는 시점은 공통의 멤버변수, 공통의 바디를 가지는 메소드를 가질 때다.

캡슐화가 깨지는 것을 막으려 부모 메소드의 메소드를 Final화 할 수 있다.

https://livenow14.tistory.com/33

추상 메소드가 하나 이상 있어야 한다. (인터페이스에 있는 메소드도 추상 메소드다(defaultt 메소드 제외)

업캐스팅 다운캐스팅

업캐스팅:

하위 클래스를 상위 클래스로 타입을 반환하는 것을 의미

Car car = new Porsche();

다운 캐스팅:

상위 클래스를 하위 클래스의 타입으로 변환하는 것을 의미합니다.

Car car = new Porsche();

if(car instanceof Car){
        Car porsche = (Porsche) car;
}

인터페이스

표준이라 생각하자. 예를들어 자바를 기반으로 하는 소프트웨어는 DB 종류는 고려하지 않고 인터페이스만 지키면서 구현을 하면 추후 DB가 변경되더라도 소스 코드를 수정하지 않아도 된다.

디폴트 메소드가 추가됨으로써 추상클래스보다 많이 사용하게됨

강한 주장은 꺾이기 쉽다

내가 생각하기에, 아무리 설득력이 있는 주장이라도, 상대가 이해하지 못하는 경우 주장이 억지일 가능성이 높다.

이야기가 통하지 않는다 생각이 들 때, 내 주장이 억지가 아닌지 한번쯤 생각해보자.

상속보다는 컴포지션을 사용하자

상속은 코드를 재사용하는 강력한 수단이다. 하지만 부모 객체의 변경이 자식 객체의 변경으로 이어질 가능성이 높기 때문에 항상 조심해야한다. 이는 위에 링크를 통해 남겨두었다.

컴포지션은 클래스의 인스턴스를 참조하게 한다.

상속은 순수한 is-a 관계일때만 사용한다. 이런 관계가 아닐 경우 컴포지션과 전달을 사용하자.

HashMap은 정렬되지 않은 Map을 제공, LinkedHashMap은 입력순서대로의 저장순서를 보장함.

HashMap

정렬되지 않은 Map을 제공합니다.

하나의 null key와 다수의 null 값을 허용합니다.

순서에 신경쓰지 않는경우 다른 Map보다 빠르다는 장점이 있습니다.

hashCode()를 구현하면 접근 성능이 더 좋아집니다.

동기화 되지 않고 null을 허용한다는 점을 제외하면 HashTable과 거의 동일합니다. (보완했다 생각하면됨)

(싱글 스레드 환경에서 성능이 더 좋음 → 멀티 스레드 환경에선 ConcurrentHashMap을 사용)

LinkedHashMap

LinkedHashSet과 같이 입력순서대로의 저장순서를 보장합니다. → 순서를 보장하는 LinkedList의 구조를 이용함

삽입 삭제는 HashMap보다 느리지만, 더 빠른 조회를 할 수 있습니다.

정적 팩토리 메소드의 사용시기를 생각하자

이는 블로그에 저장했다.

https://livenow14.tistory.com/34

가변객체, 불변객체

쉽게 변하는객체, 변하지 않는 객체라 생각하자

스트림

데이터 처리를 지원하도록 소스에서 추출된 연속된 요소.

소는 컬렉션, I/O의 결과물등이 된다.

한번 소비된 스트림은 재사용이 불가능하다

public class Application {
    public static void main(String[] args) {
List<String> names = Arrays.asList("손너잘", "중간곰", "찰리", "웨지");
        Stream<String> stream = names.stream();

        List<Integer> nameLengths = stream.map(String::length)
                .collect(Collectors.toList());
        System.out.println("nameLengths = " + nameLengths);

        stream = names.stream();
        List<Integer> doubleNameLengths = stream.map(map -> map.length() * 2)
                .collect(Collectors.toList());
        System.out.println("doubleNameLengths = " + doubleNameLengths);
}

Flamap은 평면화된 stream을 반환한다.

public class Application {
    public static void main(String[] args) {
        List<String> symbols = Arrays.asList("스페이드", "하트", "다이아몬드", "클로버");
        List<String> numbers = Arrays.asList("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");

            List<String> cards = symbols.stream()
                .flatMap(symbol -> numbers.stream().map(number -> symbol + number))
                .collect(Collectors.toList());

        System.out.println("cards = " + cards);
    }
}

 

4. Future Actions(할 것)

페어 시작 주는 바쁜거 같다. 이번주는 따로 생각하지 말고 일단 할 수 있는 것을 하자.

 

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

댓글