Skip to content

Java

Java Packages (list)

  • java.applet
  • java.awt
  • java.awt.color
  • java.awt.datatransfer
  • java.awt.dnd
  • java.awt.event
  • java.awt.font
  • java.awt.geom
  • java.awt.im
  • java.awt.im.spi
  • java.awt.image
  • java.awt.image.renderable
  • java.awt.print
  • java.beans
  • java.beans.beancontext
  • java.io
  • java.lang
  • java.lang.annotation
  • java.lang.instrument
  • java.lang.invoke
  • java.lang.management
  • java.lang.ref
  • java.lang.reflect
  • java.math
  • java.net
  • java.util.concurrent
  • java.nio
  • java.nio.channels
  • java.nio.channels.spi
  • java.nio.charset
  • java.nio.charset.spi
  • java.nio.file
  • java.nio.file.attribute
  • java.nio.file.spi
  • java.rmi
  • java.rmi.activation
  • java.rmi.dgc
  • java.rmi.registry
  • java.rmi.server
  • java.security
  • java.security.acl
  • java.security.cert
  • java.security.interfaces
  • java.security.spec
  • java.sql
  • java.text
  • java.text.spi
  • java.util
  • java.util.concurrent
  • java.util.concurrent.atomic
  • java.util.concurrent.locks
  • java.util.jar
  • java.util.logging
  • java.util.prefs
  • java.util.regex
  • java.util.spi
  • java.util.zip
  • javax.accessibility
  • javax.activation
  • javax.activity
  • javax.annotation
  • javax.annotation.processing
  • javax.crypto
  • javax.crypto.interfaces
  • javax.crypto.spec
  • javax.imageio
  • javax.imageio.event
  • javax.imageio.metadata
  • javax.imageio.plugins.bmp
  • javax.imageio.plugins.jpeg
  • javax.imageio.spi
  • javax.imageio.stream
  • javax.jws
  • javax.jws.soap
  • javax.lang.model
  • javax.lang.model.element
  • javax.lang.model.type
  • javax.lang.model.util
  • javax.management
  • javax.management.loading
  • javax.management.modelmbean
  • javax.management.monitor
  • javax.management.openmbean
  • javax.management.relation
  • javax.management.remote
  • javax.management.remote.rmi
  • javax.management.timer
  • javax.naming
  • javax.naming.directory
  • javax.naming.event
  • javax.naming.ldap
  • javax.naming.spi
  • javax.net
  • javax.net.ssl
  • javax.print
  • javax.print.attribute
  • javax.print.attribute.standard
  • javax.print.event
  • javax.rmi
  • javax.rmi.CORBA
  • javax.rmi.ssl
  • javax.script
  • javax.security.auth
  • javax.security.auth.callback
  • javax.security.auth.kerberos
  • javax.security.auth.login
  • javax.security.auth.spi
  • javax.security.auth.x500
  • javax.security.cert
  • javax.security.sasl
  • javax.sound.midi
  • javax.sound.midi.spi
  • javax.sound.sampled
  • javax.sound.sampled.spi
  • javax.sql
  • javax.sql.rowset
  • javax.sql.rowset.serial
  • javax.sql.rowset.spi
  • javax.swing
  • javax.swing.border
  • javax.swing.colorchooser
  • javax.swing.event
  • javax.swing.filechooser
  • javax.swing.plaf
  • javax.swing.plaf.basic
  • javax.swing.plaf.metal
  • javax.swing.plaf.multi
  • javax.swing.plaf.nimbus
  • javax.swing.plaf.synth
  • javax.swing.table
  • javax.swing.text
  • javax.swing.text.html
  • javax.swing.text.html.parser
  • javax.swing.text.rtf
  • javax.swing.tree
  • javax.swing.undo
  • javax.tools
  • javax.transaction
  • javax.transaction.xa
  • javax.xml
  • javax.xml.bind
  • javax.xml.bind.annotation
  • javax.xml.bind.annotation.adapters
  • javax.xml.bind.attachment
  • javax.xml.bind.helpers
  • javax.xml.bind.util
  • javax.xml.crypto
  • javax.xml.crypto.dom
  • javax.xml.crypto.dsig
  • javax.xml.crypto.dsig.dom
  • javax.xml.crypto.dsig.keyinfo
  • javax.xml.crypto.dsig.spec
  • javax.xml.datatype
  • javax.xml.namespace
  • javax.xml.parsers
  • javax.xml.soap
  • javax.xml.stream
  • javax.xml.stream.events
  • javax.xml.stream.util
  • javax.xml.transform
  • javax.xml.transform.dom
  • javax.xml.transform.sax
  • javax.xml.transform.stax
  • javax.xml.transform.stream
  • javax.xml.validation
  • javax.xml.ws
  • javax.xml.ws.handler
  • javax.xml.ws.handler.soap
  • javax.xml.ws.http
  • javax.xml.ws.soap
  • javax.xml.ws.spi
  • javax.xml.ws.spi.http
  • javax.xml.ws.wsaddressing
  • javax.xml.xpath
  • org.ietf.jgss
  • org.omg.CORBA
  • org.omg.CORBA_2_3
  • org.omg.CORBA_2_3.portable
  • org.omg.CORBA.DynAnyPackage
  • org.omg.CORBA.ORBPackage
  • org.omg.CORBA.portable
  • org.omg.CORBA.TypeCodePackage
  • org.omg.CosNaming
  • org.omg.CosNaming.NamingContextExtPackage
  • org.omg.CosNaming.NamingContextPackage
  • org.omg.Dynamic
  • org.omg.DynamicAny
  • org.omg.DynamicAny.DynAnyFactoryPackage
  • org.omg.DynamicAny.DynAnyPackage
  • org.omg.IOP
  • org.omg.IOP.CodecFactoryPackage
  • org.omg.IOP.CodecPackage
  • org.omg.Messaging
  • org.omg.PortableInterceptor
  • org.omg.PortableInterceptor.ORBInitInfoPackage
  • org.omg.PortableServer
  • org.omg.PortableServer.CurrentPackage
  • org.omg.PortableServer.POAManagerPackage
  • org.omg.PortableServer.POAPackage
  • org.omg.PortableServer.portable
  • org.omg.PortableServer.ServantLocatorPackage
  • org.omg.SendingContext
  • org.omg.stub.java.rmi
  • org.w3c.dom
  • org.w3c.dom.bootstrap
  • org.w3c.dom.events
  • org.w3c.dom.ls
  • org.xml.sax
  • org.xml.sax.ext
  • org.xml.sax.helpers

