TIL(20240728) [상속과 오버라이딩, 컨텍스트 스위칭 그리고 Optional]
📌 상속, 오버라이딩에 대한 개념을 이해하고 설명 가능하다.
- 상속 ? 하위 클래스가 상위 클래스의 속성과 메서드를 물려받는 객체지향 프로그래밍의 메커니즘이며 상속을 통해 코드의 재사용성과 확장성을 높입니다.
오버라이딩 ? 자식클래스가 부모 클래스에서 상속 받은 메서드를 재정의하는 것으로 코드의 유연성과 재사용성을 높이고 확장성을 높일 수 있습니다.
- 1.1. 오버라이딩과 오버로딩의 차이점은 무엇인가요?
: 오버로딩과 오버라이딩은 객체지향 프로그래밍에서 메서드를 정의하는 두 가지 주요 방식을 말하는데, 각각의 목적과 사용방식이 다릅니다.
오버라이딩(Overriding)은 상속을 받은 자식클래스가 부모클래스의 메서드를 재정의하는 것으로 메서드 이름과 매개변수, 반환타입이 모두 동일해야하며 자식클래스의 특성에 맞게 메서드를 구현 할 수 있어 코드의 유연성과 재사용성을 향상시킬 수 있습니다. 그리고 오버로딩의 경우 같은 클래스 내에서 같은 이름의 메서드를 매개변수의 타입이나 개수를 달리하여 여러개 정의하는것으로 같은 기능을 하는 메서드를 매개변수에 따라 다르게 동작하도록 하기위해 사용되며 코드의 가독성을 향상시킬 수 있습니다.
오버로딩의 경우 같은 클래스 내에서 같은 이름의 메서드를 여러 개 정의하되, 매개변수의 타입/개수/순서(반환타입은 무관)를 다르게 하는 것을 의미하며 주로 동일한 작업을 수행하지만 입력 매개변수가 다를 때 유용합니다. 오버라이딩은 상위 클래스에서 정의된 메서드를 하위 클래스에서 재정의하는 것을 의미하는데, 이는 상속 관계에서 사용되며 하위 클래스가 상위 클래스의 메서드를 자신의 방식으로 구현할 수 있게 합니다. 주의할 점은 오버라이딩된 메서드는 상위클래스의 메서드와 이름/매개변수/반환타입이 동일해야 합니다. 그리고 오버라이딩 된 메서드는 상위클래스의 메서드보다 더 제한적인 접근제어자를 사용할 수 없습니다. ex)상위-public 하위-private X
오버로딩과 오버라이딩을 통해서 코드의 유연성과 재사용성을 향상 시켜 줄 수 있습니다.
- 1.2. 추상클래스와 인터페이스 차이점은 무엇인가요?
추상클래스는 하나 이상의 추상메서드를 포함하는 클래스로 관련성이 높은 클래스들에서 공통적으로 사용되는 기능을 추상클래스에서 정의하여 코드의 중복을 줄이고 기능을 확장하는데 사용됩니다. 주요 특징은 추상클래스는 일반메서드,추상메서드,필드,생성자를 가질 수 있고 단일상속만 가능하며 자식클래스는 반드시 상속받은 추상클래스의 추상메서드를 구현해야합니다. 그리고 인터페이스의 경우 기본적으로 구현이 없는 추상 메서드만을 포함하고 있으며 서로 관련성이 없는 클래스들의 공통적으로 사용하는 행위를 정의하고 구현을 강제하며 코드의 유연성과 확장성을 높이는데 사용됩니다. 주요특징으로는 다중구현이 가능하며 추상메서드와 상수만을 포함할 수 있으며 생성자를 가질 수 없다는 특징을 가지고 있습니다.
Java 8 이후부터 default methods,static methods 가질 수 있습니다.
인터페이스의 모든 메서드는 기본적으로 public abstract입니다. 인터페이스의 모든 변수(상수)는 기본적으로 public static final입니다.
📌 (운영체제) 프로세스와 쓰레드에 대한 개념을 이해하고 설명이 가능하다.
프로세스 ? 프로세스는 실행 중인 프로그램의 인스턴스를 의미합니다. 운영체제는 각 프로세스에 독립된 메모리 공간을 할당하며, 프로세스는 자신의 메모리 공간에서 실행됩니다.
쓰레드 ? 쓰레드는 프로세스 내에서 실행되는 가장 작은 실행 단위입니다. 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있으며, 이 쓰레드들은 프로세스의 자원을 공유합니다.
2.1. 컨텍스트 스위칭이란 무엇인가요?
: 컨텍스트 스위칭(Context Switching)은 운영체제에서 멀티태스킹을 구현하기 위한 핵심 메커니즘으로, 현재 실행 중인 프로세스나 스레드의 상태를 저장하고, 다음 실행할 프로세스나 스레드의 상태를 복원하는 과정을 뜻합니다. 이러한 과정을 통해 CPU 자원을 여러 프로세스나 스레드가 효율적으로 공유할 수 있게 하고, 멀티태스킹을 가능하게 하여 시스템의 전반적인 성능을 향상시킵니다.
하지만 과도한 컨텍스트 스위칭은 다음 실행할 프로세스나 스레드의 상태를 복원하는 과정에서 CPU 사이클을 소모합니다. 이로 인해 시스템의 전반적인 성능이 저하되므로 오버헤드가 발생할 수 있으며, 프로세스 간 전환 시 CPU 캐시가 무효화되어 새로운 프로세스의 데이터로 채워져야 하므로 이로 인해 메모리 접근 시간이 증가하여 성능 저하를 초래할 수 있습니다.
단점 해결방법 :
- 스케줄링 최적화: 효율적인 프로세스 스케줄링 알고리즘을 사용하여 컨텍스트 스위칭을 최소화할 수 있습니다. 예를 들어, 우선순위 기반 스케줄링 등을 활용하여 스위칭 빈도를 줄이는 것
- 프로세스 및 스레드 수 조정: 시스템에서 동시에 실행되는 프로세스나 스레드의 수를 조정하여 과도한 스위칭을 피할 수 있습니다. 필요 없는 프로세스를 종료하거나 스레드 풀을 사용하여 효율성을 높일 수 있습니다.
📌1. Optional의 등장 배경을 이해하고 활용할 수 있다.
- 1.1. Optional에서 사용하는 주요 메소드들은 무엇인가요? 그리고 어떤 상황에서 사용해야 할까요?
: Optional은 Null 참조의 문제점 해결과 명시적인 null 가능성 표현으로 Optional을 활용하면 null 관련 버그를 줄이고, 더 명확하고 안전한 코드를 작성할 수 있다는 점이 있습니다.
주요 메서드를 말씀드리면 of는 값이 절대 null이 아님을 확신할 때 사용하며 empty()의 경우 명시적으로 값이 없음을 표현하고 싶을 때 사용, isPresent()는 값의 존재 여부를 체크할 때 사용, ifPresent() 값이 있을 때만 특정 작업을 수행하고 싶을 때 사용, get() 값이 반드시 존재한다고 확신할 때 사용 (주의: 값이 없으면 예외 발생), orElseThrow() 값이 반드시 있어야 하며, 없을 경우 예외 처리가 필요할 때 사용, map의 경우 값을 변환하되, null 안전성을 유지하고 싶을 때 사용 되며 이러한 메소드들을 적절히 활용하면 null 체크를 보다 안전하고 명확하게 할 수 있으며, NullPointerException을 방지하는 데 도움이 되고 또한, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
(NullPointerException은 Java에서 가장 흔한 런타임 에러 중 하나인데, 개발자들이 null 체크를 빼먹거나 잘못 처리하는 경우가 많았다고 합니다. 그리고 명시적인 null 가능성 표현으로 메서드의 반환 타입만으로는 null 반환 가능성을 알기 어려워 Optional을 사용하면 값이 없을 수 있음을 명시적으로 표현할 수 있게 되었다고 합니다.)
- 단점 : 1. 성능오버헤드 Optional은 객체를 감싸는 래퍼(wrapper)이므로, 추가적인 객체 생성과 메모리 사용이 발생합니다. 2. 남용가능성으로 불필요한 곳에서 Optional을 사용하면 코드가 복잡해지고 가독성이 떨어질 수 있어 적절히 사용되어야 합니다.