📘 Backend/Java

Java GC & Equality & Override/Overload

신건우 2023. 4. 2. 09:06

📘 Garbage Collector

  • 힙 영역에서 사용하지 않는 객체들을 제거하는 작업
  • 이 작업이 필요한 이유는 개발자가 메모리를 직접 해제할 수 없는 언어이기 떄문

동작 방식
  • 간단한 Serial GC 방식으로 설명함
  • 좀 더 진보된 GC는 G1 GC, ZGC가 있으며 이 문서에선 다루지 않음

Garbage Collection
  • Minor GC, Major GC로 구분된다
  • Minor GC는 young 영역, Major GC는 old 영역에서 일어난다고 정의함
  • GC를 수행할 때는 GC를 수행하는 스레드 이외의 스레드는 모두 정지함
    이를 Stop-the-world 라고 한다
  • Minor GC는 Eden 영역이 가득 참으로부터 시작된다
  • Eden 영역에서 참조가 남아있는 객체를 Mark하고 Survivor 영역으로 복사한다
  • 그리고 Eden 영역을 비운다
  • Survivor 영역도 가득차면 같은 방식으로 다른 Survivor 영역에 복사하고 비운다
  • 이를 반복하다 보면 계속해서 살아남는 객체를 old 영역으로 이동한다
  • Major GC는 old 영역에서 일어나며 위와 반대로 삭제되어야 하는 객체를 Mark 한다
  • 그리고 지움
  • 메모리는 단편화 된 상태이므로 이를 한 군데에 모아주는것을 Compaction이라고 함
  • 그래서 Mark-Sweep-Compact 알고리즘이라고도 한다

Garbage Collection이 중요한 이유

GC 수행 시 시스팀에 멈추기 때문에 의도치 않은 장애의 원인이 될 수 있다

따라서 이를 위해 힙 영역을 조절하는 GC 튜닝이 가능하며,
JVM 메모리는 절대 마음대로 조정해선 안된다


📘 메서드 오버라이딩의 조건

메서드 오버라이딩이란?

부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의 하는 것

  • 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메서드를 상속받는다
  • 이렇게 상속받은 메서드는 그대로 사용해도 되고, 재정의하여 사용해도 됨

오버라이딩의 조건

  • 메서드의 동작만을 재정의하는 것이므로, 메서드의 선언부는 기존과 완전히 같아야 함
  • 부모 클래스의 메서드보다 더 좁은 범위의 접근 제어자 지정 불가 (ex: protected -> private)
  • 부모 클래스의 메서드보다 더 큰 범위의 예외 선언 불가 (ex: IllegalException -> RuntimeException)

📘 Overloding & Overriding

Overloding
  • 같은 클래스 내에서 동일한 메서드 이름을 가지지만 매개변수의 타입, 개수가 다르게
    구현될 수 있는것을 의미하며 컴파일 타임 다형성이기도 하다

Overriding
  • 상위 클래스의 메서드를 재정의 하는것을 의미하며, 런타임 다형성이기도 하다
  • @Override 를 써야하는 이유
    • 컴파일 타임에 오버라이딩에 대한 안정성을 부여하므로 왠만하면 꼭 쓰자

📘 Access Modifier

  • private, default, protected, public 이 있다
  • 외부로 노출될 데이터를 선택적으로 제공하기 위함이며, 캡슐화와 통하는 면이 있다
  • private - 해당 클래스 내부에서만 접근 가능
  • default - 해당 패키지에서만 접근 가능
  • protected - 상속한 클래스에서만 접근 가능
  • public - 전체 영역에서 접근 가능