1. 상속과 오버라이딩

상속은 객체 지향 프로그래밍에서 기존 클래스의 속성과 메서드를 새로운 클래스가 재사용할 수 있습니다.
오버라이딩은 상속받은 메서드를 자식 클래스에서 재정의하는 것을 의미합니다.

1.1. 오버라이딩과 오버로딩의 차이점

오버라이딩(Overriding):

  • 상속 관계에서 발생합니다.
  • 부모 클래스의 메서드를 자식 클래스에서 재정의합니다.
  • 메서드 이름, 매개변수, 반환 타입이 모두 동일해야 합니다.
  • 런타임 다형성을 지원합니다.

오버로딩(Overloading):

  • 같은 클래스 내에서 발생합니다.
  • 같은 이름의 메서드를 여러 개 정의합니다.
  • 메서드 이름은 같지만 매개변수의 타입, 개수, 순서가 달라야 합니다.
  • 컴파일 타임 다형성을 지원합니다.

-> 추가 질문을 준비
부모 메서드 호출 super
매개변수 다르면 어떻게 되냐 - 오버로딩

오버로딩에서 리턴타입 다를경우 -> 에러발생함

1.2. 추상 클래스와 인터페이스의 차이점

추상 클래스:
토론
동물 먹는것 자는것
추상 클래스는 공통되는 부분을 모아서 추상 클래스에 정의하고, 그 외의 부분을 자식 클래스에서 확장하여 사용하는 개념

  • 일부 구현된 메서드와 추상 메서드를 모두 가질 수 있습니다.
  • 단일 상속만 가능합니다.
  • 생성자를 가질 수 있습니다.
  • 멤버 변수를 가질 수 있습니다.
  • 'abstract' 키워드로 선언합니다.

인터페이스:
카페 주문 제작 호출
동물 소리
저마다의 방식으로 동작을 정의합니다.

  • 모든 메서드가 추상 메서드입니다
  • 다중 상속을 지원합니다
  • 생성자를 가질 수 없습니다.
  • 상수만 멤버 변수로 가질 수 있습니다.
  • 'interface' 키워드로 선언합니다.

정의 먼저하기!

  1. 프로세스와 쓰레드

프로세스는 실행 중인 프로그램의 인스턴스로, 독립된 메모리 공간과 시스템 자원을 할당받습니다.
쓰레드는 프로세스 내에서 실행되는 작업의 단위로, 같은 프로세스 내의 쓰레드들은 메모리 공간과 자원을 공유합니다.

2.1. 컨텍스트 스위칭

컨텍스트 스위칭은 현재 실행 중인 프로세스나 쓰레드를 중단하고 다른 프로세스나 쓰레드를 실행하기 위해 상태를 전환하는 작업입니다.

이 과정에서 다음과 같은 일이 발생합니다:

  1. 현재 실행 중인 프로세스/쓰레드의 상태를 저장합니다 (레지스터 값, 프로그램 카운터 등).
  2. 다음 실행할 프로세스/쓰레드의 상태를 로드합니다.
  3. 새로운 프로세스/쓰레드의 실행을 시작합니다.

컨텍스트 스위칭은 멀티태스킹 운영체제에서 필수적이지만, 빈번한 스위칭은 시스템 성능에 부정적인 영향을 줄 수 있습니다.

-> 성늘 줄이는 방법 : 쓰레드 최적화 하고, 적당한 개수를 만들고, 스케 알고리즘, 이것도 있습니다. cpu를 좋은것으로 교체(하드웨어는 교체)

  1. Optional의 등장 배경을 이해하고 활용할 수 있다.
    1.1. Optional에서 사용하는 주요 메소드들은 무엇인가요? 그리고 어떤 상황에서 사용해야 할까요?

Optional은 Java 8에서 도입된 클래스로, null 처리를 보다 안전하고 명확하게 하기 위해 등장했습니다.

등장 배경:
1. NullPointerException(NPE)은 Java에서 가장 흔한 런타임 에러 중 하나입니다.
2. null 체크 로직이 필요한 경우가 많아 코드가 복잡해지고 가독성이 떨어집니다.
3. 메소드의 반환 값이 null일 수 있다는 것을 명시적으로 표현할 방법이 필요했습니다.

Optional의 주요 메소드와 사용 상황:

  1. of(T value)

    • null이 아닌 값을 포장할 때 사용합니다.
    • 값이 null이면 NullPointerException을 발생시킵니다.
      사용 예: Optional opt = Optional.of("Hello");
  2. ofNullable(T value)

    • 값이 null일 수도 있는 경우에 사용합니다.
    • 값이 null이면 빈 Optional을 반환합니다.
      사용 예: Optional opt = Optional.ofNullable(maybeNullString);
  3. empty()

    • 빈 Optional 객체를 생성할 때 사용합니다.
      사용 예: Optional empty = Optional.empty();
  4. isPresent()

    • Optional 객체가 값을 포함하고 있는지 확인할 때 사용합니다.
      사용 예: if (opt.isPresent()) { ... }
  5. ifPresent(Consumer<? super T> consumer)

    • 값이 존재할 때만 특정 작업을 수행하고 싶을 때 사용합니다.
      사용 예: opt.ifPresent(s -> System.out.println(s));
  6. get()

    • Optional 객체에서 값을 추출할 때 사용합니다.
    • 값이 없으면 NoSuchElementException을 발생시키므로 주의해야 합니다.
      사용 예: String value = opt.get();
  7. orElse(T other) 객체를 반환하기 때문에 / 무조건 연산된 데이터

    • 값이 존재하면 그 값을, 그렇지 않으면 인자로 전달된 기본값을 반환합니다.
      사용 예: String value = opt.orElse("Default");
  8. orElseGet(Supplier<? extends T> other) 권장 람다, 성능에 유리 / 값이 없는상황이 됬을때 람다가 실행

    • orElse와 유사하지만, 값이 없을 때만 Supplier가 실행됩니다.
    • 기본값을 생성하는 비용이 큰 경우에 사용합니다.
      사용 예: String value = opt.orElseGet(() -> expensiveOperation());
  9. orElseThrow(Supplier<? extends X> exceptionSupplier)

    • 값이 존재하면 그 값을, 그렇지 않으면 지정된 예외를 발생시킵니다.
      사용 예: String value = opt.orElseThrow(() -> new NoSuchElementException());
  10. map(Function<? super T, ? extends U> mapper)

    • 값이 존재하면 제공된 매핑 함수를 적용합니다.
      사용 예: Optional length = opt.map(String::length);
  11. flatMap(Function<? super T, Optional> mapper)

    • map과 유사하지만, 매핑 함수의 결과가 Optional인 경우에 사용합니다.
      사용 예: Optional upper = opt.flatMap(s -> Optional.of(s.toUpperCase()));

NullPointerException을 방지할 수 있습니다. 또한 값의 존재 여부를 명시적으로 표현할 수 있어 코드의 가독성과 안정성을 높일 수 있습니다.

-> 다시 정리해서 이야기하기 보충하기
of, ofNullable , orElse ,orElseGet

단점
매핑 하는거기 때문에 성능저하
남발하면 느려진다

안쓰는게 좋은 측면도 있음
optional을 자제하는게 좋을수도 있음.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글