[기술면접] 상속, 오버라이딩, 추상클래스, 인터페이스, 프로세스, 쓰레드, Java Optional

White 와잇·2024년 7월 29일

상속, 오버라이딩

오버라이딩과 오버로딩의 차이

둘 다 객체지향 프로그래밍에서 다형성을 구현할 수 있는 개념입니다.

오버라이딩은 자식클래스에서 부모클래스의 메서드를 재정의합니다.
메서드 시그니처가 동일해야합니다. (메서드이름, 매개변수, 반환타입)
접근 제한자가 부모보다 닫혀있을 수 없습니다.
부모의 예외보다 더 넓은 범위의 예외를 던질 수 없습니다.
@Override라는 애너테이션을 사용해서 명시적으로 표기하여 가독성을 높이고 실수를 방지할 수 있습니다.

오버로딩은 같은 클래스 내에 같은 이름 메서드를 여러 개 정의하는 것이고, 대신 서로 다른 매개변수 리스트를 가져야 합니다.
매개변수의 타입, 개수 또는 순서가 달라야 합니다.
같은 이름의 메서드가 매개변수가 다르다면 반환타입이 다를 수 있습니다.

오버라이딩과 오버로딩은 둘 다 객체지향 프로그래밍에서 다형성을 구현하는 방법이고 코드의 유연성과 재사용성을 높일 수 있습니다.

추상클래스와 인터페이스 차이

추상 클래스와 인터페이스는 모두 스스로 객체를 만들 수 없고 상속의 개념을 사용한다는 공통점이 있습니다.

추상 클래스는 클래스의 공통된 속성, 행동을 정의하고
추상메서드를 포함해 일부 동작을 위임할 수 있습니다.
자바에서는 단일 상속만 가능합니다.

인터페이스는 추상 메서드와 public static final 필드로 구성되어 있어 클래스가 구현해야할 특정 행동을 강제할 때 사용합니다.
자바 8 이후부터 default 메서드, static 메서드를 정의할 수 있습니다.
생성자가 없고, 다중 상속이 가능합니다.

프로세스와 쓰레드

  • 프로세스: 실행 중인 프로그램의 인스턴스이며 각 프로세스는 독립적으로 실행됩니다.
    프로세스는 메모리에 자신의 주소 공간을 가지고 프로그램 코드, 데이터, 힙, 스택영역으로 구성되어 있습니다.

  • 쓰레드: 프로세스 내부의 작은 실행 단위이며 각 쓰레드는 독립적으로 실행되지만 같은 프로세스의 코드, 데이터, 힙 메모리를 공유합니다.

레지스터와 스택은 자신의 자원을 사용합니다.

컨텍스트 스위칭

운영체제 스케줄러가 하나의 프로세스에서 다른 프로세스로 전환하는 과정 또는 쓰레드에서 쓰레드일 수도 있습니다.
프로세스 전환은 CPU에 현재 프로세스 상태와 메모리 정보를 저장하고 새 프로세스 데이터를 가져오면서 오버헤드가 발생합니다.
쓰레드는 같은 프로세스 내에서 실행되기 때문에 주소 공간을 전환하지 않아 일반적으로 더 적은 오버헤드가 발생합니다.

순서:
1. 현재 실행중인 작업의 상태를 제어블록에 저장합니다.
2. 스케줄러가 선택한 다음 작업의 상태를 제어블록으로부터 작업을 복원합니다.
3. CPU가 이어서 실행합니다.

사용 이유:
1. 여러 작업을 동시에 처리하여 사용자의 편의가 증가합니다.
2. cpu가 유휴상태가 되지 않도록 자원과 프로세스를 효율적으로 사용할 수 있게 합니다.
3. 멀티스레딩을 사용하여 프로그램이 더 빠르고 자원을 효율적으로 사용할 수 있게 합니다.
4. 각 프로세스에게 독립적인 실행 환경을 제공해서 다른 프로세스에게 영향이 없도록 합니다.


프로세스 컨텍스트 스위칭 순서
1. 현재 프로세스 상태를 제어블록에(프로세스 제어블록 PCB) 저장: 실행 중이던 pc 같은 레지스터값, 메모리관리정보
2. 다음 프로세스 상태를 (PCB) 가져옴
3. cpu가 다음 프로세스를 실행

쓰레드 컨텍스트 스위칭 순서
요약: 쓰레드 제어블록 TCB에 쓰레드가 사용하던 레지스터 값을 저장하고 다음 차례가 됐을 때 다시 CPU에 로드하여 명령을 실행할 수 있게 합니다.

*프로그램 카운터 : 레지스터

  • 스케줄링 알고리즘:
    FCFS 먼저 도착한 작업을 먼저 실행
    SJF 실행시간이 가장 짧은 작업 먼저 실행
    라운드로빈 : 각 작업에 동일한 시간 부여

Java Optional

  • Java 8부터 도입

Optional의 주요 메서드 활용

변수가 값을 가질 수도 있고 아닐 수도 있는 상황을 명시적으로 처리할 때 사용합니다.

장점: 코드의 가독성, 안정성, 유지보수성을 높일 수 있습니다.
Optional을 적절히 사용하면 NPE를 방지할 수 있습니다.
값이 없을 수도 있다는 것을 알릴 수 있습니다.
함수형 프로그래밍을 사용할 수 있습니다.

단점:
Optional 객체를 생성하므로 성능 부하와 메모리 사용량이 증가합니다.
간단한 null검사를 Optional으로 대체하는 것이 불필요할 수 있습니다.
컬렉션 제네릭 타입으로 Optional을 두는 것은 가독성이 안좋고 복잡할 수 있습니다.
JSON 직렬화/역직렬화가 지원되지 않습니다.

따라서 변수의 null값을 확인이 필요할 때에만 사용해야 하고 Optional을 남발하여 사용하는 것은 불필요하다고 생각합니다.

  • 생성메서드
    Optional.empty()
    Optional.of(~)
    Optional.ofNullable(~)

  • 검색
    isPresent()
    isEmpty()

  • 조회
    get() : null일 경우 NoSuchElementException 예외
    orElse(~)
    orElseGet(~) null일 경우 기본값 ~
    orElseThrow(~) null일 경우 예외

profile
웹개발 도전! 데브옵스 도전!

0개의 댓글