썬 마이크로시스템즈에서 개발 1996년 1월에 공식적으로 발표한 '객체지향 프로그래밍 언어'이다.
자바는 OS에 종속되지 않는 플랫폼 독립적인 언어이다. 이러한 특징때문에 하나의 프로그램으로 모든 OS에서 실행이 가능하다.
2010년 썬이 오라클사에 인수되어 오라클사의 제품이 되었다.
자바는 1991년 썬의 엔지니어들에 의해서 오크(Oak)라는 언어에서부터 시작되었다.
원래 목표는 가전제품에 탑재될 소프트웨어를 만드는 것이었다.
하지만 여러종류의 OS를 사용하는 인터넷의 등장으로 여러 종류의 OS들이 등장하면서 OS독립적인 언어를 만드는게 적합하다 판단되어 Oak를 인터넷에 적합하도록 개발방향을 바꾸면서 이름을 Java로 변경, 1996년 1월 자바의 정식 버전을 발표했다.
이 당시 정적인 웹페이지에 사운드와 애니메이션등의 멀티미디어적인 요소들을 제공할 수 있는 유일한 방법이 자바로 작성된 애플릿(Applet)이었기 때문에 많은 사랑을 받았지만 보안상의 이유로 최신 웹브라우저에서는 애플릿을 더 이상 지원하지 않게 되었다.
이 후 서버 쪽 프로그래밍을 위한 (Servlet, JSP)등이 많이 사용되고 있으며, 안드로이드에서도 Java를 사용하며 아직도 많은 사랑을 받고있다.
OS 독립적이다.
기존의 언어는 운영체제또는 하드웨어에 컴파일 되면서 OS에 종속적인 특징이 있었다.
대표적으로 C언어가 있다. OS에 종속되어있기 때문에, 이미 개발된 프로그램을 다른 OS에 적용하려면 많은 변경이 필요했다.
하지만 자바는 OS나 하드웨어에 종속되어있지 않고 JVM이라는 가상머신에 종속되어 있기 때문에 JVM이 있으면 어떤 OS에서도 실행이 가능하다는 특징이 있다.
객체지향언어
자바는 객체지향 프로그래밍언어다. 객체지향의 특징인 캡슐화, 다형성 등을 지원한다.
가비지 컬렉션(GC)
자바는 가비지컬렉터가 메모리 관리를 해주기 때문에 개발자가 직접 메모리를 관리하지 않아도 된다.
C언어 같은 경우, 포인터를 이용하여 개발자가 직접 메모리 관리를 해주어야 하지만, 자바는 가비지 컬렉터가 사용하지 않는 자원을 직접 반환해주어 개발자가 개발에만 집중할 수 있게 해준다.
멀티쓰레드 지원
일반적으로 멀티쓰레드의 지원은 OS에따라 구현방식도, 처리방식도 다르다. 하지만 자바에서 개발되는 멀티쓰레드 프로그램은 시스템과 관계없이 구현이 가능하며 관련된 라이브러리가 제공되어 쉽게 구현할 수 있게 해준다.
동적 로딩을 지원한다.
보통 자바로 작성된 애플리케이션은 여러 개의 클래스로 구성되어 있다.
자바는 동적 로딩을 지원하기 때문에 컴파일시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있다는 장점이 있다. 이러한 장점 때문에 일부 클래스가 변경되어도 전체 애플리케이션을 다시 컴파일하지 않아도 되며, 애플리케이션의 변경이 발생하여도 그 파급효과가 적은편이다.
JVM은 Java Virtual Machin의 약자이다.
자바는 이 JVM에 의해 컴파일 되기 때문에 OS에 독립적인 언어가 될 수 있다.
C언어로 작성된 코드같은 경우, OS에 의해 컴파일되어 하드웨어로 전달된다. 따라서 OS에 종속적이다.
C언어 -> OS -> 하드웨어
하지만 Java는 JVM에 의해 컴파일 되고 이 JVM이 OS, 하드웨어와 통신하게 된다.
자바 -> JVM -> OS -> 하드웨어
이러한 특징 때문에 자바언어는 OS에 독립적이지만, JVM은 OS에 종속적이다. 하지만 많이 사용되는 주요 OS용 JVM을 제공하기 때문에 걱정할 필요 없다.
또한 보통 C언어의 경우 코드가 OS에 의해 바로 기계어로 변환이 된다.
하지만 자바는 JVM에 의해 기계어로 바로 변환되는 것이 아니라. 자바 바이트코드로 컴파일되고, 이를 실행시점(런타임시점)에 기계어로 변환하는, 컴파일 방식과 인터프리터방식 두가지 특징을 모두 가지고 있어 속도가 느리다는 단점을 가지고 있다.
이러한 단점을 JIT등과 같은 최적화 기술이 적용되어 속도의 격차를 많이 줄였다.
자바는 JVM에 의해 자바바이트코드로 컴파일되는 컴파일 방식과, 이 바이트코드를 실행시점에 기계어로 변환해주는 인터프리터 두가지 방식의 특성을 모두 가지고 있어 속도가 느리다는 단점이 있다.
이러한 단점을 JIT라는 기술로 많이 보완하였다.
JIT란 Just In Time의 약자로, 실행 시점에 인터프리터 방식으로 기계어로 변환된 코드를 캐싱하여 동일한 부분이 호출될때 캐싱된 코드를 호출하게 하여 속도를 향상시키는 기술이다.
이 JIT를 이용하여 매번 실행이 될때마다 기계어로 변환하는 작업이 이루어지지않고, 캐싱해둔 코드가 있다면 캐싱되어있는 코드를 바로 실행하여 속도가 느리다는 단점을 많이 개선하였다.
Java Development Kit의 약자
자바 실행에 필요한 프로그램들(JVM, Java API등)을 말한다.
javac.exe: 자바 컴파일러, 자바코드를 자바 바이트코드로 컴파일해준다.
java.exe: 바이트코드를 실행하는 자바 인터프리터
javap.exe: 바이트코드로 컴파일된 클래스파일을 자바코드로 변환
javadoc.exe: 자바 문서를 생성해준다. /** */를 이용하여 작성한 글을 자바 API문서 형식으로 생성해준다.
/**
* JavaDoc Test
*/
public class JavaDoc {
public static void main(String[] args) {
System.out.println("javadoc Test");
}
}
위의 코드처럼 작성 후 javadoc JavaDoc.java 명령어를 입력하면

