Post

TIL(20240915) [JAVA 기술면접대비]


** 컴파일 과정

  • 개발자가 .java소스파일을 생성하고 build를 하면 java compiler의 명령어를 통해 바이트코드(.class)를 생성합니다. class loader를 통해 바이트코드를 jvm내로 로드하게 되고 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석되어(각 운영체제에 맞게) runtime data area에 배치되게 됩니다.

    정리 : java파일 생성→ build → java compiler의 javac 명령어 → 바이트코드(.class) 생성 → class loader를 통해 jvm 로드→ 실행엔진을 통해 기계어 해석→ runtime data area 배치

  • 먼저, 개발자가 .java소스파일을 생성하고 빌드하게 되면 컴파일러가 명령어를 통해 자바소스를 바이트 코드로 변환합니다. 그 다음 클래스 로더가 바이트코드를 런타임 데이터 영역에서 로드시키고, 로딩된 바이트코드가 실행엔진에 의해서 실행되게 됩니다.

image

자바 메모리구조는 크게 5가지 영역으로 구분되어 있는데요. 스레드 별 영역인 PC Register, JVM stack, Native Method Stack이 있고, 스레드 공통으로는 Method 영역 , Heap영역이 있습니다.

PC Register(CPU의 register와 역할이 유사)는 현재 수행중인 JVM 명령의 주소값이 저장되는 영역이고, JVM Stack은 호출된 메서드의 매개변수, 지역변수, 리턴정보(메서드에서 사용되는 값들)들이 저장됩니다. Native Method Stack은 자바 언어 외 다른언어의 메서드 호출을 수행하기 위한 영역 입니다. 스레드 공통인 Method 영역은 클래스,변수, 메서드, 상수 정보들이 저장되게 됩니다. 마지막으로 Heap 영역에서는 런타임 중 생성되는 객체들이 동적으로 할당되는 곳입니다.

JVM에서 메모리를 관리해주는 모듈인데요, 조금 더 자세히 설명을 드리면 (과거에는 개발자가 직접 메모리를 관리해주어야 했던 것으로 알고 있다.) Heap 메모리를 재활용하기 위해서 더이상 참조되지 않는 객체들을 확인한 후에 메모리에서 제거하는 역할을 합니다. 개발자가 직접 메모리를 정리하지 않아도 되어서 개발 속도가 향상되는 장점이 있지만 Mark and Sweep이라는 과정에서 참조되지 않는 객체를 찾는 과정이 있는데, 이 때 스레드가 잠시 중단되어서 성능이 떨어진다는 단점이 있습니다.

** 메모리영역이 꽉 차게되면 잠시 실행을 멈추고 각 데이터가 어디서 참조되고 있는지 확인 후 참조되지 않는 부분들은 삭제된다.(mark and sweep)

현실 세계의 사물과 같은 객체를 만들고, 객체에서 필요한 특징(상태:변수, 동작/행위: 메서드)을 뽑아 프로그래밍을 수행하는 것을 의미하며 (장점으로는 유지보수성, 확장성, 재사용성이 향상된다는 장점이 있습니다.) 객체지향 프로그래밍에는 총 4가지 특징이 있는데요.

  • 추상화: 어떤 사물의 공통적인 특징을 하나의 개념으로 다루는 것(추상클래스, 인터페이스)

    ex) 개와 고양이 /

  • 캡슐화: 클래스 안에 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하여 객체의 결합도를 낮추는것(접근 제어자를 통해 정보 은닉하여 데이터를 보호)

    ex) 결합도가 높으면 하나가 바뀌게되면 다른 것도 바뀌어야 할 확률이 높기에 결합도는 낮아야 한다.

  • 상속: 부모클래스의 속성과 기능을 자식클래스가 물려받아 재사용하므로써 기능의 확장성, 재사용성을 확보할 수 있습니다.
  • 다형성: 하나의 타입에 여러 객체를 대입할 수 있는 성질을 의미하는데, 예를 들어 메서드의 은 요청에 대해서 각각 다른 방식으로 결과를 내도록 하는 것인데, 객체 행동 변경을 용이하게 하기 위해 사용됩니다. (오버로딩/오버라이딩)

정의에 대해서 먼저 말씀을 드리면, 추상 클래스는 abstract 지시자로 정의되며 추상메서드가 하나 이상 포함된 클래스이고 인터페이스는 interface 지시자로 정의하며 모든 메서드가 추상메서드로 정의됩니다.(자바 8버전에서는 default 키워드로 일반메서드의 구현도 가능해졌습니다) 이 두가지는 목적에서 차이가 있는데요. 추상클래스는 추상 클래스를 상속받아서 기능을 재활용하고 확장시키는 데 있고 인터페이스는 함수의 껍데기만 존재하며 그 메서드의 구현을 강제하기 위해서 존재하는데, 구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.