API(Application Programming Interface)
: 응용 프로그램에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 한 인터페이스.
: 주로 파일 제어, 윈도우 제어, 화상 처리, 문자 제어 등을 위한 인터페이스 제공
문자열 - API에서 제공하는 클래스 (java.lang.String)
: 객체 자료형이지만, 기본 자료형처럼 선언 가능
문자열의 길이 - length()
인덱스 번호 0에서 시작하는 반면에 length()는 1에서 시작
특정 문자 위치 찾아내기 - indexOf()
원하는 글자의 인덱스 번호 얻어옴. 문자열이 없다면 -1 반환.
문자열 자르기 - substring()
substinrg(int index) : 해당 index 번호부터 자른다. (해당 위치 포함)
substring(int start, int end) : 해당 start 위치부터 end 직전까지
문자열 내용이 같은지 비교하는 equals() - boolean 으로 알려줌.
문자열을 기본 자료형처럼 선언할 수 있다고 해서 문자열 비교 시 '==' 사용하지 말기.
무조건 equals() 이용
'=='는 기본 자료형일 경우, 변수 안의 내용물 비교
객체 자료형일 경우, 변수 안의 레퍼런스가 같은 곳을 가리키는지 비교
문자열의 법칙
빈 문자열(" ")을 이용해서 강제로 문자열 변환
빈 문자열과 '+'를 이용하면 별도의 연산 작업 없어도 처리 가능
예) String str1 = " " + 10;
문자열에 포맷 주기
%d - 정수
%f - float, double과 같은 실숫값
%s - 다른 문자열
split() 메소드 : 문자열을 특정 토큰으로 분리하여 문자열의 배열로 분해.
trim() 메소드 : 문자열의 앞뒤 공백을 제거한 결과를 다시 문자열로 반환 (중간 공백은 대상 x)
equals()로 비교하기 전에 문자열들의 공백을 제거해야 할 때, trim() 사용.
String 클래스는 데이터를 처리하는 여러 가지 기능을 가지고 있다.
문자열은 char[ ] 혹은 byte[ ]로 변형 가능
자신의 데이터를 char[ ]로 만들어서 알려주는 기능.
String str = "한글은";
char[ ] arr1 = str.toCharArray(); // 결과 : {한, 글, 은}
String은 속도 면에서 너무 느리기 때문에 성능을 생각한다면 가능하다면 최소화.
immutable(불변)의 객체이기 때문. 연산할 때마다 객체가 생성됨.
String의 문제점 개선 : StringBuffer, StringBuilder
String 클래스와 거의 유사한 메소드들을 가지고 있고, 잦은 변경 시에 속도도 훨씬 좋음.
객체 안의 데이터를 내부적으로 변경하지만 새로운 객체를 만들지 않는 mutable한 객체이기 때문.
append() 메소드가 + 대신에 쓰인다.
모든 기본형 자료와 문자열, 객체들을 현재의 StringBuilder에 추가하는 메소드.
StringBuilder 생성자와 메소드 -> 책 참고
StringBuilder를 이용해야 하는 경우
1) 루프를 돌면서 문자열 내용이 계속 변경되는 경우
2) + 혹은 += 같은 연산이 빈번하고 자주 사용되는 메소드인 경우
3) if ~ else 연산에 의해 문자열이 완성되는 경우(주로 SQL문이나 명령어)
Date, Calendar, long : 시간을 데이터로 처리하기 위한 장치
1) long : 1000분의 1초 단위로 계산된 결과 알려줌.
2) java.util.Calendar : 국가, 시간대별 시간 정확히 알 수 있도록 제공, 날짜 계산에 관한 메소드 등
3) java.util.Date : 거의 모든 메소드가 Deprecated / java.util.Calendar와 long 사이의 중간 고리로 사용
날짜 처리에 가장 많이 쓰이는 Calendar 계열 - Calendar 객체 얻는 방법 2가지
1) Calendar.getInstance()를 이용해서 GregorianCalendar 객체 얻는 방법
2) new GregorianCalendar()를 이용해서 직접 객체 얻어내는 방법
Calendar에서 데이터 얻으려면 get()만 알면 된다.
get() 메소드는 파라미터로 원하는 데이터 입력하는데, public static final int인 상수로 정의되어 있기 때문에 다음과 같이 호출
int year = call.get(Calendar.YEAR);
int month = call.get(Calendar.MONTH);
int date = call.get(Calendar.DATE);
get 메소드 이용 규칙
1) get() 메소드의 리턴 타입은 무조건 int
(month는 0부터 시작하므로 실제 월보다 하나 작은 값 반환)
2) get() 안에는 Calendar 클래스 상수 정해주기
(Calendar.YEAR와 같이 원하는 상수 있는지 확인 후 호출하면 됨)
Calendar 클래스는 get(), set() 두 개의 메소드만 알고 있으면 됨.
get(int field)
set(int field, int value)
int year = cal.get(Calendar.YEAR);
cal.set(Calendar.DATE, 22);
new Random() : 별도의 Seed 값(난수 발생기가 처음 이용하는 값)을 지정하지 않고 객체 생성
new Random(long seed) : 사용자가 직접 Seed 값을 지정해서 객체 생성
기왕이면 Math.random보다 Random() 클래스 이용하는 방식을 권장.
예) Random(long seed) 값을 이용하면 난수 발생 시에 유사한 패턴이 나오는 것 방지 가능하기 때문.
1) Scanner(File file)
: 원하는 파일을 Scanner의 생성자로 지정하면 지정된 파일에서 데이터 읽어냄
2) Scanner(inputStream in)
: 입출력 프로그래밍에서 Scanner의 기능을 그대로 활용할 때 사용. System.in도 여기에 해당
3) Scanner(inputStream in, String encoding)
: 입출력 프로그래밍으로 데이터를 읽어낸다. 다만, 지정된 문자열의 방식과 같은 인코딩 적용해서 읽어낼 수 있음.
nextLine()은 \n
문자열이 나올 때까지 데이터를 읽어들인다.
next() : 공백 앞의 문자들을 끊어내서 문자열로 반환
Wrapper 클래스 : 기본 자료형을 객체 자료형으로 만드는 역할에 주로 사용.
기본 자료형들과 같은 연산 결과를 만들어 낼 수 있도록 객체가 만들어지면 값을 수정할 수 없는 immutable로 설계된다.
모든 객체의 상위 객체 타입인 Object a 라는 변수가 있다면 이 변수는 어떠한 종류의 객체를 가져도 상관이 없음.
Object a = new String("AAA");
Object a = new Scanner(System.in);
Object 타입의 변수는 모든 객체형 자료를 표현할 수 있지만, int나 byte와 같은 기본형 자료는 선언 X
기본형 자료는 객체형 자료와 완전히 별도로 처리해야만 해서 기본형 자료를 객체형 자료로 처리하기 위한 클래스들이 있다.
Wrapper 클래스 -> Byte 클래스, Short클래스, Integer 클래스... Character 클래스 등등
JDK1.5의 Autoboxing/Unboxing 기능 - 기본 자료형이나 객체 자료형을 간단히 변환.
- Autoboxing : 자동으로 Wrapper 클래스 변환
Unboxing : Wrapper 자료형을 기본 자료형으로 자동 변환
Timer / TimerTask : 지정된 시간에 어떤 로직을 실행하게 해주는 기능. 하루 한번, 혹은 분마다 작업되는 로직을 만들 때 필요.
1) 지정된 시간에 수행될 작업을 java.util.TimerTask 클래스를 상속해서 구현
2) Timer 객체를 만들고 지정된 시간을 넣어준다.
Formatter : 데이터 포매팅
- Systemout.printf(); 특정 데이터를 대체시켜서 출력
JDK 1.5의 Formatter 클래스
- printf() 기능은 화면에 출력되지만 실제 데이터로 활용하기 어려워, 만일 결과를 반환해줘야 하는 상황에는 부적합.
- 따라서 Formatter 클래스가 이런 데이터를 String 타입의 반환 값으로 사용할 수 있는 장치 제공
에러(Error)와 예외(Exception) 구분 기준
에러 - 발생하면 개발자가 조치하기 어려운 수준. (예 : 메모리 부족, JVM 동작 이상 등)
예외 - JVM은 정상적으로 동작, 다른 방식으로 처리하는 것 (예 : 실행되는 프로그램 입력 값이 잘못되었거나 네트워크에 문제 발생, JVM 자체에 문제 없는 상황)
Exception 종류 2가지
1) Checked Exception : 예외 처리 하지 않으면 컴파일 허락하지 않는 예외. (주로 외부 리소스와 통신하는 경우는 반드시 Checked Exception)
2) Unchecked Exception : 컴파일 시 체크되지 않고, 실행 시(Runtime)에 발생하는 Exception을 말한다. 개발자들이 작성하는 로직에 의해서 처리해야 하는 예외.
가장 흔하게 보는 예외
1) 실제 레퍼런스(리모컨)가 가리키는 객체가 없는 상태에서 강제로 동작을 시키는 NullPointerException
2) 배열과 유사한 자료구조에서 범위를 벗어난 인덱스 번호를 사용하는 XXXOutOfBoundsException
3) 문자열이나 숫자/날짜 변환 시에 잘못된 데이터로 발생하는 XXXFormatException
NumberFormatException : 숫자로 바꿀 수 없는 데이터를 숫자로 바꿀 때.
특정 로직에서 사용되는 문자나 숫자, 날짜 등의 데이터를 처리하기 위해서 변환하므로 컴파일러가 체크하지 않는 Exception이므로 신경을 많이 써야 한다.
-> '사용자의 입력 / 외부 데이터의 로딩 / 결과 데이터의 변환 처리'의 경우에 많이 발생함.
Java에서는 예외도 객체로 처리한다.
- 예외는 상속 구조로 처리된다.
- 상속에서 기억해야하는 사항
- 부모 타입으로 변수 선언하고 자식 타입의 객체로 처리해줄 수 있다.
Mouse m = new WheelMouse();- 부모 클래스에 정의된 메소드와 속성을 자식 클래스에서 사용할 수 있다.
- 필요하다면 자식 클래스가 부모가 가진 메소드르 오버라이드(재정의)해서 사용할 수 있다.
가장 상위에 Throwable 클래스가 있고, 그 아래에 Error, Exception 클래스가 있다.
java.lang.Exception 클래스만 알아둔다.
Exception 클래스에서 알아야 할 메소드
1) printStackTrace() : 발생한 Exception의 출처를 메모리 상에서 추적하면서 결과를 알려줌.
2) getMessage() : 한 줄로 요약된 요약 메시지를 String으로 반환.
3) getStackTrace() : printStackTrace()의 결과를 객체화. PrintStackTrace()가 콘솔 창에 출력만 되기 때문에 별도로 문자열 만들 때 getStactTrace()를 이용해서 문자열로 변경해서 처리.
try ~ catch : 예외를 직접 처리
try {
예외가 발생할 가능성이 있는 코드 (정상일 때)
}catch(Exception e){
예외 발생 시 대안 처리 (잘못되었을 떄)
}
throws Exception : 예외가 발생하면 처리하지 않고 책임을 미룸. 예외 처리 X
예외는 return문보다 강력하다
메소드의 return 구문은 어떤 메소드를 호출하더라도 리턴된 결과값을 받지 않을 수 있다.
그러나 예외 처리는 반드시 처리하거나 던지거나를 선택해야만 한다.