관리 메뉴

KorSA

[남궁성 '자바의 정석'] 94~111강 본문

Study Memos/Java

[남궁성 '자바의 정석'] 94~111강

Praiv. 2021. 11. 15. 15:58
320x100

※ 이 글은 남궁성 저자의 '자바의 정석' 94~111강을 수강한 후 정리한 내용입니다.

 

1. 내부 클래스의 장점
    1) 내부 클래스에서 외부 클래스의 멤버들에 쉽게 접근할 수 있다.
    2) 코드의 복잡성을 줄일 수 있다. (캡슐화)

2. JDK 1.8부터는 final 키워드를 생략해도 값이 안 바뀌면 컴파일러가 상수 취급한다.
    원래 JDK 1.8 이전의 자바에서 외부 클래스의 지역 변수는 final이 붙은 변수(상수)만 접근 가능했다.
    그래서 final 키워드를 생략하면 무조건 에러가 났었는데
    JDK 1.8 이후에는 해당 변수가 한번도 변하지 않으면 에러가 나지 않는다.
    (JAVA가 알아서 final 취급하도록 변경됐기 때문)

3. 상수는 따로 관리하고 있어서 함수를 빠져나가도 메모리에 상수가 남아있다.

4. Java의 런타임 에러
    1) 에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
    2) 예외(exception): 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
        일반 Exception 클래스들: 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
        RuntimException 클래스들: 프로그래머의 실수로 발생하는 예외

5. 예외 처리의 목적은 비정상 종료를 막고 정상적인 실행상태를 유지하는 것

6. checked 예외, unchecked 예외
    checked예외: 컴파일러가 예외 처리 여부를 체크 (예외 처리 필수) 
        ex) Exception

    unchecked예외: 컴파일러가 예외 처리 여부를 체크 안함 (예외 처리 선택)
        ex) RuntimeException

7. 연결된 예외(chained exception)
    한 예외가 다른 예외를 발생시킬 수 있다.
    예외 A가 예외 B를 발생시키면 A는 B의 원인 예외(cause exception)이다.
    initCause(): 지정한 예외를 원인 예외로 등록한다.
    getCause(): 원인 예외를 반환한다.

8. 연결된 예외는 checked예외를 unchecked예외로 변경할 때도 사용한다.
    checked예외를 unchecked예외의 cause exception으로 등록하면 된다.
    자바가 1991년에 만들어졌다보니 그때와 지금의 exception 처리 생각이 다른 경우가 좀 있다.
    즉, 그땐 checked예외로 구현해야했지만 오늘날에는 unchecked예외로 다루는 게 더 나은 경우가 종종 있다.
    이런 경우들에 사용하기 위해 연결된 예외를 사용하기도 한다.

9. native 메소드 : OS가 원래 가지고 있는 메서드
    이미 OS에 존재하는 함수이기 때문에 JAVA 코드에서는 함수 내용이 비어있다.
    실제론 JNI(Java Native Interface)를 통해 OS 함수를 호출한다.

10. equals()를 오버라이딩하면 hashCode()도 오버라이딩해야 한다.

11. System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일하다.

12. Object클래스의 finalize() 함수는 거의 사용하지 않는다.
    역할은 객체 제거 전에 마무리 작업을 하는 건데, 
    안그래도 메모리가 부족한 상황에서 이런 작업들을 하면 시간이 지연되기 때문에 거의 사용하지 않는다.

13. Object 클래스의notify(), wait() 관련 함수들은 쓰레드와 관련된 함수들이다.

14. 문자열을 초기화할때는 되도록 빈 문자열로 초기화하자. 굳이 객체 새로 만들지 말고.

String str = new String(""); // 이거 쓰지 말고
String str = ""; // 이거 쓰자


15. String클래스의 valueOf() 함수는 기본형 변수값을 문자열로 바꿔준다.
    참조형 변수의 경우 참조형 인스턴스의 toString()함수를 호출한다.

16. String클래스의 join()함수는 문자열을 합칠 때 유용하다.

String animals = "dog,cat,bear";
String[] arr = animals.split(",");
String str = String.join("-", arr); // "dog-cat-bear"


17. StringBuffer클래스는 문자열을 저장 & 다루기 위한 함수이다.
    String과 달리 내용을 변경할 수 있다.
    문자열을 char 배열형의 멤버 변수로 가지고 있다.
    배열은 한번 만들면 길이 변경이 불가하기 때문에 공간이 부족하면 새로운 배열을 만든다.

    보통 직전 배열 길이의 2배 길이로.
    그리고 새로 만든 배열로 기존 배열의 내용을 복사한다.

18. StringBuffer클래스는 String클래스와 달리 equals()가 오버라이딩되어있지 않다.
    즉, Object의 주소비교이기 때문에 내용이 같아도 equals()가 false로 나올 수 있다.
    그래서 StringBuffer클래스간 내용비교는 StringBuffer클래스의 toString()클래스를 호출해서 비교해야 한다.

19. StringBuffer클래스를 생성할 땐 적절한 length를 지정해주어야 

     불필요한 배열 생성 & 복사가 많이 일어나지 않는다.

20. StringBuilder 클래스는 StringBuffer클래스와 거의 비슷하다.
    단 하나의 차이점은 StringBuffer클래스가 동기화되어 있는 반면 

    StringBuilder클래스는 동기화가 되어있지 않다.
    즉, StringBuffer클래스는 멀티 쓰레드에 안전(thread-safe)하지만 StringBuilder는 그렇지 않다.

21. 멀티 쓰레드 프로그램이 아닌 경우 동기화는 불필요한 성능 저하가 있다.
    이럴 땐 StringBuffer클래스 대신 StringBuilder클래스를 사용하면 성능이 향상되지만 

    요즘엔 대부분 StringBuffer클래스를 사용한다.

22. Math클래스에서 round()는 무조건 올림(HALF_UP)이지만, 

      rint()는 홀수인 경우 내림을 하고 짝수인 경우만 올림(round even)을 한다.

    round()는 값이 쌓일수록 오차가 커지지만 rint()는 오차가 커지지 않아서 오차를 줄이는 게 중요할 때 사용된다.

728x90
728x90
Comments