자바(Java, 문화어: 쟈바)는 썬 마이크로시스템즈의 제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어이며, 썬 마이크로시스템즈에서 무료로 제공하고 있다. 1991년 그린 프로젝트(Green Project)라는 이름으로 시작해 1995년에 발표했다. 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발했지만 현재 웹 애플리케이션 개발에 가장 많이 사용하는 언어 가운데 하나이고, 모바일 기기용 소프트웨어 개발에도 널리 사용하고 있다.

자바의 개발자들은 유닉스 기반의 배경을 가지고 있었기 때문에 문법적인 특성은 파스칼이 아닌 C++의 조상인 C 언어와 비슷하다. 자바를 다른 컴파일언어와 구분짓는 가장 큰 특징은 컴파일된 코드가 플랫폼 독립적이라는 점이다. 자바 컴파일러는 자바 언어로 작성된 프로그램을 바이트코드라는 특수한 바이너리 형태로 변환한다. 바이트코드를 실행하기 위해서는 JVM(자바 가상 머신, Java Virtual Machine)이라는 특수한 가상 머신이 필요한데, 이 가상 머신은 자바 바이트코드를 어느 플랫폼에서나 동일한 형태로 실행시킨다. 때문에 자바로 개발된 프로그램은 CPU나 운영 체제의 종류에 관계없이 JVM을 설치할 수 있는 시스템에서는 어디서나 실행할 수 있으며, 이 점이 웹 애플리케이션의 특성과 맞아떨어져 폭발적인 인기를 끌게 되었다.

