delpho

Java에 대하여 - 1 본문

CS

Java에 대하여 - 1

delpho 2022. 6. 8. 01:55

1. JVM의 구조와 Java의 실행방식을 설명해주세요.

# JVM ( Java Virtual Machine )

  • 자바와 운영체제 사이에서 중개자 역할을 수행
  • 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와줌
  • 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작

 

# 자바는 왜 JVM이 필요할까?

  • Java 컴파일러는. java 파일을. class 파일로 컴파일한다.
  • 이는. java 파일을 Java byte code로 변환하여. class 만드는 것인데 Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행이 되지 않는다.
  • 이를 해결하기 위해 JVM을 통해 .class 파일을 로드/해석하여 Java 프로그램을 실행하는 것!
  • 즉, 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 얻은 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜주는 역할

 

 

 

 

 

# JVM의 구조

JVM 간단 구조

 

  • 크게 Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로 나뉘어짐 

 

 

 

 

JVM SubSystem 포함 구조

 

 

 

 

 

 

 

 

 

 

 

 

# java 프로그램의 실행 단계

 

  1. 먼저, 자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환됩니다. 
  2. 그리고 이러한 바이트 코드를 JVM에서 읽어 들인 다음에, 이것저것 복잡한 과정을 거쳐서 어떤 운영체제든간에 프로그램을 실행할 수 있도록 만드는 것입니다.

 

 

 

 

 

 

 


 

 

2. GC(Garbage Collector)가 무엇인지, 필요한 이유는 무엇인지, 동작방식에 대해 설명해주세요.

 

# Garbage Collection

  • Heap 메모리를 재활용 하기 위해 참조 되지 않는 Object(Unreachable Object)들을 해제해 가용한 공간을 만드는 작업
  • 실행 조건이 일정하지 않다

 

 

 

# JVM의 Heap

 

JVM의 Heap 영역

  • JVM의 Heap 영역은 처음 설계될 때, 2가지 전제로 설계됨
    1. 대부분의 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
    2. 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
  • 즉, 객체는 대부분 일회성이고, 메모리에 오래 남아있는 경우는 드물다!
    • --> 객체의 생존기간을 기준으로 물리적인 Heap 영역을 나누게 됨 (Young, Old)
      • 초기에는 Perm 영역도 존재했지만, Java8에서 제거

 

GC 영역 및 흐름

 

  1. Young 영역
    • 1개의 Eden 영역 + 2개의 Survivor 영역으로 나뉘어짐
      • Eden 영역: 새로 생성된 객체가 할당(Allocation)되는 영역
      • Survivor 영역: 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
    • 대부분의 객체가 금방 접근 불가능 상태가 되기 때문에, 많은 객체가 이 영역에서 생성되었다가 사라짐
    • Minor GC = Young 영역에 대한 가비지 컬렉션(Garbage Collection)

 

2. Old 영역

  • Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다. 
    • 수명 짧은 객체들은 보통 큰 공간을 필요로 하지 않음
    • 큰 객체들은 Young 영역이 아닌 Old 영역에 할당됨
  • Major GC 또는 Full GC = Old 영역에 대한 가비지 컬렉션(Garbage Collection)

 

 

 

3. Card Table 영역

  • 예외적인 상황으로 Old 영역에 있는 객체가 Young 영역의 객체를 참조하는 경우도 존재할 것
  • 이러한 경우를 대비하여 Old 영역에는 512 bytes의 덩어리(Chunk)로 되어 있는 카드 테이블(Card Table)이 존재
  • Old 영역에 있는 객체가 Young 영역의 객체를 참조할때 마다 그에 대한 정보가 표시됨
  • 도입된 이유
    • Young 영역에서 가비지 컬렉션(Minor GC)가 실행될 때 모든 Old 영역에 존재하는 객체를 검사하여 참조되지 않는 Young 영역의 객체를 식별하는 것이 비효율적이기 때문!
    • 그렇기 때문에 Young 영역에서 가비지 컬렉션이 진행될 때 카드 테이블만 조회하여 GC의 대상인지 식별할 수 있도록 하고 있다.

 

 

 

 

# Garbage Collection의 동작 방식

  • Young 영역과 Old 영역은 다른 메모리 구조로 되어있기때문에 세부적인 방식은 다르다.
  • 하지만, 기본적으로 GC가 실행된다고하면 아래 2가지의 공통 단계를 따르게 됨!!

 

  1. Stop The World
    • 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업
    • GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개
  2. Mark and Sweep
    • Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
      • 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색하게 된다. 그리고 사용되고 있는 메모리를 식별!
    • Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업

 

 

 

