자주 발생하는 예외
- ArithmeticException : 정수를 0으로 나눌 때
- NullPointerException : null 레퍼런스를 참조할 때
- ClassCastException : 변환 할 수 없는 타입으로 객체를 변환 할 때
- OutOfMemoryException : 메모리 부족
- ArrayIndexOutOfBoundsException : 배열의 범위를 벗어난 접근 시
- IllegalArgumentException : 잘못된 인자 전달 시
- IOException : 입출력 동작 실패 또는 인터럽트 시 발생
- NumberFormatException : 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시
OverLoading
메소드 명과 인자가 같으면서 return 값만 다른 경우 컴파일 오류가 발생한다.
Garbage
Person a, b;
a = new Person("이몽룡")
b = new Person("성춘향")
b = a; // b가 가리키던 객체는 가비지가 됨 (성춘향)
Garbage Collection 강제 수행
System.gc(); // 가비지 컬렉션 작동 요청
Runtime.gc();
강력한 제안을 할 뿐 강제 작동을 시키는 것은 아니다. JVM이 판단하여 적절한 시점에 작동 시킨다.
super, this 의 사용
생성자 코드의 첫 라인에 와야한다.
class B extends A {
public B() {
System.out.println("생성자B");
}
public B(int x) {
super(x);
System.out.println("매개변수생성자B" + x);
}
}
Casting
캐스팅(Casting) 이란 개발자가 프로그램 코드로 행하는 강제 타입 변환
- upcasting : 자식 클래스가 부모 클래스 타입으로 변환 되는 것
- downcasting : 다시 원래대로 돌리는 것
Person p = new Person;
Student s = (Student)p;
instanceof
객체 레퍼런스가 가리키는 객체가 해당 클래스 타입이면 결과 값을 boolean 타입으로서 return 해준다.
Override
메소드 오버라이딩에서 메소드 이름 과 매개 변수는 같으나 리턴 타입만 다를 수는 없다.
추상클래스
추상클래스의 인스턴스를 생성할 수 없다.
인터페이스
서로 다른 하드웨어 장치들이 상호 접속하여 데이터를 주고 받을 수 있는 규격을 의미
인터페이스는 메소드와 상수만을 가지며 필드는 가지지 않는다. 메소드는 모두 추상 메소드이다. 그러나 메소드 선언 시 abstract 키워드를 생략 할 수 있다.
모든 메소드는 public 이며 생략 가능하다.
상수도 public static final 을 생략 가능 하다.
인터페이스 끼리의 상속도 가능하다.
레퍼런스 변수를 만드는 것도 가능하다. ex) Car car;
스레드 관리 정보
스레드 이름 String 스레드 이름으로서 사용자가 지정
스레드 ID | int | 스레드 고유의 식별자 번호 |
스레드의 PC(Program Count) | int | 현재 실행 중인 스레드 코드의 주소 |
스레드 상태 | int | NEW, RUNNABLE, WAITING, TIMED_WAITING, BLOCK, TERMINATED 등 6개 상태 중 하나 |
스레드 우선순위 | int | 스레드 스케줄링 시 사용되는 우선순위 값으로서 1 ~ 10 사이의 값이며 10이 최상위 우선순위 |
스레드 그룹 | int | 여러 개의 자바 스레드가 하나의 그룹을 형성할 수 있으며 이 경우 스레드가 속한 그룹 |
스레드 레지스터 스택 | int | 스레드가 실행되는 동안 레지스터들의 값 |
데몬 스레드
JVM이 스스로 필요에 의해 사용하는 스레드이다. 대표적인 예로 GC가 있다.
내가 작성한 스레드도 데몬 스레드로 표시하여 JVM이 인식하게 할 수도 있다.
일반 스레드가 모두 종료되면 데몬 스레드가 살아 있더라도 프로그램은 종료된다.
스레드 상태
- NEW
스레드가 생성되었지만 아직 실행할 준비가 되지 않은 상태이다. start() 메소드가 호출되면 RUNNABLE 상태가 된다.
- RUNNABLE
스레드가 현재 실행되고 있거나 실행 준비되어 스케줄링을 기다리는 상태이다.
- WAITING
스레드가 어떤 Object 타입의 객체 a에 대해 a.wait()을 호출하고 무한 대기하면서 다른 스레드가 a.notify(), a.notifyAll()을 불러주기를 기다리고 있는 상태이다. 스레드 동기화를 위해 사용된다.
- TIMED_WAITING
스레드가 sleep(int n) 을 호출하여 n밀리초 동안 잠을 자고 있는 상태이다.
- BLOCK
스레드가 I/O 작업을 요청하여 I/O 작업이 완료되기를 기다리는 상태이다.
- TERMINATED
스레드가 종료한 상태이다. 더이상 다른 상태로 바뀔 수 없다.
만일 실행중인 스레드의 코드에 yield()를 호출하는 부분이 있다면 이는 다른 스레드에게 양보하겠다는 의미이며 JVM은 해당 스레드를 RUNNALBE 상태로 변경시키고 다시 스레드 스케줄링을 실시한다.
'Java' 카테고리의 다른 글
Spring Cloud Config 란 무엇인가 (0) | 2022.11.20 |
---|---|
WAS란 그리고 그 종류들 (0) | 2022.06.20 |
Java Thread 기초 (0) | 2022.02.04 |
java 자주 발생하는 예외 (0) | 2022.02.04 |
Java 메모리 영역(Static, Stack, Heap) (0) | 2022.01.11 |