Web/Java

    [Java] Optional 반환값 도대체 어떻게 사용하라는 걸까?

    Optional에 대한 기본적인 정의나 상세한 설명은 다른 블로그에도 설명이 잘 되어있습니다. Optional에 대해 기본적인 숙지를 하시고 보시길 추천드립니다. 블랙잭 미션에서는 로또미션과 다르게 Enum에 쓸모 없는 인스턴스를 두지 않았습니다. 그래서 반환타입에 처음으로 Optional을 사용했는데 get()을 사용해야할 지 orElse()를 사용해야할 지 orElseThrow()를 사용해야할 지 Optional로 반환해 클라이언트에게 책임을 넘기고, 클라이언트는 어떻게 사용해야할 지 앞으로 사용할 방법을 정형화 하기 위해 포스팅을 했습니다. 로또미션 OTHER (나머지) 라는 인스턴스가 존재합니다. public enum Rank { OTHER(0,false, 0), FIFTH(3, false, 5_..

    [Java] for-loop 와 stream.forEach() 는 다르다.

    Java8 에서 Stream이 도입되었습니다. Stream으로 인해 기존의 코드를 더 깔끔하고 가독성있게 바꿀 수 있게 되었습니다. // for-loop for (String item : list) { System.out.println(item); } // stream forEach list.stream().forEach(System.out::println); 하지만 모든 for-loop를 Stream의 forEach로 바꿔도 될까요? " 아닙니다. " 크게 세가지로 모든 for-loop를 forEach로 바꾸지 말아야 할 이유를 소개합니다. 첫번째로 확인해야 할 것은 "굳이 forEach를 사용해야 하는가" 입니다. list.stream().forEach(item -> { if (item.equals(..

    [Java] java.lang.String의 isEmpty() vs isBlank()

    java.lang.String 에는 isEmpty() 와 isBlank() 가 있습니다. 두 메서드는 메서드명만 봤을 때 언뜻 비슷해보이지만 분명한 차이가 있어서 사용할때 정확히 알고 사용하면 좋습니다. isEmpty() 문자열의 길이가 0인 경우에, true를 리턴합니다. isBlank() 문자열이 비어 있거나, 빈 공백으로 이루어져 있으면 true를 리턴합니다. (java 11 이후에 사용이 가능합니다.) isBlank()의 동작방식을 보면 어떤 역할을 하는지 이해하기 쉽습니다. isBlank()는 whitespace(공백)이 아닌 문자의 인덱스와 문자열의 길이를 비교합니다. 빈문자로만 이루어져있는 경우에 nonWhitespace() == length() 이기때문에 true가 리턴됩니다. 마찬가지로,..

    [우테코 프리코스] 최종시험 + 최종합격

    최종시험 일시 : 2021.12.18(토) 13시 ~ 18시 난이도 : 3주차보다 약간 쉬웠던 수준 3주차 과제를 쉽게 변형시켜낼 것이라는 예상과 다르게 아예 새로운 문제가 나왔습니다. 최종시험문제보기 상심할 시간도 없이 문제 이해하고, 설계하고, 기능목록을 작성했습니다. 최종시험 보기전까지 탑다운 방식으로 개발하는 것을 연습했기 때문에 연습한 대로 진행했습니다. 스트림 사용법도 공부해서 바로 실전에 적용했습니다. 시작하자마자 당황했던건 파일입력을 받아야하는 것이었습니다. 파일입력을 직접 구글링하며 방법을 찾고 적용해야했는데, 여기서 시간을 굉장히 많이 썼습니다. 생각보다 Enum 클래스를 만들어서 사용할 일이 많았는데 지난 프리코스 3주차동안 enum은 문제에서 제공해준 Coin enum만 사용해봤기 ..

    [우테코 프리코스] 3주차: 자판기

    🚀 기능 요구사항 반환되는 동전이 최소한이 되는 자판기를 구현한다. 자판기가 보유하고 있는 금액으로 동전을 무작위로 생성한다. 투입 금액으로는 동전을 생성하지 않는다. 잔돈을 돌려줄 때 현재 보유한 최소 개수의 동전으로 잔돈을 돌려준다. 지폐를 잔돈으로 반환하는 경우는 없다고 가정한다. 상품명, 가격, 수량을 입력하여 상품을 추가할 수 있다. 상품 가격은 100원부터 시작하며, 10원으로 나누어떨어져야 한다. 사용자가 투입한 금액으로 상품을 구매할 수 있다. 남은 금액이 상품의 최저 가격보다 적거나, 모든 상품이 소진된 경우 바로 잔돈을 돌려준다. 잔돈을 반환할 수 없는 경우 잔돈으로 반환할 수 있는 금액만 반환한다. 반환되지 않은 금액은 자판기에 남는다. 사용자가 잘못된 값을 입력할 경우 Illegal..

    [우테코 프리코스] 2주차: 자동차 경주 게임

    🚀 기능 요구사항 초간단 자동차 경주 게임을 구현한다. 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는..

    [우테코 프리코스] 1주차: 숫자 야구 게임

    🚀 기능 요구사항 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 포볼 또는 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. 예) 상대방(컴퓨터)의 수가 425일 때 123을 제시한 경우 : 1스트라이크 456을 제시한 경우 : 1볼 1스트라이크 789를 제시한 경우 : 낫싱 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다. 이 같은 과정을 반복해 컴퓨터가 선택한 ..

    [Java] 람다식

    람다식 사용법 함수형 인터페이스 Variable Capture 메소드, 생성자 레퍼런스 람다식 (Lambda expression) 람다식은 메서드를 하나의 '식(expression)'으로 표현한 것입니다. 즉, 람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해줍니다. 메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 '익명 함수(anonymous function)'이라고도 부릅니다. 메서드와 함수의 차이 위의 설명에서 '함수'라는 용어를 사용했습니다. 원래 자바의 객체지향개념에서는 '함수' 대신 '메서드'라는 용어를 사용합니다. 메서드는 기본적으로 함수와 비슷한 의미이지만, 특정 클래스에 반드시 속해야 한다는 제약을 가지고 있습니다. 그래서 자바에선 함수와는 다른 '메서드'라는..

    [Java] 제네릭

    제네릭 사용법 제네릭 주요 개념 (바운디드 타입, 와일드 카드) 제네릭 메소드 만들기 Erasure 제네릭 JDK 1.5에서 처음도입이 되었습니다. 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시에 타입체크 해주는 기능입니다. 장점 객체의 타입을 컴파일시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어듭니다. (타입 안정성 : 의도하지 않은 타입의 객체가 저장되는 것을 막는다는 뜻) 제네릭 클래스 선언 클래스 Box가 아래와 같이 정의되어있으면 class Box { Object item; void setItem(Object item) { this.item = item; } Object getItem() { return item; } } Object 부분을 T로 바..

    [Java] I/O

    스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O InputStream과 OutputStream Byte와 Character 스트림 표준 스트림 (System.in, System.out, System.err) 파일 읽고 쓰기 스트림(Stream) 스트림은 바이트 단위로 데이터를 운반하는데 사용되는 연결통로 입니다. 스트림은 데이터의 흐름을 한쪽 방향으로 흐르는 물에 비유해서 붙여진 이름입니다. 즉, 스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없습니다. 그래서 입력과 출력을 동시에 수행하려면 입력스트림, 출력스트림 모두 2개의 스트림의 필요합니다. 스트림은 먼저 보낸 데이터를 먼저 받게 되어 있는 큐(queue), FIF..