오늘부터 토이프로젝트가 시작된다. 혹시나 조를 짜서 프로젝트를 진행하면 어떻게 되나 했지만 개인별로 진행을 하면 된다고 해서 오히려 좋다는 생각이 들었다. 아직은 내가 다른 사람의 발목을 붙잡지는 않을까라는 걱정이 앞선다..
토이프로젝트는 스마트스토어 운영진을 위한 고객 분류 프로그램을 개발하는 것이다. 단 List, Set, Map 등의 API는 전혀 사용하지않고 총 이용시간과 결제한 금액을 토대로 고객을 분류하고 이를 정렬, 출력 등을 하는 것이다. 물론 데이터들은 모두 직접 입력을 하는 형태로 구현하면 된다. 또한 기준도 직접 입력을 받아서 바꿀 수 있도록 해야한다.
마지막으로 예외처리또한 해주어야한다. 물론 오늘 배우긴 했지만 중요한 부분이기 때문에 빼놓아서는 안된다.
쉬울거라는 생각은 안든다. 천천히 차근차근 해봐야겠다. 아직은 시간적으로 여유가 있으니깐.
예외는 제대로 활용한다면 프로그램의 가독성, 신뢰성, 유지보수성이 높아지지만 잘못 사용하면 반대의 효과만 나타난다.
에러
치명적인 오류
시스템이 종료되는 수준
JVM실행에 문제
개발자가 예측할 수 없음
예외
개발자의 로직에서의 실수
사용자의 잘못된 입력이나 사용
개발자가 예측가능함
발생하면 프로그램은 즉시 종료
-> 예외처리를 통해서 정상 실행 상태를 유지 가능
프로그램 사용자들의 동작에 의해 발생하는 경우
예시
- 스트림이나 파일 접근시 발생하는 예외 `IOException`
- DB 접속 권한이 없거나 네트워크 오류시 발생하는 예외 `SQLException`
- 존재하지 않는 파일 처리시 발생하는 예외 `FileNotFoundException`
- 클래스 이름을 잘못 적었을 때 발생하는 예외 `ClassNotFoundException`
주로 프로그래머 실수에 의해 발생될 수 있는 예외들
예시
- 배열 범위 벗어났을 때 발생하는 예외 `IndexOutOfBoundsException`
- null인 참조 변수의 멤버를 호출시 발생하는 예외 `NullPointerException`
- 클래스 간의 형을 잘못 변환했을 때 발생하는 예외 `ClassCastException`
- 정수를 0으로 나누려고 했을 때 발생하는 예외 `ArithmeticException`
예외처리 (Exception Handling)
정의 - 프로그램 실행시 발생할 수 있는 예외를 대비한 코드를 작성하는 것
try {
} catch(Exception e1){
} finally {
//예외 발생 유무와 상관없이 무조건 실행 (생략가능)
}
상속이나 인터페이스 등으로 인해서 부모 자식 클래스가 생겼을 경우 부모 클래스가 자식의 예외 처리를 전부 할 수도 있다. 따라서 가장 하위의 클래스의 예외부터 try catch 문을 사용하는 것이 좋다.
리소스 닫기
리소스 객체(입출력 스트림, 서버 소켓, 소켓, 각종 채널)은 사용 후 안전하게 자원을 해제해 주어야 한다.
try (
FileInputStream fileInputStream = new FileInputStream(PATH+FILENAME) ;
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
)
API (Library)
1. java lang
자바의 기본적인 클래스를 담고 있는 패키지.
import 없이도 사용 가능하다.
System.in (데이터 입력 -> 키보드)
System.out (데이터 출력 -> 모니터)
System.exit() JVM 종료
System.currentTimeMillis() (시스템 시간)
String
문자열 수정없이 읽기만 하는 경우
String Pool에 저장된다.
문자열 상수로 저장이 된다.
Math
수학에서 자주 사용하는 상수들과 함수들을 구현해놓은 클래스
모든 필드와 메소드는 정적 필드/ 메소드로 구성됨
Math.PI - PI값
Math.random - 랜덤값
자료형 클래스
Wrapper Class라고도 부른다.
Byte, Short, Integer, Long, Float, Double, Character, Boolean
Comparable, Comparator
하나의 인스턴스 안에는 여러 필드값이 존재함
그 중에서 특정값을 기준으로 객체 배열을 정렬해야 하는 경우에 사용할 수 있다.
Object nextElement(), String nextToken()
// 이 두가지 메소드는 다음의 토큰을 반환
// 두가지 메소드는 같은 객체를 반환하는 데 반환형은 다름
// nextElement는 Object를, nextToken은 String을 반환함
// StringTokenizer vs String split()
// String split() - 빈 문자열도 토큰으로 인식, 정규식 사용 가능, 잘라낸 결과를 배열에 담아서 반환 (데이터 양이 많은 경우 성능 떨어짐)
// StringTokenizer - 빈 문자열은 토큰으로 인식하지 않음
in.nextByte() // byte 형 입력 및 리턴
in.nextShort() // short 형 입력 및 리턴
in.nextInt() // int 형 입력 및 리턴
in.nextLong() // long 형 입력 및 리턴
in.nextFloat() // float 형 입력 및 리턴
in.nextDouble() // double 형 입력 및 리턴
in.nextBoolean() // boolean 형 입력 및 리턴
in.next() // String 형 입력 및 리턴 (공백을 기준으로 한 단어를 읽음)
in.nextLine() // String 형 입력 및 리턴 (개행을 기준으로 한 줄을 읽음)