Notice
Recent Posts
Recent Comments
Link
«   2024/03   »
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
Archives
Today
Total
03-28 19:56
관리 메뉴

zyint's blog

자바 (Java) 문법 본문

예전글들

자바 (Java) 문법

진트­ 2012. 6. 5. 11:43



주석

  • // 한줄 주석
  • /* 여러줄
      주석 */
  • /** 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 변수명)
{
  case1:
 <statements>
 break;
  case2:
 <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패키지에 미리 정의된 클래스를 사용합니다.
  • import java.util.Scanner;
  • import static java.lang.Math.*; // Math의 static 멤버를 Math. 를 붙이지 않고 사용
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 -

Comments