위와 같은 파일들이 생성된다. 이 중 JavaDoc.html파일을 열면

위와 같이 JavaDoc.Java파일이 문서화 된 것을 볼 수 있다.
자바를 실행하려면, 자바컴파일러(javac.exe)를 이용하여 자바 코드로 된 .java파일을 바이트코드로 된 .class파일로 컴파일 시켜야 한다. 이 후 자바 인터프리터(java.exe)로 실행할 수 있다.
public class Execute {
public static void main(String[] args) {
Sum sum = new Sum(5, 3);
System.out.println(sum.sum());
}
static class Sum {
private int x;
private int y;
public Sum(int x, int y) {
this.x = x;
this.y = y;
}
public int sum() {
return x + y;
}
}
}
해당 파일을 javac 명령어를 이용하여 컴파일 시킨다.

Execute.java를 컴파일 시켜 Execute.class라는 파일이 생성되었다.
이후 Execute.class를 java명령어로 실행 시킨다.

package one; //해당 Execute클래스는 one이라는 패키지에 속해있다.
public class Execute {
public static void main(String[] args) {
Sum sum = new Sum(5, 3);
System.out.println(sum.sum());
}
static class Sum {
private int x;
private int y;
public Sum(int x, int y) {
this.x = x;
this.y = y;
}
public int sum() {
return x + y;
}
}
}
이 경우 컴파일된 파일을 패키지의 최상위 디렉토리(src)에서 패키지 경로를 모두 입력해 주어야 한다.(컴파일은 상관없다.)

위 사진처럼 경로를 모두 입력해주어야 한다.
자바 실행 과정
*.java 작성 -> javac로 컴파일 -> *.class 생성 -> java명령어로 실행 -> 실행
에러 대응이 어려운 경우, 에러가 발생한 경우 아래의 순서대로 처리 해본다.
1. 에러 메시지를 잘 읽고 해당 부분의 코드를 살펴본다. 이상이 없으면 코드의 주위도 함께 살펴본다.
2. 대부분의 에러는 사소한 것이 많다. 오타나 괄호가 짝을이루는지 등 사소한 부분도 꼼꼼히 체크해본다.
3. 의심이 가는 부분을 따로 작성하여 테스트 해보거나 주석처리 후 실행해본다.
자바를 실행하게되면 *.class파일을 로드한 후 파일형식, 악성코드 등을 체크한다. 이 후 지정된 클래스에서 main메서드를 찾아 호출한다.
class파일 로드 -> 검사 -> main메서드 실행(main메서드가 없을 경우 NoSuchMethodError: main 에러 발생)