History

자바 언어는 1991년 6월 셋톱 프로젝트를 위해 제임스 고슬링(James Gosling)이 만들었다. 이 언어는 원래 제임스 고슬링의 사무실 밖에 있던 오크 나무를 따라 오크(Oak), 혹은 그린(Green) 이라고도 불렀으나 단어 리스트 중 무작위로 뽑은 자바(Java)를 선택했다. 고슬링의 목표는 C/C++ 스타일의 언어와 가상 머신을 구현하는 것이었다. 첫 공개 자바 버전은 1995년의 자바 1.0 이었다. 한번 쓰고 어느 곳에도 실행 "Write Once, Run Anywhere" 하는 것을 약속하였고 인기 플랫폼에 무료 런타임을 제공하였다. 이 플랫폼은 꽤 안정성을 지녔고 보안 시스템은 여러 설정을 통해 네트워크 및 파일 접근을 통제할 수 있었다. 대부분의 브라우저들은 곧 자바 애플릿(Java Applet)을 웹 페이지 안에서 실행할 수 있었고 자바의 인기는 급상승했다. 자바 2 (JDK 1.2 ~ 1.4) 의 출현으로 여러 다양한 플랫폼에서 사용 할 수 있는 설정(Configuration) 들을 만들었다. 예를 들어 J2EE 는 엔터프라이즈 애플리케이션을 실행할 수 있고 J2ME 는 모바일 애플리케이션을 실행할 수 있다. J2SE는 스탠다드 에디션 으로 지정되었다. 2006년에 마케팅 용으로 Java EE, Java ME, Java SE 순서대로 명칭을 바꾸었다.

썬 마이크로시스템즈는 1997년 ISO/IEC JTC1 표준화 그룹, 그리고 나중에는 ECMA International 그룹과 접촉하여 정식 승인 받으려 했으나 곧 이 프로세스에서 철수 했다. 자바는 사실상 (de facto) 의 표준이며 자바 커뮤니티 프로세스(Java Community Process) 를 통해 관리가 된다. 썬 마이크로시스템즈는 자바의 대부분을 무료로 배포하였으나 오픈이 아닌 Proprietary 소프트웨어였다. 썬 마이크로시스템즈는 자바 엔터프라이즈 시스템같은 특정 라이선스를 팔아서 수입을 올렸다. 썬사는 자사의 개발용(소프트웨어 개발 키트 (SDK))과 개발용의 일부인 실행용 (자바 런타임 환경, JRE) 을 구분한다. 실행용에는 컴파일러, 유틸리티 및 여러 개발용 헤더 파일이 포함되어 있지 않다.

2006년 11월 13일 썬 마이크로시스템즈는 대부분은 자바를 GPL 라이선스로 소스를 오픈하였으며 2007년 5월 8일 이 과정을 마쳤다. 썬 마이크로시스템즈가 권한을 가지고 있지 않은 대부분의 코어 부분을 오픈하였다.

2009년 4월 20일 제작사인 썬 마이크로시스템즈가 오라클과 인수합병됨에 따라 자바에 대한 권리 및 유지보수 또한 오라클로 넘어가게 되었다.

Install Java Developer Kit

JDK(Java Developer Kit)을 설치하고 싶을 경우 아래와 같이 진행하면 된다.

  1. JDK가 설치된 폴더를 JAVA_HOME환경변수로 등록한다.
  2. PATH환경변수로 $(JAVA_HOME)/bin을 추가한다. (Windows의 경우 %JAVA_HOME%\bin으로 추가한다.)
  3. 등록할 *.jar파일이 존재한다면 CLASSPATH환경변수에 추가한다.

Java Runtime Interpreter

자바 런타임(Runtime) 인터프리터(Interpreter) 이다.

