나만의 WAS 서버를 구현하는 도중에 클라이언트의 HTTP 메시지를 요청받고, 이를 파싱해 객체로 다루기 위한 작업이 필요했다. 이 과정에서 생성된 HttpRequestMessage 라는 클래스는 처음 파싱 이후 수정될 일이 없다는 특성을 가지고 있다. 이 특성을 만족하기 위한 객체지향 프로그래밍에서 사용되는 불변 객체에 정리하고자 한다. 불변 객체 (Immutable Object)? 불변 객체는 객체가 생성된 이후에 그 상태를 변경할 수 없는 객체를 의미한다. 한 번 생성된 객체는 재할당 되는 것이 아니라면 영원히 그 상태가 변하지 않는다. 자바에도 불변 객체가 존재한다. java.lang.String 문자열 클래스가 그 예이다. String 으로 생성된 문자열 객체의 메서드를 직접 살펴본다면 내부의 ..
스레드 Thread 운영 체제를 배웠다면 스레드의 개념은 익히 알 것이다. 스레드는 프로그램 수행의 가장 작은 단위를 의미한다. 스레드는 한 가지 일을 하는 프로세스의 단점을 극복하고자 여러 가지 일을 동시에 하기 위해 탄생했다. 스레드는 다음과 같은 생성 주기를 갖는다. 💡 스레드의 생성 주기 Runnable: 준비 상태로 CPU 를 점유하고 있지 않으며 대기하고 있는 상태이다. Running: 실행 상태로 CPU 가 점유하고, 실행중인 상태를 의미한다. Dead: 수행할 동작이 모두 실행이 완료된 상태를 의미한다. Blocked: 실행 중에 일시 중단되어 CPU 점유를 잃은 상태를 의미한다. wait() 메서드를 통해 대기 상태로 전환되며, 대기 상태에서 notify() 메소드를 통해 Runnable..
테스트 코드 작성의 중요성은 이제는 널리 알려져 있다. 어떤 코드든 예상치 못한 상황이 발생할 수 있기에, 이를 방지하고자 테스트 코드를 작성한다. 단위 테스트, 기능 테스트 다양한 기준으로 작성되며, 테스트 코드를 먼저 작성한 뒤 구현을 하는 TDD, DDD, BDD 등 다양한 개발 방법론도 존재한다. 테스트 코드 작성을 위해 다양한 도구들이 사용된다. 그중 Java를 테스트하기 이한 JUnit에 대해 간단히 살펴보고, 조금 더 다양하게 테스트하기 위한 Assertion 메서드들을 정리해보려 한다. JUnit 이란? JVM 위에서 쉽게 테스트를 할 수 있게 해주는 도구이다. 이번 내용에서 다루는 JUnit5는 Java 8 이상에서 동작함에 유의하자! Assertion 이란? 테스트를 수행하며, 결과에 ..
equals를 사용한 테스트 코드를 작성하고, 실제 기능을 구현한 뒤 테스트 해보았지만, 실패했다. 분명 내 코드에는 문제가 없다고 생각했고, 열심히 디버깅을 해 본 결과 equals 메소드에서 서로 다른 메모리 주소를 갖기 때문에 false를 반환했던 것이다. 이러한 문제는 equals, hashcode 재정의를 통해 해결할 수 있지만, 좀 더 근본적인 이유를 간단히 정리해보고자 한다. 자바의 동일성 (identify), 동등성 (equality) 먼저 자바의 동일성과 동등성에 대해 알아보자. 동일성 (identify) 이란 무엇일까? 나는 동일성 (identify) 이란 태생부터 존재하는 유일한 것이라고 생각했다. 나 홍길동은 태어나서 존재하는 단 한 명의 인간이다. 나와 같은 이름을 가진 다른 홍길..
패키지 import java.io.*; import java.util.*; 입출력 // 선언 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st; // 한줄 입력받기 br.readLine(); // 한줄 입력받고, 쪼갤 준비 st = new StringTokenizer(br.readLine()); // 토큰 단위로 하나씩 쪼개기 st.nextToken(); // 원하는 자료형으로 변환 int N = Integer.parseInt(br.readLine()); int N = Integer.parseInt(st.nextToken()); // EOF 처리 String input = ""; while..
그동안 파이썬으로 백준 문제를 풀 때 VScode를 활용해서 풀었다. 입출력을 빠르고, 쉽게 보기 위해 리다이렉션(redirect) 을 활용해서 테스트 케이스를 확인했는데, 자바로 언어를 바꾸면서 같은 방식을 사용하고 싶었다.. 다음과 같은 문제(문제는 KAUPC 문제..) 가 주어지면 예제를 복사하고 실행하면 다음처럼 Input.txt 파일에서 입력받고, Output.txt 파일에 출력이 저장된다. 즉, 텍스트 파일로 입출력을 저장할 수 있다. 이렇게 풀다보니까 적응돼서 없인 못 풀겠다.. 인텔리제이에서도 해당 기능을 사용할 수 있다. 먼저 같은 폴더에 input.txt / output.txt 를 각각 만들어준다. 메인 클래스를 한번 빌드해주고, 우측 상단에 구성 편집을 들어가 준다. 다음 화면에서 빌..