Language 65

Java - 제네릭(Generic)은 무엇인가? 에 대한 정리! (1)

제너릭(Generic) 제너릭(Generic)은 JDK ArrayList나 LinkedList, HashMap 등의 자료구조를 사용할 때 주로 사용한다. ArrayList students = new ArrayList(); 그렇다면 제너릭의 정확한 역할은 무엇인가 ? 우리는 제너릭을 잘 활용하고 있을까? 제너릭을 사용하는 이유 제너릭은 JDK 1.5에 처음 도입되었다. Oracle Javadoc - Generics add stability to your code by making more of your bugs detectable at compile time. 다음은 제너릭의 기능을 정리한 것이다. 잘못된 타입이 들어오는 것을 컴파일 단계에서 방지한다. 자바 컴파일러는 잘못 사용된 타입 때문에 발생하는 에..

Language/Java 2022.05.08

Java - ArrayList가 가변적일 수 있는 이유 (+ Size 지정하는 이유)

ArrayList 자바에서 배열은 크기가 고정된 데이터 구조이다. 반면에, ArrayList는 가변적인 크기를 가지고 있다. 일반적인 배열은 우리가 알고 있는 형태로 Heap에 저장된다. ArrayList는 물리적으로 원소들이 연속되어야 한다. 만약 여기서 Heap에 새로운 Object가 들어왔다고 가정하자. 그러면 List에 새로운 원소를 생성할 수 없게 된다. "ArrayList는 어떻게 가변적인 길이를 가질 수 있을까?"에 대해 알아보자. add() ArrayList 클래스의 add() 메서드를 살펴보자. add()를 사용하면 내부적으로 오버로딩된 add 메서드를 호출한다. 메서드 내부를 살펴보면 흥미로운 사실을 알 수 있다. ArrayList는 내부적으로 elementData라는 배열을 가지고 있..

Language/Java 2022.05.07

Java - PreparedStatement란 무엇인가?

Statement 자바에서 쿼리문을 사용할 때 java.sql 패키지에 있는 Statement를 사용한다. Statement는 SQL문을 실행할 때 사용하는 인터페이스이다. Statement는 다음과 같은 동작 방식을 가진다. PreparedStatement PreparedStatement는 Statement를 상속하고 있는 Interface이다. PreparedStatement는 내부적으로 Statement의 4단계 과정 중 첫 번째 parse 과정의 결과를 캐싱하고, 나머지 3가지 단계만 거쳐서 SQL문이 실행될 수 있게 한다. PreparedState를 사용하면 구문 분석(parse)의 결과를 캐싱해서 과정을 생략할 수 있으므로 성능이 향상된다. 많은 분들이 아시고 계시길 PreparedStatem..

Language/Java 2022.05.03

Java - Perm 영역이 Metaspace로 바뀐 이유! [+ Heap Area, Native Memory 차이]

JDK 8부터는 Java Heap에서 PermGen이라는 영역이 제거되었고, Metaspace라는 영역이 Native Memory에 추가되었다. 기존에 Perm 영역 크기로 인한 java.lang.OutOfMemory가 뜨는 경우가 많았다. PermGen이라는 영역이 제거되고 Metaspace 영역이 생기면서 이제는 해당 문제를 보기 어려워졌다. 그 이유를 알아보자. Perm PermGen(이하 Perm) 영역은 상수와 static 변수, 런타임 중에 읽은 클래스와 메소드의 메타데이터를 저장한다. PermGen 영역의 크기는 JVM이 사이즈를 지정한다. 앱이 실행되면 최대 사이즈는 변경되지 않는다. 동적으로 클래스들이 로드되고 Static 변수나 상수가 Perm영역에 쌓이게 되면서 OOM이 자주 발생했다..

Language/Java 2022.04.29

Java - JVM 구성 요소와 역할 정리! (+ JIT 컴파일러, 인터프리터, 클래스 로더, 가비지 컬렉터란 무엇인가?)

JVM이란 JVM(Java Virtual Machine)은 자바 프로그램의 실행하기 위해 물리적 머신과 유사하게 소프트웨어로 구현한 것이다. JVM 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다. JVM은 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다. 그리고 메모리관리, Garbage collection을 수행한다. 추가적으로 JVM은 스택 기반의 VM(가상머신)이다. Lua VM, Dalvik VM 등은 레지스터 기반으로 동작하는데 비해 JVM은 스택 기반으로 동작한다. 스택 기반 VM 스택 기반 VM은 다음과 같은 장점을 가진다. 코드 작성과 컴파일이 쉽다. 속도는 레지스터 기반 VM보다 느리지만..

Language/Java 2022.04.27

