인파

You Can Become A

늦게 시작해도 누구든지 노력하면 개발자가 될수 있어요 !

공부한 내용을 정리합니다
Language/Java (JVM)

☕ 자바 제네릭 타입 소거 컴파일 과정 알아보기

제네릭 타입 소거 (Erasure) 제네릭은 타입 안정성을 보장하며, 실행시간에 오버헤드가 발생하지 않도록 하기위해 JDK 1.5부터 도입된 문법으로, 이전 자바에서는 제네릭 타입 파라미터 없이 자바를 코딩해왔다. 그래서 이전의 자바 버전의 코드와 호환성을 위해 제네릭 코드는 컴파일되면 제네릭 타입은 사라지게 된다. 즉, 클래스 파일(.class)에는 제네릭 타입에 대한 정보는 존재하지 않는 것이다. 컴파일 타임에만 타입 제약 조건을 정의하고, 런타임에는 타입을 제거하기 때문에, 어찌보면 제네릭은 반쪽 짜리 언어 문법이라고 할수 있다. 그래서인지 제네릭을 개발자가 잘못된 방향으로 설계를 하면 잠재적인 힙 오염(heap pollution) 문제에 빠지게 되는 잠재적인 위험성을 가지고 있다. 따라서 올바르게..

category_image
인파_
2023.01.20
(0)
Language/Java (JVM)

☕ 힙 오염 (Heap Pollution) 이란?

힙 오염 (Heap pollution) 힙 오염(Heap pollution)은 단어 그대로 JVM의 힙(Heap) 메모리 영역에 저장되어있는 특정 변수(객체)가 불량 데이터를 참조함으로써, 만일 힙에서 데이터를 가져오려고 할때 얘기치 못한 런타임 에러가 발생할 수 있는 오염 상태를 일컫는다. 힙 오염의 대표적인 원인 주자로 꼽히는 것이 바로 제네릭(Generics) 이다. 사실 Java 5 버전에 제네릭 문법이 처음 도입되었을때 약간의 논란이 있었다. 왜냐하면 기존 컬렉션 프레임워크(Collection Framework)의 클래스들을 raw type으로서 써왔는데 갑자기 타입 체크(type check) 기능을 넣으니 기존 프로그램과의 호환성을 고려해야 하는 문제점이 있었기 때문이다. 그래서 제네릭은 컴파..

category_image
인파_
2023.01.19
(0)
Language/Java (JVM)

☕ 자바 객체의 hashCode는 고유하지 않다 ❌

객체의 hashCode는 고유하지 않다 자바에서는 포인터를 철저히 숨겼기 때문에 직접적인 객체의 주소 원래값을 얻을수는 없다. 그래서 자바에서는 참조 변수의 주소값을 표현하기 위해 위와 같이 해시코드를 이용한다. 보통 해싱 알고리즘 상 서로 다른 두 주소값을 가지고 있는 객체는 결코 같은 해시코드를 가질 수 없다. 하지만 예외가 있는데, 바로 hashCode() 메서드가 int형 정수를 반환한다는 점이다. 만일 자신의 컴퓨터가 32bit 사양이라면 이는 문제가 되지 않는다. 하지만 현대 시대에서 대부분 사용하는 64비트 컴퓨터에서 돌아가는 JVM(가상머신)은 기본적으로 8바이트(64bit) 주소체계를 기본으로 하는데, 만일 8바이트의 주소값을 hashCode를 이용해 반환하면 메서드의 타입에 따라 4바이..

category_image
인파_
2022.11.16
(0)
Language/Java (JVM)

☕ 클래스는 언제 메모리에 로딩 & 초기화 되는가 ❓

JVM의 클래스 로더 (Class Loader) 자바의 클래스들이 언제 어디서 메모리에 올라가고 클래스 멤버들이 초기화되는지, 원리를 알기위해선 우선 JVM(자바 가상 머신)의 클래스 로더(Class Loader)의 진행 방식에 대해 알 필요가 있다. 특히나 다음과 같이 내부(중첩) 클래스 중에 static 키워드가 붙고 안붙고의 유무에 따른 메모리 로드 차이와 쓰레드에 세이프하다는 등, 이러한 부분은 꽤나 고수준의 지식이기 때문에 글 로만 훑어보고 넘어가기 다반사라 이를 이해하기 위해선 클래스 로더 부터 살펴볼 필요가 있다. class Outer { class Inner { } static class Holder { } } 클래스 로더는 컴파일 된 자바의 클래스 파일(*.class)을 동적으로 로드하고..

category_image
인파_
2022.10.31
(0)
Language/Java (JVM)

☕ 내부 클래스는 static 으로 선언 안하면 큰일 난다

Inner 클래스의 문제점 인텔리제이와 같은 IDE에서 내부 클래스를 선언하여 사용하면 다음과 같이 경고 메세지가 뜰 것이다. (내부 클래스가 외부의 멤버를 참조하여 사용하지 않을 경우) 메세지 내용을 보아하니 내부 클래스를 인스턴스가 아닌 static으로 설정하라는 경고이다. 별거 아닌 경고인줄 알고 무시하기에는, inner 클래스가 가지는 심각한 문제를 보면 마음이 바뀔 것이다. 왜냐하면 inner 클래스는 inner static 클래스보다 메모리를 더 먹고, 더 느리고, 바깥 클래스가 GC 대상에서 빠져 버려 메모리 관리가 안될 수 있기 때문이다. Inner 클래스는 외부 참조를 한다 일반적으로 내부 인스턴스 클래스를 만들기 위해서는 먼저 외부 클래스를 초기화한뒤 내부 클래스를 초기화해야 한다. 이..

category_image
인파_
2022.10.28
(0)
Language/Java (JVM)

☕ 자바는 Call by reference 개념이 없다 ❓

자바의 Call by Value / Call by Reference 프로그래밍을 하다보면 반드시 마주치는 것이 바로 call by value / call by reference 개념이다. 함수의 매개변수에서 값을 복사하느냐 주소값을 참조하느냐에 따라 반환 결과가 달라지기 때문에 대부분의 프로그래밍 교육과정에선 중요시 하게 여긴다. 자바에서도 역시 call by value 와 call by reference 동작 차이가 존재한다. 자바의 데이터형을 알아보면 크게 두가지로 나뉘게 된다. 기본형(primitive type) - Boolean Type(boolean), Numeric Type(short, int, long, float, double, char) 참조형(reference type) - Class ..

category_image
인파_
2022.10.05
(0)
Language/Java (JVM)

☕ 그림으로 보는 자바 코드의 메모리 영역(스택 & 힙)

자바의 메모리 영역 이번 포스팅에선 자바(JAVA)를 사용하는 입장에서 알아야 할 메모리 구조 및 특징에 대해서 알아보려고 한다. 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리를 한다. JVM의 메모리 공간(Runtime Data Area)은 크게 Method(Static) 영역, Stack 영역, Heap 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당 되게 된다. 컴퓨터의 메모리는 사용할 수 있는 공간이 한정되어 있기 때문에 어떻게 관리하느냐에 따라서 프로그램의 성능(속도 등)이 좌우된다. 그래서 메모리 설계가 잘되어 있는 프로그램에 비해 그렇지 않은 프로그램은 속도 저하 현상이나 튕김 등의..

category_image
인파_
2022.10.04
(0)
Language/Java (JVM)

☕ 실수 표현(부동 소수점) 원리 한눈에 이해하기

실수의 2진수 표현 10진수의 정수를 2진수의 정수로 변환할 수 있듯이, 10진수의 소수를 2진수의 소수로 변환할 수 있다. 예를들어 10진수 11.765625 를 2진수 소수로 변환하는 방법은 다음과 같다. 먼저 숫자를 정수부 11 와 소수부 0.765625 로 나누어주고, 각각 2진수로 변환해주면 된다. 정수부 2진수 변환 정수부에 2를 지속적으로 나눈다. 몫은 계속 2로 나누어주고, 나머지값은 따로 모아준다. 더이상 나눌수 없을때 나머지 값을 모아 연결해주면 1011(2)로 간단히 변환이 된다. 실수부 2진수 변환 절대값이 1보다 작은 10진수 소수에 2를 곱한다. 2를 곱한 결과는 1을 넘거나 넘지 않을 것이다. 만약 1을 넘었을 경우 결과에서 1을 떼어내고, 아니면 0으로 처리하며 다음 계산을 ..

