-
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();의 형태이다.
-
오버로딩의 규칙은 다음과 같다. 1) 오버로딩하는 메소드들이 같은 클래스에 존재해야 한다.
2) 같은 이름을 가져야 한다.
3) 이 메소드들은 매개변수의 형이 다르거나 개수가 달라야 한다.
4) 리턴형은 상관이 없다.
-
오버라이딩의 규칙은 다음과 같다. 1) 상위클래스의 메소드 이름과 일치해야 한다.
2) 상위클래스의 메소드 매개변수의 개수와 데이터형이 일치해야 한다.
3) 상위클래스의 메서드 리턴형과 일치해아 한다.
4) 상위클래스의 접근 제한자와 범위가 같거나 더 넓은 접근 제한자로 선언해야 한다.
-
상위 클래스에서 final, static, private 접근제한자로 선언된 메소드는 재정의 할 수 없다.
-
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 또는 아무 것도 붙지 않는다.
-
메서드나 필드(멤버변수), 또는 내부클래스에 선언 된다.
-
자동변수(지역변수)에는 선언될 수 없다.
-
instance 객체를 생성할 필요 없이 접근 할 수 있다.
-
상위클래스에서 static으로 선언된 메소드는 오버라이딩할 수 없다.
-
상위클래스에서 static이 아닌 메서드를 static으로 오버라이딩할 수도 없다.
-
static class,메서드 안에서 this키워드는 호출할 수 없다.
-
메서드나 멤버변수, 또는 내부클래스에 선언 된다.
-
상위클래스에서 private으로 선언된 메소드는 오버라이딩할 수 없다.
-
같은 클래스 내 외는 참조 불가능하다. (상속 받은 클래스도 안 됨)
클래스, 메서드, 내부 클래스에 선언될 수 있다.
메서드 앞에 abstract 제한자를 붙일 경우, 반드시 클래스 앞에도 abstract 제한자르 붙여야 한다.
변수에는 선언될 수 없다.
abstract 클래스를 상속받은 클래스가 abstract 메소드를 모두 오버라이드 하지 않앗다면, 그 클래스도 abstract로 선언해야 한다.
abstract로 선언된 메소드는 public 또는 protected로 선언되어야 한다.
-
implements 키워드를 통해서 하나 이상의 interface를 클래스에서 구현가능하다. 이는 extends 키워드를 이용한 상속과는 다르다.
-
interface간에도 extends를 이용한 상속이 가능하다.
-
interface 안에 정의된 field는 상수와 같아서 static final로 한정된 것과 같이 변동될 수 없다.
-
interface 안에서 정의된 모든 메소드는 이를 구현하는 class에서 구현되어야 한다.
-
instanceof 연산자 위에 interface가 오면 해당오브젝트가 그 interface 또는 그 하부 interface를 구현하고 있는지를 검사하는 논리식이 된다.
-
interface형의 변수에 이를 구현하고 있는 클래스의 객체를 할당하는 것이 가능하다. 예) InterceA a=new ClassA(); // class ClassA implements InterfaceA 일때
-
컴파일시 javac -d . 파일명.java 로 디렉토리를 지정하면 패키지명의 디렉토리 밑에 class파일이 생성된다.
-
java 패키지명.파일명의 형식으로 해당디렉토리에 있는 패키지 속의 파일을 실행시킬 수 있다.
-
다음의 형식으로 패키지를 jar파일로 묶을 수 있다. jar cvf 파일명.jar 해당디렉토리
-
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 지정없이 사용할 수 있다.
-
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을 지정하는 것도 가능하다.
-
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 s1="java"; 와 같이 대입해서 생성하면 new 키워드를 이용했을때와는 달리 이전에 생성된 같은 문자열을 가진 객체가 있을 때는 새로운 객체를 생성하지 않고 기존에 있던 객체를 참조하여 사용하게 된다.
-
StringBuffer의 객체와는 달리 생성된 객체의 내용이 변경되지 않는 불변성(immutability)를 가지고 있다.
-
StringBuffer 클래스는 equals()를 재정의하고 있지 않기 때문에 java.lang.Object 클래스의 equals()를 그대로 사용한다. 즉 “==”와 같이 비교되는 객체의 주소가 같으면 true를 리턴한다.
-
StringBuffer 객체는 ‘+’ 연산자가 적용되지 않는다.
-
사용자 쓰레드(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 키워드는 메소드와 블록에 사용할 수 있다. 메소드에 사용하게 되면 오직 한 개의 쓰레드만 그 메소드에 접근할 수 있으며 먼저 접근한 메소드의 사용을 종료해야 다른 쓰레드가 접근하여 사용할 수 있게 된다.