# 영역 별 동작 방식

 

  • Minor GC의 동작방식
    1. 새로 생성된 객체가 Eden 영역에 할당
    2. Eden 영역이 꽉차게 되면 Minor GC가 실행
      1. Eden 영역에서 사용되지 않는 객체의 메모리가 해제된다.
      2. Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동된다.
    3. 1~2번의 과정이 반복되다가 Survivor 영역이 가득 차게 되면 Survivor 영역의 살아남은 객체를 다른 Survivor 영역으로 이동시킨다.(1개의 Survivor 영역은 반드시 빈 상태가 된다.)
      • Survivor 영역 중 1개는 반드시 사용이 되어야 한다. 
      • 만약 두 Survivor 영역에 모두 데이터가 존재하거나, 모두 사용량이 0이라면 현재 시스템이 정상적인 상황이 아님을 파악할 수 있다.
    4. 이러한 과정을 반복하여 계속해서 살아남은 객체는 Old 영역으로 이동(Promotion)된다.
      • 객체의 생존 횟수를 카운트하기 위해 Minor GC에서 객체가 살아남은 횟수를 의미하는 age를 Object Header에 기록
      • Minor GC 때 Object Header에 기록된 age를 보고 Promotion 여부를 결정한다.

 

Minor GC의 진행 과정

 

 

 

  • Major GC의 동작 방식
    1. Young 영역에서 오래 살아남은 객체는 Old 영역으로 Promotion됨
    2. 객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 Major GC 발생
      • Young 영역은 일반적으로 Old 영역보다 크키가 작기 때문에 GC가 보통 0.5초에서 1초 사이에 끝난다.
      • 그렇기 때문에 Minor GC는 애플리케이션에 크게 영향을 주지 않는다.
      • 하지만 Old 영역은 Young 영역보다 크며 Young 영역을 참조할 수도 있다.
      • 그렇기 때문에 Major GC는 일반적으로 Minor GC보다 시간이 오래걸리며, 10배 이상의 시간을 사용한다.

 

 

 

 


 

 

 

3. 제네릭에 대해서 설명해주세요.

 

 

# 제네릭

  •  클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 데이터 타입이 지정되는 것을 의미
    • 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것

 

# 제네릭 장점

  1. 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
  2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
  3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

 

 

# 제네릭 사용방법

많이 쓰이는 제네릭의 타입 (암묵적인 규칙)

 

 

 

# 상황별 선언 및 생성 방법

 

  1. 제네릭 클래스 및 인터페이스 선언 
public Interface InterfaceName <T> { ... }
public class HashMap <K, V> { ... }
public class ClassName <T> { ... }
 
public class Student { ... }
 
public class Main {
	public static void main(String[] args) {
		ClassName<Student> a = new ClassName<Student>();
	}
}


// 제네릭 클래스 
class ClassName<K, V> {	
	private K first;	// K 타입(제네릭)
	private V second;	// V 타입(제네릭) 
	
	void set(K first, V second) {
		this.first = first;
		this.second = second;
	}
	
	K getFirst() {
		return first;
	}
	
	V getSecond() {
		return second;
	}
}
  • 제네릭 프로그래밍 = 외부 클래스에서 제네릭 클래스를 생성할 때 <> 괄호 안에 타입을 파라미터로 보내 제네릭 타입을 지정해주는 것
  • T 타입은 해당 블럭 { ... } 안에서까지 유효
  • 주의해야할 점!!
    • 타입 파라미터로 명시할 수 있는 것은 참조 타입(Reference Type)밖에 올 수 없다!!
      • 즉, int, double, char 같은 primitive type은 올 수 없다는 것이다. 그래서 int형 double형 등 primitive Type의 경우 Integer, Double 같은 Wrapper Type으로 쓰는 이유가 바로 위와같은 이유

 

 

2. 제네릭 메소드

public <T> T genericMethod(T o) {	// 제네릭 메소드
		...
}
 
[접근 제어자] <제네릭타입> [반환타입] [메소드명]([제네릭타입] [파라미터]) {
	// 텍스트
}



// 제네릭 클래스
class ClassName<E> {
	
	private E element;	// 제네릭 타입 변수
	
	void set(E element) {	// 제네릭 파라미터 메소드
		this.element = element;
	}
	
	E get() {	// 제네릭 타입 반환 메소드 
		return element;
	}
	
	<T> T genericMethod(T o) {	// 제네릭 메소드
		return o;
	}
}
  •  별도로 메소드에 한정한 제네릭도 사용할 수 있다.
  • 클래스와는 다르게 반환타입 이전에 <> 제네릭 타입을 선언한다.

 

 

 

 


 

 

 

4. 어노테이션에 대해서 설명해주세요.

 

# 어노테이션의 의미

  • 사전적 의미 = 주석
  • 자바에서의 의미 = 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술
    • 프로그램에게 추가적인 정보를 제공해주는 메타데이터(데이터를 위한 데이터)

 

# 용도

  1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
  2. 소프트웨어 개발툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
  3. 런타임 시 특정 기능을 실행하도록 정보를 제공

 

 

