Skip to content

1주차 수요일 그룹 1

Semin Choi edited this page Jun 28, 2024 · 2 revisions

내가 고민한거, 내가 질문한거, 후기 (내가 오늘 어떤걸 배웠고 어떤 생각을 했다! 고민사항에 대한 답변, 질문 받았던 것)

김현욱님

  • equlas 사용할 때 꿀팁

    • NPE를 피하기 위해 입력 파라미터로 들어온 객체를 기준으로 equals를 사용하는것을 지양해야합니다.
    //bad
    public boolean isWhite(String str){
    	return str.equals("white");
    }
    
    //good
    public boolean isWhite(String str){
    	return "white".equals(str);
    }
  • black list기법보단 white list 기법을 사용해라

    //bad
    ~~~은 안된다. ~~~은 private으로 설정해야 한다.
    //good
    모두 안되는데 너하고 너는 통과시켜준다. 모두 private으로 하고 필요에 따라 protected , private default, or public으로 설정할것이다.
  • ArrayList를 사용할 때 꿀 팁

    초기 셋팅 이후 add되는 비즈니스 로직이 없을 능성이 크고, 초기 셋팅의 사이즈를 안다면 ArrayList의 생성자 파라미터에 initCap값을 넣어주는것이 성능상 좋다.(물론 크기 작을경우는 유의미한 결과를 얻기 좀 빡세다)
  • String.format은 구닥다리 jdk의 산물이라 수행 속도가 유의미할정도로 느리다. 따라서 StringBuilder 혹은 StringBuffer를 사용해라.

최세민님

고민한 내용

  • Board 에서 배열과 ArrayList 중 어떤 것이 더 좋은 지 고민했습니다. 체스판은 크기가 고정되어 있어 ArrayList의 필요성을 크게 느끼지 못했습니다.
    • 어떤 경우에서든 비즈니스로직이 확장될 가능성이 있기 때문에 확장성을 고려한다면 배열보다 ArrayList가 더 좋은 방안일 수 있습니다.

인상 깊었던 코드

  • 현식님이 객체의 책임을 분리하기 위해 Piece에서 점수 계산을 하지 않도록 Calc 클래스를 구현한 부분이 인상깊었습니다.
  • 준기님이 요구사항에 대해 정말 깊이 고민하시고 본인의 의미로 해석해서 활용하신 부분이 인상깊었습니다.

알게된 내용

  • 메서드 내부에서 정해진 인스턴스와 equals()를 사용할 때 전달된 인자에서 equals()를 호출하기 보다는 확실하게 존재하는 인스턴스에서 equals()를 호출하는 것이 NPE를 방지하는데 도움이 됩니다.
  • Optional에서 map() 을 사용했을 때
  • String.format()StringBuilder 보다 성능이 눈에 띌 정도로 좋지 않아서 사용을 지양하는 것이 좋습니다.

김현종님

  • 크기가 변하지 않는 경우 ArrayList를 생성할 때 초기 크기를 지정해주는 것이 좋다. 초기 크기는 10개래요. 크기 증가는 보통 더블링이래요.
    • 내부에서 배열을 사용하기 때문에 수용 크기를 넘어가면 재할당하면서 오버헤드가 일어날 수 있다.
  • 인터페이스를 통해 정렬 기준을 제한해서 전달받도록 처리한다.

이영민님

  • 멤버변수는 우선 private으로 제한한 뒤 필요에 따라 개선해나가자.
    • 기본적으로 일단 public 으로 필드를 만들고 보는 나쁜 습관이 있다는 것을 알았습니다. 앞으로는 일단 private field 로 만들고 필요에 따라서 public 이나 protected 로 open 하는 습관을 들이고자 합니다!
    • 객체의 캡슐화를 이런 것부터 신경을 쓰는 것이라고 배웠습니다.
  • 중첩 클래스에 관한 논의가 있었습니다.
    • 저는 해당 클래스 내부에서만 쓰이는 클래스 라면 중첩 클래스를 하고 보는 경향이 있었습니다.
    • 일례로 저는 Rank 클래스가 Board 의 내부 클래스 였는데, 코드의 양이 많아지고 메서드가 복잡해지다보니 결국 코드가 길어져 가독성을 굉장히 해치고 있었습니다.
    • 당장의 테스트를 통과하기 위해 너무 막 코드를 짜지 않았나 반성했습니다.
  • Null Safe 를 신경써야한다는 것을 배웠습니다.
    • 개발 중에 급해서 값이 필요없다고 판단되는 곳에 null 을 넣는 실수를 범했는데, 이게 굉장한 안티패턴인 것을 깨달았습니다.
    • 값이 없다면 Null 이 아니라 값이 없음을 표현할 수 있는 값을 넣는 것이 좋겠습니다.

최현식님

  • 체스판 List를 한번더 wrapping 할까 고민이 됬었지만, 오히려 복잡성이 더 증가하는 것 같아 포기!
  • Optional을 사용할 때 [Stream.Map](http://Stream.Map) 사용하면 얻는 효과에 대해서 알게 되었다!
  • 각 기물에 대한 Point를 외부로 분리하는 것에 대한 고민이 있었는데 다른 분들은 다른 생각을 가지고 있는 것을 보고 고민하게 된 것 같습니다.
  • 소프트웨어 설계할 때 많은 고민이 있었는데 다른 분들에 설명을 들으면서 생각을 많이 넓힐 수 있는 기회였던 것 같습니다!
  • StringFormat이 StringBuilder보다 성능상 유의미할 정도로 느리다는 것을 알게되었습니다.
  • Enum을 잘 활용하시는 분이 많아서 자극을 받았음!

김준기님

고민한 / 고민중인 내용 🤔

  • 연관성 있는 상수끼리 묶어서 Enum을 활용하면 좋은데, 어떤 기준으로 묶을지 가끔 애매할 때가 있어서 고민이에요
  • 기물 Enum이 점수를 관리하는 것이 좋을지 조금 더 고민이 필요해요.
  • 안정적인 public interface를 설계하기 위해 어떻게 하면 좋을지 고민이 됩니다.
    • 파라미터나 반환값에 VO를 활용하면 확장이 가능하다.
    • 하지만 오버헤드는 커질 수 있다.
  • 행/열 탐색이 필요한 요구사항에서 행 단위로 묶는 일급 컬렉션의 효용성이 크게 있을까? 라는 생각이 들어요.

공유한 내용 😀

  • 도메인 클래스에서는 getter&setter와 도메인로직을 분리하는 것을 선호하는 편입니다.
  • Optional에서 map()을 사용하면 Optional.EMPTY 라면 무시하고 지나갑니다. 스트림으로 활용하시면 좋아요.
  • String.format()StringBuilder 보다 성능이 유의미하게 좋지않아서 참고하시면 좋을 것 같습니다.

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally