설명 순서는 다음과 같습니다.

1. Stream이란
2. Stream의 특징
3. Stream의 장단점

1. Stream이란

   - 많은 수의 데이터를 다룰 때, 컬렉션이나 배열에 데이터를 담고 for문 또는 Iterator를 이용해서 코드를 작성했음. 그렇지만 이러한 방식은 가독성, 재사용성이 떨어지고, 데이터 소스마다 다른 방식으로 다뤄야하는 단점이 있음

   - 예를 들어, List를 정렬할 때는 Collections.sort()를 사용하고 배열을 정렬할 때는 Arrays.sort()를 사용해야 함

   - Stream은 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있도록 데이터 소스를 추상화하였고, 데이터를 다루는데 자주 사용되는 메소드들을 정의해 놓았음


2. Stream의 특징

   - 스트림은 데이터 소스를 변경하지 않음

      * 데이터 소스로 부터 데이터를 읽기만할 뿐, 원본 데이터 소스를 변경하지 않음

   - 스트림은 일회용임

      * 스트림은 한번 사용하면 닫혀서 다시 사용할 수 없음

   - 스트림은 작업을 내부 반복으로 처리함

      * 내부 반복이란 뜻은 반복문을 메소드 내부에 숨길 수 있다는 뜻임

      * 반복문을 숨김으로써 가독성이 높아짐

   - 지연된 연산

      * 스트림의 진행 순서는 생성 -> 중간연산 -> 최종연산으로 됨

      * 지연된 연산이란 최종연산이 수행되기 전까지 중간연산이 수행되지 않는다는 것

      * 최종연산이 수행되어야 비로소 스트림의 요소들이 중간연산을 거쳐 최종연산에서 소모됨

   - 병렬 처리가 쉽다

      * 병렬 처리를 하려면 단지 parellel() 메서드를 호출만 하면됨(다만 병렬처리가 항상 빠른 결과를 얻는 것은 아님)


3. Stream의 장단점

   - 장점

      ① 가독성이 높다

      ② 재사용성이 높다

      ③ 데이터소스에 관계없이 같은 방식으로 다룰 수 있다

      ④ 병렬 처리가 쉽다

   - 단점

      ① for문보다 성능이 대부분 떨어진다

         * 하지만, 복잡한 로직을 계산하는 비용이 순회하는 비용보다 크고 데이터의 양이 많다면 Stream의 성능은 for문과 비슷해지거나 더 좋아짐


Stream에 대해 알아볼 수 있었습니다.

 

'Java' 카테고리의 다른 글

JAR, WAR, EAR  (1) 2023.09.18
Garbage Collector  (0) 2023.09.15
JVM  (0) 2023.09.14
Abstract Class vs Interface  (0) 2023.09.13
[Java의 정석] Static이란?  (0) 2023.04.07

설명 순서는 다음과 같습니다.

1. JAR
2. WAR
3. EAR

1. JAR

   - Java ARchive의 약자

   - zip파일은 하나의 파일 안에 여러 개의 파일이 압축되어 들어있는 파일이며, 이러한 형태를 아카이브(Archive)라고함. 하나의 파일로 여러 파일을 편리하게 다루고 보관할 수 있고, 압축 덕분에 용량 또한 작아지게 되는 장점이 있음

   - JAR란 자바 애플리케이션을 실행하기 위한 여러 파일(클래스 파일, 이미지 파일, 소리 파일 등)을 압축한 파일

   - JAR는 그 자체로 실행할 수 있고, 다른 애플리케이션의 클래스 경로에 JAR를 추가해서 안에 있는 코드를 사용할 수 있게 할 수 있음

   - 이 때 포함된 파일들은 .class로 컴파일이 되는데, 그래서 윈도우에서 만든 jar파일을 맥에서도 사용할 수 있음


2. WAR

   - Web application ARchive의 약자

   - 자바의 웹 어플리케이션으로 이용되는 클래스 파일(servlet), 설정 파일(xml), JSP나 HTML, JAR 형식의 라이브러리 등이 압축되어 있는 파일

   - 웹 어플리케이션을 배포하기 위한 여러 파일을 압축한 파일

   - WAR는 단독으로 실행되지 않고, 웹 서버인 WAS에 의해 실행됨


3. EAR

   - Enterprise ARchive의 약자

   - Java Enterprise Edition에 쓰이는 파일 형식

   - 웹 애플리케이션 단위를 넘어서 실제 서버 배포를 위한 파일

   - 엔터프라이즈 애플리케이션에 필요한 JAR나 WAR 같은 모든 파일을 포함한 파일


JAR, WAR, EAR에 대해 알아볼 수 있었습니다.

'Java' 카테고리의 다른 글

Stream  (0) 2023.09.19
Garbage Collector  (0) 2023.09.15
JVM  (0) 2023.09.14
Abstract Class vs Interface  (0) 2023.09.13
[Java의 정석] Static이란?  (0) 2023.04.07

설명 순서는 다음과 같습니다.

1. Garbage Collector란?
2. Garbage Collection 대상
3. Garbage Collector의 청소 방식(Mark And Sweep)
4. Heap 메모리 구조
5. Garbage Collection 과정

1. Garbage Collector란?

   - 자바의 메모리 관리를 해주는 역할

   - JVM의 Heap 영역에 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체를 모아 제거해줌

   - C / C++ 에서는 Garbage Collector가 없어서 프로그래머가 수동으로 메모리 할당과 해제를 해줘야 했음. 그렇지만, Java에서는 Garbage Collector가 메모리 관리를 해주므로 오로지 개발에만 집중할 수 있다는 장점이 있음

   - 그렇지만, Garbage Collector가 메모리를 관리하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제점이 있음. 이를 전문 용어로 Stop The World라고 하고 이 시간을 줄일수록 성능이 올라가며 이런 최적화 작업을 GC 튜닝이라고 함


2. Garbage Collection 대상

   - Garbage Collector는 ① Heap에서 사용되지 않는 객체를 찾고, ② 지움

   - 사용되지 않는 객체란 해당 객체가 어디에서도 참조되지 않는 객체를 의미함(Unreachable 상태)

   - 위 그림처럼 어디에서도 참조되지 않는 Heap의 객체를 Garbage Collector는 제거해야할 메모리로 인식하고 지워줌


3. Garbage Collector의 청소 방식(Mark And Sweep)

   - Mark And Sweep 방식은 Garbage Collector의 기초적인 청소 방식임

   - 과정

      ① Mark : Root Space로부터 그래프 순회를 통해 어떤 객체가 참조되고 있는지 찾아서 마킹함(청소 대상 마킹)

         * Root Space : Heap 메모리 영역을 참조하는 Method Area, static 변수, stack 등이 됨. 이 root부터 찾아가며 heap에 있는 객체가 참조되고 있는지 판별

      ② Sweep : 참조되고 있지 않은 객체(청소 대상)을 Heap에서 제거함(청소함)

      ③ Compact : 청소 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축


4. Heap 메모리 구조

   - Heap은 동적으로 생성된 객체들이 저장되는 공간으로, 가비지 컬렉션의 대상이 됨

   - Heap은 2가지 전제로 설계되었음

      ① 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다

      ② 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다

      -> 객체는 대부분 일회성이고, 메모리에 오래 남아있는 경우는 드물다는 뜻

   - 이러한 특성을 이용해서 Heap영역을 Young과 Old로 나눔

      ① Young

         * 새로 생성된 객체가 할당되는 영역

         * 대부분의 객체가 금방 Unreachable이 되기 때문에, Young에서 생성되었다가 사라짐

         * Young에 대한 가바지 컬렉션을 Minor GC라고 부름

      ② Old

         * Young에서 Reachable 상태를 유지해서 살아남은 객체가 복사되는 영역

         * Young보다 크게 할당되며, 그만큼 가바지 컬렉션은 적게 발생함

         * Old에 대한 가비지 컬렉션을 Major GC라고 부름

   - Young은 효율적은 GC를 위해 다시 Eden, Survivor0, Survivor1로 나뉨

      ① Eden : new를 통해 새로 생성된 객체가 위치. GC후 살아남은 객체들은 Survivor로 보냄

      ② Survivor 0/1 : 최소 1번의 GC 이상 살아남은 객체가 위치. Survivor 0/1 둘 중 하나는 꼭 비어있어야 함


5. Garbage Collection 과정

   (1) 처음 생성된 객체는 Young의 Eden 영역에 위치

   (2) 객체가 계속 생성되어 Eden이 꽉차게 되면 Minor GC가 실행

   (3) Mark를 통해 Reachable 객체를 탐색

   (4) Eden에서 살아남은 객체는 Survivor 0 또는 1 영역으로 이동

   (5) Eden 영역에서 Unreachable 객체의 메모리를 해제(청소)

   (6) 살아남은 객체들의 age값이 1 증가

   (7) Eden 영역이 다시 가득 차면 Minor GC를 실행하고(Survivor영역도 같이 청소), 이제 살아남은 객체를 모두 Survivor 1로 보냄

   (8) 이후 객체의 age가 임계값에 도달하면 이 객체를 Old로 보냄

   (9) Old 영역이 가득 차면 Major GC를 실행

   - Old 영역은 Young 영역에 비해 크기가 크기 때문에 GC가 10배 이상의 시간이 소요됨

   - 이렇게 Major GC가 일어날 때 성능이 나빠지는데, 이 때 성능을 높이기 위해 가비지 컬렉션 알고리즘이 발전함


Garbage Collector에 대해 알아볼 수 있었습니다.

'Java' 카테고리의 다른 글

Stream  (0) 2023.09.19
JAR, WAR, EAR  (1) 2023.09.18
JVM  (0) 2023.09.14
Abstract Class vs Interface  (0) 2023.09.13
[Java의 정석] Static이란?  (0) 2023.04.07

설명 순서는 다음과 같습니다.

1. JDK, JRE, JVM이란
2. JVM의 장점
3. JVM 구조

1. JDK, JRE, JVM이란

   - JDK : Java Debelopment Kit의 약자로, 자바로 개발할 때 필요한 도구들의 모음

   - JRE : Java Runtime Environment의 약자로, 자바 프로그램을 실행시킬 때 필요한 환경의 모음

   - JVM : Java Virtual Machine의 약자로, 자바 프로그램을 실행시키는 핵심적인 기기

   - Java 프로그램 실행 순서

      ① Java 소스코드(.java 파일)을 Java Compiler(javac)가 바이트코드인 .class파일로 컴파일

      ② JVM이 바이트코드를 기계어로 변환

      ③ 기계어 실행

 


2. JVM의 장점

   - 다른 언어는 작성한 코드를 특정 OS에서 컴파일 하면, 해당 OS에서만 실행가능한 프로그램이 만들어짐. 다른 OS에서는 실행이 불가능

   - 그렇지만, Java의 경우 어느 OS에서 컴파일된 바이트코드는 JVM만 있다면 다른 OS에서 실행이 가능함. 그래서 'Write Once Read Anywhere'라는 장점이 있음

   - 소스코드 -> 바이트코드 -> 기계어, 이렇게 되므로 두번 컴파일을 하기 때문에 속도의 문제가 발생하는데, JIT 컴파일러 방식으로 개선되어 속도에서도 개선을 이룸

   - JIT 컴파일러는 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱함


3. JVM 구조

   - 클래스 로더 : .class 파일을 필요에 따라 동적으로 로드하고 엮어서 JVM의 메모리 영역인 Runtime Data Areas에 배치함

   - 실행 엔진 : 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행

   - 런타임 데이터 영역 : 프로그램을 실행할 때 사용되는 데이터들을 적재하는 영역

      ① 메서드 영역 : 바이트 코드(.class)를 처음 메모리에 올릴 때 초기화되는 대상을 저장하기 위한 공간. 이 영역은 클래스가 로드되고 종료될 때까지 저장됨. 이 영역에는 class 초기 정보 또는 static 변수나 메서드가 저장됨

      ② 힙 영역 : 런타임시 동적으로 생성되는 객체, 배열이 저장되는 공간

         * 만약 힙에 생성된 객체가 참조되지 않는다면, 이것을 쓰레기로 취급하고 Garbage Collector를 통해 제거됨

      ③ 스택 영역 : 메서드 호출마다 각각의 스택 프레임이 생성되고 이 안에서 사용되는 값을 임시로 저장하는 공간

      ④ PC 레지스터 : 현재 수행중인 JVM 명령어 주소를 저장하는 공간


JVM에 대해 알아볼 수 있었습니다.

'Java' 카테고리의 다른 글

JAR, WAR, EAR  (1) 2023.09.18
Garbage Collector  (0) 2023.09.15
Abstract Class vs Interface  (0) 2023.09.13
[Java의 정석] Static이란?  (0) 2023.04.07
[Java의 정석] JVM이란?  (0) 2023.04.01

설명 순서는 다음과 같습니다.

1. Abstract class와 Interface의 공통점
2. 용도에 따른 차이점
3. 기능에 따른 차이점
4. 정리

1. Abstract class와 Interfae의 공통점

   - 추상 메서드를 가질 수 있다

   - 인스턴스화를 할 수 없다(new를 이용한 생성 불가)

   - 추상 클래스 또는 인터페이스를 상속한 클래스는 추상 메서드를 반드시 구현해야 한다


2. 용도에 따른 차이점

   - Abstract class는 자신의 기능을 하위 클래스에 확장시킬 때 사용

   - Interface는 구현된 객체가 같은 동작을 한다는 것을 보장하기 위해 사용


3. 기능에 따른 차이점

   - 변수 : Interface는 public static final로 정의된 상수만 가능, Abstract class는 모두 가능

   - 메서드 : Interface는 추상 메서드만 가능(현재는 아님), Abstract class는 모두 가능


4. 정리

   - 따라서, Abstract class는 일반 클래스처럼 일반 멤버 변수와 메서드를 가질 수 있으므로 중복된 멤버들을 통합시킬 때 사용될 수 있고 자신의 기능을 하위 클래스에 확장시킬 때 사용함. 반면 Interface는 구현된 객체가 같은 동작을 한다는 것을 보장하기 위해 사용됨.


Abstract class와 Interface의 차이에 대해 알아볼 수 있었습니다.

'Java' 카테고리의 다른 글

JAR, WAR, EAR  (1) 2023.09.18
Garbage Collector  (0) 2023.09.15
JVM  (0) 2023.09.14
[Java의 정석] Static이란?  (0) 2023.04.07
[Java의 정석] JVM이란?  (0) 2023.04.01

학부에서 Java강의를 들으면, 'static'은 시험에서 단골문제입니다. 전에는 암기하기만 했던 'static'의 성질들을 JVM의 메모리구조부터 차근차근 살펴보며 이해하려 합니다. 왜 static이 그러한 성질을 갖게 되었는지 알아보겠습니다.

 

1. Java 응용프로그램 실행 순서

먼저, Java 응용프로그램이 실행되는 순서를 되짚고 가겠습니다.

(1) 운영체제로 부터 JVM이 사용할 메모리 할당받음
(2) javac.exe로 .java파일을 JVM이 실행할 수 있는 .class파일로 컴파일함
(3) java.exe로 main메서드 실행
(4) 실행 중 어떤 class가 필요할 때, 해당 .class파일을 읽어서 JVM이 할당받은 메모리에 올림.
(5) 모든 코드 실행 후 종료

이 순서로 실행됩니다. 신기했던 건, 프로그램 시작할 때가 아닌 실행 중에 필요한 .class파일을 메모리에 올린다는 점이었는데요. 클래스 로더라는 친구가 이 역할을 한다고 합니다. 

 

2. JVM 메모리 구조

그렇다면 어떤 형태로 .class파일을 읽어서 메모리에 올릴까요?

자료 : 'Java의 정석'

JVM은 위 그림처럼 메모리를 용도에 따라 대표적으로 3가지 영역으로 나누어 관리합니다. 그리고 이 중 'static'을 이해하기 위해서는 'Method Area'와 'Heap'에 대해 알아야합니다.

 

- Method Area

: 이 영역에는 클래스에 대한 정보가 저장됩니다. JVM은 해당 클래스가 필요할 때 .class파일을 읽어서 클래스에 대한 정보를 이곳에 저장합니다. 그리고 이 영역에 해당 클래스의 static변수static메소드 또한 생성됩니다.

- Heap

: 이 영역에는 인스턴스가 생성됩니다. 인스턴스가 생성될 때, 이 영역에 인스턴스 변수인스턴스 메소드가 생성됩니다.

 

예를 들어, 아래와 같은 클래스가 있습니다. 그리고 이 클래스는 실제 사용될 때 메모리에 올라갑니다.

public class Data {
	int x;
	static int y = 3;
	void m() {}
	static void s() {};
}

아래는 실제 사용될 때 입니다.

public static void main(String[] args) {
	//...
	Data data1; //Method Area에 Data클래스 생성
	data1 = new Data(); //Heap에 Data인스턴스(data1) 생성
	Data data2 = new Data(); //Heap에 Data인스턴스(data2) 생성
	//...
}

아래는 메모리에 로딩된 최종 결과 입니다.

정리하면

첫 번째로, 메모리에 생성되는 공간이 다릅니다. static변수와 메모리는 Method Area에, 인스턴스 변수와 메모리는 Heap에 생성됩니다.

두 번째로, 생성되는 시점이 다릅니다. static변수와 메모리는 클래스가 로딩되는 시점에 생성되는 반면, 인스턴스 변수와 메모리는 인스턴스가 생성될 때 생성됩니다.

세 번째로, 생성 횟수가 다릅니다. static변수와 메모리는 메모리에 한번만 올라가서 계속 있는 반면, 인스턴스 변수와 메모리는 새롭게 인스턴스가 생성될 때마다 메모리에 생성됩니다. 

 

3. static 성질 이해하기

저희가 이해한 것을 바탕으로 static의 성질들을 이해해보겠습니다.

 

- "static변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다"

: YES. 클래스의 static변수는 Method Area에 딱 하나 존재합니다. 인스턴스에서 참조하더라도 같은 공간을 참조하므로 항상 같은 값을 갖게됩니다.

 

- "static변수 및 메소드는 인스턴스를 생성하지 않아도 사용할 수 있다"

: YES. static변수와 메소드는 인스턴스가 생성되는 시점에 메모리에 올라가는 것이 아닌, 클래스가 메모리에 올라갈 때 생성됩니다.

 

- "static메소드는 인스턴스 변수나 메소드를 사용할 수 있다"

: NO. 클래스는 메모리에 로딩되었지만, 인스턴스는 없을 수 있습니다. 따라서, static메소드를 사용하는 시점에 인스턴스는 없을 수 있으므로 사용할 수 없습니다.

 

- "인스턴스 메소드는 static 변수나 메소드를 사용할 수 있다"

: YES. 인스턴스 메소드는 인스턴스가 생성되고 사용할 수 있습니다. 인스턴스가 생성되었다는 의미는 클래스가 메모리에 이미 로딩되었다는 뜻이므로 static변수와 메소드 또한 메모리에 로딩되었음을 의미합니다. 따라서, 사용할 수 있습니다.


시험에서 단골문제로 나왔던 'static' 성질 찾기. 위 예시 뿐만 아니라 여러가지 변형들이 무수히 존재합니다. 하지만, 메모리 관점에서 시작해서 static의 본질 이해하면 변형들도 쉽게 이해할 수 있으리라 생각합니다. 'static'을 공부하시는 분들께 도움이 됐으면 좋겠습니다~

'Java' 카테고리의 다른 글

JAR, WAR, EAR  (1) 2023.09.18
Garbage Collector  (0) 2023.09.15
JVM  (0) 2023.09.14
Abstract Class vs Interface  (0) 2023.09.13
[Java의 정석] JVM이란?  (0) 2023.04.01

1학년 때, 학부 강의를 듣다보면 JVM..., JDK를 설치해서..., 시스템 환경변수 path에 bin파일을 추가... 등등 하나도 이해하지 못하고 따라하기 급급한 행동들이 있습니다. 저도 그랬습니다. 그리고 저는 심지어 졸업을 한 지금까지도 이해를 하지 못했습니다. 

지금부터, 이에 대해 조금 더 쉽게 이해해보도록 하겠습니다.

 

1. JVM...?

우리가 다른나라로 여행을 간다고 가정해봅시다. 나라마다 표준전압이 다르기 때문에 저희는 '어댑터'를 가져갑니다. 그런데 혹시 이런 어댑터가 없는 상황을 생각해보신적 있으신가요? 저희는 코드가 필요한 모든 전자기기를 해당 나라의 전압에 맞는 것으로 새로 사서 가져가야 합니다(어댑터는 정말 소중한 겁니다ㅎㅎㅎ). 어댑터가 있음으로써, 저희는 '하나의 220V짜리 핸드폰 충전기'와 '어댑터'를 가지고 모든 나라에서 핸드폰을 충전할 수 있는 것입니다.

 

위 비유는 Java 세계에서 아래와 매칭됩니다.

'나라마다 다른 표준전압' = 다양한 운영체제(OS)
'어댑터' = JVM
'전자기기' = Java 어플리케이션

따라서, 우리는 '하나의 Java 어플리케이션' 과 'JVM'을 가지고 모든 '운영체제'에서 실행할 수 있습니다. 하지만 '어댑터'는 220V를 110V, 250V 등등 여러 전압으로 변환해주지만, JVM은 해당 운영체제에 맞는 JVM이 필요합니다. 그래서 저희가 1학년때 그냥 따라만 했던, '운영체제에 맞는 JDK를 다운받아서...'가 해당 운영체제에 맞는 JVM을 다운받는 행위였습니다.

(JDK : JVM과 자바 클래스 라이브러리 등 자바를 개발하는데 필요한 프로그램)

 

2. 시스템 환경변수 path에 bin디렉토리 경로를 추가한다...?

여기서 의문이 드는 점은 두가지 입니다.

JDK의 bin폴더에는 뭐가 있는데? 와 시스템 환경변수 path에 등록하면 뭐가 좋은데? 입니다.

 

(1) JDK의 bin폴더에 있는것

여기에는 javac.exe, java.exe 등등 쉽게 말해서 JVM을 실행시키는 실행파일들이 있습니다. 쉽게 알아보도록 하겠습니다.

javac.exe - 220V 핸드폰 충전기를 어댑터에 꽂는 행위
java.exe - 이 어댑터를 콘센트에 꽂는 행위

좀 더 깊게 들어가면,

javac.exe 실행파일은 Java코드를 JVM이 이해할 수 있는 바이트 코드로 바꾸는 역할을 합니다.

java.exe 실행파일은 이렇게 만들어진 바이트 코드를 기계어로 번역해 운영체제로 전달해서 실행하는 역할을 합니다.

자세히 이해하려면 컴퓨터 구조, 운영체제에 대한 이해가 필요합니다. 따라서, 이러한 지식이 없다면 그냥 느낌정도만 아는 것으로 충분하다고 생각합니다.

 

(2) 시스템 환경변수 path에 등록하면 좋은 점

시스템 환경변수 path에 디렉토리 경로를 등록하면, 어디서라도 해당 디렉토리안에 들어있는 파일을 실행할 수 있습니다. 이는 쉽게 말해, 운영체제에게 어댑터(JVM)의 위치를 알려준다고 생각할 수 있습니다. 운영체제는 어댑터의 위치를 알고있어서, Java어플리케이션을 실행할 때 언제든 가져와 사용할 수 있습니다. 이를 위해 path를 등록하는 것입니다. 


'Java의 정석' 책의 Chapter 1을 읽으면서, 이전에 대학교 1학년 때 따라만 했던 행위를 이해할 수 있었습니다. 저와 같은 분들에게 도움이 됐으면 좋겠습니다~ 

 

'Java' 카테고리의 다른 글

JAR, WAR, EAR  (1) 2023.09.18
Garbage Collector  (0) 2023.09.15
JVM  (0) 2023.09.14
Abstract Class vs Interface  (0) 2023.09.13
[Java의 정석] Static이란?  (0) 2023.04.07

+ Recent posts