[TIL] 220316

effiRin·2022년 3월 16일
0

TIL

목록 보기
2/2
post-thumbnail

[Java] 책 읽으면서 메모


Ch.12 문자열

  • 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() 이용

  • '=='는 기본 자료형일 경우, 변수 안의 내용물 비교
    객체 자료형일 경우, 변수 안의 레퍼런스가 같은 곳을 가리키는지 비교

  • 문자열의 법칙

  1. 같은 내용의 문자열 객체는 한 번만 만들어진다.
  2. 문자열 변경되면 새로운 객체로 다시 만들어낸다. (불변, Immutable)
    (+ 문자열을 가지고 많은 작업을 할수록 메모리를 많이 사용하게 된다.)
  • 문자열과 변환
  1. 기본 자료형을 문자로
    String.valueOf() 라는 static 메소드 이용
  1. 빈 문자열(" ")을 이용해서 강제로 문자열 변환
    빈 문자열과 '+'를 이용하면 별도의 연산 작업 없어도 처리 가능
    예) String str1 = " " + 10;

  2. 문자열에 포맷 주기
    %d - 정수
    %f - float, double과 같은 실숫값
    %s - 다른 문자열

  • split() 메소드 : 문자열을 특정 토큰으로 분리하여 문자열의 배열로 분해.

  • trim() 메소드 : 문자열의 앞뒤 공백을 제거한 결과를 다시 문자열로 반환 (중간 공백은 대상 x)
    equals()로 비교하기 전에 문자열들의 공백을 제거해야 할 때, trim() 사용.

  • String 클래스는 데이터를 처리하는 여러 가지 기능을 가지고 있다.

  1. 문자열은 char[ ] 혹은 byte[ ]로 변형 가능

  2. 자신의 데이터를 char[ ]로 만들어서 알려주는 기능.

String str = "한글은";
char[ ] arr1 = str.toCharArray(); // 결과 : {한, 글, 은}

Ch.13 API 클래스

  • 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);
  • Math.random()과 Random 클래스의 차이
    Math.random()은 double에 해당하는 임의의 실수 발생
    Random 클래스는 난수 발생 시에 사용하는 seed값을 지정할 수 있고, 추가 메소드가 있다.

new Random() : 별도의 Seed 값(난수 발생기가 처음 이용하는 값)을 지정하지 않고 객체 생성
new Random(long seed) : 사용자가 직접 Seed 값을 지정해서 객체 생성

  • Random random = new Random(); 으로 객체를 만들고,
    nextFloat(), nextDouble(), nextInt(), nextInt(int n), nextLong() 호출

기왕이면 Math.random보다 Random() 클래스 이용하는 방식을 권장.
예) Random(long seed) 값을 이용하면 난수 발생 시에 유사한 패턴이 나오는 것 방지 가능하기 때문.

  • java.util.Scanner

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(); 특정 데이터를 대체시켜서 출력

    • 가장 많이 쓰이는 것들
      %d : 10진수를 표시
      %s : 문자열 출력
      %S : 대문자로 문자열 출력
      기타 시간 값의 출력
  • JDK 1.5의 Formatter 클래스
    - printf() 기능은 화면에 출력되지만 실제 데이터로 활용하기 어려워, 만일 결과를 반환해줘야 하는 상황에는 부적합.
    - 따라서 Formatter 클래스가 이런 데이터를 String 타입의 반환 값으로 사용할 수 있는 장치 제공


Ch.14 예외 처리

  • 에러(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){
예외 발생 시 대안 처리 (잘못되었을 떄)
}
  • finally : 예외가 발생하거나 하지 않거나 무조건 실행한다. (catch 블록 뒤에 추가된다)
    - 주로 연결을 종료하는 작업은 finally로 한다.
    - finally를 이용해서 예외가 발생할 때도 무언가 작업할 수 있게 된다.
    -finally는 외부 자원 연결을 종료할 때는 반드시 사용
  • throws Exception : 예외가 발생하면 처리하지 않고 책임을 미룸. 예외 처리 X

  • 예외는 return문보다 강력하다
    메소드의 return 구문은 어떤 메소드를 호출하더라도 리턴된 결과값을 받지 않을 수 있다.
    그러나 예외 처리는 반드시 처리하거나 던지거나를 선택해야만 한다.


Ch.15는... 내일 읽도록 하자.

profile
모종삽에서 포크레인까지

0개의 댓글