JAVA

JAVA

[JAVA] 크리스마스 프로모션을 구현하면서 배운점

마지막 미션은 새로운 주제의 미션이었다. 이번에도 그전과 동일하게 회고의 느낌으로 작성할 예정이다. 내가 고민한 점과 적용한 점 수정했던 부분 및 이유를 작성할 것이다. 고민거리 이번에 enum을 적용해야 하는 상황이 거의 필수적으로 일어났다고 생각했다. 그래서 이를 적용했는데, 문제는 얼마나 나눌 것인가에 대한 고민이었다. 처음에는 카테고리마다 전부 나누고 메뉴판에서 통일하는 방식을 생각했다. 하지만 이러한 방법은 복잡도가 올라간다는 생각도 했고, 입력으로 들어온 값을 찾기가(이름으로 매칭되는 값) 번거롭다는 느낌을 받았다. 물론 분리가 잘되어있다는 생각이 들긴 함. 그래서 한눈에 보기에도 편하고 매칭되는 값을 찾기도 편하게 전부 모아서 관리하였다. 물론 정말 확장 가능성도 생각한다면 다른 방법이 더 ..

JAVA

[JAVA] 로또를 구현하면서 배운점

우아한테크코스 6기 프리코스 3주 차는 로또였다. 이번에도 그전과 동일하게 회고의 느낌으로 작성할 예정이다. 내가 고민했던 부분과 적용한 점 수정했던 부분을 이유로 작성할 것이다. 미션에서 Randoms.pickUniqueNumberInRange를 사용해야 했기에 이를 먼저 분석했다. validate를 통해 검증을 거치는데, 이때 validate 메서드의 이름이 validateRange로 되어있었다. 네이밍에 대한 고민이 많던 나에게는 큰 도움이 되었다. 범위 내의 숫자를 담고 셔플을 통해 섞은 다음 필요한 크기로 잘라내는 로직이었다. 이런 역할 분리를 보고 각각의 메서드가 하나의 일만 수행하며 적절히 분리되어 있다고 느꼈다. 그동안 정적 팩토리 메서드를 사용하는 모습과 거의 동일하여 이대로 진행하면 되..

JAVA

[JAVA] 자동차 경주를 구현하면서 배운점

우아한 테크코스 6기 프리코스 2주 차는 자동차 경주였다. 이번에도 저번 숫자 야구 게임에 이어서 회고의 느낌으로 작성할 예정이다. 내가 했던 고민과 수정했던 부분에 대한 이유를 주로 작성할 것이다. 고민거리 미션 중에 시도 횟수만큼 반복을 하는데, 이때 이 시도 횟수를 어떻게 처리할지에 대한 고민을 했다. 정확히 말하자면 나는 시도 횟수는 양의 정수여야 한다고 판단했다. 그렇다면 이 값에 대한 검증이 존재해야 하는데 이를 어디서 진행할 것인가? 나는 총 3가지를 고민했다. 첫 번째는 InputValidator였다. 즉 inputView를 받자마자 이를 예외를 검증하는 것이다. 하지만 이는 단순히 시도 횟수만을 위한 검증이라는 생각이 들기도 하였고, InputValidator는 빈 값만 체크하도록 전체 ..

JAVA

[JAVA] 숫자 야구 게임을 구현하면서 배운점

이번에 우아한 테크코스 6기 프리코스에서 숫자 야구 게임을 구현해 보았다. 공통 피드백도 나왔기에 회고의 느낌으로 작성할 예정이다. 평소에도 객체지향에 관심이 많았고, 이를 충분히 적용하려고 노력하였다. 하지만 역시 코드에 정답은 없기에 미션을 수행하면서도 많은 고민을 하였다. 우선 구현에 사용하도록 외부 라이브러리가 포함되어 있었다. 이를 분석하고, 사용하기 위해 클래스 내부를 뜯어보았다. 내부에서 ThreadLocalRandom를 사용하여 랜덤 값을 생성하는데, ThreadLocalRandom를 찾아보니 동시성 문제에도 성능 저하 없이 사용할 수 있다는 특징이 있었다. Console의 경우에는 scanner를 싱클톤으로 사용하여 효율적으로 리소스를 활용하는 모습이었다. 살아있는 문서 가장 처음 목표로..

JAVA

[JAVA] 체스를 구현하면서 배운점