# 어노테이션 종류

  • 내장 어노테이션
  •  메타 어노테이션 (어노테이션에 적용되는 어노테이션)

 

 

 

# 어노테이션 사용 순서

  1. 어노테이션 정의 -- 필요 시 
  2. 클래스에 어노테이션 배치
  3. 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능 실시

 

# 어노테이션 정의

@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명]{
	public 타입 elementName() [default 값]
    ...
}
  • 정의할 때 설정해야 할 부분!!
    • 어노테이션이 어디에 적용되는지 --- @Target
    • 어노테이션 소스가 언제까지 유지될 것인지 --- @Retention

 

  • @Target
    • 어떠한 값, 범위(ex : 클래스, 필드, 메서드 ...)에 어노테이션을 적용할 것인지.
ElementType.TYPE : 클래스, 인터페이스, enum
ElementType.FIELD : 필드
ElementType.METHOD : 메서드
ElementType.PARAMETER : 파라미터
ElementType.CONSTRUCTOR : 생성자
ElementType.LOCAL_VARIABLE : 지역 변수 
ElementType.ANNOTATION_TYPE : 어노테이션 
ElementType.PACKAGE : 패키지
ElementType.TYPE : 클래스, 인터페이스, enum
ElementType.TYPE_PARAMETER : 타입 파라미터
ElementType.TYPE_USE : 타입
ElementType.MODULE : 모듈

 

  • @Retention
    •  어노테이션 값들을 언제까지 유지할 것인지 값을 입력.
RetentionPolicy.RUNTIME : 런타임
바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임에 어노테이션 정보를 얻을 수 있다.

RetentionPolicy.CLASS : 컴파일
바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 이용해서 어노테이션 정보를 얻을 수는 없다.

RetentionPolicy.SOURCE : 컴파일 전 소스레벨
소스상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다.

 

 

 

# 어노테이션의 배치 및 사용

 

 

 

 

 

 

 

 

5. 오버라이딩과 오버로딩이 무엇이며 어떤 차이가 있을까요?

 

# 오버라이딩

  • 자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
  • 메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다. 주의할 점은 '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다.
    • 접근 제어자만 다르게한다고 오버로딩이 가능하지 않다

 

 

 

# 오버로딩

  • 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것
  • 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다

 

 

 

 

 

 

 

 

 

출처

https://technote-mezza.tistory.com/72

 

[JVM구조]JVM으로 보는 java 프로그램의 실행 과정

java를 통해 개발을 하면서 jvm위에서 돌아간다는 것쯤은 알고 있을 것이다. 하지만 프로그램이 실행되고 처리되는 과정에 대해 정리가 되지 않았던 것 같아 정리하면서 여러 가지 궁금점을 포함

technote-mezza.tistory.com

https://mangkyu.tistory.com/118

 

[Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)

1. Garbage Collection(가비지 컬렉션)이란? [ Garbage Collection(가비지 컬렉션)이란? ] 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는..

mangkyu.tistory.com

https://velog.io/@recordsbeat/Garbage-Collector-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%95%8C%EA%B8%B0

 

Garbage Collector 제대로 알기

ㅅㅅ슈규슈슉 g..gc 슈슉 g...gc GC! 슈슉

velog.io

https://st-lab.tistory.com/153

 

자바 [JAVA] - 제네릭(Generic)의 이해

정적언어(C, C++, C#, Java)을 다뤄보신 분이라면 제네릭(Generic)에 대해 잘 알지는 못하더라도 한 번쯤은 들어봤을 것이다. 특히 자료구조 같이 구조체를 직접 만들어 사용할 때 많이 쓰이기도 하고

st-lab.tistory.com

https://honeyinfo7.tistory.com/56

 

Java에서 어노테이션(Annotation) 이란 무엇인가에 대해 알아보자.

 자바에서 어노테이션이라는 기술이 스프링 프레임워크상에서 자주 쓰이지만 이 기술에 대해 자세히 알아보지도 않고 IT에 몸담고 있는 5년간 대충 아는정도에 밖에 그치지 못하고 있다. 이러

honeyinfo7.tistory.com

https://hyoje420.tistory.com/14

 

[Java]오버로딩 & 오버라이딩(Overloading & Overriding)

오버로딩(Overloading) 오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다.'라는 뜻이다. C언어에서는 함수명이 고유하게 존재해야 한다. 즉 하나의 함수가 하나의 기능만을 구현해야 한다는 것

hyoje420.tistory.com

 

'CS' 카테고리의 다른 글

Java에 대하여 - 3  (0) 2022.06.10
Java에 대하여 - 2  (0) 2022.06.08
Spring에 대하여 - 3  (0) 2022.06.04
Spring에 대하여 - 2  (0) 2022.06.03
Spring에 대하여 - 1  (0) 2022.06.02