-
Notifications
You must be signed in to change notification settings - Fork 0
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
보다 성능이 유의미하게 좋지않아서 참고하시면 좋을 것 같습니다.