일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 민동현의토요명화
- ETF
- 김장훈
- 자바
- 러시아
- 공정위
- 그녀가말했다
- CDMA
- 페이스북
- 유희열의라디오천국
- Java
- EV-DO Rev. B
- 위피
- 김장훈의who
- brew
- 이지형
- 사요
- itmusic
- SWT
- HSDPA
- 한국의 기획자들
- 모던음악만만세
- 퀄컴
- 라디오
- USIM
- 민동현
- VoIP
- "명탐정 코난"
- 차트쇼쇼쇼
- Wibro
- Today
- Total
zyint's blog
자바 (Java) 문법 본문
주석
- // 한줄 주석
- /* 여러줄
주석 */ - /** Java Doc 주석 */
식별자
- 숫자로 시작하지 않고, 스페이스를 포함하지 않는 글자, 숫자, 밑줄(_), 달러($)
- 대소문자 구분
- 클래스 이름: 대문자로 시작, 뒤는 소문자 예) SampleClassName
- 변수, 함수 이름: 소문자로 시작 예) foo
문자 포맷팅
Escape character | \n: 다음 줄의 처음으로 이동합니다. \t: 탭 \r: 현재 줄의 처음으로 이동합니다. \\: 백슬러시(\)를 출력할 때 사용 \": 큰 따옴표(")를 출력할 때 사용 |
Formatting specifier | %s: 문자열 %f: float, double 값 표현 %.2f: 소수점 2째 자리까지 표현 %d: 정수 |
연산자
연산자 종류
- 단항 후위 연산자: a++, a--
- 단항 연산자: ++a, --a, +a, -a, (타입)
- 산술 연산자
- 곱셈(*), 나눗셈(/), 나머지(%)
- 덧셈 또는 문자열 연결(+), 뺄셈(-)
- 비교연산자
- >, <, >=, <=
- ==, !=
- 타입 연산자: instanceof 예) 객체의 클래스 타입이 맞는지 반환. 객체 instanceof 클래스이름
- 조건 연산자: ?:
- 대입 연산자: =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=
- 논리 연산자: &&, ||, !
- 비트 연산자
- 왼쪽 시프트(<<), 오른쪽 시프트(>>), 부호 없는 오른쪽 시프트(>>>)
- &, |, ^, ~
연산자 우선순위
위에서 아래로 내려갈수록 우선순위가 낮아집니다.- a++, a--
- ++a, --a, +a, -a, NOT(!), complement(~), (타입)
- *, /, %
- 덧셈 또는 문자열 연결(+), 뺄셈(-)
- <<, >>, >>>
- <, <=, >, >=, instanceof
- ==, !=
- &
- ^
- |
- &&
- ||
- ?:
- =, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>=
타입
- primitive type → java.lang에 있는 Wrapper class
- boolean → Boolean
- byte → Byte
- char → Character
- short → Short
- int → Integer
- long → Long
- float → Float
- double → Double
배열
- 배열 선언
- int c[] = new int[12];
- int[] c = new int[12];
- int[] array1, array2; // 둘다 배열로 선언
- int c[][] = new int[2][2];
- int b[][];
b = new int[2][];
b[0] = new int[5]; // 첫 행에 5개의 열
b[1] = new int[3]; // 첫 행에 3개의 열 - 값 지정
- int n[] = {1,2,3,4};
- int n[][] = {{1,2}, {3,4}};
- 접근
- myArray[2] = var;
제어문
조건문
if
if(조건문) { ... } else { ... }?:
System.out.println(studentGrade >= 60 ? "Passed" : "Failed");switch
switch(타입이 int 또는 enum 변수명){
case 값1:
<statements>
break;
case 값2:
<statements>
break;
...
default:
<statements>
break;
}
반복문
while
while( 조건문 ) { ... }do ~ while
do { … } while( 조건문 );for
for(int i=1; i<10; i++) { ... }enhanced for
배열이나 Collection을 순회할 때 인덱스 없이 반복할 수 있습니다. 단, 각 배열 값을 for문에서 아래 코드의 number로 수정할 수 없습니다. array[0] = 1; 과 같이 배열에 직접 접근해서 수정해야 함.int array[] = { 87, 68, 94, 100, 83 }; int total = 0; for(int number : array) { total += number; } |
레이블
switch, while, do/while, for, for/in 문장에 레이블을 붙일 수 있습니다.parser: while(token != null) { ... } |
continue
현재 반복문을 탈출합니다.- continue;
- continue 레이블이름;
예) 0,1,2,4만 순회
for(int i=0; i<5; i++) { if( i==3 ) continue; } |
break
switch, for, while 문으로부터 탈출합니다. 레이블 이름을 붙이는 경우, 해당 루프를 탈출합니다.for(int i=0; i<5; i++) { if( i==3 ) break; System.out.println(i); } |
예외처리
try
try { <statements> } catch (<예외 클래스> e) { <try {...} 내부에서 예외가 발생하면 실행될 코드> } catch (<예외 클래스> e) { <try {...} 내부에서 예외가 발생하면 실행될 코드> } finally { <try나 catch가 실행된 후 반드시 실행될 코드> } |
try: try 문 실행 도중 예외가 발생하면 나머지 코드는 무시하고 현재 발생한 예외를 처리 할 수 있는 catch 문으로 이동합니다.
catch: 예외가 발생하는 경우, catch에서는 현재 발생한 예외와 일치하는 가장 첫 catch 블록만을 실행합니다.
finally: System.exit(); 메소드를 사용하는 경우를 제외하고는 try { ... } catch { ... } 가 실행된 후에 continue, return, break 문이 실행 되어도 반드시 finally 문이 실행됩니다.
예외를 전부 처리할 수 없는 경우: 발생한 예외를 전부 처리할 수 없는 경우, 일부만 처리하고 나머지는 호출한 메소드에서 처리하도록 다시 throw로 예외를 던질 수 있습니다.
try { ... } catch (Exception e) {
// <예외중 일부만 처리>
throw e; 또는 throw new Exception();
}
throw
예외를 발생시킵니다.
throw new Exception();
예외의 종류
checked exception: 반드시 try로 예외 처리를 하거나 메소드 선언시 throws로 예외가 발생함을 명시적으로 나타내야 하는 예외
unchecked exception: try나 throws로 예외를 처리하지 않아도 되는 예외
예외의 상속 구조
Throwable(checked exception):
모든 예외의 슈퍼클래스. 예외 핸들링은 Throwable 객체만 사용할 수 있습니다.Exception(checked exception):
자바 프로그램에서 발생하는 예외상황을 나타냅니다. 어플리케이션에서 잡아서 처리합니다.RuntimeException(unchecked exception)
어플리케이션에서 처리하지 않는 예외입니다.ClassCastException
ArrayIndexOutOfBoundsException
NullPointerException
InputMismatchException
ArithmeticException
IOException
Error(unchecked exception):
JVM에서 발생할 수 있는 예외적인 상황을 나타내며, 정상으로 돌아오는 것이 대개 불가능하므로, 애플리케이션에서 처리하지 않습니다.AWTError
ThreadDeath
OutOMemoryError
접근 제한자(클래스, 필드, 메소드, interface, enum)
- public: 모든 패키지에서 접근 가능
- private: 같은 클래스 내부에서만 접근 가능
- protected: 정의한 클래스의 메소드나 상속 받은 메소드에서 접근 할 수 있습니다.
- 접근 제한자를 쓰지 않는 경우: 같은 패키지에 있는 클래스에서만 접근할 수 있습니다.
클래스 (Class)
클래스 선언
[final] [abstract] [public] class <클래스이름> [extends <상속할 부모 class이름>] [implements <상속할 부모 interface이름>, ...] { <클래스 Property 선언> <클래스 Method 선언> } |
- final: final 클래스는 상송할 수 없으므로, 자식 클래스가 없습니다.
- abstract: 이 클래스가 추상 클래스임을 나타냅니다.
- 구현이 되지 않은 abstract Method가 포함되어있음을 나타내며,
- 이 클래스로 바로 객체를 생성할 수 없습니다.
- extends: 이 클래스가 상속받는 클래스
- implements: 이 클래스가 상속받는 인터페이스
클래스의 static 영역
클래스를 처음 접근 했을 때 호출되는 영역static 변수를 초기화하거나 기타 초기화 작업을 할 때 사용합니다.
예) class Test {
private static final String text;
static {
text = "TEST";
}
}
필드 & 메소드
필드
[public|protected|private] [final] [static] [transient] [volatile] int foo = 10; |
클래스의 속성 변수는 외부에서 수정할 수 없도록 private/protected으로 선언합니다. 속성 값은 public인 set, get함수로 각각 값을 지정하거나 얻습니다.
- public, protected, private, 생략하는 경우: 접근 제한자
- final: 변수 값을 변경할 수 없는 상수로 선언합니다. 선언할때 초기화를 반드시 해야합니다.
- static: 한 Class의 모든 객체가 공유하는 변수로 객체가 없어도 접근 가능
public final static double PI = 3.141592; // static field. 클래스이름.필드이름 으로 참조 - transient:
- volatile:
클래스 내에서 접근할 수 있는 미리 지정된 객체
- this: static 타입의 메소드가 아닌 경우, 현재 객체를 메소드에서 this로 접근할 수 있습니다.
- super: 현재 객체의 클래스가 상속받는 부모 클래스 타입의 객체를 반환합니다.
메소드
[public|private|protected] [abstract] [synchronized] [final] [static] <반환타입> <메소드이름> ([<argument type> <argument name>]*) [throws <예외클래스이름>+] |
- 접근 제한자
- abstract: 추상 메소드로 이 클래스에서는 선언만 하고 메소드를 정의하지 않습니다. 추상 클래스나, interface에서만 사용할 수 있습니다.
abstract void foo();
static 메소드는 오버라이딩이 불가능하므로 추상메소드가 될 수 없습니다. - synchronized:
- final: 현재 클래스를 상속 받은 자식 클래스에서 override 할 수 없습니다.
- static: 객체를 생성하지 않고 호출할 수 있는 메소드
- throws: 예외처리 부분 참조. 해당 메소드에서 발생할 수 있는 checked exception(메소드 안에서 try로 잡히지 않은 예외)을 명시적으로 나타내야 합니다.
- 상속: 오버라이딩하는 경우, 부모클래스의 throws에 선언된 예외 이외의 예외는 throws에 추가할 수 없습니다.
생성자
반환타입이 없고 클래스 이름과 동일class MyClass {
public MyClass(String courseName) { // 생성자
this.courseName = courseName;
}
}
- this( ... ): 생성자에 현재 클래스의 다른 생성자를 호출할 수 있습니다.
- super( ... ): 클래스를 상속 받아 생성자를 Overriding하는 경우 부모의 생성자를 호출할 수 있습니다. 단, 해당 생성자에서 가장 처음 나와야 합니다.
finalize
가비지 컬렉터가 객체의 메모리를 회수하기 직전에 객체의 종료 작업을 위해 호출하는 protected 메소드 입니다.- 정의:
class Foo {
protected void finalize() {
System.out.println("finalized");
}
} - Foo foo = new Foo(); // 객체를 생성
foo = null; // 가비지 컬렉터 대상임을 표시
System.gc(); // 명시적으로 가비지 컬렉터 실행
- 주의: 메소드가 호출될 지 보장할 수 없습니다.
static
- 객체를 생성하지 않고 호출할 수 있습니다.
public static void main(String args[]) { … } // static 메소드. 클래스이름.메소드이름 로 호출
메소드 오버로딩
// 생성자 같은이름의 메소드를 파라미터만 달리해서 정의할 수 있습니다.public MyClass() { }
public MyClass(String courseName) { }
// 메소드를 오버로딩 하는 경우
public int square(int intValue) { }
public int square(double doubleValue) { }
set/get 함수
public void setCourseName(String name) { // set함수: property에 접근this.courseName = name;
}
public String getCourseName() { // get함수: property에 접근
return courseName;
}
return
- 메소드가 void type인 경우: return;
- 이외의 경우: return expression;
toString
객체를 문자열로 변환하는 메소드public String toString() {
return 문자열;
}
가변 인자 목록
public class VarargsTest {public static double average( double... numbers ) {
double total = 0.0;
for( double d : numbers )
total += d;
...
}
}
클래스 객체
- 객체 생성: Foo foo = new Foo(파라미터);
상속
- Method Overriding: 클래스를 상속 했을 때, 부모 클래스의 메소드를 자식 클래스에서 재정의 할 수 있습니다.
static 메소드는 오버라이딩 할 수 없습니다.
Parent의 foo() 메소드를 Child 클래스에서 상속받아 Override한 예:
public class Parent {
void foo() { System.out.println("Parent's bar"); }
}
class Child extends Parent {
void foo() { System.out.println("Child's bar"); }
}
다형성 (Polymorphism)
다음과 같이 객체를 생성할 수 있습니다.Parent a = new Child();
Interface
abstract method를 포함하고 있습니다. Interface를 상속받아서 클래스의 메소드들을 구현하여 사용할 수 있습니다.예)
public interface Payable {
double getPaymentAmount();
}
정의
interface 인터페이스이름 [extends <interface이름1>, <interface이름2>, ...];- abstract method를 포함하고 있습니다.
- final로 정의된 상수를 포함하고 있습니다.
- 변수는 선언할 수 없습니다.
Enum
enum 정의
- 클래스의 멤버 변수로 enum 정의
public class Craps {
private enum Status { CONTINUE, WON, LOST};
} - enum 정의
public enum Book {
AAA("aaa"), BBB("bbb"), CCC("ccc");
private String title;
Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
} - 메소드를 상속받는 경우
public static enum Store {
YES {
@Override
public boolean isStored() { return true; }
},
NO {
@Override
public boolean isStored() { return false; }
};
public abstract boolean isStored();
}
enum 메소드
- Book.values(): enum의 값들을 배열로 반환
Package
import | 패키지에 미리 정의된 클래스를 사용합니다.
|
package |
예) package com.zyint.util |
제네릭 (Generic)
제네릭에서 사용하는 타입은 primitive 타입이 아닌 wrapper class를 사용합니다. 즉, 정수를 제네릭에서 표현할 때 int가 아닌 Integer 클래스를 사용함- <T>: 모든 클래스가 제네릭 타입이 될 수 있습니다.
- <T extends Comparable<T> >: Comparable 인터페이스를 상속받는 클래스만 제네릭 타입이 될 수 있습니다
예) public static <T extends Comparable<T> > T maximum(T x, T y, T z) { … } - <? extends Number>: wildcard type argument.
예) Integer 클래스가 Number가 자식 클래스 일 때, void sum(ArrayList<Number> list) 함수에 ArrayList<Integer> 변수를 함수의 argument로 넘길 수 없습니다. → void sum(ArrayList<? extends Number> list)로 변경하면 ArrayList<Integer>타입의 변수도 인자로 받을 수 있습니다.
Generic Class
클래스에서의 제네릭 타입을 설정합니다.예) public class Stack <E> {
private E[] elements;
…
}
Generic Method
함수 파라미터의 변수 타입에 따라서 타입이 결정되도록 합니다예) public <E> void print(E value) { }
public <E> void print(E value1, E value2) { }
참고자료
- Java How to program (한글 6판), Prentice Hall - 책