devlog of ShinJe Kim

[Java] Java란 어떤 언어인가?

|

Java 언어의 특징

  1. 운영체제에 독립적이다(WORA).

    자바로 작성된 소스코드는 .java라는 확장자를 가지는 파일이다. .java 파일이 컴파일되면 .class라는 확장자를 가진 바이트 코드 파일이 생성되며, 이 .class파일은 JVM(Java Virtual Machine)이라는 자바 가상 머신을 통해 운영체제에서 실행된다. 이 JVM의 존재 덕분에 자바는 단 한 번만 컴파일되면, JVM에 의해 각 운영체제에 맞게 변환되어 실행된다. 이를 WORA(Write Once Run Anywhere), 즉 한 번 작성하면 어디서나 실행된다고 한다.

  2. 객체지향언어이다.

    자바는 객체지향 프로그래밍(OOP; Object Oriented Programming)언어이며, 객체지향개념의 특징인 상속, 캡슐화, 다형성 등을 작 적용한 언어이다.

  3. 가비지 컬렉션(Garbage Collection)

    자바의 가비지컬렉터(garbage collector)라는 것이 메모리관리를 자동으로 해준다. 그래서 프로그래머가 일일이 코드로 메모리관리를 해주지 않아도 된다.

    메모리 관리를 직접 하는지 혹은 gc(가비지컬렉터) 같은 존재가 자동으로 관리해주는지에는 각각의 장단점이 있다. 메모리 관리를 직접 하면 어디서 메모리가 반환되고 그렇지 않은지 명확하게 코드로 볼 수 있지만 번거롭고 보일러플레이트 코드가 생성된다는 단점이 있다. 반면 gc가 자동으로 메모리관리를 해주면 보일러플레이트 코드도 줄어들고 덜 번거롭겠지만 메모리가 반환되는 지점이 명확하게 보이지 않는다.

    메모리란?

    기억 장치(記憶裝置)는 컴퓨터에서 자료를 일시적으로, 또는 영구히 보존하는 장치를 말한다. 비슷한 말로 저장 장치라고도 하는데 이때는 대체로 비휘발성의 기억 장치를 의미한다. 컴퓨터의 기억 장치는 주기억 장치와 보조 기억장치로 나눌 수 있다. 메모리(memory)는 종종 ‘기억 장치’라는 용어와 혼용되기도 하지만, 대체로는 주기억장치를 말하며 특히 램을 가리키는 경우가 많다.(위키피디아)

  4. 멀티스레드를 지원한다.

    스레드(Thread)란?

    스레드를 알기 위해서는 프로세스(process)를 먼저 알아야 한다. 프로세스는 운영체제에서 메모리 공간을 할당받아 현재 실행중인 프로그램을 의미한다. 프로세는 프로그램에 사용되는 데이터, 메모리 등의 자원, 그리고 스레드로 구성된다. 스레드는 프로세스 내에서 실제로 작업을 수행하는 주체이다. 모든 프로세스는 한 개 이상의 스레드가 존재하여 작업을 수행하는데, 두 개 이상의 스레드를 가지는 프로세스를 멀티 스레드 프로세스라고 한다.

    멀티스레드를 구현하면 동시에 여러 작업을 하거나 대용량의 작업을 더 빨리 처리할 수 있다. 자바에서는 이러한 멀티스레드 프로그래밍을 지원한다. 일반적으로 멀티스레드는 운영체제에 따라 구현 방법과 처리 방식이 다른데, 자바에서는 시스템과 관계없이 구현이 가능하며 관련 라이브러리인 자바 API가 제공되기때문에 구현이 상대적으로 쉽다. 또한 여러 스레드에 대한 스케줄링(scheduling)을 자바 인터프리터가 담당하게 된다.

    스케줄링(scheduling)이란?

    CPU는 한 번에 한 가지 작업만 가능하다. 따라서 여러개의 작업을 동시에 수행하는 것처럼 보이게 하기 위해서는

  5. 동적 로딩(Dynamic Loading)을 지원한다.

    동적 로딩은 프로그램 실행 시에 모든 클래스가 한 번에 로딩하여 객체를 생성하는 것이 아니라, 필요한 시점에 클래스를 로딩하여 객체를 생성하는 것을 의미한다. 동적 로딩을 하면 유지보수시 특정 객체만 쉽게 수정하고 교체할 수 있으며, 일부 클래스가 변경되어도 전체 애플리케이션을 다시 컴파일하지 않아도 된다는 장점이 있다.

Java의 동작 원리

자바로 작성된 애플리케이션은 모두 JVM(Java Virtual Machine)이라는 자바 가상머신에서만 실행되기 때문에 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다. 일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달된다. 반면 Java 애플리케이션은 JVM을 한 번 더 거친다. JVM을 거치더라도 하드웨어에 맞게 완전히 컴파일 된 상태가 아니기 때문에 실행시에 해석(interpret)이 필요하여 속도가 느리다는 단점이 있다. 하지만 요즘은 바이트코드(컴파일된 자바 코드)를 하드웨어의 기계어로 바로 변환해주는 JIT 컴파일러와 향상된 최적화 기술이 적용되어 속도의 격차가 많이 줄어들었다(자바의 정석, p.5).

기타

  • new Instance를 호출하면 String 클래스를 제외한 모든 클래스는 Object 객체를 지원한다. String 클래스만 유일하게 String 객체를 리턴한다.
  • 이스케이프 문자를 사용하기는 했지만 정확한 정의를 알지 못했다. 제타위키에 따르면 어떤 부호 또는 언어로부터 이탈하는 것을 의미한다고 한다. 조금 더 자세한 설명은 생활코딩에 있다.
  • C언어는 리눅스나 맥에서는 동작하지 않는다. 따라서 윈도우즈에서만 개발 가능하다고 한다.

참고 자료

Comments