2020-11-19-TIL
입출력은 프로그램의 기본이다.
운영체제는 마우스, 키보드로 입력받아서 모니터로 출력하고,
표준 입력, 출력도 결국엔 파일이다. 그래서 리다이렉션으로 echo “hello” > a.txt 같은 명령이 가능한 것이다. 입력도 마찬가지로 java Test.java < input.txt 로 가능하다. 따라서 프로그램 작성시 입출력은 기본이다.
입력장치 : 키보드, 마우스
출력장치 : 모니터
File IO관련 API는 실제로 open, read, write, setpos, close의 과정을 거친다
자바에서는 파일을 InputStream으로 읽어들인다. 파일 자체로는 읽을 수 있는 대상이 아니다. File 객체에서
Throws는 호출부에게 예외 처리를 맡긴다. Try ~ catch는 내가 직접 메소드 블록 내에서 처리코드를 구현한다.
FileInputStream은 바이트 단위로 읽지만 음수표현 (-1)때문에 int로 리턴한다. byte단위로 가져오기 때문에 조작하기가 매우 까다롭다. 그래서 Character Streams가 조금 낫다.
추상화가 많이 되면 될수록 핸들링은 어렵지만, 쓰기는 편하다.
bos.close() 안하면 마지막 버퍼가 안 비워져서 값이 다 써지지 않는다.
BufferedReader/BufferedWriter를 사용하는 것이 가장 성능이 좋으면서도 편리하다.
자동차를 만드는게 아니라 (엔진, 타이어, 엑셀, 브레이크 포함)
킥보드를 만드는게 낫다. 즉, 부품하나를 제대로 만드는 것보다 온전한 프로그램 하나를 완성하는것이 낫다.
장류진 - 일의 기쁨과 슬픔
문제 - 시계
숫자야구
- 기능에 따라 Parser, Validator, Tokenizer, ProcessRunner 이런 식으로 나누어 보겠습니다!
- 네! 접근 제한자의 학습을 위해서 사용해보았습니다!
- 생성자에 argument로 넘겨주는 방식을 사용하였는데, 이러한 방식이 주입이 맞는지 모르겠습니다. JavaShell 객체가 생성되면서 바로 main에서 생성된 Scanner 객체를 받아오는 방식으로 작성하였습니다.
- clock 패키지의 메소드는 최대한 private로 변경하고, shell에서는 ClockRunner.runClock()메소드만 public으로 호출하는 방식으로 변경하였습니다.
그러고 보니 항상 모각코 시간이 끝나고 체크아웃을 하면, 대부분 방에서 나가는데 계속 이어서 하는분도 계시잖아요? 그런데 혼자만 남으면 의미가 없어져서 나가게 되는 것 같아요. 하지만 다른 그룹에서 남아서 계속 하는 사람이 있다면 방을 합치는 것도 나쁘지 않을 것 같아요.
홀짝게임
- 클래스 이름이 적절한지는 모르겠지만(이벤트에 따라 핸들링하는 것은 아니므로..), 적당한 이름이 도저히 떠오르지 않아서 일단
Handler
로 명명하고 분리시켜 보았습니다. Scanner
를betMoney
에서 생성하면main
에서의Scanner sc
와 이름은 같지만, 별도의 지역변수에 새로 생성한Scanner
가 저장되겠네요. 그리고sc.close()
를 해주지 않아서 문제가 되는군요.main
에서 생성한 후,Handler
에 주입하는 방식으로 수정했습니다. (3주차 미션에서 honux가 힌트로 준 방법을 사용했습니다.)- 불필요한
continue;
였네요. 흐름상 문제가 없어서 제거했습니다! - 삼항 연산자가 필요 없군요. 그렇게 수정했습니다.
- 이 부분은 쉽지 않네요. 객체 간의 메시지 패싱에 대해서는 좀 더 공부해야겠습니다. 조영호 님의 책도 열심히 읽으면서 이해하려고 노력 중입니다!
getter
,setter
사용하지 않는 부분은 지웠습니다.
가계부
- ‘가계부 정보’가 무엇을 말하는지 모르겠어요! 혹시 현재는 남아있지 않은 .iml 파일인가요?
- DAO/DTO는 추후 확장성을 염두해두고 정한 클래스네임 입니다. DB를 추가하는 미션이 있을지 몰라서 그렇게 작성해둔 것입니다. 지금은 DAO/DTO라고 하기에는 좀 그렇죠. 혹시 제가 모르는 다른 특별한 의미가 있을까요?
public static boolean exitCode = false
에 대해서 말씀하신건가요? 일단, 이 변수는 사용자의 커맨드에 따라 전역적으로 실행 중지할 수 있도록 하기 위해서 선언하였습니다. 만약에 변하면 안되는 값이라면 final로 값을 고정해두어야합니다. 어떠한 메소드에 얼마나 중첩되어 있더라도 탈출하도록 하려다보니 static으로 저런 변수를 사용했는데, 우아한 방법이 떠오르질 않네요. 인자로 전달하는게 더 나으려나 모르겠네요.- 인스턴스가 생성되지 않는다면 NullPointException이 일어날 수 있습니다. 따라서 생성자에서 초기화해주는 방식을 사용하도록 수정했습니다.
- 네, 일단 throws로 예외 처리를 상위 객체로 넘겨주는 방법으로 수정하였습니다.
- 변수없이 리턴하는게 깔끔해보이네요! 수정했습니다.
- TODO가 맞습니다 ;)
- equals를 사용해야하는데 실수를 했네요. 이런 실수를 절대 하면 안되는데 주의해야 겠습니다.
- 여러가지 기준에 대해 정렬하기 위해 compareTo만으로는 한계를 느껴서 Comparator 객체를 만드는 방법으로 수정해야겠습니다.
- 간결한 코드로 보이고자 하는 욕심(?)을 버리고, 블록으로 감싸는 것을 습관화해야 겠네요.
- 이 부분은 파일에서 sc.nextLint()으로 읽는데, 마지막 라인에서 개행이 있다면 NullPointException이 발생하여서 예외처리한 부분입니다.
- 네, 주석에도 달아놓았지만 프로그램 실행이 되는 동안에 변경사항이 반영되지 않아서 어쩔 수 없이 저렇게 작성하였습니다. DB를 사용했다면 저런 코드는 필요가 없겠지만요.
- 네, ledger로 변경했습니다.
continue
를 하는게 for each문에서 더 자연스러운 것 같네요. 저렇게 하면 중간에 만약에 null이 있더라도 끊어지지 않고 진행할 수 있겠네요.
객체간의 메시지 패싱
https://woowabros.github.io/study/2016/07/07/think_object_oriented.html
Scanner injection in Java
https://stackoverflow.com/questions/21887928/using-a-scanner-across-multiple-classes-in-java
https://stackoverflow.com/questions/34474045/is-there-any-way-i-can-use-a-scanner-object-in-a-different-class
Handler
https://www.quora.com/What-is-an-handler-in-programming
DAO/DTO
https://stackoverflow.com/questions/14366001/dto-and-dao-concepts-and-mvc
https://stackoverflow.com/questions/35078383/what-are-the-dao-dto-and-service-layers-in-spring-framework
https://velog.io/@emawlrdl/DAO%EC%99%80-DTO
카카오 경력 공채
https://encyphered.github.io/blog/note/2018/09/26/kakao-interview-review.html