Java
- 컴파일 과정
- Java Virtual Machine
- Call By Value / Call By Reference
- Thread
- Casting
- Auto Boxing / Auto Unboxing
- Thread
1) 우리가 자바 코드를 생성하여 이를 컴파일 할 경우 확장자가 .java였던 코드가 컴파일러에 의하여 자바 바이트 코드로 변화하게 됩니다. 자바 바이트 코드로 변화하면서 확장자는 .class로 변화합니다. 우리가 이해할 수 있는 형식의 고급 언어(Java)가 저급 언어(어셈블리어)로 변화한 것입니다.
2) 변화한 자바 바이트 코드를 자바 가상 머신(JVM)의 클래스 로더에게 전달해줍니다.
3) 클래스 로더가 자바 바이트 코드를 입력받은 경우, 필요한 클래스들을 로딩 및 링크하여 JVM의 메모리 영역에 올려줍니다.
4) 실행엔진이 JVM 메모리에 올라온 바이트 코드들을 하나씩 가져와서 실행합니다.
자바 언어를 컴퓨터가 이해할 수 있게끔 변화시켜주는 가상의 컴퓨터이며, 자바가 OS에 종속적이지 않게끔 만들어 주는 역할을 수행합니다.
만일 언어가 OS로부터 독립적이지 못한다면, 운영체제마다 언어의 문법을 다르게 해주어야하지만, 언어가 OS로부터 독립적이라면 운영체제에 따라서 언어를 변화시킬 필요가 없습니다.
메소드를 호출하는 과정에서 매개변수에 값을 전달할 때, Call By Value방식과 Call By Reference 방식을 통하여 메소드에 매개변수를 전달할 수 있습니다.
Call By Value 방식의 경우, 직접적인 값만을 전달하기 때문에, 메소드 내부에서 값에 변화를 주어도 main문에서는 해당 값에 변화를 주지 못합니다.
그러나, Call By Reference 방식의 경우에는 참조값을 전달하기 때문에, 메소드 내부에서 참조값을 통하여 원래 값에 도달할 수 있게 됩니다. 따라서, 이러한 경우, 원래 값에 영향을 줄 수 있게 됩니다.
Thread에 대하여 알아보기 전에 먼저, 프로세스(Process)에 대해서 알아보겠습니다.
프로세스는 단순하게 실행 중인 프로그램을 의미하며, 정확히 설명하자면, 운영체제에 의하여 메모리 공간을 할당받아 실행중인 프로그램을 의미합니다.
이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원, 그리고 Thread로 구성됩니다.
그럼, 스레드란 어떠한 역할을 수행하고, 프로세스와 어떠한 관계에 있을까요?
일단, 스레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미합니다.
즉, 모든 프로세스에는 적어도 한 개 이상의 스레드가 존재하여 작업을 수행한다는 것을 알 수 있습니다.
하나의 프로세스에 여러 개의 스레드가 사용되는 구조를 멀티 스레드 프로세스라고 합니다.
이렇게 멀티 스레드를 사용하게 될 경우, 병렬로 연산을 처리하기 때문에 성능 면에서 뛰어나다는 것을 확인할 수 있습니다.
데이터의 자료형을 변경시키는 작업**을 캐스팅(Casting)이라고하는데, 캐스팅을 어떻게 진행하느냐에 따라서 업 캐스팅과 다운 캐스팅이 존재합니다.
범위가 적은 자료형에서 범위가 넓은 자료형으로 형변환하는 경우를 의미합니다.
EX)
int intValue = 3;
double doubleValue = (double)intValue; // doubleValue에 3.0이 저장됨
범위가 넓은 자료형에서 범위가 좁은 자료형으로 형변환하는 경우를 의미합니다. 이 과정에서 정보의 손실이 발생할 수 있습니다.
EX)
double doubleValue = 3.5;
int intValue = (int)doubleValue; // intValue에 3이 저장됨. 0.5 손실 발생
기본 자료형의 값을 Wrapper 클래스에 담거나 Wrapper 클래스에 담겨있는 값을 가져올때 발생하는 현상입니다.
본래 Wrapper 클래스는 기본 자료형과 비슷하지만, null값을 저장할 수 있다는 특징으로 인하여 많이 사용하는 클래스입니다.
이러한 Wrapper 클래스에 값을 담는 경우에는 Integer.valueOf()와 같은 메소드를 통하여 값을 담아주는 것이 원칙이지만,
Integer value = 3;
과 같이 기본 자료형을 별도의 메소드 사용없이 담을 수 있도록 해주는 방식이 Auto Boxing입니다.
반대로 Wrapper 클래스에 담긴 값을 꺼내는 경우에도 별도의 메소드를 사용해야하지만, 별도의 메소드 사용을 생략하고 바로 값을 기본 자료형으로 바꾸는 방식을 Auto Unboxing이라고 합니다.