category_image
인파_
2022.09.27
(0)
Language/Java (JVM)

☕ 가비지 컬렉션 GC 튜닝 절차 맛보기

Garbage Collection 튜닝 자바(Java)가 C 언어에 비해 속도 차이가 나는 이유는 아키텍쳐 설계, 즉 JVM에 있는데, 미리 바이너리 코드로 컴파일되는 C언어에 비하여, 자바는 바이트 코드라는 중간 단계 컴파일을 해석하는데 있어서 시간이 소요되기 때문이다. 그리고 무엇보다 자바 어플리케이션 성능의 가장 큰 비중을 차지하는게 바로 가비지 컬렉션(GC)의 Stop-The-World 이다. 이전 포스팅에서 우리는 지금까지 GC의 힙 메모리 구성 및 동작 원리 그리고 GC의 알고리즘 종류에 대해 알아보았다. 그런데 만일 자바 애플리케이션 성능이 제대로 안나온다면 STW를 줄이기 위해 다른 GC 알고리즘 을 채택해서 돌아가게 하면 되지만, 이도 문제가 해결이 안된다면 비로소 GC 튜닝 이라는 것을..

category_image
인파_
2022.09.22
(0)
Language/Java (JVM)

☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리

Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스를 말한다. C / C++ 언어에서는 이러한 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 했었다. 반면 Java에서는 가비지 컬렉터가 메모리 관리를 대행해주기 때문에 Java 프로세스가 한정된 메모리를 효율적으로 사용할수 있게 하고, 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에서 대해 관리하지 않아도 되어 오롯이 개발에만 집중할 수 있다는 장점이 ..

category_image
인파_
2022.09.22
(0)
Language/Java (JVM)

☕ JVM 내부 구조 & 메모리 영역 💯 총정리

저번 포스팅에서는 JRE / JDK / JVM에 대해서 간략하게 알아보는 시간을 가졌다면, 이번 포스팅에서는 JVM의 내부 구조에 대해 좀 더 자세하게 알아보도록 할 예정이다. JVM(자바 가상 머신)은 자바 언어에서만 사용하는 것이 아니다. 코틀린, 스칼라 언어에서도 JVM 동작 방식을 그대로 따른다. 따라서 JVM을 정확히 이해하면 추후에 자바에서 파생된 모던 언어를 이해하는데 있어 수월해지며, 내부에서 정확히 어떻게 동작을 해서 코드가 실행이 되는지 개념을 알면 코드 최적화나 리팩토링을 하는데 매우 도움이 된다. 위의 그림은 자바 애플리케이션의 구동원리를 간략하게 그려본 것인데, 지금부터 우리가 배울 JVM(자바 가상 머신) 실행 부분은 빨간 박스를 친 부분인, 컴파일된 .class 파일을 어떠한 ..

category_image
인파_
2022.09.21
(0)
Language/Java (JVM)

☕ JDK / JRE / JVM 개념 & 구성 원리 💯 총정리

자바를 처음 설치하면 C:\Program Files\Java 폴더에 아래와 같이 JDK와 JRE 가 각각 설치되는 것을 볼 수 있다. 그렇다면 이 JDK와 JRE의 역할은 무엇인지 그리고 자바 프로그램(JVM)은 어떤식으로 돌아가는지에 대해 정리해보는 시간을 가져보자. JDK (Java Development Kit) JDK는 자바 개발키트(Java Development Kit)의 약자로 개발자들이 자바로 개발하는 데 사용되는 SDK 키트라 생각하면 된다. 그래서 JDK안에는 자바를 개발 시 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들을 포함되어 있고, 개발을 하려면 자바 프로그램을 실행도 시켜줘야 하기 때문에 뒤에서 배울 JRE(Java Runtime Environment)도 함께 ..

category_image
인파_
2022.08.26
(0)