우테코 3주차 미션 [로또]를 하다가 마주한 요구사항이었다. 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, 에러 메시지를 출력 후 그 부분부터 입력을 다시 받는다. 예제와 함께 구현해보기 간단한 예제를 들어보자. 다음과 같은 함수들을 만들어야 한다고 하자. 0 이상의 양수를 입력받는 getTryCount() 1과 45 사이의 숫자를 중복 없이 6개 받고, 보너스 번호도 받는 getLottoNumber() 그 외 등등 다른 input 함수들 간단히 만들어보기 getTryCount 만들어보기 일단 올바른 값이 들어올 때까지 무한해서 입력을 다시 받아야하니, while + if - break의 조합으로 만들어야 할 것이다. 그리고 잘못된 값이 발생하면 에외를..
이전에 Java에서 불변 데이터 객체를 만들기 위해서는 여러 보일러플레이트들이 많이 필요했다. 그리고 이런 불편을 해소하기 위해 JDK 14부터 record라는 녀석이 추가되었다. getter, equals, hashcode, toString 등을 자동으로 만들어주어, 불변 데이터 객체를 쉽게 만들 수 있게 해준다. 하지만 이런 record를 사용할 때 조심해야 할 점이 있다. public record Person( String[] names, int age ) { } 바로 다음과 같이 레코드의 구성요소에 배열(array)이 있을 경우이다. 레코드의 구성요소에 배열이 존재할 경우, 레코드가 보일러플레이트들을 자동으로 생성해줌에도 불구하고 직접 equals, hashcode, toString을 재정의해주어..
java reflect를 사용하면 클래스에서 멤버변수의 이름들을 얻어오거나, 메소드를 실행하는 등의 다양한 작업을 할 수 있다. 멤버변수들의 정보가 담긴 Field 객체들의 배열을 얻어오는 getDeclaredFields() 메소드와 메소드를 동적으로 실행할 수 있게 해주는 invoke() 메소드를 이용해서 특정 클래스 객체 내의 모든 멤버변수 이름과 값을 가져올 수 있다. 알고리즘 요약 1. getDeclaredFields() 를 통해 멤버변수들의 Field 배열을 얻음 2. getName() 을 통해 각 멤버변수 Field 객체에서 변수명을 얻음 3. ②에서 얻은 변수명을 통해 getter 함수 명을 만든 후 invoke()를 이용하여 getter 함수 실행 후 결과값 얻음 // ※ import ja..
// Boolean to boolean Boolean b = true; boolean bb = b.booleanValue(); // Integer to int Integer i = 10; int ii = i.intValue(); // Character to char Character c = 'a'; char cc = c.charValue(); // Long to long Long l = 2L; long ll = l.longValue(); // Double to double Double d = 5.0; double dd = d.doubleValue(); 이를 이용해서 Integer to double과 같은 경우는 Integer를 언박싱한 후 double로 형변환하면 된다. Integer i = 10; do..
java.lang.ArithmeticException: / by zero 이 에러는 정수를 0으로 나눴을 때 발생하는 오류이다. 하지만 흥미로운 점이 있다. int a = 10; System.out.println(a / 0); 이를 실행할 경우 JVM은 위의 "/ by zero" 예외를 반환하지만 double a = 10; System.out.println(a / 0); int a = 10; System.out.println(a / 0.0); 이 두 경우는 JVM이 Infinity를 반환하게 된다. 따라서 try-catch 문으로 캐치할 수 없다! 이렇게 int 형에서는 예외를 발생하던 코드가 double형 (float 형에서도 동일함)에서는 Inifinity를 반환하는 이유는 Java가 부동 소..