자바 Java란?
Sun Microsystems에서 개발해서 1996년에 공식적으로 발표된 객체지향 프로그래밍 언어입니다.
운영체제에 독립적이라는 장점으로 인해 다양한 컴퓨터와 운영체제가 공존하는 인터넷 환경에 적합한 언어입니다.
객체지향과 C++의 장점을 채택하는 동시에 비교적 배우기 쉽고 간결하다는 장점이 있습니다.
풍부한 클래스 라이브러리를 제공하며, 현재에도 꾸준히 성능을 개선하여 새로운 버전을 발표하고 있습니다.
자바 언어의 특징
- 운영체제에 독립적입니다.
자바로 작성된 프로그램은 자바가상머신(JVM, Java Virtual Machine)에서 실행되기 때문에, 프로그램이 운영체제와 직접적으로 통신하지 않습니다.
JVM이 자바 응용프로그램으로부터 전달받은 명령을 운영체제가 이해할 수 있도록 변환하여 전달합니다.
즉, 프로그램은 운영체제에 독립적이지만, JVM은 운영체제에 종속적입니다.
덕분에 자바로 작성된 프로그램은 운영체제와 하드웨어에 관계없이 JVM만 설치되어 있다면 어디서나 실행 가능하여 "Write once, run anywhere"이라는 특징이 있습니다.
- 객체지향언어입니다.
자바는 객체지향 프로그래밍 언어의 하나이기 때문에 객체지향의 특징인 상속, 캡슐화, 다형성이 적용됩니다.
자바의 모든 코드는 반드시 클래스 안에 존재해야 하며, 여러 클래스들이 모여 하나의 자바 애플리케이션이 됩니다.
- 자동으로 메모리를 관리합니다.(Garbage Collection)
자바 프로그램이 실행되면 Garbage collector가 자동적으로 메모리를 관리해주기 때문에 프로그래머가 메모리를 따로 관리하지 않아도 된다는 장점이 있습니다.
이러한 점이 다소 비효율적인 면도 있지만, 프로그래머가 프로그래밍에 더 집중할 수 있도록 도와줍니다.
- 네트워크와 분산처리를 지원합니다.
인터넷과 대규모 분산환경을 염두하고 만들어진 언어이다 보니, 네트워크 프로그래밍 라이브러리(Java API)를 통해 비교적 짧은 시간에 네트워킹을 개발할 수 있도록 지원합니다.
- 멀티쓰레드를 지원합니다.
일반적으로 멀티쓰레드 구현 방법은 사용되는 운영체제에 따라 다르지만, 자바는 시스템과 관계없이 구현 가능하다는 장점이 있습니다.
또한, 멀티쓰레드 관련 라이브러리가 제공되고 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당합니다.
- 동적 로딩을 지원합니다.
자바로 작성된 프로그램은 여러 개의 클래스로 구성되어 있는데 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩해서 사용할 수 있다는 장점이 있습니다.
따라서 일부 클래스가 변경되어도 전체 애플리케이션을 재컴파일 하지 않아도 되며, 변경사항이 있더라도 비교적 적은 작업으로 처리할 수 있어 유연합니다.
자바 가상 머신 JVM(Java Virtual Machine)
자바를 실행하기 위한 가상 머신입니다.
가상 머신은 소프트웨어로 구현된 하드웨어를 말합니다.
즉, 실제 컴퓨터 하드웨어가 아닌 소프트웨어로 구현된 컴퓨터이기 때문에 사용하고 있는 OS에서 실행가능한 JVM만 설치한다면 자바를 실행시킬 수 있습니다.(JVM은 운영체제에 종속적이기 때문)
일반적인 애플리케이션의 경우에는 OS를 직접적으로 거쳐 실행되지만, Java 애플리케이션은 JVM을 거쳐 실행됩니다.
따라서 하드웨어에 맞게 완전히 컴파일된 상태는 아니고, 실행 시에 해석(interpret)되기 때문에 속도가 느리다는 단점이 있습니다.
하지만 최근 바이트코드(컴파일된 자바 코드)를 하드웨어의 기계어로 변환해주는 JIT 컴파일러와 최적화 기술이 적용되어 속도가 개선되었습니다.
JVM의 존재 덕분에 Write once, run anywhere이 가능하게 되는 것입니다.
- JVM의 메모리구조
자바 프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받습니다.
- Method Area
프로그램 실행 중에 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽고 클래스에 대한 정보(클래스 데이터)를 메모리의 메서드 영역에 저장합니다.
클래스 내 클래스 변수도 메서드 영역에 생성됩니다.
- Heap
프로그램 실행 중 생성되는 인스턴스는 힙에 생성됩니다.
인스턴스 변수도 힙에 생성됩니다.
- Call stack(Execution stack)
호출 스택은 메서드 작업에 필요한 메모리 공간을 제공합니다.
메서드가 호출될 때 호출스택에 메서드를 위한 메모리가 할당되고, 해당 메모리에 메서드 내 지역변수와 연산의 중간값 등이 저장됩니다.
메서드가 작업을 마치면 메모리도 반환됩니다.
스택의 top에 위치하는 메서드가 현재 실행 중인 메서드이고 나머지는 대기 상태입니다.
스택의 바로 아래에 있는 메서드가 바로 위에 있는 메서드를 호출한 메서드입니다.
자바 컴파일러와 자바 인터프리터
JDK(Java Development Kit)를 설치하면 JVM과 자바 클래스 라이브러리(Java API)외에 자바를 개발하는데 필요한 프로그램들이 설치됩니다.
bin 디렉토리에는 자바로 프로그램을 개발하는데 필요한 실행파일들이 존재하므로 OS가 파일 위치를 파악하기 위해 path를 등록해줘야 합니다.
JDK의 bin 디렉토리에 자바 컴파일러와 인터프리터 실행파일이 존재합니다.
- 자바 컴파일러: javac.exe, 자바 소스코드를 바이트코드로 컴파일합니다.
- 자바 인터프리터: java.exe, 컴파일러가 생성한 바이트코드를 해석하고 실행합니다.
- 역어셈블러: javap.exe, 컴파일된 클래스파일을 원래 소스로 변환합니다.
Hello.java라는 프로그램을 프로그램을 실행하려면 자바 컴파일러(javac.exe)를 사용해서 소스파일(Hello.java)로부터 클래스파일(Hello.class)을 생성하고 자바 인터프리터(java.exe)로 실행해야 합니다.
소스파일(*.java)과 달리 클래스파일(*.class)은 클래스마다 하나씩 만들어집니다.
main 함수 내의 코드가 자바 인터프리터에 의해 호출되어 프로그램이 실행됩니다.
main 함수는 자바 애플리케이션의 시작점이자 끝점이므로 main 함수는 반드시 하나는 있어야 합니다.
main 함수의 코드가 모두 실행되면 프로그램이 종료되며, 사용했던 자원들이 모두 반환됩니다.
* 바이트코드
JVM이 이해할 수 있는 기계어로, JVM은 바이트코드를 해당 OS의 기계어로 변환해 OS에게 전달합니다.
참고
- 참고 도서: Java의 정석 - 남궁성 지음
'Java' 카테고리의 다른 글
super와 this (0) | 2022.05.20 |
---|---|
상속 Inheritance (0) | 2022.05.20 |
오버로딩(Overloading)과 오버라이딩(Overriding) (0) | 2022.05.19 |
객체지향 프로그래밍(OOP, Object-Oriented Programming) (0) | 2022.05.19 |
배열 Array (0) | 2022.05.19 |