table of contents
객체 지향 아시는구나
- 추상화: 대상의 핵심적인 부분만 남기고 필요 없는 건 만들지를 마세요
- 상속: 같은 특징을 갖는 것들끼리 묶어서 공통 모듈(기반 클래스)을 쓰세요
- 다형성: 기반 클래스 하위호환 가능
- 업캐스팅: 파생 클래스 상위호환, 대신 기반 클래스에 있는 것만 쓸 수 있음
- 실무에서는 상속도 결합이 강하기 때문에 잘 안쓴다. 인터페이스를 쓰세요. + 확장 어렵고 단일 상속 제한 때문에 관리 어려움
인터페이스를 쓰세요
- UI, API 다 인터페이스의 I를 쓴다. 컨트롤러임. 알맹이가 어떻게 생겼는지는 사용자에게 알릴 필요가 없고 사용자는 필요한 기능을 쓸 줄만 알면 됨.
상속이랑 뭐가 다르세요?
구분 상속 인터페이스 사용 대상 클래스 ← 클래스 클래스 ← 인터페이스 역할 상속 (물려받음. 주는대로 써도 됨) 구현 (구현의 의무를 떠맡음) 수량 1개만 상속 가능 여러 개 받아도 됨 받은 것 위에서 정의된 내용까지 다 받음 이름만 정해준 거임 구현 의무 안해도 쓰는 데 지장 없음 해.
추상 클래스
- 나는 여러 클래스를 상속하면서도 공통 멤버는 미리 정의해놓고 싶다 → 그런 님을 위한 추상 클래스
- 사용 방식은 인터페이스와 동일
예외 처리
- 사람들은 사용 설명서를 안읽는다. 당기세요도 안읽는다. 그게 아니어도 인터넷이 갑자기 끊긴다거나, 주점에 들어가서 돈까스를 열어제낀다거나 하는 등 다양한 이슈로 문제가 생긴다. → 누가 책임져? 개발자가 책임져…
- 예: 나이를 숫자로 입력하세요 - “서른마흔다섯살”
- 보통 이런 예외는 코드 문법상으로는 빨간 밑줄을 안쳐주기 때문에 코드를 쓸 때 똑바로 생각하고 미리 오류를 정의해놔야 한다 → 하지만 try-catch를 쓰라는 말은 아님
- try-catch와 throw
- try-catch: 내부적으로 다 처리하고 아무 일도 없었다..! 해버림. 그 ‘내부’마다 각자 try-catch 해야 해서 로직이 중복됨
- 아예 쓰지 말라는 건가? → 아님. 굳이 밖에서 알 필요 없는 소소한 이슈들은 알아서 처리해도 됨. 예: 오류 출력만 해도 되는 경우, 바로 복구 가능한 경우
- 멈추지 말고 계속 진행해야 하는 경우에도 try를 씀
- throw: 예외를 호출자에게 집어던짐. 해결 책임을 상위에 전가함.
- 이 오류가 내 책임이 아닐 때 씀. 던져져 올라간 예외들이 최상위에서 한번에 처리되도록 함. 핵심 로직 먼저 하고 예외 처리는 나중에 할 때에도 씀.
- try-catch: 내부적으로 다 처리하고 아무 일도 없었다..! 해버림. 그 ‘내부’마다 각자 try-catch 해야 해서 로직이 중복됨
- 커스텀 예외: 기본으로 제공되는 예외만으로는 설명이 부족한 경우 사용. 프로젝트 전용 예외 구현. → Exception 객체 상속 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.ArrayList;
import java.util.List;
public class DAY3_3 {
public static void main(String[] args) {
UserService userService = new UserService();
try {
userService.findUser("alice"); // 존재
userService.findUser("zoe"); // 존재하지 않음
} catch (UserNotFoundException e) {
System.out.println("에러 발생: " + e.getMessage());
}
System.out.println("프로그램 종료");
}
}
// 1. 사용자 정의 예외 클래스
class UserNotFoundException extends Exception {
public UserNotFoundException(String message) {
super(message);
}
}
// 2. UserService: 유저 관리 기능
class UserService {
private List<String> users;
public UserService() {
users = new ArrayList<>();
// 유저 5명 등록
users.add("alice");
users.add("bob");
users.add("charlie");
users.add("david");
users.add("emma");
}
// 유저 조회
public void findUser(String name) throws UserNotFoundException {
if (!users.contains(name)) {
throw new UserNotFoundException(name + " 유저는 존재하지 않습니다.");
}
System.out.println(name + " 유저를 찾았습니다.");
}
}