Java - JDK와 JRE 차이 정리!

JDK와 JRE의 차이 아래는 Oracle에서 JDK와 JRE의 범위에 대해 표현한 그림이다. JRE JRE(Java Runtime Environment)는 자바 가상 머신( Java Virtual Machine ), 자바 클래스 라이브러리(Java class library), 자바 명령(Java command) 및 기타 인프라를 포함한 컴파일된 Java 프로그램을 실행하는데 필요한 패키지이다. JRE는 환경(Environment)이다. 기본적으로 Java 관련 파일이 있는 디렉터리이다. 포함되어 있는 폴더와 파일에 대해 설명을 간단하게 하면 아래와 같다. bin: Java 실행 프로그램이 포함되어 있다. JVM을 시작하는 java(Window의 경우 javaw)가 포함되어 있다. 또한, keytool ..

Language/Java 2022.04.26

해시 충돌(Hash Collision)이란? [+ 전략 비교]!

해시 충돌(Hash Collision) 해시 자료구조에서는 hashCode로 먼저 비교를 하고, 결과가 같다면 equals로 추가로 비교한다. 관련하여는 자바에서 equals와 hashCode의 관계를 다루는 이전 포스팅 (https://jaehoney.tistory.com/168)을 참고하자. 요약하자면, 해시 알고리즘에서 낮은 확률로 다른 Instance이지만 같은 HashCode를 가질 수 있다. 우리가 아는 해시 테이블의 구조는 아래와 같이 생겼다. 그렇다면, 만약 여기서 새로운 Instance가 추가 되었는데, 해시(Hash)를 적용하니 HashCode가 01이 나왔다! 그러면 기존의 01번 버킷에 데이터를 덮어쓰면 될까? 당연히 안된다. 해당 포스팅에서는 이런 경우에 새로운 데이터는 어디에 저..

Language/Algorithm 2022.04.24

Java - Equals()랑 HashCode()를 반드시 같이 재정의해야 하는 이유!

equals() Equals와 HashCode를 재정의하는 이유와 둘 사이에 관계에 대해 알아보자. Point라는 클래스가 있다고 가정한다. class Point { int x; int y; Point(int x, int y) { this.x = x; this.y = y; } } 그리고 아래의 테스트를 돌려보면 테스트가 깨진다. equals가 기본적으로 java core 라이브러리에 있는 equals로 동작하는데 내부적으로 참조(주소)를 기준으로 비교하기 때문이다. @Test void test() { Point point1 = new Point(1, 2); Point point2 = new Point(1, 2); Assertions.assertThat(point1).isEqualTo(point2); //..

Language/Java 2022.04.24

자바(Java)의 장단점 정리! [+ Spring vs Node.js + Express 비교]

자바(Java) 이전에 가전 제품에 C++을 플랫폼 독립적으로 확장한 Oak라는 언어가 있었는데, 인터넷이 확장되면서 네트워크 통신이 적합하도록 방향을 잡고 언어의 이름을 변경했다. 그게 자바(Java)다. 이번 포스팅에서는 자바(Java)의 장단점에 대해 다룬다. 그리고 추가적으로 Java(Spring)과 (Node + Express)를 비교하는 부분을 설명한다. 자바의 장점 객체 지향 프로그래밍의 장점을 충분히 반영하고 있다. 클래스, 상속, 다형성, 캡슐화, 추상화 등을 지원 플랫폼 종속적이지 않다. 많은 국내 개발자, 레퍼런스와 강의가 있다. 더 구조적이고 효율적인 코드 작성을 할 수 있다. 오픈소스도 많아서 안정적인 애플리케이션을 빠르게 개발할 수 있다. 보안, 운영측면에서 모두 안정적이다. 멀..

Language/Java 2022.04.24

Java - Hibernate는 무엇인가?

JPA 하이버네이트(Hibernate)를 이해하기 전에 JPA를 알아야 합니다. JPA는 Java Persistence API의 약자로 자바 ORM에 대한 표준 인터페이스입니다. 자바에서는 JPA를 인터페이스로 구현하고, JPA를 사용할 수 있는 구현체를 만들 수 있도록 설계했습니다. JPA의 구현체로 대표적인 Framework로 Hibernate가 있습니다. Hibernate JPA는 기술 명세입니다. JPA만으로 구현체 없이 ORM을 사용하는 것은 불가능합니다. 하이버네이트(Hibernate)는 JPA의 대표적인 구현체입니다. JPA의 핵심 인터페이스인 EntityManagerFactory, EntityManager, EntityTransaction를 Hibernate에서 각각을 상속하는 인터페이스를..

Language/Java 2022.04.17