[[TableOfContents]] == 자바 프로그래밍 언어 == === Hello World === * Hello.java {{{#!vim java public class Example { public static void main(String[] args) { System.out.println("Hello World!"); } } }}} * C++와 달리 클래스 정의 뒤에 세미콜론이 붙지 않는다. * main() 함수가 클래스 내부에 메쏘드로 들어가 있다. * 소스 파일 이름의 확장자는 .java 이다. {{{ command_prompt> javac Hello.java }}} * .java를 컴파일하면 .class 가 생성된다. * JVM(Java Virtual Machine)은 .class 를 읽어서 실행한다. * 실행할 .class 파일을 JVM에 넘겨줄 때에는 확장자를 생략한다. {{{ command_prompt> java Hello }}} === 주석(comment) === * C++ 언어와 동일 === 식별자(identifier) === * C 언어와 유사 * 예약어(reserved word) * C 언어와 마찬가지로 키워드가 예약어로 예약되어 있어 사용자가 정의할 수 없다. * null, false, true 는 리터럴로 예약되어 있는 식별자이다. * const 와 goto 는 자바에 구현되어 있지는 않지만 예약어이다. * 키워드(keyword) ||[#s-1.11.1 abstract] ||[#s-1.4.7 boolean] ||[#s-1.6 break] ||[#s-1.4.1 byte] ||[#s-1.6 case] ||[#s-1.12.1 catch] || ||[#s-1.4.8 char] ||[#s-1.7.1 class] ||const ||[#s-1.6 continue] ||[#s-1.6 default] ||[#s-1.6 do] || ||[#s-1.4.6 double] ||[#s-1.6 else] ||[#s-1.7.3 extends] ||[#s-1.7.6 final] ||finally ||[#s-1.4.5 float] || ||[#s-1.6 for] ||goto ||[#s-1.6 if] ||[#s-1.8.3 implements] ||[#s-1.10.2 import] ||[#s-1.5.2 instanceof] || ||[#s-1.4.3 int] ||[#s-1.8.2 interface] ||[#s-1.4.4 long] ||native ||[#s-1.7.2 new] ||[#s-1.10.1 package] || ||[#s-1.7.8 private] ||[#s-1.7.8 protected] ||[#s-1.7.8 public] ||[#s-1.6 return] ||[#s-1.4.2 short] ||static || ||strictfp ||[#s-1.7.5 super] ||[#s-1.6 switch] ||[#s-1.16.1 synchronized] ||[#s-1.7.7 this] ||[#s-1.12.2 throw] || ||[#s-1.12.3 throws] ||transient ||[#s-1.12.1 try] ||[#s-1.4.9 void] ||volatile ||[#s-1.6 while] || * escape sequence * C 언어와 동일 * unicode escape * 소스 코드에서 unicode escape 를 사용하면 pre-processor 가 먼저 처리를 해 버린다. === 자료형 === * 기본형(primitive type)과 참조형(reference type)으로 구분한다. * 기본형은 정수형(byte, short, int, long), 실수형(float, double), 논리형(boolean), 문자형(char)으로 나뉘고, 참조형은 C 언어의 포인터에 해당한다. * 기본형이 아닌 모든 자료형은 참조형이다. 즉 클래스로 선언하는 모든 자료형은 참조형이다. * 참조형은 C 언어의 포인터나 C++ 언어의 reference 와 비슷한 개념을 갖고 있다. * 인자전달 방식에 있어 기본형은 call-by-value 방식을, 참조형은 call-by-reference 방식을 사용한다. * 플랫폼 사이의 호환성을 설계 기준으로 하는 특성 때문에 C 언어에 비해 자료형 사이의 변환을 엄격히 제한하고 있다. ==== byte ==== * 8 bits * signed ==== short ==== * 16 bits * signed ==== int ==== * 32 bits * signed ==== long ==== * 64 bits * signed ==== float ==== * 32 bits ==== double ==== * 64 bits ==== boolean ==== * false 와 true 값을 갖는다. * 크기는? ==== char ==== * 16 bits * unsigned ==== void ==== * C 언어와 동일 ==== 리터럴(lieral) ==== * C 언어와 유사 * long 형 - 숫자 뒤에 접미사로 L 또는 l 이 온다. * float 형 - 숫자 뒤에 접미사로 F 또는 f 가 온다. * double 형 - 숫자 뒤에 접미사로 D 또는 d 가 온다. * boolean 형 - false, true * reference 형 - null ==== 기본형에 연결된 포장 클래스(wrapper class) ==== * Byte * Short * Integer * Long * Character * Float * Double * Boolean ==== 기타 수식 관련 클래스 ==== * Math * Random * import java.util.* * BigIngeger * 큰 수의 정수형 * import java.math.* * BigDecimal * 큰 수의 실수형 * import java.math.* === 연산자(operators) === * C 언어와 유사 * sizeof 연산자가 없다. ==== 쉬프트 연산자 ==== ===== << ===== * 왼쪽으로 쉬프트하면서 오른쪽 끝을 0 으로 채운다. ===== >>> ===== * zero extension * 오른쪽으로 쉬프트하면서 왼쪽 끝을 0 으로 채운다. ===== >> ===== * sign extension * 오른쪽으로 쉬프트하면서 왼쪽 끝을 부호에 따라 0 또는 1 로 채운다. ==== insanceof ==== * 어떤 객체가 어떤 클래스의 인스턴스인가를 알아보는 연산자이다. * 연산자의 왼쪽에는 어떤 객체를 가리키는 참조형 변수가 오고, 오른쪽에는 클래스 이름이 온다. * 연산값은 true 또는 false 이다. {{{#!vim java if( obj instanceof AClass ) { doSomething(); } }}} === 제어문(control statements) === * C 언어와 유사 * if-else * switch-case-default * while * do-while * for * break, contiue, goto * return * if, while, do-while, for 문에서 사용하는 조건식에는 반드시 boolean 식이 나와야 한다. * break 와 continue 뒤에 이름표를 붙이면, 이름표가 명시한 곳으로 마치 C 언어의 goto 처럼 사용할 수 있다. {{{#!vim java Label_01: { initSomething(); for( int i = 0; i < 10; i++ ) { if( doSomething(i) == false ) { break Label_01; } } } }}} * 이름표 달린 break 문은 goto 처럼 어디서나 사용 가능하지만, 이름표 달린 continue 문은 for, while, do-while 문에서만 사용가능하다. === 클래스 === ==== class ==== {{{#!vim java class SuperClass { } }}} * 클래스 정의 방식은 C++ 언어와 비슷하다. * C++ 에서 클래스 정의는 일종의 사용자 자료형을 새로 만드는 정의문이기 때문에 클래스 정의 뒤에는 세미콜론이 반드시 와야 하지만, Java 언어에서 클래스 정의는 일종의 블럭 개념으로 클래스 정의 뒤에 세미콜론이 와서는 안 된다. * Objcet 클래스는 모든 클래스의 조상이며 어떤 클래스에도 속하지 않는다. ==== new ==== * new 가 지정하는 클래스의 인스턴스를 만든다. {{{#!vim java AClass a = new AClass(); MyClass aMyClass = new MyClass(10, 20, 30); }}} ==== extends ==== * 클래스를 정의할 때 상속 받을 클래스를 지정한다. {{{#!vim java class SuperClass { } class SubClass extends SuperClass { } }}} * extends 에 의한 다중 상속은 지원하지 않는다. ==== 메쏘드의 오버로딩(overloading)과 오버라이딩(overiding) ==== * C++ 언어와 유사 * 오버로딩 * 한 클래스 내에 같은 이름의 메쏘드를 여러 개 두는 것을 말한다. * 단 전달인자들의 자료형로 오버로딩한 메쏘드들을 모두 구별할 수 있어야 한다. * 오버라이딩 * 수퍼-클래스에 있는 메쏘드와 이름과 전달인자들의 자료형이 같은 메쏘드를 서브-클래스에서 선언할 수 있도록 하는 것을 말한다. * 호출 우선순위는 서브-클래스의 인스턴스에서 선언한 메쏘드가 높다. ==== super ==== * 서브-클래스에서 수퍼-클래스의 생성자를 호출한다. {{{#!vim java class SuperClass { protected int x, y; public SuperClass(int x, int y) { this.x = x; this.y = y; } public SubClass extends SuperClass { public SubClass(int x, int y) { super(x, y); } } } }}} * 서브-클래스의 생성자에서 super 를 명시하지 않으면 자동으로 super() 를 호출한다. * this 와 마찬가지로 서브-클래스 생성자의 맨 앞에 와야 하므로, super 와 this 를 같이 사용할 수 없다. ==== final ==== * C 언어의 const 와 비슷한 개념으로 final 로 지정한 변수의 값은 바꿀 수 없다. * final 로 지정한 참조형 변수가 다른 객체를 참조하도록 바꿀 수는 없지만 객체 자체는 바꾸는 것이 가능하다. 이것은 C 언어의 상수형 포인터와 비슷한 개념이다. * final 로 선언된 클래스는 상속이 안 된다. * final 메쏘드는 오버라이딩할 수 없다. ==== this ==== * C++ 언어의 this 와 같은 개념이다. * 객체 자신을 return 문을 통해서 반환할 때 사용한다. * 객체 자신을 전달인자로 보낼 때 사용한다. * 지역 변수의 이름이 class 의 멤버와 같은 이름을 갖고 있을 때, 서로를 구별해주기 위해 사용한다. ==== 접근 제한 ==== * C++ 와 유사 * public * private * protected === 추상 클래스와 인터페이스 클래스 === ==== abstract ==== * 추상 클래스를 만들 때 사용한다. {{{#!vim java abstract class AbstractClass { public abstract setValue(int nValue); } }}} * 추상 클래스는 완성되지 않은 클래스이기 때문에 추상 클래스로는 인스턴스를 만들 수 없다. * 추상 메쏘드가 한 개라도 있는 클래스는 반드시 추상 클래스가 되어야 한다. * 추상 메쏘드는 private, static, final, native, strictfp 가 올 수 없다. * 정적 메쏘드는 추상 클래스 내에 정의할 수 없다. * 추상 클래스로는 다중 상속을 할 수 없다. ==== interface ==== * 다중 상속이 가능하다. {{{#!vim java interface A { } interface B { } class C implements A, B { } }}} * interface 클래스의 필드는 public static final 이어야 한다. * interface 클래스의 메쏘드는 public abstract 이어야 한다. ==== implements ==== * interface 로 정의한 클래스를 구현할 때 사용한다. {{{#!vim java interface A { } class B implements A { } }}} === 중첩된 클래스 === === 패키지 === * 패키지는 자바 클래스를 배포할 때, 클래스 이름 경로를 제시하여, 타 클래스와의 이름 충돌을 피할 수 있도록 해 준다. ==== package ==== * 하나의 자바 소스 파일에는 하나의 package 를 사용해야 한다. * package 이름은 보통 소문자로 쓴다. * package 이름은 계층 구조를 가질 수 있고, 이 계층 구조는 폴더의 구조와 같아야 한다. * public 클래스의 이름은 소스 파일 이름과 같아야 한다. * kr/pe/tactlee/Button.java {{{#!vim java package kr.pe.tactlee; public class Button { } }}} * kr/pe/tactlee/special/Button.java {{{#!vim java package kr.pe.tactlee.special; public class Button { } }}} * package 문이 없는 소스 파일에 선언된 클래스는 디폴트 패키지에 속한다. ==== import ==== * 위의 Button.java를 다른 자바 소스 파일에서 사용하기 위해서는 import 를 사용한다. {{{#!vim java import kr.pe.tactlee.Button; }}} 또는 {{{#!vim java import kr.pe.tactlee.*; }}} * import 는 실제로 해당 클래스를 로딩하는 것이 아니라, 단지 클래스 이름 경로를 생략해 주는 역할을 한다. 따라서 클래스 이름 경로를 모두 사용한다면, import 없이도 클래스 사용은 가능하다. {{{#!vim java public class MyButton { kr.pe.tactlee.Button b = new kr.pe.tactlee.Button(); } }}} * import 문의 생략 * java.lang 패키지의 클래스들은 import 문 없이도 사용이 가능하다. * 예를 들어 자주 사용하는 println() 이 속해 있는 System 클래스의 원래 이름은 java.lang.System 이다. === 배열 === * 기본형의 배열 객체 선언과 생성 {{{#!vim java int[] intArray = new int[5]; }}} * 기본형의 배열 객체 선언과 초기화 {{{#!vim java int[] intArray = { 10, 20, 30, 40, 50 }; }}} * 배열이 인덱싱은 C 언어와 동일 * 다차원 배열의 선언과 생성 {{{#!vim java int[][] intArray = new int[3][5]; }}} * 수퍼 클래스로 선언한 배열에 서브 클래스의 객체를 넣을 수 있다. {{{#!vim java class SuperClass { } class SubClassA extends SuperClass { } class SubClassB extends SuperClass { } SuperClass[] arraySuperClass = new SuperClass[3]; arraySuperClass[0] = new SuperClass(); arraySuperClass[1] = new SubClassA(); arraySuperClass[2] = new SubClassB(); }}} * 클래스 배열 객체는 참조형 배열 객체로서 초기값은 null 이다. * interface 로 객체를 생성할 수는 없지만 배열을 만들 수는 있다. 이 배열에는 interface 를 구현한 클래스의 객체를 넣을 수 있다. {{{#!vim java interface SuperInterface { } class SubClassA implements SuperInterface { } class SubClassB implements SuperInterface { } SuperInterface[] arraySuperInterface = new SuperInterface[2]; arraySuperInterface[1] = new SubClassA(); arraySuperInterface[1] = new SubClassB(); }}} * 배열의 복제 {{{#!vim java int[] intArray = { 1, 2, 3 }; int[] intArrayClone = (int[])intArray.clone(); }}} * 배열과 관련된 클래스 * System.array() * Arrays 클래스 === 예외상황 === ==== try-catch ==== ==== throw ==== ==== throws ==== === 리플렉션 === === 쓰레드 === === 스트림 === === 직렬화 === ==== synchronized ==== === 메모리 관리 === === assert === === 기타 === ==== static ==== ==== strictfp ==== ==== volatile ==== == 자바 튜토리얼 == * [http://java.sun.com/ 썬마이크로시스템즈], [http://java.sun.com/docs/books/tutorial/index.html ''The Java Tutorial''] ([http://java.sun.com/docs/books/tutorial/information/download.html Download]) * 이덕하, ''Java Programming Language 정복'',2002 ([attachment:BavaLang.zip zip]) == API 레퍼런스 == * [http://java.sun.com/j2se/1.5.0/docs/api/ Java 2 Platform Standard Ed. 5.0 API Reference] == 자바 관련 링크 == * http://blog.naver.com/etwas0227/60009029130 * http://www-128.ibm.com/developerworks/java/newto/ * http://blog.naver.com/slaltats/120010574953 * http://www.eclipse.org/articles/index.html * http://www.javacafe.or.kr/ == Upload == [[UploadedFiles]] [[UploadFile]]