본문 바로가기

Certification/OCAJP

OCAJP 복습(5)

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에서 실행할 수 있다는 뜻
    • 플랫폼 독립성
  • E. It can run on any platform that has the Java Runtime Environment.
    • 자바 바이트코드는 JVM(Java Virtual Machine)을 통해 실행.
      즉, JVM이 설치된 플랫폼에서는 어떤 운영 체제든 실행 가능
    • "Write Once, Run Anywhere" 

**컴파일러(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