목록Java (37)
개발놀이터
컬렉션 프레임워크란? 배열을 사용하다 보면 여러가지 비효율적인 문제가 생긴다. 가장 큰 문제점은 크기가 고정적이라는 것이다. 배열의 크기는 생성할 때 결정되며 그 크기를 넘어가게 되면 더이상 데이터를 저장할 수 없다. 또 데이터를 삭제하면 해당 인덱스의 데이터는 비어있어 메모리가 낭비되는 등 여러 문제점들이 발생한다. 그렇기에; 자바는 배열의 이러한 문제점을 해결하기 위해, 널리 알려져 있는 자료구조를 바탕으로 객체나 데이터들을 효율적으로 관리할 수 있는 자료구조들을 만들어두었다. 이러한 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 한다. 대표적으로는 List, Set, Map, Stack, Queue등이 있다. List 컬렉션 컬렉션 프레임워크를 상속받고 있는 List컬렉션은 객체를 일렬로 늘어..
GC의 정의 GC는 Garbage Collector의 약자로 힙 영역에서 사용하지 않는 객체들을 제거하는 작업을 총칭한다. 이 객체를 제거하는 작업이 필요한 이유는 자바는 개발자가 메모리를 직접 해제해줄 수 없는 언어이기 때문이다. 따라서 객체를 사용하고 제거하는 기능이 필요하게 된다. GC의 동작방식 GC의 동작방식을 정리하면 다음과 같다. GC의 동작방식은 가장 간단한 Serial GC 방식으로 설명한다. GC는 Minor GC, Major GC로 구분한다. Minor GC는 young한 영역에, Major GC는 old한 영역에서 일어난다. GC를 수행할 때는 GC를 수행하는 스레드 이외의 스레드는 모두 정지한다. Minor GC는 Eden 영역이 가득 차면 시작한다. Eden 영역에서 참조가 남아..
위 그림은 자바 코드의 실행 과정을 간략하게 보여준다. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로하는 메모리를 할당 받는다. (JVM은 이 때 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.) 자바 파일(.java)이 자바 컴파일러에 의해 자바 바이트코드(.class)로 변환된다. 클래스 로더를 통해 자바 바이트 코드를 JVM으로 필요한 시점에 로딩한다. 해석된 바이트 코드는 런타임 데이터 영역에 배치되어 실질적인 수행이 이루어진다. 실행 과정 속에서 JVM은 필요에 따라 GC와 같은 관리 작업을 수행한다. 자바 코드가 실행되는 과정을 살펴보면 C / C++과는 다르다는 것을 알 수 있다. C / C++은 운영체제별로 컴파일러가 존재하여 해당 운영체제가 인식할 수 있는 기계어로 변환된..
도입 GOF 디자인 패턴 중 템플릿 메서드 패턴을 공부하던 중에 공통 로직인 AbstractTemplate를 구성하는 요소중 abstract라는 키워드를 발견하게 되었고 이에 대해 검색을 했더니 기능이 인터페이스랑 비슷한것을 발견했다. 둘의 차이점이라곤 추상클래스는 extends를 사용하는 상속이고 인터페이스는 implements를 사용한다는 것이다. 둘 다 추상메서드를 가지고 있으며 이 추상메서드를 추상클래스의 자식클래스나 인터페이스의 구현체에서 반드시 구현해야 한다는 공통점을 가지고 있었다. 이처럼 공통점을 가지고 있지만 서로 다른 역할을 할것으로 추측해서 둘의 차이점에 대해서 정리해봤다. 또한, 추상클래스와 인터페이스를 가벼운 예제코드를 통해 어느 상황에서 사용하는지 이해하는 시간도 가져볼 것이다...
스레드에 대해 공부하다 보니 문득 궁금증이 생겼다. https://coding-review.tistory.com/90 스레드와 멀티스레드 스레드 스레드를 알기전에 우리는 프로세스에 대해서 알아야한다. 프로세스는 무엇인가? 프로레스란 단순히 실행중인 프로그램이라고 할 수 있다. 즉, 사용자가 작성한 프로그램이 운영체제에 coding-review.tistory.com 생각해보니 우리는 스레드란 말을 어디선가 들어봤다. 바로 CPU의 코어와 스레드이다. 자바의 스레드와 CPU의 스레드는 같은의미일까? 다른의미일까? 글에 들어가기 앞서 CPU의 스레드를 하드웨어 스레드 자바같은 언어가 지원하는 스레드를 소프트웨어 스레드라 칭하겠다. 하드웨어 스레드 하드웨어 스레드를 설명하기 전에 CPU의 코어를 먼저 알아보자 ..
스레드 스레드를 알기전에 우리는 프로세스에 대해서 알아야한다. 프로세스는 무엇인가? 프로레스란 단순히 실행중인 프로그램이라고 할 수 있다. 즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다. 이러한 프로세는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다. 그럼 스레드는 무엇인가? 스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다. 모든 프로세스는 한개 이상의 스레드가 존재하여 작업을 수행한다. 또한, 두개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다. 예를 들어 Controller - Service - Repository로 이어지는 로직을 하나의 프로세스라 하면 이 프로세스는 하나의 스레드가 할당되어 실..
*람다식의 대한 고찰 람다식은 내 입장에서 다른 자바8 내용인 Optional과 LocalDateTime과 다르게 이해하기 상당히 까다로운 내용이었다. 내가 나름대로 이해한 내용을 기록으로 적어 남긴다 *stream API에서의 람다식 -사고의 시작 Map paramMap = new HashMap(); request.getParameterNames().asIterator().forEachRemaining(paramName -> paramMap.put(paramName, request.getParameter(paramName))); 람다식 안에 있는 paramName은 어떻게 구분하지? 자바 코드는 뭘 가지고 판단해서 paramName을 지정하는 것이지? request.getParameter(paramNa..
*Optional클래스 Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해주는 래퍼 클래스(Wrapper class)이다. 따라서 Optional클래스는 모든 타입의 참조 변수를 저장할 수 있다. 이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 즉, 복잡한 조건문 없이도 널값으로 인해 발생하는 예외를 처리할 수 있게 된다. Optional 객체를 생성하기 위해서는 메서드를 사용해야 한다. Optional도 stream API 처럼 생성, 중개연산, 최종연산이 있다. *Optional 객체 생성 -Optional.of value가 null인 경우 예외가 터진다. 반드시 값이 있..
*사용법 ①선언 import java.util.Timer import java.util.TimerTask ②초기화 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override }; ③구현 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { 반복하고싶은 코드 } }; timer.scheduleAtFixedRate(task, 1000, 60 * 1000); scheduleAtFixedRate의 첫번째 인자값은 반복하고싶은 TimeTask, 두번째 인자값은 해당 인자값 후에 실행, 세번째 인자값은 몇초단위로 반복할지 단위는 ms 즉..
*스트림 API Java SE 8 부터 추가된 스트림 API는 파일입출력에서의 스트림과는 전혀 다른 개념이다. 자바에서는 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 사용한다. 이렇게 저장된 데이터에 접근하기 위해서는 반복문이나 반복자를 사용하여 매번 새로운 코드를 작성해야한다. 하지만 이렇게 작성된 코드는 길이가 너무 길고 가독성도 떨어지며, 코드의 재사용이 거의 불가능하다. 즉, 데이터베이스의 쿼리와 같이 정형화된 처리 패턴을 가지지 못했기에 데이터마다 다른 방법으로 접근해야만 했다. 이러한 문제점을 극복하기 위해서 Java SE 8 부터 스트림 API를 도입했다. 스트림 API는 데이터를 추상화하여 다루므로, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다. 따라서 ..