Java

    [Java] 예외(Exception)의 종류

    개발하면서 절대 안마주쳤으면 하지만 결국에는 마주하게되는게 바로 예외인 것 같습니다. 이 예외에도 큰 틀에서 종류가 존재한다는 것을 알고 계셨나요? 지금부터 바로 알아보겠습니다! 예외(Exception)와 에러(Error)는 다르다 예외를 설명하기전에 우선 예외와 에러에 대해서 간단히 짚고 넘어가겠습니다. 우리는 보통 예외가 발생하면 에러가 발생했다고 생각합니다. 하지만 Java에서 예외와 에러는 엄연히 다른 개념입니다! 에러(Error): 에러는 자바 프로그램 밖에서 발생한 오류를 뜻합니다. 예시로 프로그램이 동작하는 서버 자체가 고장이 났다거나, OS에 비정상적인 상황이 발생해서 JVM이 제대로 실행될 수 없는 경우 등이 있습니다. 예시를 보면 아시겠지만 에러는 애플리케이션 내 코드로 해결할 수 없기..

    [Java] String과 String Constant Pool

    String은 자바에서 자주 쓰이는 자료구조이자 어떻게 보면 특별하 자료구조인데요! 오늘은 자바의 String에 대해서 살짝 깊게 다뤄보겠습니다~!! String 이란? 먼저 프로그래밍 언어에 제약되지않은 String이라는 개념에 대해서 설명해보려고 합니다. 너무도 당연한 얘기지만 자바에서 String을 설명하려면 꼭 필요하기 때문입니다. String은 한국어로 문자열이라고도 부르는데요, 여러 문자(Character)들이 모여서 하나의 집합으로 이루어진것을 우리는 문자열이라고 부릅니다. 그래서 그런지 자바 이전에 등장했던 C 에서는 String이라는 자료구조가 따로 존재하지 않습니다. 문자열을 사용해야할때는 char* (포인터) 또는 char[] (배열)의 형태로 문자열을 간접적으로 나타내죠. C++ 에..

    [Java] Set Collection (HashSet, TreeSet, LinkedHashSet)

    Set은 List와 더불어 엄청 자주쓰이는 인터페이스입니다. 둘다 Collection 인터페이스를 기반으로 구현한 클래스이고 List는 선형 자료구조를 구현한 클래스, Set은 비선형 자료를 구현한 클래스로 사용됩니다. 오늘은 Set의 인터페이스를 구현한 HashSet, TreeSet, LinkedHashSet에 대해서 알아보겠습니다 HashSet 가장 일반적으로 많이 쓰이는 자료구조입니다. 해싱을 사용하여 데이터를 주소에 저장합니다 데이터의 중복을 허용하지 않습니다 데이터의 저장 순서를 보장하지 않습니다 탐색비용은 O(1)로 검색으로 사용하기에 가장 빠릅니다. TreeSet 이진탐색트리의 형태로 데이터를 저장하는 컬렉션입니다. 이진탐색트리 중에서도 성능을 향상시킨 'red-black tree'로 구현되..

    [Java] 동일성(identity)과 동등성(equality)

    개발을 하다보면 객체나 변수를 비교할일이 많이 있습니다~! 어떨땐 주로 == 로 비교를 하고 어떨땐 equals() 함수를 써서 비교하는데요 이 비교문의 의미와 비교문으로 동일성과 동등성을 어떻게 비교하는지 알아보겠습니다. 동일성 (identity) 동일성은 동일하다는 뜻으로 두 개의 객체가 완전히 같은 경우를 의미합니다. 여기서 완전히 같다는 뜻은 두 객체가 바라보는 메모리 주소가 똑같다는 것이죠! 따라서 사실상 하나의 객체로 봐도 무방합니다. 위 그림을 볼까요? 자바에서 객체가 메모리에 저장될때 실제 정보는 jvm에 할당된 heap 메모리에 저장되고 그 객체의 주소는 스택 영역에 저장됩니다. 우리가 DannyObject do1 = new DannyObject();같은 코드를 써서 새로운 객체를 생성하..

    [Java] GC (Garbage Collection, Garbage Collector) 란?

    Garbage Collection 이란? Garbage Collection, 직역하면 "쓰레기 수거"입니다. 말그대로 쓰레기를 수거하는데, 어디서 수거하느냐? 바로 메모리(RAM)에서 합니다. 우리가 컴퓨터에서 사용할 수 있는 메모리는 한정되어있습니다. 따라서 더이상 안쓰는 정보(쓰레기)를 메모리에서 제거해서 메모리 공간을 확보해주는 프로세스가 필요하죠. 이 작업을 Garbage Collection 이라고 합니다. 더 정확하게 말하면 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 것이죠. Java의 큰 장점이라고 한다면 이 Garbage Collection 이 자동으로 진행된다는 것입니다. 어디서 어떻게 진행되는지 알아보기 전에 먼저 Java 코드가 동작하는 방식을 복습해볼..

    [Java] JIT 컴파일러 (JIT Compiler)

    [언어] 컴파일러(Compiler)와 인터프리터(Interpreter) 에서 컴파일러와 인터프리터에 대해서 다뤘었죠~! 그럼 JIT 컴파일러는 무엇이고 어디에 쓰일까요? JIT은 Just In Time을 줄인 말입니다. 뜻을 해석하면 "제시간에 딱 맞춘" 정도가 되겠네요. 산업공학 교양수업에서도 들은 기억이 있는데 물류쪽에서도 자주 쓰이던 단어같아요. 대표적으로 주문이 들어올 때만 생산을 해서 재고를 쌓아두지 않고 바로 딱 맞춰서 고객에게 보낼 수 있는 적시생산시스템도 JIT으로 불리죠. JIT 컴파일러도 이와 아주 비슷하게 동작합니다. 자세히 설명하기전에 우선 자바가 실행되는 과정을 다시 한번 살펴볼까요? 자바(Java) 코드가 실행되기 위해서는 우선 자바 바이트코드(Java bytecode)로 한번 ..

    [Java] JVM 동작 및 실행 과정

    JVM 은 크게 4가지 구성요소로 이루어져있습니다. 1. 클래스 로더 시스템 (Class Loader System) 클래스 로더 시스템은 자바 바이트코드(*.class)를 실행시점(RunTime)에 읽어들여서 JVM의 메모리 영역(Runtime Data Area)에 적절하게 배치시켜주는 역할을 합니다. 크게 로딩 -> 링크 -> 초기화 순서로 진행됩니다. 로딩 (Loading): 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 메서드 영역에 저장합니다. 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 “heap" 영역에 저장합니다. 링크 (Linking): Verify(확인), Prepare(준비), Resolve(해결) 3 단계로 나누어져 있습니다. ..

    [Java] JVM, JRE, JDK?

    자바 개발자라면 JVM, JRE, JDK는 필연적으로 마주하게 되는 용어인 것 같습니다. 이들이 왜 존재하고 어떻게 동작하는지, 어떤 차이점이 있는지 개념적으로만 간단하게 정리해보고자 합니다. JVM (Java Virtual Machine) - 자바 가상 머신 기계(Machine)는 "동력에 의해 일정한 일을 하는 도구"라는 뜻을 가지고 있죠. JVM도 마찬가지입니다. 다만 JVM의 역할은 자바 코드(.java)가 컴파일되어 만들어진 자바 바이트코드(.class)를 하드웨어가 이해할 수 있도록 기계어로 번역을 해주는 것이죠. [Java] 자바(Java)의 역사에서 언급했듯, 자바 이전에는 컴파일된 코드가 플랫폼(또는 OS)와 CPU에 종속적이어서, 한번 컴파일된 파일로 다른 플랫폼이나 하드웨어 환경에서 ..

    [Java] 자바(Java)의 역사

    자바(Java) 언어는 1991년 6월 썬 마이크로시스템즈(Sun Microsystems)에 다니던 제임스 고슬링(James Gosling)이 만들었습니다. 왜 새로운 언어를 만들었나? 자바는 초기에 토스터, 전자레인지, 리모콘 등의 가전제품에 사용되는 임베디드 소프트웨어를 위해 만들어졌습니다. 이미 C, C++등 하드웨어에서 쓰이는 언어가 있었는데 왜 새롭게 언어까지 만들었을까요? 당시 대부분의 컴퓨터 언어는 특정 플랫폼(또는 OS)이나 하드웨어에 맞게 컴파일 되도록 설계되었습니다. 따라서 플랫폼마다 그리고 각 플랫폼에서 쓰이는 CPU마다 해당 환경에 맞는 컴파일러가 필요했기때문에 개발 비용이 비싸고 오래걸렸죠. 예를 들어 C++ 프로그램의 경우 모든 종류의 CPU에 맞게 컴파일될 수 있지만 플랫폼과 ..

    [Java] JSON 파싱하기 (jackson/gson/json-simple)

    JSON 파싱시 자주 쓰이는 라이브러리 3개로 JSON을 파싱하는 예제를 소개합니다. 라이브러리 Gson (https://mvnrepository.com/artifact/com.google.code.gson/gson) Jackson (https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind) JSON.simple (https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple) https://github.com/jhl8041/code-collection/tree/main/json-parsing