목록java (8)
dev-sohee 님의 블로그
I/O(Input/Output)은 파일을 쓰거나 불러올때 또는 서버에 보낼때 입출력을 통칭하는 용어입니다.그런데 JDK 1.4부터 NIO라는 것이 추가되었습니다.이 글에서는 NIO가 왜 추가된 것인지, I/O와 어떤 점이 다른지 알아보겠습니다. 먼저 I/O와 비교했을 때 NIO가 다른 점을 표로 살펴보겠습니다. # 입출력 방식스트림(Stream): 데이터가 들어온 순서대로 흘러다니는 단방향의 통로입구를 InputStream, 출구를 OutputStream이라 합니다. 스트림을 통해 데이터는 byte 형태로 흘러다닙니다.채널(Channel): 데이터가 흘러다니는 양방향의 통로채널은 양방향이기 때문에 스트림처럼 Input과 Output을 구별하여 따로 만들 필요가 없습니다. 기본적으로 버퍼를 통해서만 rea..
프로그램이 실제로 실행되어, 메모리나 CPU와 같은 자원을 할당 받으면 이를 프로세스라고 부릅니다. 스레드는 프로세스 내에서 실제로 작업을 수행하는 가장 작은 단위입니다. 모든 프로세스에는 한 개 이상의 스레드가 존재하고, 동시에 두 개 이상의 스레드가 처리되는 것을 멀티 스레드라고 합니다. 프로세스 내부의 스레드는 같은 자원을 공유하여 사용하기 때문에 동시에 여러가지 일을 수행할 수 있고, 웹 서버에서 빠른 응답이 가능하다는 장점이 있지만, 여러 스레드가 하나의 자원을 공유하고 있기 때문에 동시성 문제가 발생할 수 있습니다. 예를 들어, 여러 스레드가 공유 자원에 동시에 접근하여 그 자원의 상태를 변경하려고 한다면, 자원의 상태가 예측할 수 없는 결과를 초래할 수 있습니다.이 글에서는 이렇게 문제가 될..
세상의 모든 프로그래밍 언어가 그렇듯 자바도 완벽하지는 않습니다. 그래서 자바는 개발자의 편의 및 성능 향사을 위해 지속적으로 업그레이드 되고 있습니다. 이 글에서는 자바의 다양한 버전 중 Java 8, Java11, Java17에 대해 알아보겠습니다.* Java 8* Java 11* Java 17 그 많은 버전 중에서 특별히 3가지를 선택한 이유는 바로 8, 11, 17이 LTS 버전이기 때문입니다.LTS(Long Term Support)는 오랜 기간 지원하는 특별한 버전의 에디션이며출시 이후 8년간 보안 업데이트와 버그 수정을 지원해주기 때문에 대부분 LTS 버전을 사용합니다. # Java 8오라클이 자바 인수 후 출시한 첫 번째 LTS 버전32bit를 지원하는 마지막 공식 Java 버전Oracle ..
malloc()과 free()는 런타임 도중에 사용할 메모리 공간 할당과 해제를 위한 즉, 동적 메모리 사용을 위한 C언어의 대표적인 함수들입니다. C언어로 개발을 해보신 분들이라면 이 함수들을 봤을 때 인상을 찡그리실 수도 있습니다.malloc()을 사용하는 순간 시스템은 사용하지 않는 메모리를 할당하고 이에 대한 포인터를 리턴합니다. 이것은 프로그램의 실행 지체를 유발하기 때문에 조심해서 사용해야 하는 아주 까다로운 녀석입니다. 그리고 malloc()으로 메모리를 할당한 후에 free()로 해제를 안하면 메모리 누수, 성능 저하의 문제가 발생할 수 있으므로 free()도 꼭 잊지말고 해줘야 합니다. 하지만 자바에서는 이런 고민을 할 필요가 없습니다. 자바의 가비지 컬렉터가 알아서 해주니까요. 이 글..
인터프리터는 바이트 코드를 한줄 한줄 읽으면서 OS가 실행할 수 있도록 기계어로 번역을 하는 방식입니다. 초기 JVM은 인터프리터 방식만 이용하여 한줄 한줄 읽기 때문에 실행속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 도입해 속도를 보완했습니다. 오늘은 JIT 컴파일러가 무엇인지, 어떻게 JVM의 속도를 개선했다는 것인지 자세히 알아보겠습니다.* 인터프리터 * 컴파일러* JIT-Compiler(Just-In-Time) # 인터프리터와 컴파일러 컴파일러는 소스코드 전체를 컴퓨터 프로세서가 실행할 수 있도록 바로 기계어로 변환합니다. 인터프리터는 고레벨 언어를 중간 코드(intermediate code)로 변환하고 이를 각 행마다 실행합니다.파이썬은 인터프리트 언어이고 C, C++는 컴파일 언어..
혹시 개발자가 코드를 짜는 모습을 상상해본 적이 있으신가요?개발을 경험해본 적이 없는 사람이라면 머릿속에 있는 것들을 타자를 치면서 바로 실현시키는 개발자의 모습을 상상하실 수도 있습니다. 하지만 실제 개발 과정에서는 저렇게 결과물을 뚝딱 만들어낼 수 없습니다.어떤 시스템을 개발하든 간에 일반적인 절차라는 것이 있습니다. 일반적인 절차는 다음과 같습니다.1. 분석- 시스템을 만들어 달라고 한 사람들에게 어떻게 개발하기를 원하는지 물어보며 요구사항을 분석하는 단계입니다. 2. 설계- 분석 단계에서 만든 대략적인 그림을 프로그램으로 만들 수 있도록 설계하는 단계입니다. 이 단계에서 어떤 클래스, 어떤 메서드, 어떤 변수를 만들 것인지 등의 세부적인 것들을 정리합니다.예시) 시퀀스다이어그램, ERD, 클래스 ..
이 글에서는 자바의 핵심이자 두뇌인 JVM에 대해 깊이 알아보겠습니다. * 클래스 로더* 실행 엔진* 메모리 영역 # 클래스 로더자바는 동적 로드, 즉 컴파일 타임이 아니라 런타임(바이트 코드를 실행할 때)에 클래스를 로드하고 링크한다는 특징이 있습니다. 이 동적 로드를 담당하는 부분이 JVM의 클래스 로더입니다. 정리하자면, 클래스 로더는 런타임 중에 JVM의 메서드 영역에 동적으로 Java 클래스를 로드하는 역할을 합니다.**바이트코드란? : 자바 소스 코드를 컴파일한 결과로 생성되는 중간 코드. 자바 소스 파일(.java)을 자바 컴파일러(javac)에 의해 바이트코드(.class)로 변환한다. 사람이 읽기 쉽도록 쓰인 소스코드와 비교했을 때, 바이트 코드가 덜 추상적이며, 더 간결하고, 더 컴퓨터..
저는 첫 직장의 첫 프로젝트에서 C언어로 개발을 시작했습니다. 반복문이나 연산이 많은 프로그램에서 C언어의 저수준 접근 방식은 코드 최적화에 유리하여 고성능 애플리케이션을 작성할 수 있다는 장점이 있고 메모리 관리나 포인터 같은 개념을 깊이 이해하는 데 큰 도움이 되었습니다. 그러나 시간이 지나면서 소프트웨어 개발의 복잡성이 증가할수록, 대규모 소프트웨어 개발에 효율적인 프로그래밍 언어의 필요성을 느꼈고 자바를 공부하기 시작했습니다. 자바의 구동원리에 대해 공부하면서 JVM(Java Virtual Machine)에 대해 알게 되었습니다. 처음에는 단순히 자바 프로그램을 실행하기 위한 환경으로만 생각했지만, 점차 그 내부 구조와 동작 원리에 대해 더 깊이 이해하고 싶어졌습니다. JVM은 자바 프로그램을 ..