기초문법
- package, import, class선언의 순서로 소스파일은 구성된다.
- const, goto는 예약은 되어 있지만 사용되지 않는 키워드이다.
- 자바의 주석은 //, /* */, /** */ 의 3가지 스타일이 가능하다. /** */는 javadoc에 의해 설명파일이 생성될 때 사용한다.
- $, _ 도 변수의 첫 글자에 올 수 있다. 숫자는 불가능하다.
- 배열의 크기가 new 키워드에 의한 생성 없이 변수 선언만으로는 지정될 수 없다.
( ex) String a[50];(틀림) C와는 달리 )
- if문에는 반드시 true, false로 평가되는 식이 와야 한다. 숫자식(0,1) 혹은 대입식(a=b)등은 C와는 달리 허용되지 않는다.
- 논리연산자(&&,||)는 short circuit기능을 가지고 있고, 비트연산자(&,|)는 그렇지 않다. 즉 비트 연산자는 논리 연산 시 왼쪽과 오른쪽에 있는 모든 식을 평가하는 반면, 논리 연산자는 왼쪽 연산자만으로 논리 연산의 결과를 알 수 있으면 오른쪽을 평가하지 않는다.
- int a[][]=new int[5][5];int []a[]=new int[5][5]; 등 변수선언시 []의 위치는 상관없다.
- public static void main(String args[])와 같이 main method는 선언되어야 한다.
- main method가 public으로 선언되어 있지 않으면 Compile시는 문제가 없으나 run time에서 에러가 난다.
- 메소드 내의 변수(자동변수,지역변수)는 초기화 하지 않고 사용하면 compile시 error를 발생시킨다.
- char형은 C나 C++과는 달리 2byte이다.
- 멤버변수는 자동으로 초기화 된다.
- boolean의 초기값은 false, 그 외 변수의 초기값은 0이나 null값으로 생각하면 된다.
객체지향 관련 개념, 문법
- 객체지향 프로그래밍의 3대 특징은 캡슐화(encapsulation), 상속(inheritance), 다형성(polymorphism)
- 완전캡슐화(Full encapsulation, tight encapsulation)은 오브젝트에 포함되어 있는 변수는 외부에서 직접 접근하지 못하게 하고, 이변수와 연관된 메소드를 만들어 메소드를 통해서만 변수에 접근할 수 있게 하는 것이다. 변수는 private, 메소드는 public으로 선언한다.
- 객체의 상속관계에 맞지 않는 대입,형변환은 다음과 같은 오류를 발생시킨다.
하위클래스=상위클래스; // (컴파일 오류)
하위클래스=(상위클래스)하위클래스; // (컴파일 오류)
상위클래스=(하위클래스)상위클래스; // (런타임 오류)
하위클래스=(하위클래스)상위클래스; // (런타임 오류)
대입에서의 오류는 컴파일 오류, casting에서의 오류는 runtime 오류를 생성한다. 그러나 하위클래스의 오브젝트가 상위 클래스의 핸들로 가리켜 질 때, 그 오브젝트가 다시 하위클래스로 casting되는 경우는 오류가 발생하지 않는다.
- 하위클래스의 오브젝트를 상위 클래스의 핸들로 가리킬때
예) Super super=new Sub();
오버라이드 된 메소드를 호출하면 실제 오브젝트가 생성된 하위 클래스의 메서드가 호출된다. 이때는 하위클래스에만 정의되어 있고 상위클래스에는 없는 메소드는 호출할 수 없다.
생성자
- 생성자는 리턴값을 지정하지 않는다.
- 생성자 정의시 this()나 super()를 통해 상위 혹은 같은 클래스의 다른 상속자를 호출 할때는 생성자의 첫문장에서만 가능하다. 다른 메서드 안에서는 this()생성자를 호출할 수 없다.
- 상위 객체의 생성자로 하위객체를 생성할 수 없다.
- 상위 클래스를 상속 받은 하위 클래스를 new 키워드로 실행할 때 하위 클래스의 생성자 내에서 상위클래스의 생성자를 명시적으로 호출하지 않을 시에는 하위 클래스의 생성자 내용이 실행되기 전에 상위 클래스의 디폴트 생성자, 즉 파라미터를 가지고 있지 않은 생성자를 먼저 실행된다.
- 디폴트 생성자는 public Class();의 형태이다.
오버로딩(Overloading)
1) 오버로딩하는 메소드들이 같은 클래스에 존재해야 한다.
2) 같은 이름을 가져야 한다.
3) 이 메소드들은 매개변수의 형이 다르거나 개수가 달라야 한다.
4) 리턴형은 상관이 없다.
오버라이딩(Overrideing)
1) 상위클래스의 메소드 이름과 일치해야 한다.
2) 상위클래스의 메소드 매개변수의 개수와 데이터형이 일치해야 한다.
3) 상위클래스의 메서드 리턴형과 일치해아 한다.
4) 상위클래스의 접근 제한자와 범위가 같거나 더 넓은 접근 제한자로 선언해야 한다.
- 상위 클래스에서 final, static, private 접근제한자로 선언된 메소드는 재정의 할 수 없다.
inner class
- static inner class, member inner class, local inner class, anonymous inner class 로 구분할 수 있다.
- static inner class는 다른 클래스 내에 static 제한자로 선언된 클래스를 말한다. 클래스 내부에 선언되기는 하지만 top-level 클래스의 속성을 갖는다.
- member inner class는 다른 클래스 내에 static제한자로 선언되지 않는 클래스를 말한다.
- local inner class는 블록이나 메서드 내에 선언된 클래스를 말한다.
- anonymous inner class는 몸체만 정의되는 클래스를 말한다.
- static inner class에서는 static으로 선언된 멤버들만 접근 할 수 있다.
- member inner class와 anonymous inner class는 static member를 가질 수 없다.
접근제한자
- class 앞에는 public, abstract, final 제한자 만이 올 수 있다.
- public, protected, friendly(제한자 없음), private 순으로 공개성이 줄어든다고 할 수 있다.
- interface 앞이나 interface 안의 method에 앞에는 public 또는 아무 것도 붙지 않는다.
public
static
- 메서드나 필드(멤버변수), 또는 내부클래스에 선언 된다.
- 자동변수(지역변수)에는 선언될 수 없다.
- instance 객체를 생성할 필요 없이 접근 할 수 있다.
- 상위클래스에서 static으로 선언된 메소드는 오버라이딩할 수 없다.
- 상위클래스에서 static이 아닌 메서드를 static으로 오버라이딩할 수도 없다.
- static class,메서드 안에서 this키워드는 호출할 수 없다.
private
- 메서드나 멤버변수, 또는 내부클래스에 선언 된다.
- 상위클래스에서 private으로 선언된 메소드는 오버라이딩할 수 없다.
- 같은 클래스 내 외는 참조 불가능하다. (상속 받은 클래스도 안 됨)
protected
- 메소드, 변수,내부 클래스에 선언될 수 있다.
- 같은 패키지 또는, 다른 패키지라도 상속 받은 클래스에서 접근할 수 있다.
friendly(키워드 아님)
아무것도 붙이지 않은 제한자로 friendly라는 키워드는 없다.
같은 패키지 내의 클래스에서 접근할 수 있다.
abstract
클래스, 메서드, 내부 클래스에 선언될 수 있다.
메서드 앞에 abstract 제한자를 붙일 경우, 반드시 클래스 앞에도 abstract 제한자르 붙여야 한다.
변수에는 선언될 수 없다.
abstract 클래스를 상속받은 클래스가 abstract 메소드를 모두 오버라이드 하지 않앗다면, 그 클래스도 abstract로 선언해야 한다.
abstract로 선언된 메소드는 public 또는 protected로 선언되어야 한다.
final
상위클래스에서 final로 선언된 메소드는 오버라이딩할 수 없다.
final로 선언된 변수는 상수와 같다. (상수는 보통 static final로 선언된다.)
기타
transient키워드는 object serialization에서 제외되는 변수 앞에 붙는다.
native 키워드는 메서드 앞에만, volatile 키워드는 변수 앞에만 붙을 수 있다.
Interface
- implements 키워드를 통해서 하나 이상의 interface를 클래스에서 구현가능하다. 이는 extends 키워드를 이용한 상속과는 다르다.
- interface간에도 extends를 이용한 상속이 가능하다.
- interface 안에 정의된 field는 상수와 같아서 static final로 한정된 것과 같이 변동될 수 없다.
- interface 안에서 정의된 모든 메소드는 이를 구현하는 class에서 구현되어야 한다.
- instanceof 연산자 위에 interface가 오면 해당오브젝트가 그 interface 또는 그 하부 interface를 구현하고 있는지를 검사하는 논리식이 된다.
- interface형의 변수에 이를 구현하고 있는 클래스의 객체를 할당하는 것이 가능하다.
예) InterceA a=new ClassA(); // class ClassA implements InterfaceA 일때
Package
- 컴파일시 javac -d . 파일명.java 로 디렉토리를 지정하면 패키지명의 디렉토리 밑에 class파일이 생성된다.
- java 패키지명.파일명의 형식으로 해당디렉토리에 있는 패키지 속의 파일을 실행시킬 수 있다.
- 다음의 형식으로 패키지를 jar파일로 묶을 수 있다.
jar cvf 파일명.jar 해당디렉토리
1)다음의 형식으로 jar로 묶여진 패키지의 위치를 지정할 수 있다.
javac -classpath 파일명.jar 파일명.java
2) 윈도우의 환경변수-시스템 변수의 classpath변수를 통해서 해당 jar을 지정할 수도 있다. 이때 현재 디렉토리를 같이 지정하는 것이 좋고, 파일명.jar까지 같이 포함을 시킨다.
예) .;c"\temp\tv.jar
3) c:\j2sdk1.4.1_02\jre\lib\ext 디렉토리 밑에 jar파일을 복사하면 별도의 classpath 지정없이 사용할 수 있다.
Exception handling
- RuntimeException의 종류는 try-catch로 잡아주는 처리를 하지 않아도 에러메시지를 발생시키지 않는다.
- try 블록에서 예외가 발생했을 경우, try 블록의 나머지 코드들은 실행되지 않고 해당 예외에 대한 catch 블록, finally 블록을 실행한다. 그 후 finally 이후의 코드들을 실행한다
- 해당하는 예외를 처리할 catch 블록이 없을 경우 finally 블록으로 바로 넘어가서 실행을 한다. 그 후 try 블록을 가지고 있는 메서드 전체가 종료를 한다.
- try 블록이나 catch 블록에 return 문이 있을 경우 finally 블록을 실행 후 return 문이 실행된다. 따라서 finally블럭 다음의 코드는 실행되지 않는다.
- try 블록이나 catch 블록에 System.exit();가 있을때는 강제종료 되어 finally 블록이 실행되지 않는다.
- try 블록에서 예외가 발생하지 않은 경우는 finally 블록에 있는 코드를 실행 후 finally 블록 다음의 코드를 실행시킨다.
- catch block에서 상위 exception이 중복 정의되고 그것이 앞에 있다면 뒤에서 catch할 exception이 처리되지 않거나 컴파일 에러가 발생한다.
- method 정의 옆에 throws 키워드로 2개 이상의 exception을 지정하는 것도 가능하며, 내부에서 throw하는 exception들의 상위 exception을 지정하는 것도 가능하다.
Garbage Collection
- System.gc(); 혹은 Runtime.getruntime.gc();에 의해서 요청할 수 있다.
- 요청을 해도 JVM이 언제 받아들일지는 알 수 없고, 강제될 수 없다. 즉 가비지 콜렉션은 프로그래머에 의해 구현될 수 없다.
- 가비지 콜렉션의 대상은 객체(object)이지 참조(reference)가 아니다.
- 객체에 null이 할당되거나 객체를 더 이상 참조하지 않게 되었을 대 가비지 컬렉션의 대상이 된다.
- 다른 참조변수도 참조하고 있는 객체는 가비지 컬렉션의 대상이 아니다.
java.lang
Math
1) Math 클래스는 final제한자로 선언되어 있어 상속을 받을 수 없다.
2) 생성자는 private 제한자로 선언되어 있어 객체생성을 할 수 없다.
3) 메서드들은 static 제한자로 선언되어 있어서 객체 생성없이 접근할 수 있다.
1) Math.ceil(), math.floor(), Math.sqrt(), Math.random()은 double형으로 값을 리턴한다.
2) Math.round()는 인자가 double형이면 long형으로, float형이면 int형으로 리턴한다.
3) Math.min(), Math.max()는 int,long,float, double형으로 오버로드 되어 있다.
String
- String의 생성에서 String s1="java"; 와 같이 대입해서 생성하면 new 키워드를 이용했을때와는 달리 이전에 생성된 같은 문자열을 가진 객체가 있을 때는 새로운 객체를 생성하지 않고 기존에 있던 객체를 참조하여 사용하게 된다.
- StringBuffer의 객체와는 달리 생성된 객체의 내용이 변경되지 않는 불변성(immutability)를 가지고 있다.
StringBuffer
- StringBuffer 클래스는 equals()를 재정의하고 있지 않기 때문에 java.lang.Object 클래스의 equals()를 그대로 사용한다. 즉 “==”와 같이 비교되는 객체의 주소가 같으면 true를 리턴한다.
- StringBuffer 객체는 ‘+’ 연산자가 적용되지 않는다.
Wrapper Class
- int:Interger, char:Character 이고 나머지는 기본데이터형의 첫 문자를 대문자로 바꾼것과 같은 이름의 Wrapper 클래스를 가진다.
- Charater 클래스만이 String형을 인자로 받는 생성자가 정의되어 있지 않다.
- Boolean, Character 클래스는 Number클래스의 하위 클래스가 아니다.
Thread
- 사용자 쓰레드(user thread)는 일반적으로 프로그램에서 만들어지는 main 메소드와 같은 쓰레드를 말한다.
- 데몬 쓰레드(daemon thread)는 입출력처리, 가비지 컬렉션, 사용자 쓰레드의 요청 등을 처리하기 위해 자바 가상머신에서 제공하는 쓰레드이며, 사용자 쓰레드가 존재하지 않으면 자동으로 종료된다.
- 쓰레드의 스케쥴링 방법은 플랫폼에 따라서 다르다.
- 쓰레드를 생성하는 방법은 다음과 같다.
1) java.lang.Thread 클래스를 상속받고 run() 메소드를 오버라이드
예) ThreadA ta=new ThreadA; ta.start();
2) java.lang.Runnable 인터페이스를 구현하고 run()메소드를 구현
RunnableB rb=new RunnableB();
Thread tb=new Thread(rb); //rb를 매개객체로 쓰레드 객체 tb생성
tb.start();
- start()메소드를 호출하게 되면 스케줄에 따라 해당 쓰레드가 실행될 수 있는지를 판단하고 실행될 순서가 되면 run()메소드를 호출하여 실행가능상태로 만든다.
- Runnable interface를 구현하는데 있어서 run()메서드에는 파라미터가 있으면 안된다.
- yield()메소드를 호출하면 현재 쓰레드를 대기 상태로 전이되며 다른 쓰레드가 실행될 수 있게 된다. 만약 현재 쓰레드가 yield() 메소드에 의해 대기 상태로 전이되었는데 실행할 다른 쓰레드가 없다면 대기상태로 전이된 쓰레드가 다시 실행가능상태로 된다.
- wait(), notify(), notifyall()등의 method는 java.lang.Object 상에서 정의되어 있다.
- wait() 메서드는 InterruptedException을 발생시킨다.
- thread의 실행을 멈출 수 있는 메서드는 sleep(), wait(), yield(), suspend(), wairforlD() from clzass MediaTracker등이 있다.
- 쓰레드의 우선순위 상수
java.lang.Thead.MIN_PRIORTY :1
java.lang.Thead.NORM_PRIORTY :5
java.lang.Thead.MAX_PRIORTY :10
setPriorty(MAX_PRIORTY)와 같이 사용한다.
- synchronized 키워드는 메소드와 블록에 사용할 수 있다. 메소드에 사용하게 되면 오직 한 개의 쓰레드만 그 메소드에 접근할 수 있으며 먼저 접근한 메소드의 사용을 종료해야 다른 쓰레드가 접근하여 사용할 수 있게 된다.