목록Backend/Java (44)
elevne's Study Note
진행하는 프로젝트에서 static 메모리에 저장하는 Map 객체에 접근하는 로직을 구성해야했다. Map 객체는 아래와 같이 하나의 클래스 내에 정의되어 있다. private static final Map MAP = new ConcurrentHashMap(); 프로젝트에 사용된 것은 여러 번 중첩된 Map 객체였다. 위와 같은 형식을 지닌 Map 에 값을 저장하고, 특정 Key 값을 기반으로 값을 불러오는 로직을 작성해야 했던 것이다. 우선 저장을 구현했다. MAP 내에 무한대로 데이터가 저장되면 메모리가 부족해질 수 있으니 따로 지정해둔 시간을 지나게되면 해당 데이터를 삭제해줄 수 있게끔 한다. (이를 위해 위 MAP 의 가장 바깥 Map 의 Key 를 현재시간으로 저장한다) long maxAge = M..

스레드 객체를 생성하고 start() 메서드를 호출하면 곧바로 스레드가 실행되는 것처럼 보이지만, 사실은 실행 대기 중인 상태가 된다. 실행 대기 상태란 아직 스케줄링이 되지 않아서 실행을 기다리고 있는 상태를 말한다. 실행 대기 상태에 있는 스레드 중에서 스레드 스케줄링으로 선택된 스레드가 비로소 CPU 를 점유하고 run() 메서드를 실행하며 실행 상태가 된다. 경우에 따라 실행 중인 스렐드는 실행 상태에서 (스케줄링으로 인해) 다시 실행 대기 상태로 가지 않고 일시 정지 상태로 가기도 한다. 일시 정지 상태는 스레드가 실행할 수 없는 상태로 WAITING, TIMED_WAITING, BLOCKED 세 종류의 상태로 또 나뉠 수 있다. 이러한 스레드의 상태들은 Java 에서도 getState() 메서..

운영체제에서 실행 중인 하나의 애플리케이션을 Process 라고 부른다. 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는 것이 프로세스이다. 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 말한다. 운영체제는 멀티 태스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다. 하지만 멀티 태스킹이 꼭 멀티 프로세스를 뜻하는 것은 아니다. 멀티 쓰레드를 활용하여 애플리케이션 내부에서 멀티 태스킹을 수행할 수 있는 것이다. 멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다. 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향을 주지 않지만, 멀티 쓰레..

클래스가 여러 클래스와 관게를 맺는 경우에는 클래스들을 독립적으로 선언하는 것이 좋으나, 특정 클래스와 관계를 맺을 경우에는 관계 클래스를 클래스 내부에 선언하는 편이 좋다. 중첩클래스, Nested Class 는 클래스 내부에 선언한 클래스로 이를 사용하면 두 클래스의 멤버들을 서로 쉽게 접근하여 사용할 수 있으며 외부에 불필요한 관계 클래스를 감춰 코드 복잡성을 줄일 수 있다. 클래스 뿐만 아니라 인터페이스도 동일하게 사용 가능하다. 중첩클래스는 클래스 내부에 선언되는 위치에 따라서 멤버 클래스와 로컬 클래스로 분류된다. 멤버 클래스는 클래스 멤버로서 선언되는 중첩클래스이고, 로컬 클래스는 메서드 내부에서 선언되는 중첩클래스이다. 또 멤버 클래스는 바깥 클래스를 생성해야만 중첩클래스를 사용할 수 있는..

HttpServletRequest, HttpServletResponse 두 클래스는 Java Servlet API 에서 사용되는 클래스로, HTTP 요청과 응답을 처리하는데 사용된다. 여기서 Servlet 이란 클라이언트의 요청을 처리하고 결과를 응답해주는 자바 웹 프로그래밍 기술을 말한다. HttpServletResponse 는 HTTP 요청 정보를 캡슐화한다. 이 클래스는 클라이언트가 서버에 보낸 HTTP 요청정보를 나타내는 것으로, Servlet 에서 이 정보가 사용된다. getParameter(String name) HTTP 요청의 매개변수 값을 가져온다. getParameterMap() 모든 HTTP 요청 매개변수를 매개변수 이름과 값으로 나타내는 Map 객체를 반환한다. getHeader(St..

Java 7 에서 새로 추가된 try-with-resources 라는 것에 대해서 알아보았다. 이는 예외 발생 여부와 상관없이 사용했던 리소스 객체 (각종 입출력 스트림, 서버 소켓, 소켓, 각종 채널) 의 close() 메서드를 호출해서 안전하게 리소스를 닫아준다. FileInputStream, FileOutputStream 을 과거 Java 의 try-catch 문 안에서 사용할 때는 아래와 같이 작성해야했다. public class Main { public static void main(String[] args) { FileInputStream fis = null; try { fis = new FileInputStream("../output.txt"); ... } catch (IOException ..

간혹 전체 프로그램 내에서 단 하나의 객체만 만들도록 보장해야 하는 경우들이 있다. 이를 Singleton 이라고 부른다. 이를 구현하기 위해서는, 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. 생성자를 외부에서 호출할 수 없도록 private 접근 제한자를 붙여주면 된다. 대신, 외부에서 호출할 수 있는 static 메서드를 하나 선언해주면 된다. 아래의 getInstance 메서드는 단 하나의 객체만 리턴하게 된다. package test_classes2; public class SingletonTest { private static SingletonTest singleton = new SingletonTest(); private SingletonTest() {} stati..

Java 에는 byte, short, int, long, float, double 그리고 char, boolean 8 개의 기본 데이터 타입이 있다. public class Main { public static void main(String[] args) { System.out.println(Byte.MAX_VALUE); System.out.println(Byte.MIN_VALUE); System.out.println(Short.MAX_VALUE); System.out.println(Short.MIN_VALUE); System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); System.out.println(Long.MAX_V..