(Effective Java) 규칙63. 문자열 연결은 느리니 주의하라 문자열 연결 연산자 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다. 그런데 작고 크기가 고정된 객체의 문자열 표현을 만들때라면 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 성능 문제 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다. 문자열은 불변(규칙 17)이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과이다. 예) 문자열 연결을 잘못 사용한 예 public String statement() { String result = ""; for (inti = 0; i < numItems(); i++) result +=lin..
(Effective Java) 규칙15. 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트란 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다. 정보은닉의 장점 대부분의 장점은 시스템을 구성하는 컴포넌트들을 서로 독립시켜서 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해준다. 1. 시스템의 개발 속도를 높임 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 2. 시스템 관리 비용을 낮춤..
(Effective Java) 규칙57. 지역변수의 범위를 최소화하라 지역변수의 범위를 최소화 지역변수의 유효범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수의 범위를 줄이는 방법 1. 가장 처음 쓰일 때 선언하기 미리 선언부터 해두면 코드가 어수선해져 가독성이 떨어짐 변수를 실제로 사용하는 시점엔 타입과 초기값이 기억나지 않을 수도 있음 그렇지 않으면 지역변수가 쓰이는 범위 보다 너무 앞서 선언하거나, 다 쓴 뒤에도 여전히 살아 있게 되기 쉬움 2. 거의 모든 지역변수는 선언과 동시에 초기화하기 만약 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 함 단, try-catch문은 예외임 변수를 초기화하는 표현식에서 검사 예외를 던질 가능성이 ..
(Effective Java) 규칙16. public 클래스에서는 public필드가 아닌 접근자 메서드를 사용하라 public 필드의 문제 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있다. class Point { public double x; public double y; } 이런 클래스는 데이터필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못함 API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없음 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없음 접근자 메서드 public 클래스에서라면 아래의 방식이 확실히 맞다. class Point { private double x; private double y; public..
규칙9. try-finally보다는 try-with-resources를 사용하라 자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 예) InputStream, OutputStream, java.sql.Connection 등 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다. finalizer의 문제 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLi..
(Effective Java) 규칙12. toString을 항상 재정의하라 toString() java.lang.Object 클래스의 toString 메서드는 일반적으로 사용자가 보려는 문자열이 아니다. 클래스 이름 다음에 @기호와 16진수로 표현된 해시 코드가 붙은 문자열 (예: "PhoneNumber@163b91") toString의 일반 규약을 보게 되면 "사람이 읽기 쉽도록 간략하지만 유용한 정보를 제공해야 한다"라고 되어 있다. PhoneNumber@adbbd 보다는 707-867-5309가 훨씬 유익한 정보를 담고 있는 것처럼 더불어 toString 일반 규약에는 "모든 하위 클래스는 이 메서드를 재정의함이 바람직하다"라는 구절도 있음 toString()을 재정의 해야 하는 이유 toStrin..
(Effective Java) 규칙7. 다 쓴 객체 참조를 해제하라 C, C++ 처럼 손수 메모리 관리를 해야 하는 언어를 쓰다 쓰레기 수집가 포함된 언어를 사용하기 시작하면 프로그래밍이 아주 쉬워진다. 볼 일 없는 객체는 자동적으로 반환되기 때문에 메모리 누수가 발생하는 Stack 클래스 //"메모리 누수(memory leak)가" 어디서 생기는지 보이는가? public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } p..
(Effective Java) 규칙18. 상속보다는 컴포지션을 사용하라 계승(Inheritance) 계승(Inheritance)은 재사용을 돕는 강력한 도구지만, 항상 최선이라고 할 순 없다. 계승을 적절히 사용하지 못한 소프트웨어는 깨지기 쉬움. 계승은 상위 클래스와 하위 클래스 구현을 같은 프로그래머가 통제하는 단일 패키지 안에 있을 경우 안전하다. 일반 객체 생성 클래스(concrete class)라면, 해당 클래스가 속한 패키지 밖에서 계승을 시도하는 것은 위험하다. 이 책에서는 계승(Inheritance)이라는 용어를 구현 계승 (implementation Inheritance)의 의미로 사용 즉 한 클래스가 다른 클래스를 'extends' 한다는 소리, 인터페이스 끼리의 계승은 해당하지 않음 ..
- Total
- Today
- Yesterday
- 이펙티브 자바
- windows
- springboot
- JavaFX 종료
- 배낭여행
- java
- JavaFX
- 방통대 과제물
- effectivejava
- 자전거 여행
- Java UI
- JavaFX 테이블뷰
- TableView
- 일본 자전거 여행
- 이펙티브자바
- 스프링부트
- 이펙티브
- JavaFX Table View
- git
- 텐트
- 자전거
- 일본 여행
- effective java
- 배낭 여행
- 일본 배낭여행
- 인텔리제이
- 자바
- JavaFX Window Close
- intelij
- 일본여행
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |