public static void main(String[] args) {
String[] arr = {"Hi", "How", "Are", "You"};
List<String> arrList = new ArrayList<>(Arrays.asList(arr));
if (arrList.removeIf((String s) -> { return s.length() <= 2; })) {
System.out.println(s + " removed");
}
}
애초에 s변수가 predicate scope 밖에 있어서 s를 찍어낼 수 없다
if (arrList.removeIf((String s) -> {
if (s.length() <= 2) {
System.out.println(s + " removed");
return true;
}
return false;
})) {
System.out.println("Items removed");
}
위와 같이 같은 scope 내에 있어야 변수 사용 가능
private class A2 {
private static int i;
private A2() {}
}
- private 클래스는 **최상위 클래스(top-level class)**로 선언될 수 없음
- 최상위 클래스는 반드시 public 또는 *package-private (접근 제어자가 없는 경우)*
- private 클래스는 **내부 클래스(nested class)**로만 사용할 수 있음
- 컴파일 오류
final abstract class A5 {
protected static int i;
void doStuff() {}
abstract void doIt();
}
- final과 abstract는 상호 배타적인 조합
- final 클래스는 더 이상 상속될 수 없다는 것을 의미
- 반면, abstract 클래스는 상속을 전제로 하고, 추상 메서드의 구현을 하위 클래스에 위임
- 컴파일 오류
*final 클래스는 상속이 불가능하지만, 자체적으로 인스턴스를 가질 수 있음
class A4 {
protected static final int i = 10;
private A4() {}
}
정적 필드와 final 조합은 정상이며, 생성자가 private인 경우 싱글턴 패턴 등을 구현할 때 사용
- 예외를 던지는 메서드 (예: printFileContent)
- 예외를 발생시키는 메서드는 해당 예외를 명시적으로 선언
- 이 선언은 throws를 사용해서 이루어지며, 던질 수 있는 예외를 호출자에게 알림
- 예외를 호출하는 코드 (예: main 메서드)
- 예외를 던지는 메서드를 호출할 때는, 발생할 가능성이 있는 예외를 반드시 처리해야 함
- 호출자가 처리하는 방법은 두 가지 :
- try-catch 블록을 사용하여 처리.
- 해당 메서드에서도 throws로 다시 전달하여 호출자(예: JVM)에게 넘김.
- A. It can be serialized across network.
- 자바 바이트코드는 네트워크를 통해 직렬화(serialized)
이 말은 바이트코드(.class 파일)를 네트워크로 전송하여 다른 JVM에서 실행할 수 있다는 뜻 - 플랫폼 독립성
- 자바 바이트코드는 네트워크를 통해 직렬화(serialized)
- E. It can run on any platform that has the Java Runtime Environment.
- 자바 바이트코드는 JVM(Java Virtual Machine)을 통해 실행.
즉, JVM이 설치된 플랫폼에서는 어떤 운영 체제든 실행 가능 - "Write Once, Run Anywhere"
- 자바 바이트코드는 JVM(Java Virtual Machine)을 통해 실행.
**컴파일러(Javac)는 소스코드(.java)를 바이트코드(.class)로 변환하는 역할
바이트코드 실행에는 JVM이 필요하지, 컴파일러는 필요 없음.....
**바이트코드 파일은 .class 확장자
"자바 바이트코드는 편지를 보내고, JVM 놀이터에서만 읽힌다!"
**컴파일러는 놀이터를 만드는 사람일 뿐, 바이트코드가 실행되지는 않음
인터페이스의 메서드는 모두 public이어야 하며, 이를 구현하는 클래스에서도 접근 제어자는 반드시 public이어야 함
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
String[] arr = {"Hi", "How", "Are", "You"};
List<String> arrList = new ArrayList<>(Arrays.asList(arr));
if (arrList.removeIf(s -> {
System.out.print(s); // 요소를 출력
return s.length() <= 2; // 길이가 2 이하인 요소를 삭제
})) {
System.out.println(" removed");
}
}
}
** boolean removeIf(Predicate<? super E> filter);
- Predicate<E>는 E 타입의 입력을 받아 boolean을 반환하는 함수형 인터페이스
- arrList는 List<String> 타입이므로, Predicate<String>이 필요
- 따라서, 람다 표현식에서 s의 타입은 **자동으로 String**으로 추론
** 만약 removeIf가 하나 이상의 요소를 제거했다면 true를 반환하므로 " removed"가 출력
**Java에서 생성자를 호출하면 상위 클래스의 생성자가 먼저 호출
>> 클래스 계층 구조에서 부모 클래스의 초기화를 먼저 보장하기 위해서
>>>> 메서드 호출 방식과 다름 (생성자는 상속 계층 순서, 메서드는 실제 객체 기준)
예외 처리의 우선순위:
- 구체적인 예외 타입이 먼저 처리
- 예외 계층 구조에서 상위 타입은 하위 타입보다 뒤에 위치해야 함
try {
throw new IOException();
} catch (IOException e) {
System.out.println("Caught IOException");
} catch (Exception e) {
System.out.println("Caught Exception");
}
class Test {
public static final void method() {
System.out.println("Final static method");
}
}
final과 static은 함께 사용 가능
final 키워드는 메서드를 오버라이드할 수 없게 하고, static은 클래스 수준 메서드로 만듦
class Test {
private Test() {}
private Test(String s) {}
}
클래스는 private 접근 제한자를 사용하여 생성자를 오버로드 가능
>객체 생성 제어
Fields need to be initialized before use.
- 틀림.
- 필드는 초기화하지 않아도 기본값으로 초기화. 기본값은 데이터 유형에 따라 다릅니다:
- 숫자: 0
- 객체: null
- 논리: false
'Certification > OCAJP' 카테고리의 다른 글
OCAJP(1z0-808) 후기 [시험등록 및 변경사항] (0) | 2024.12.19 |
---|---|
OCAJP 복습(6) (0) | 2024.12.12 |
OCAJP 복습(4) (0) | 2024.12.10 |
OCAJP 복습(3) (0) | 2024.12.09 |
OCAJP 복습(2) (0) | 2024.12.08 |