Java
|
자바(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)을 설치하고 싶을 경우 아래와 같이 진행하면 된다.
- JDK가 설치된 폴더를
JAVA_HOME
환경변수로 등록한다. -
PATH
환경변수로$(JAVA_HOME)/bin
을 추가한다. (Windows의 경우%JAVA_HOME%\bin
으로 추가한다.) - 등록할
*.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
- CodingGuidelines:Java: Java 코딩 가이드라인.
- Java:Enumeration
- Java:Annotation
- Java:Exceptions
- Java:StackTrace
- Java:Volatile
- Java:InstanceOf
- Java:ThreadPool
- Java:Timestamp
- Java:Serialization
- Java:CLASSPATH
- Java:VirtualThreads
- Java bytecode
- Java Collection Framework (JCF)
- Java Virtual Machine (JVM)
- Java applet
- OpenJDK
- Java Development Kit (JDK)
- Scala
- Java class file
Libraries
Java Decompiler
Examples
- Android:Example: 간단한 안드로이드 예제.
- Java:Example: 간단한 자바 예제.
- Java:Example:GlobalSetting: 전역으로 사용될 설정(Setting)변수를 관리한다.
- Android.opengl.GLSurfaceView#Example: Android GLSurfaceView Sample.
- Android:Example:DipCalc: Android의 dip와 pixel의 단위를 변환할 수 있다.
- Android:Example:DisplayInfo: Android의 화면장치 정보를 획득할 수 있다.
- Android.content.SharedPreferences:Example: Android의 사용자정보(Preference)를 Save/Load할 수 있다.
- Android:Example:SpinnerDialog: Android의 SPINNER-TYPE 대화상자 출력방법.
- Android:Example:Png2Mp4: png이미지를 mp4로 변환하는 샘플 프로그램.
- Android:Example:MusicInfo: 안드로이드의 음악정보를 획득할 수 있는 샘플 클래스.
- Android:Example:DirectoryManager: 안드로이드에서 사용할 수 있는 미리 정의된 디렉토리 목록을 획득할 수 있도록 도와준다.
- Android:Example:SocketServer: 안드로이드에서 Socket Server와 Socket Client을 만드는 샘플 예제.
- Java.lang.String:InitialConsonant: 한글 초성검색 클래스 예제 (InitialConsonant)
- Android:Example:ImageAdapter: (Geosoft Roadie Android) 이미지 + 문자열 선택형(아이템 선택 가능) 리스트 박스 클래스.
- Android:Example:SpinnerBox: (Geosoft Roadie Android) 스피너(Spinner) 프로그래스 아이콘 다이얼로그 박스 출력 클래스.
- Android:Example:NdkOpenGLESGeometry: (Geosoft Roadie Android) NDK측 에서 OpenGLES를 사용한 기하구조 렌더링.
- SMS-Forward: 문자오면 다른 전화 또는 텔레그램 또는 웹훅 으로 전달.
Classes
Build tools
Java Version Manager
- [추천] 여러 개의 JDK를 설치하고 선택해서 사용하기 - 개발수양록
- IDE (e.g. IntelliJ)
- APT/YUM
- update-alternatives / alternatives
- Homebrew
- Chocolatey
- direnv
- jEnv
- SDKMAN
- jabba
- jvms
How to install
- How to Install JAVA 8 (JDK 8u40) on CentOS/RHEL 7/6/5 and Fedora
- Ubuntu에 Oracle Java 수동 설치
- Linux(CentOS 5.2) 에 JAVA(JDK) 수동 설치
오라클 홈페이지에서 자바를 다운받은 후 압출을 푼다.
## 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
파일을 열고 아래와 같이 입력하면 된다.
(참고로 위의 파일은 /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 중 방금 설치한 경로의 번호를 입력합니다. 보통 가장 마지막에 위치한다.
변경 되었는지 확인하고 버전까지 확인하면 설치가 종료된다.
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 버전을 무료로 사용
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
- LINE의 OpenJDK 적용기: 호환성 확인부터 주의 사항까지
- Java SE versions history
- Java version history - Wikipedia
- OpenJDK JDK 20.0.2 GA Release
- Java/OpenJDK | endoflife.date
자바 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은 단지 한 가지에 대한 서로 다른 버전 이름일 뿐이라는 점을 명심하세요.
Change USER
You can override this value, the same as any other system property with:
OR,
Hello, World!
아래와 같이 Main.java
파일을 생성한다. 파일명과 클래스명은 동일해야 한다.
public class Main {
public static void main(String args[]) {
System.out.println("Hello, World!");
}
}
아래와 같이 컴파일 한 후 실행하면 된다.
또는 아래와 같이 CLASSPATH
를 추가할 수 있다.
Directory
Current Working Directory
User Home Directory.
Line separator
OS별 개행문자(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):
가장 기본적인 용법은 import문 뒤에 static을 붙이고, {패키지.클래스.*}
혹은 {패키지.클래스.멤버}
를 적으면 된다. 위 코드를 static import를 사용하여 작성한 코드는 아래와 같다.
기본적인 static import 사용 (권장되지 않음)
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 메시지가 출력될 경우가 있다.
- Stackoverflow: Is this a memory leak or a false positive?
- Stackoverflow: Eclipse Juno : unassigned closeable value
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
- Eclipse
- Scala
- JVM
- kotlin
- Rawdrawandroid – Java 없이 C와 Make로 안드로이드 앱 개발하기
Favorite site
- Oracle JAVA homepage
- Java™ Platform, Standard Edition 7 API Specification
- Wikipedia (en) JAVA
- 자바 메모리 모델과 쓰레드 1
- 자바(Java) - Annotation 어노테이션 (Custom Annotation)
- [추천] winapi.co.kr: C++ 개발자를 위한 JAVA 강좌 2
- [추천] JavaTM Platform, Standard Edition 6 API 스펙 3
- [추천] 클래스 및 인터페이스 한글 색인 (JDK) 4
Guide
- Stackoverflow: Why const keyword is not used in Java?
- 13 Decks Java Developers Must See to Stay Updated (자바 개발자가 뒤쳐지지 않으려면 봐야 할 13가지 슬라이드)
- 자바로 다중 작업(Multi Task)을 효과적으로 처리하는 방법들 (Executor, CountDownLatch, CyclicBarrier, ForkJoin)
Tip
- Java의 숨겨진 비용을 파악하고 앱 성능 향상하기 5 (Java8 사용시 주의점)
- Java 시스템 운영 중 알아두면 쓸모 있는 지식들
- 자바 난독화 기법(Java Obfuscation Techniques)