Q1. 아래 코드에서 throws
사용 이유는?
private final boolean just = true;
// throws : 던지다!! ( = 예외를 던지다 / 발생시키다.)
public void thisMethodIsDangerous() throws OurBadException{
// custom logic
if(just){
throw new OurBadException();
}
}
public OurBadException(){
super("위험한 행동 예외 처리");
}
A. throws
사용하면 해당 메서드 호출하는 곳에서 예외 처리 강제화.
public static void main(String[] args) {
OurClass ourClass = new OurClass();
try{
ourClass.thisMethodIsDangerous();
}catch (OurBadException e){
System.out.println(e.getMessage());
}finally {
}
}
Q2. 디테일한 예외사항 사용 이유?
A.
1. 문제 발생시 원인 빠르게 파악 가능.
2. 개발자 간 이해 쉬워 협업 향상.
3. 시스템 안전성 보장.
Q3. throws
사용해서 메서드 위험성 알리는 이유?
A. 개발자 협업 및 시스템 안정성 향상. 예외 원인 파악 용이.
Q4. checked exception
을 unchecked exception
으로 포장 이유?
A. 코드 간결성 위해 및 예외 처리 자율화.
Q5. 연결된 예외 어떻게 여러 예외 함께 처리?
public class main {
public static void main(String[] args) {
try {
// 예외 생성
NumberFormatException ex = new NumberFormatException("가짜 예외이유");
// 원인 예외 설정(지정한 예외를 원인 예외로 등록)
ex.initCause(new NullPointerException("진짜 예외이유"));
// 예외를 직접 던집니다.
throw ex;
} catch (NumberFormatException ex) {
// 예외 로그 출력
ex.printStackTrace();
// 예외 원인 조회 후 출력
ex.getCause().printStackTrace();
}
// checked exception 을 감싸서 unchecked exception 안에 넣습니다.
throw new RuntimeException(new Exception("이것이 진짜 예외 이유 입니다."));
}
}
A. 예외 함께 처리는 여러 예외 유형 동일 처리 로직 필요할 때 의미. 해당 코드는 NumberFormatException
및 NullPointerException
함께 처리.
Q6. chained Exception
정의?
A. 한 예외의 원인이 다른 예외일 때, 두 예외 연결 기능.
Q7. 예외를 다른 예외로 변환 이유? 그리고 왜곡 위험은?
public void someMethod() throws IOException { ... }
public void someResponsibleMethod() throws MoreSpecificException {
try {
this.someMethod();
} catch (IOException e) {
throw new MoreSpecificException(e.getMessage());
}
}
A.
1. 예외 추상화해서 협업 도움.
2. 기존 에러 설명 추가 위해.
Q8. 제네릭 클래스 생성 가능?
A. 클래스 뒤에 <>
붙이면 제네릭 클래스.
public class Box<T> {
private T item;
}
Q9. 제네릭 배열 생성 및 static
사용 안되는 이유?
A. 배열은 고정 타입, 제네릭은 컴파일 타임에만 타입 정보. static
은 클래스 수준 동작, 인스턴스 제네릭 타입 정보 알 수 없음.
Q10. 제네릭 E
사용 시기?
A.
E = Element, 주로 컬렉션 내부 요소 표현.
Q11. 아래 코드 동작 방식은?
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
<T>: 'T'는 아직 정해지지 않은 데이터 유형을 나타냄
나중에 함수를 호출할 때 'T'가 무엇인지 알 수 있음
예를 들어 숫자, 문자열, 어떤 객체든 가능
List<T> list: 'T' 유형의 아이템을 담은 리스트
예를 들어, T가 숫자면 숫자 리스트, T가 문자열이면 문자열 리스트
Comparator <? super T> c
이는 'T' 유형의 아이템 두 개를 비교하여 어느 것이 먼저 오고, 어느 것이 나중에 올지를 결정하는 규칙
? super T: 이 부분은 T 또는 T의 부모 유형을 다룰 수 있는 비교 규칙을 사용가능
예를 들어, T가 특정 클래스의 서브클래스라면, 그 서브클래스 뿐만 아니라 부모 클래스를 비교하는 규칙도 사용 가능
<T>는 함수 호출되며 매개변수의 타입이 확정될때 해당 매개변수의 타입으로 바뀐다
만약 타입들이 일치하지 않으면 컴파일 에러가 난다.
A.
<T>
표시는 아직 확정되지 않은 데이터 유형. List<T> list
는 T
유형 아이템 리스트. Comparator <? super T> c
는 T
아이템 비교 규칙.
T = type
E = Element
K = Key
N = Number
V = Value
R = Result
https://kang-james.tistory.com/entry/JAVA-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-%EC%A0%9C%EB%84%A4%EB%A6%ADGeneric-%EC%99%84%EB%B2%BD-%EC%A0%95%EB%A6%AC
Q12. 아래 코드에서 Parser
반환 필요?
public Parser parseFirstNum(String firstInput) throws Exception{
if (!Pattern.matches(NUMBER_REG, firstInput)) {
throw new BadInputException("정수값");
}
this.calculator.setFirstNumber(Integer.parseInt(firstInput));
return this;
}
A. 메소드 체이닝 위해 반환 사용. 그러나 코드에서 독립적 호출이므로 반환 필요 없음.
method1().method2().method3()
System.out.println("첫번째 숫자를 입력해주세요!");
String firstInput = scanner.nextLine();
parser.parseFirstNum(firstInput);
System.out.println("연산자를 입력해주세요!");
String operator = scanner.nextLine();
parser.parseOperator(operator);
System.out.println("두번째 숫자를 입력해주세요!");
String secondInput = scanner.nextLine();
parser.parseSecondNum(secondInput);
Q13. 전역변수, 정적 변수, 배열 저장 위치?
A. 전역변수와 정적 변수는 메모리의 Heap
영역에 저장. 배열도 Heap
영역에 저장.
Q14. Runnable
인터페이스 vs Thread
클래스?
A.
Runnable
: 실행할 작업 정의 위한 인터페이스.
Thread
: 스레드 동작 제어 및 생성 위한 클래스. Runnable
객체 받을 수 있음.
Q15. 가비지 컬렉터 무엇?
A. 사용하지 않는 메모리 자동 회수 시스템. 자바에서 더 이상 참조되지 않는 객체 메모리 회수.