Java에 관하여
Java 기술은 프로그래밍 언어이면서 플랫폼 역활을 합니다.
프로그래밍 언어 Java
Java 프로그래밍 언어는 고수준 언어 이면서 .java 확장자를 가지는 일반 텍스트 파일로 모든 소스 코드들은 작성이 됩니다.
이런 소스 파일들은 .class라는 확장자를 가진 클래스 파일로 컴파일러에 의해 컴파일되죠.
하지만 .class파일은 컴퓨터의 프로세서가 직접 실행할 수 있는 저 수준의 코드들을 포함하고 있지는 않습니다.
대신 바이트 코드라는 것들을 포함하고 있죠. 바이트 코드는 JVM이 해석하고 실행할 수 있는
Instruction들이 들어 있습니다.
Java bytecode instruction listings
아래와 같은 소스 코드 파일을 클래스로 컴파일 하게 되면
| public class Bag<T> extends Object{ public Bag(){ super(); } public void add(T t) { } public int size() { return 0; } } | cs |
아래와 같은 바이트 코드가 생성이 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public algorithm.fundamental.Bag(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public void add(T); Code: 0: return public int size(); Code: 0: iconst_0 1: ireturn } | cs |
| Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return | cs |
위의 코드는 Bag()의 기본 생성자를 나타냅니다. 순서가 0, 1, 4로 나타나는 이유는 뭘까요?
자바에서 모든 객체는 암묵적 혹은 명시적으로 Object를 상속 받는 다는 것을 생각해보세요.
아무튼 자바는 JVM을 통해 여러 운영체제에서 동일한 소스코드 파일로 실행이 될 수 있습니다. 그리고 여러개의 JVM이 존재하며 그중 하나인 Java SE HotSpot의 경우, 당신이 만든 어플리케이션의 성능을 향상 시키기 위한 작업을 실행시에 실행합니다.
예를 들면, 성능상의 병목이 되는 곳을 찾아 주기도 하고 자주 사용되는 코드들을 native 코드로 다시 컴파일을 하기도 합니다.
플랫폼(platform)은 프로그램이 실행되고 돌아가는 물리적(하드웨어) 혹은 소프트웨어적인 환경을 말합니다. 즉, 윈도우, 리눅스 유닉스, 맥 OS등등이 있습니다.
대부분의 플랫폼들은 운영체제와 운영체제가 실행될 수 있는 하드웨어를 통칭하기도 합니다.
그런데 자바 플랫폼은 이와 같은 플랫폼과는 다른 점이 있습니다. 바로 하드웨어 기반의 다른 플랫폼 위에서 동작하는 소프트웨어적인 플랫폼 만을 의미합니다.
자바 플랫폼은 아래와 같은 두가지 요소를 가지고 있습니다.
- JVM(Java Virtual Machine)
- Java API (Application Programming Interface)
(* API와 JVM은 프로그램을 하드웨어로부터 격리시켜 줍니다. 즉, 하드웨어에가 달라도 동일한 코드가 실행될 수 있다느 것입니다.)
API라는 것은 이미 만들어져서 있으며, 많은 유용한 기능들을 포함하고 있느 소프트웨어 콤포넌트들을 의미합니다. 그리고 class, interface들을 포함하는 라이브러리(library)로 묶여집니다.
라이브러리나는 것은 다른 말로 패키지(package)입니다.
https://docs.oracle.com/javase/tutorial/getStarted/application/index.html
질문
- 위와 같은 class 파일의 바이트 코드를 볼 수 있는 명령어는 무엇일까요?
- 그리고 그 이외의 자바 명령어들은 무엇이 있을까요?
- javac, java…. 옵션들도 함께 살펴 보면 좋다.
HelloWorld
코드의 구성
| class HelloWorldApp { public static void main(String[] args) { System.out.println("Hello World!"); // Display the string. } public void instance_method(){ System.out.println("This is instance method, can be invoked after creation of instnace"); } public static void class_method(){ System.out.println("This is instance method, can be invoked after loading of class"); } } | cs |
위의 예제는 아마도 수없이 봐왔던 예제이겠죠? 하지만 다시 하나씩 살펴 보겠습니다.
위의 코드는 HelloWorldApp라는 아래와 같은 항목들로 구성이 되어있습니다.
- 클래스의 정의
- main method (* class(static) method, and is entry point of application)
- instance method
- class(static) method
Tutorial Examples
https://docs.oracle.com/javase/tutorial/getStarted/QandE/questions.html
추가적인 질문
- HelloWorldApp을 컴파일하고 실행할때 몇개의 추가적인 클래스들이 필요한가?
- instance, class method들의 차이점은 무엇인가?