기존의 언어는 한 운영체제에 맞게 개발된 프로그램을 다른 프로그램에 적용시키기 위해 별도의 노력이 필요했지만 자바는 일종의 에뮬레이터인 자바가상머신(JVM)을 통해 운영체제로부터 독립적이다.
자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM과 통신해 JVM이 자바 응용프로그램에서 전달받은 명령을 해당 운영체제가 이해할 수 있도록 변환하여 전달하는 방식이다.
따라서 자바로 작성된 프로그램은 운영체제에 독립적이지만 JVM은 운영체제에 종속적이라 썬에서는 여러 운영체제에 설치할 수 있는 서로 다른 버전의 JVM을 제공하고 있다.
❓ JVM(Java Virtual Machine)
JVM은 Java Virtual Machine을 줄인 말로 직역하면 '자바를 실행하기 위한 가상머신' 이란 뜻이다. 자바로 작성된 언어는 모두 JVM에서 실행되기 때문에 자바 어플리케이션이 실행되기 위해서는 JVM이 꼭 필요하다.
일반 애플리케이션은 OS와 붙어있기 때문에 OS에 종속적이다. 그래서 다른 OS에서 실행시키기 위해서는 해당 OS에 맞게 변경하는 별도의 작업이 필요하다.
반면 Java 애플리케이션은 JVM하고만 상호작용하기 때문에 OS와 하드웨어와는 독립적이라 다른 OS에서도 별도의 작업없이 실행이 가능하다. 하지만 JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요하다.
해서 썬에서는 일반적으로 많이 사용되는 주요 OS용 JVM을 제공하고 있고, JVM은 Windows용 JVM, Macintosh용 JVM, Linux용 JVM 등 여러 JVM으로 나누어진다. 이렇게 함으로써 자바의 중요한 장점 중 하나인 "Write once, run anywhere.(한 번 작성하면 어디서든 실행된다.)"가 성립되는 것이다.
자바는 객체지향 프로그래밍 언어중의 하나로 객체지향개념인 상속, 캡슐화, 다형성이 잘 적용된 언어이다.
❓ 객체지향언어(object-oriented pro-gramming language)
객체지향언어에서 객체(object)란 여러 데이터가 분산되지 않도록 데이터와 기능을 하나로 묶은 그룹이라고 할 수 있다.
ex) 컴퓨터 = 데이터(모니터, 키보드, 마우스...) + 기능(화면, 소리, 입력...)
따라서 객체지향언어는 명령어로 이루어진 목록이 아닌 하나하나 독립된 객체들의 그룹으로 생각하면 되고, 이들이 서로 상호작용을 통해 만들어가는 언어이다.
- 상속
상위클래스의 모든 것을 하위클래스가 이어받는 것이다. 즉 부모의 객체가 자식의 객체에게 부모의 특징을 모두 물려준다.- 캡슐화
데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 것이다. 캡슐화되지 않은 데이터와 코드는 사용하기 어렵다.- 다형성
한 객체 밑에서 다른 여러객체로 재구성 되는 것을 뜻한다. 다시 말해 한 부모의 자식들은 완전히 똑같지 않다는 것을 말한다.
대표적인 예시로 오버로드(Overload)와 오버라이드(Override)가 있다.
자바의 연산자와 기본구문은 C++에서, 객체지향관련 구문은 스몰톡(small talk)에서 가져왔다. 이 두개의 장점을 취해 복잡하고 불필요한 부분은 과감하게 제거하여 단순화해 배우기 어려운 객체지향언어를 보다 쉽게 이해하고 활용할 수 있도록 했다.
자바로 작성된 프로그램이 실행되면 자동으로 가비지컬렉터(garbage collector)가 메모리를 관리해주어 프로그래머는 별도로 메모리를 관리하지 않아도 된다. 이를 통해 프로그래머가 좀 더 프로그래밍에 집중할 수 있게 해준다.
풍부하고 다양한 네트워크 프로그래밍 라이브러리(Java API)를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 지원한다.
일반적으로 멀티쓰레드(multi-thread)의 지원은 운영체제에 따라 구현방법이나 처리방식이 다르지만 자바에서 개발되는 멀티쓰레드 프로그램은 시스템과 상관없이 구현가능하며, 관련 라이브러리(Java API)가 제공되므로 구현이 쉽다.
❓ 멀티쓰레드(multi-thread)
일반적으로 하나의 프로세스는 하나의 쓰레드를 가지고 작업하게 된다. 하지만 멀티쓰레드란 하나의 프로세스에서 여러 개의 쓰레드를 동시에 작업하는 것을 말한다.
또한 멀티쓰레드는 각 쓰레드가 자신이 속한 프로세스의 메모리를 공유한다.
멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유하므로, 시스템 자원의 낭비가 적다.
하나의 스레드가 작업을 할 때 다른 스레드가 별도의 작업을 할 수 있어 사용자와의 응답성도 좋아진다.
보통 자바로 이루어진 애플리케이션은 여러 개의 클래스로 구성된다. 자바는 동적 로딩을 지원하기 때문에 실행 시 모든 클래스가 로딩되지 않고, 필요한 클래스만 로딩이 가능하다. 또한 일부 클래스가 변경되어도 전체 애플리케이션을 다시 컴파일 하지 않아도 되며, 애플리케이션의 변경사항이 발생해도 비교적 적은 작업만으로 처리할 수 있는 유연한 애플리케이션을 작성할 수 있다.
멀티쓰레드 - http://www.tcpschool.com/java/java_thread_multi
객체지향언어란? - https://radait.tistory.com/4