OOP(Object-Oriented Programming)의 4개의 요소 캡슐화, 상속, 추상화, 다형성 중
캡슐화를 위해서 사용하는 것이 바로 접근제어자이다.
접근제어자의 필드, 메서드 단위에서의 사용에 있어서는 의외로 잘 적응했다고 생각했는데,
class, interface 단위에서의 주의점이 하나 있어서 소개하고자 한다.
1. 예제
아래와 같이 interface InputHandler와 OutputHandler를 한 개의 .java 파일에 정의하고
이를 composition을 통해 구현하는 KioskIOHandler라는 Class가 있다고 하자.
public interface InputHandler {
String readInput();
}
public interface OutputHandler {
void writeOutput(String output);
}
// 입력과 출력을 동시에 처리하는 구현체
public class KioskIOHandler implements InputHandler, OutputHandler {
// 입력 관련 기능
@Override
public String readInput() {
// TODO:
}
// 출력 관련 기능
@Override
public void writeOutput(String output) {
// TODO:
}
}
그러면 위와 같이 관성적으로 작성할 텐데,
아래와 같이 작성한다면 Checked Exception이 나와 IDE 상에서 빨간 밑줄이 그어지게 된다.
그런데 Exception이라는 예외는 대체 무엇일까?
2. Error vs Exception ?
Exception 이 무엇이고 Error가 무엇인가를 알아보자
- Exception : Exceptional Event의 줄임말이다.
" Definition: An exception is an event, which occurs during the execution of a program,
that disrupts the normal flow of the program's instructions. " - oracle docs : exception
프로그램의 실행 과정 중에 "프로그램의 일반적인 흐름을 방해하는 이벤트" 로 정의된다.
https://docs.oracle.com/javase/tutorial/essential/exceptions/definition.html
- Error : 그렇기 때문에 프로그램 실행에서 에러가 아닌, "예외"라는 단어를 두는 것이고
이 "예외"를 처리하지 않으면, 프로그램이 에러로 인해 종료될 수 있다.
https://docs.oracle.com/javase/8/docs/api/java/lang/Error.html
또한, 실행을 할 때 하드웨어 또는 시스템 자원 문제와 관련이 있는 경우도 존재한다.
가령 OutOfMemoryError(메모리 부족) 혹은 StackOverflowError(스택의 과다한 호출 -> 재귀함수의 무한루프)와
같은 경우의 Error도 존재한다.
정리하자면, Exception은 compile이나 runtime 상황에서
개발자가 의도한 context와 상반되는 context가 되는 Event가 될 것이고
이 Exception에 대한 예외 처리 과정이 없을 경우 Error가 발생한다.
참고로, Exception을 처리하는 것을 "예외 처리"라고 한다. Java 에서는 try - catch 구문을 통해서
해당하는 Exception을 받아내고, 이것을 context의 흐름에서 벗어나지 않도록(프로그램이 종료되지 않도록)
처리하는 과정이 바로 예외 처리 과정이다.
또한 이 둘은 복구 가능성과 위치 및 발생 원인이 조금 씩 다르다.
- 복구 가능성
- Error : 일반적으로 복구가 불가능, 프로그램이 강제 종료되기 전에 개발자가 할 수 있는 대응이 없다.
- Exception : 복구 가능, 개발자가 예외 처리를 통해 예방 가능
- 위치 및 발생 원인
- Error : JVM 수준의 문제에서 발생. 메모리 부족 혹은 심각한 시스템 충돌 등이 원인
- Exception : 프로그램 로직 오류, 잘못된 사용자 입력, 네트워크 문제 등
3. Checked Exception vs Unchecked Exception
Exception이라는 것을 통해 에러 처리를 진행하는데,
여기서 Exception은 두 가지로 나뉜다.
- Checked Exception : Compile 시점에서 확인되는 Exception이다.
- 주로 코드상의 문법 에러나 네트워크 통신 등
프로그램 외부와 상호 작용할 때 발생할 수 있는 예외를 처리할 때 사용한다. - complie 시점에 확인되어야 하는 예외이므로 (need to be) Checked Exception이다.
- 예외 처리를 하지 않는 경우 Compile Error 발생
- 주로 코드상의 문법 에러나 네트워크 통신 등
- Unchecked Exception : Runtime 시점에 확인되는 Exception이다.
- 그렇기에 컴파일러가 예외처리를 강제하지 않는다.
- 프로그래머의 실수, 논리 오류와 관련이 있다.
- runtime 시점에 확인되는 예외이므로 Unchecked Exception이다.
- 예외 처리를 하지 않는 경우 Runtime Error 발생
4. 예시 코드로 돌아와서,
저 예시 코드가 Checked Exception이 발생한다는 IDE의 정보는
한 개의 .java 파일 안에 public 접근제어자로 선언이 된 class 와 interface가 여러개이기 때문이다.
Java는 class 기반의 객체 지향 프로그래밍 언어로,
각각의 class 파일에는 해당하는 class를 정의하는 public class (or interface)는 단 하나여야 한다.
public 접근제어자가 class혹은 interface에서 사용되는 경우에는
프로젝트 내의 모든 위치에서 사용이 가능해야 하고,
동시에 그렇게 사용될수 있도록 (JavaScript의 예시를 들자면, export가 될 수 있도록 하려면 )
최상단의 class에 정의되어야 하기 때문이다.
따라서 위의 코드가 exception이 발생하지 않도록 아래와 같이 수정해야 한다.
interface InputHandler {
String readInput();
}
interface OutputHandler {
void writeOutput(String output);
}
public class KioskIOHandler implements InputHandler, OutputHandler {
@Override
public String readInput() {
// TODO:
}
@Override
public void writeOutput(String output) {
// TODO:
}
}
5. Method Signature
아래의 그림처럼 메서드 정의에 입력, 출력 값과 접근제어자 등으로
메서드가 어떻게 사용될 것인지를 요약하는 첫 문장을 Method Signature라고 한다.
https://developer.mozilla.org/en-US/docs/Glossary/Signature/Function
'정보 > 프로그래밍 언어' 카테고리의 다른 글
Java에서의 다형성을 사용한 구현 (0) | 2024.09.27 |
---|---|
JavaScript 엔진 동작 원리와 Hoisting (1) | 2024.09.11 |