JAR파일(*.jar)을 실행하고싶을 경우 java -jar [JAR_PATH]를 입력하면 된다.

  • appletviewer: 애플릿뷰어.
  • java: 런타임 인터프리터.
  • javac: 컴파일러.
  • jdb: 디버거.
  • javap: 클래스파일 역어셈블러.
  • javah: C 헤더파일 생성기.
  • javadoc: 문서화 도구.
  • jar: Java™ Archive (JAR) file format에 대한 설명.

Tools

Category

Libraries

Java Decompiler

Examples

Classes

Build tools

Java Version Manager

How to install

오라클 홈페이지에서 자바를 다운받은 후 압출을 푼다.

## Login root
$ sudo -s
$ cd /usr/local
## Download: jdk-8u66-linux-x64.tar.gz
$ tar vxzf jdk-8u66-linux-x64.tar.gz
$ ln -s jdk1.8.0_66 java

실행파일이 rwxr-xr-x권한을 갖고 있는지 확인해야 한다.

이 후 /etc/profile.d/java.sh파일을 열고 아래와 같이 입력하면 된다.

export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin

(참고로 위의 파일은 /etc/profile에서 자동으로 불러오게 된다.

Use alternatives

시스템에서 사용할 java를 alternatives를 사용하여 적용한다.

$ /usr/sbin/alternatives --install /usr/bin/java java /opt/jdk1.6.0_24/jre/bin/java 2
$ /usr/sbin/alternatives --config java

선택 가능한 java 중 방금 설치한 경로의 번호를 입력합니다. 보통 가장 마지막에 위치한다.

변경 되었는지 확인하고 버전까지 확인하면 설치가 종료된다.

$ /usr/sbin/alternatives --display java
$ java -version

Oracle JAVA SE License

주요버전 출시 (6개월 단위/8버전 이후)
JCP(Java Community Process)승인이 필요한 사양을 추가하거나 변경
Update 주기
주요 패치 업데이트 주기는 3개월임
취약점 보호가 포함된 버그 수정
오라클 고객에 한하여, 심각한 보안 문제가 발생하는 경우에는 비정기적으로 번들 패치 릴리즈(Bundle Patch Release)를 발행하여 제공
LTS 버전 (안정적, 장기지원)
Java 7, 8, 11, 17의 LTS 버전들은 장기 지원을 제공하기 때문에 주요 버전이라고 볼 수 있음

Java SE 정책 변화: Java SE 17 (2021.10)

  • LTS 릴리즈는 2년마다 제공 (기존에는 3년)
  • 새로운 사용 조건: Oracle No-Fee Terms and Conditions (NFTC)*
    • JDK 17 NFTC 라이선스는 오라클 Java 17 의 정책 변화에 따른 새로운 라이선스이며, 라이선스 조건과 오라클 Java 사용 정책에 따라 오라클 Java 17 버전을 무료로 사용
  • 공개 업데이트는 3년 (다음 LTS 릴리즈 + 1년) 동안 제공
  • 그 이후 업데이트에는 Java SE 구독이 필요하며 OTN 라이센스에 따라 게시
  • 상업적 사용 허용 (공개 업데이트 기간 동안 라이선스 비용 없음)

NFTC: https://www.oracle.com/downloads/licenses/no-fee-license.html

Java SE 정책: 서버 관련

  • Java SE Subscription 서버 라이선스는 Processor 단위 과금
  • 오라클은 사용 여부와 상관없이 설치되거나 실행 중인 (installed and/or running) 모든 프로세스에 대해 라이선스를 적용
  • 오라클 소프트웨어 가상화 및 클라우드 정책
    • Oracle Java SE가 설치 및/또는 실행되는 모든 프로세스에 대해 라이센스가 필요
    • 물리적, 가상 및 클라우드 컴퓨팅 환경에 동일 적용

Java SE 정책: 데스크탑 관련

  • Java SE Subscription 데스크탑 라이선스는 사용자(Named User Plus) 단위 과금
  • 사용 여부와 상관없이 설치(Installed)된 경우 라이선스 필요
  • Java SE 6,7,8 버전 사용, JRE(JVM) 라이선스가 별도로 필요한 경우 Java SE Subscription 데스크탑 라이선스 구매

Oracle JDK 무료 버전 vs 유료버전

무료버전

유료버전

6u45 이하

6u51 이상 (최신버전: 6u211)

7u80 이하

7u85 이상 (최신버전: 7u361)

8u202 이하

8u211 이상 (최신버전: 8u351)

-

11 이후 모든 버전

  • OpenJDK 는 모든 버전이 무료로 사용이 가능함
  • 무료버전은 최신의 보안 업데이트, 기능 업데이트, 버그 수정 업데이트가 지원되지 않음

Version Compatibility Matrix

자바 SE 버전

버전 번호

출시일

LTS

비고

JDK 1.0 (Oak)

1.0

1996년 1월

JDK 1.1

1.1

1997년 2월

J2SE 1.2 (Playground)

1.2

1998년 12월

J2SE 1.3 (Kestrel)

1.3

2000년 5월

J2SE 1.4 (Merlin)

1.4

2002년 2월

J2SE 5.0 (Tiger)

1.5

2004년 9월

자바 SE 6 (Mustang)

1.6

2006년 12월

자바 SE 7 (Dolphin)

1.7

2011년 7월

자바 SE 8

1.8

2014년 3월

LTS

다른 곳에서 JDK 1.8 다운로드 해달라 하면 Oracle Java SE 8 버전 이라고 하면 된다.

자바 SE 9

9

2017년 9월 21일

자바 SE 10

10

2018년 3월 20일

자바 SE 11

11

2018년 9월 25일

LTS

자바 SE 12

12

2019년 3월 19일

자바 SE 13

13

2019년 9월 17일

자바 SE 14

14

2020년 3월 17일

자바 SE 15

15

2020년 9월 15일

자바 SE 16

16

2021년 3월 16일

자바 SE 17

17

2021년 9월 14일

LTS

자바 SE 18

18

2022년 3월 22일

자바 SE 19

19

2022년 9월 20일

자바 SE 20

20

2023년 3월 21일

  • 버전 1.0과 1.1은 JDK(Java Development Kit)로 명명됩니다.
  • 버전 1.2부터 1.4까지 플랫폼 이름은 J2SE(Java 2 Standard Edition)입니다.
  • 버전 1.5부터 Sun은 내부 및 외부 버전을 도입했습니다.
    • 내부 버전은 이전 버전(1.4 이후 1.5)과 이어져 있지만 외부 버전은 크게 향상되었습니다(1.5에서 5.0).
    • 이는 누군가에게 혼란을 줄 수 있으므로 버전 1.5와 버전 5.0은 단지 한 가지에 대한 서로 다른 버전 이름일 뿐이라는 점을 명심하세요.
  • Java 6부터 버전 이름은 Java SE X입니다.

Change USER

System.getProperty("user.name");

You can override this value, the same as any other system property with:

$ java -Duser.name=my-new-user

OR,

System.setProperty("user.name", "my-new-user"); 

Hello, World!

아래와 같이 Main.java파일을 생성한다. 파일명과 클래스명은 동일해야 한다.

public class Main {
    public static void main(String args[]) {
        System.out.println("Hello, World!");
    }
}

아래와 같이 컴파일 한 후 실행하면 된다.

$ javac Main.java
$ java Main

또는 아래와 같이 CLASSPATH를 추가할 수 있다.

$ java -cp . Main

Directory

Current Working Directory

String workingDir = System.getProperty("user.dir");

User Home Directory.

String userDir = System.getProperty("user.home");

Line separator

OS별 개행문자(Line separator)는 아래와 같은 방법으로 획득할 수 있다.

String lineSeparator = System.getProperty("line.separator");

Variable Arguments

가변인자는 아래와 같이 배열처럼 사용하면 된다.

public static void foo(int ... nums) {
    for(int num : nums) {
        System.out.print(num);
    }
    System.out.printf("The last number of list is %d\n", nums[nums.length - 1]);
}

Byte Array to HEX String

byte[]를 HEX 문자열로 변환하는 방법은 아래와 같다.

public static String byteArrayToString(byte[] data) {
    if (data != null && data.length > 0) {
        StringBuilder builder = new StringBuilder();
        for (byte cursor : data) {
            String hex = Integer.toHexString(0xFF & cursor);
            builder.append("0x");
            if (hex.length() == 1) {
                builder.append('0');
            }
            builder.append(hex.toUpperCase() + " ");
        }
        return builder.toString();
    }
    return "";
}

그 역의 경우는 아래와 같다.

public static byte[] stringToByteArray(String byteString) {
    String[] byteStringArray = byteString.split(" ");
    if (byteStringArray != null && byteStringArray.length > 0) {
        byte[] byteArray = new byte[byteStringArray.length];
        for (int cursor = 0; cursor < byteStringArray.length; cursor++) {
            byteArray[cursor] = (byte) (Integer.decode(byteStringArray[cursor].trim()) & 0xFF);
        }
        return byteArray;
    }
    return null;
}

Static import

Static import를 사용하지 않은 코드 (Math):

int i = Math.abs(-20);
double d = Math.acos(Math.PI) * Math.E;

가장 기본적인 용법은 import문 뒤에 static을 붙이고, {패키지.클래스.*} 혹은 {패키지.클래스.멤버} 를 적으면 된다. 위 코드를 static import를 사용하여 작성한 코드는 아래와 같다.

기본적인 static import 사용 (권장되지 않음)

import static java.lang.Math.*;

...

int i = abs(-20);
double d = acos(PI) * E;

Troubleshooting

문제 해결방법에 대하여 정리한다.

No enclosing instance of type

접근하려는 클래스의 인스턴스가 닫혀져 있지 않다는 내용의 오류가 출력될 경우가 있다.

No enclosing instance of type 클래스이름 is accessible. Must qualify the allocation with an enclosing instance of type 클래스이름 (e.g. x.new A() where x is an instance of 클래스이름)

클래스가 static 인지 확인해야 한다.

Class loading exception

Resource leak

아래와 같은 Warning 메시지가 출력될 경우가 있다.

Resource leak: '<unassigned Closeable value>' is never closed.

close()와 같은 메모리 반환 메서드를 호출하지 않아 발생되는 경고이다. 리소스 사용 후 close()와 같은 메모리 반환을 추가해야 한다.
또는 Java 7을 사용할 경우, try-with-resources blocks을 사용하여 해결할 수 있다:

public static boolean copyFile(String fileSource, String fileDestination) {
    try (FileInputStream srcStream = new FileInputStream(fileSource); 
            FileOutputStream dstStream = new FileOutputStream(fileDestination)) {
        dstStream.getChannel().transferFrom(srcStream.getChannel(), 0, srcStream.getChannel().size());
        return true;
    } catch (IOException e) {
        return false;
    } 
}

java.lang.Object cannot be resolved

아래와 같은 에러메시지가 출력될 수 있다.

The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files

이 경우 Eclipse에서 아래와 같이 해결하면 된다.

  • Properties -> Java Build Path -> Libraries -> add JRE System Library

Could not create the Java Virtual Machine

콘솔에서 아래와 같이 사용하면 에러가 발생된다.

$ java --version
Unrecognized option: --version
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

이 경우 --version을 사용하지 말고 -version을 사용해 보자.

Documentation

쉽게 따라하는 자바 웹 개발 - Java Web Development 2판
https://github.com/keesun/study/tree/master/book
Java_Web_Development_to_Easily_Follow_-Java_Web_Development-_2nd.pdf

See also

Favorite site

Guide

Tip

Syntax: synchronized

References


  1. Tech_column_-_Java_memory_model.pdf 

  2. Soenlab_com.7z 

  3. Xrath_com-java-spec.zip (/javase/ko/6/docs/ko/api/overview-summary.html 참조) 

  4. Www.javacool.net.zip (_cool/api_doc/kor_jdk11api/AllClasses.htm 참조) 

  5. Andev-jake-wharton-java-hidden-costs-android.pdf