둘 다 객체지향 프로그래밍에서 다형성을 구현할 수 있는 개념입니다.
오버라이딩은 자식클래스에서 부모클래스의 메서드를 재정의합니다.
메서드 시그니처가 동일해야합니다. (메서드이름, 매개변수, 반환타입)
접근 제한자가 부모보다 닫혀있을 수 없습니다.
부모의 예외보다 더 넓은 범위의 예외를 던질 수 없습니다.
@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에 로드하여 명령을 실행할 수 있게 합니다.
*프로그램 카운터 : 레지스터
변수가 값을 가질 수도 있고 아닐 수도 있는 상황을 명시적으로 처리할 때 사용합니다.
장점: 코드의 가독성, 안정성, 유지보수성을 높일 수 있습니다.
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일 경우 예외