기술 면접 대비를 위해서 동기들과 스터디를 시작했다.
우선 1주차.
본격적으로 들어가기에 앞서 자바 언어는 OS에 독립적인 특징을 가지고 있다.
즉, 자바 및 플랫폼이 운영체제에 대한 의존성을 낮추는 능력이 있다는 의미인데 아래와 같은 방식으로 구현이 된다.
1. 바이트 코드
-> 자바 컴파일러가 자바 소스 코드를 바이트 코드로 변환하는 과정을 거치는데,
이 바이트 코드는 특정 운영 체제나 하드웨어 플랫폼에 의존하지 않는 중간 형태의
코드로 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있다.
2. JVM (Java Virtual Machine)
-> 자바 프로그램은 JVM에서 실행되는데, JVM은 운영 체제와 하드웨어에 대한 추상화 계층을
제공하여 자바 프로그램이 다양한 운영체제에서 실행 될 수 있도록 한다.
3. 표준 라이브러리
-> 자바는 표준 라이브러리라는 것을 제공하는데, 이러한 표준 라이브러리는 다양한 운영체제에서
동일한 방식으로 동작하기 때문에 자바가 플랫폼에 종속적인 코드를 작성하지 않도록 할 수 있다.
자바 코드가 실행되는 과정
자바 파일(.java)은 위의 그림과 같은 과정을 거쳐서 실행이 되며
각각의 환경들은 프로그램의 실행과 관련하여 다른 시간에 발생하는 환경을 의미한다.
1) 컴파일 타임 환경
-> 소스 코드가 컴파일 되는 시점에서의 환경으로 주로 개발자가 코드를 작성하고 컴파일하기 위해 사용하는
도구와 설정을 포함한다. 컴파일 타임 환경에서는 코드 분석, 구문 검사, 타입 검사 등의 과정이 수행되며 IDE나
텍스트 에디터 등이 컴파일 타임 환경을 제공한다.
예를 들어, 프로그램을 작성하고 저장하면 컴파일러가 이를 감지하고 컴파일하여 바이트 코드를 생성한다.
2) 런타임 환경
-> 프로그램이 실행되는 동안의 환경을 의미하며 운영 체제, 하드웨어, JVM 등 실행 중인 환경과 관련된
요소들을 포함한다. 런타임 환경에서는 바이너리 코드가 메모리에 로드되고 실행되며, 프로그램의 동작이 관찰된다.
예를 들어, 자바 프로그램은 JVM 위에서 실행되는데, 이는 런타임 환경의 일부라고 볼 수 있다.
자바 컴파일 순서
1. 소스 코드 작성 : 개발자가 자바 프로그램을 작성하며 일반적으로 .java 확장자를 가진 텍스트 파일에 작성한다.
2. 컴파일 : 소스 코드는 자바 컴파일러에 의해서 컴파일이 되며 이 때 나오는 파일이 바이트 코드 (.class)이다.
바이트 코드는 아직 컴퓨터가 읽을 수는 없고 JVM에서 실행 가능한 중간 형태의 코드로 자바 가상 머신이 이해할 수 있는 코드이다.
3. 바이트 코드 생성 : 컴파일러는 소스 코드를 바이트 코드로 변환하여 .class 확장자를 가진 바이너리 파일에 저장한다.
이 바이너리 파일에는 클래스와 메서드의 정의가 포함되어 있다.
4. 로드 및 실행 : JVM은 바이트 코드를 로드하고 실행하며 운영 체제에 상관없이 자바 프로그램을 실행 할 수 있도록 한다.
요약하자면 자바 파일(.java)는 컴파일러에 의해서 바이트 코드(.class)로 변환이 된다.
바이트 코드는 JVM이 이해할 수 있는 언어로 JVM(가상머신) 상의 기계어라고 이해할 수 있다.
컴파일 된 바이트 코드는 자바 명령을 통해 JVM 위에서 실행되고, 실행하게 되면 클래스 로더라는 컴파일 된 .class를
JVM의 메모리로 올리게 된다.
컴파일 에러와 런타임 에러
초창기 프로그래머들은 이진법으로 이루어진 기계어를 사용해 컴퓨터에게 명령을 내렸다.
그러나 결국엔 사람이 사용하기에는 어려움이 많았기 때문에 점점 프로그래밍 언어가 발전을 했다.
결국 컴파일이란 것은 사람이 이해하기 쉬운 프로그래밍 언어로 작성된 프로그램을 컴퓨터가 이해할 수 있는 형태의 언어로 변환하는 것이다.
이런 과정에서 여러 에러가 발생할 수 있는데 컴파일에러와 런타임에러가 있다.
컴파일 에러
컴파일 과정에서 생기는 에러로 기본적으로 컴파일러가 이해하지 못하는 코드를 발견했을 때 발생한다.
문법적인 오류가 주된 이유이며 컴파일 에러가 발생하는 경우 중앙처리장치가 실행할 수 있는 코드를 못만들기 때문에 프로그램의 실행을 애초에 막는다.
런타임 에러
컴파일 과정을 마친 프로그램이 실행되어 동작되는 것을 런타임이다.
런타임 에러는 프로그램 실행 중 발생하는 에러로 일반적으로 프로그램에서 수행 불가능한 작업을 시도할 때 발생한다.
프로그램 설계 미숙이거나 아주 드물게 하드웨어 결함이 원인일 수 있으며,
만약 어떤 소스코드가 컴파일 되었다고 해도 이것은 여전히 프로그램 실행 중 버그를 일으킬 수 있다.
0 나누기 오류, null값 참조 오류, 메모리 부족 오류 등의 이유가 존재한다.
면접 예상 질문과 답변
Q1. 자바 컴파일러란 무엇이며 어떤 역할을 하는가?
A1. 자바 컴파일러는 자바 소스 코드를 바이트 코드로 변환하는 도구로
이 바이트 코드는 JVM이 이해할 수 있는 중간 형태의 코드입니다.
Q2. 바이트 코드와 기계어의 차이는?
A2. 기계어는 컴퓨터가 직접 실행 가능한 이진형식의 명령어지만
바이트 코드는 특정 하드웨어에 의존하지 않고 JVM에서 실행되는 중간형태코드입니다.
Q3. JVM의 역할은?
A3. JVM은 바이트 코드를 해석하고 실행하여 자바 프로그램이 여러 운영 체제 및 하드웨어 플랫폼에서
동작할 수 있도록 하는 역할을 합니다.
Q4. JVM의 구성요소는?
A4. 클래스 로더, 인터프리터, JIT 컴파일러, 런타임시스템으로 구성되어 있습니다.
클래스 로더는 필요한 클래스 파일을 동적으로 로드하여 JVM의 메모리에 적재합니다.
클래스의 이름으로부터 클래스 파일을 찾고 로드하는 작업을 수행하며 동적으로
클래스를 로드함으로써 자바의 동적 로딩 및 동적 바인딩 기능을 지원합니다.
자바 인터프리터는 자바 바이트 코드를 한 줄씩 읽고 해석하여 해당 기계에 맞는 명령어로 변환하여 실행합니다.
인터프리터는 바이트 코드를 직접 실행하기 때문에 초기 실행 속도는 느리지만,
코드를 변경하지 않고 즉시 실행할 수 있고 주로 프로그램을 빠르게 실행하기 위해 JIT 컴파일러와 함께 사용됩니다.
JIT 컴파일러는 인터프리터가 반복되는 코드 블록을 감지하여 해당 코드를 네이티브 기계 코드로 컴파일합니다.
컴파일된 코드는 캐시되어 나중에 다시 사용될 수 있으며, 이로 인해 실행 속도가 향상됩니다.
주로 반복적이고 빈번하게 호출되는 코드에 대해 최적화되어 있습니다.
런타임 시스템은 JVM 내부의 여러 컴포넌트를 관리하고 실행하며,메모리 할당, 스레드 관리, 예외 처리, 가비지 컬렉션 등을
담당하여 자바 프로그램의 실행 환경을 제공합니다.
Q5. 자바 컴파일 과정?
A5. 개발자가 자바 소스파일을 작성 및 생성하고 빌드하면 자바 컴파일러의 명령을 통해 자바 파일을
바이트 코드로 변환합니다. 이후 클래스 로더를 통해 JVM 메모리 내로 로드하게 되고 실행엔진을
통하여 컴퓨터가 읽을 수 있는 기계어로 해석이 됩니다.
Q6. 자바 컴파일 과정에서 나타날 수 있는 오류?
A6. 컴파일 과정에서는 주로 구문 오류 및 의미론적 오류가 발생합니다.
구문 오류는 잘못된 구문 또는 문법으로 인해 발생하며 컴파일러가 이를 감지합니다.
의미론적 오류는 코드의 의미와 관련된 오류로 컴파일러가 감지하지 못하고 실행 시 오류 발생할 수 있습니다.
'🪄Interview > ✏️Study' 카테고리의 다른 글
[CS STUDY INTERVIEW] 6주차 - 캐스팅 (Casting) (0) | 2024.03.25 |
---|---|
[CS STUDY INTERVIEW] 5주차 - 직렬화(Serialization) (0) | 2024.03.11 |
[CS STUDY INTERVIEW] 4주차 - 오토박싱(Autoboxing)&언박싱(Unboxing) (0) | 2024.03.04 |
[CS STUDY INTERVIEW] 3주차 - Primitive type(기본/원시타입)과 Reference type(참조타입) (1) | 2024.02.26 |
[CS STUDY INTERVIEW] 2주차 - Call by value와 Call by reference (0) | 2024.02.19 |