저번 블랙잭을 이후로 이번에는 체스를 구현해 보았다. 우선 설계를 조금 디테일하게 잡아서 진행하였다. 물론 첫 설계를 끝까지 가져가지는 못했다.. 중간에 추가된 부분이 조금은 있다. 그래도 처음보단 설계하는 실력도 늘었다고 생각한다. 진행하면서 고민하고 배운 것을 정리하였다. 고민했던 것 우선 첫 번째 고민은 각각의 기물들의 위치와 기물을 Map으로 관리하였다. 이때 위치를 단순하게 String으로 관리하려 했다. 하지만 이럴 경우 예외처리를 하는 경계도 애매해지고, 관리하기가 힘들 것 같다고 판단하였다. 그래서 위치 즉 Location도 객체로 관리하여 예외를 처리하도록 하였다. 위치도 더욱 나눌 수 있기 때문에 행과 열을 체스의 용어에 맞게 분리하여 코드를 작성했다. 또 다른 고민으로는 기물이 없는 ..

JAVA

[JAVA] 블랙잭을 구현하면서 배운 점

평소에 자바를 어느 정도 잘 안다고 생각하였지만, 실제 어떠한 요구사항이 있었을 때 이를 구현하는데 생각보다 어렵다는 것을 느꼈다. 기본기가 매우 중요하고 자바를 이론으로 아는것과 실제 적용하며 몸으로 깨닫는 것은 매우 큰 차이가 있기에, 평소에도 도움을 많이 받는 친구에게 코드리뷰를 받으며 블랙잭을 구현해 보았다. 그 과정에서 내가 느끼고 배운 것을 정리하려고 이 글을 작성한다. 배운 점 기본적인 자바 컨벤션, 클린코드, 네이밍 평소에도 이론적으로는 어느 정도 알고 있다고 생각하였지만, 스스로가 많이 놓치고 있는 부분이었다. 개행을 어느 부분에서 해야 하고, 메서드 순서를 어떤 식으로 해야 하는지에 대해 무지했던 것이다. 우선 개행의 경우 변수를 선언할 때 접근자가 달라지거나 final 키워드의 유무에..

JAVA

[JAVA] 리플렉션(Reflection)

리플렉션(Reflection)이란? 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 말하며, 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이라 할 수 있다. 언제 사용할까? 동적으로 클래스를 사용해야 할 때 사용한다. 다시 말해, 작성 시점에는 어떠한 클래스를 사용해야 할지 모르지만 런타임 시점에서 가져와 실행해야 하는 경우 필요하다. 프레임워크나 IDE에서 이런 동적 바인딩을 이용한 기능을 제공한다. 리플렉션을 통해 알 수 있는 정보 Class Constructor Method Field 리플렉션 예시 public class Parent { private String str1 ..

JAVA

[JAVA] 불변 객체를 사용해야 하는 이유

불변 객체(Immutable Object)란? 불변 객체란 객체 생성 이후 내부의 상태가 변하지 않는 객체이다. 불변 객체는 read-only 메소드만을 제공하며, 객체의 내부 상태를 제공하는 메소드를 제공하지 않거나 방어적 복사(defensive-copy)를 통해 제공한다. Java의 대표적인 불변 객체로는 String이 있다. String name = "Immutable"; name.toCharArray()[0] = 'A'; System.out.println(name); //Immutable Java의 String은 불변 클래스이기 때문에 위와 같이 String 내부의 char형 배열을 얻어 수정하여도 반영이 되지 않는다. Java에서는 배열이나 객체 등의 참조(Reference)를 전달한다. 그렇기..

JAVA

다양한 가비지 컬렉션(Garbage Collection) 알고리즘

다양한 가비지 컬렉션(Garbage Collection) 알고리즘 JVM이 메모리를 자동으로 관리해 주는 것은 개발자의 입장에서 상당한 메리트이다. 하지만 문제는 GC를 수행하기 위해 Stop The World에 의해 애플리케이션이 중지되는 것에 있다. Heap의 사이즈가 커지면서 애플리케이션의 지연(Suspend) 현상이 두드러지게 되었고, 이를 막기 위해 다양한 Garbage Collection(가비지 컬렉션) 알고리즘을 지원하고 있다. Serial GC Serial GC의 Young 영역은 앞서 설명한 알고리즘(Mark Sweep)대로 수행된다. 하지만 Old 영역에서는 Mark Sweep Compact 알고리즘이 사용되는데, 기존의 Mark Sweep에 Compact라는 작업이 추가되었다. Com..

JAVA

[JAVA] Private 메서드 테스트 방법 및 지양하는 이유

Private 메소드를 테스트하는 방법 예를 들어 id를 만들때 해당 id의 길이가 2에서 10 사이가 아니라면 UUID를 생성하여 반환하는 다음과 같은 코드가 있다고 하자. @Service public class PrivateTestClass { public String makeID(String id) { if (isCollectID(id)) { return id; } return UUID.randomUUID().toString().substring(0,10); } private boolean isCollectID(String id) { return 2

javajoha
'JAVA' 카테고리의 글 목록