Java/Effective Java(11)
-
[Effective Java] Item57~67. 일반적인 프로그래밍 원칙
Item 57. 지역변수의 범위를 최소화 하라지역변수를 사용하기 직전에, 지역변수를 선언하는 것이 좋으며가능한 선언과 동시에 초기화하는 것이 좋습니다.while문 같이, 변수를 외부에 선언하는 문법보다는for문을 이용하여, for문 블럭 내에서 지역변수를 선언하고, 그 블럭 내에서만 해당 지역변수를 사용하게 만드는 것이 bug를 유발하지 않기에 더 좋은 코드입니다.메서드는 작게 유지하고, 각 메서드당 하나의 기능에 집중하게 만들자Item 58. 전통적인 for문 보다는 for-each문을 사용하라전통적으로 for문을 사용하는 아래와 같은 방식이 있습니다.for (IteratorElement> i = c.iterator(); i.hasNext(); ) { Element e = i.next(); ...}..
2024.05.19 -
[Effective Java] Item18. 상속보다는 컴포지션을 사용하라
(구체 클래스를 확장하는) 상속은 캡슐화를 깨뜨리는 특성입니다. 상위 클래스의 새로운 릴리즈로 내부 구현의 변경이 생겼을 때, 그를 구현한 커스텀 구현 클래스에서 예기치 못하는 오동작을 만날 수 있습니다. 상위 클래스에서 새로운 메서드를 추가했을 때, 기존에 특정 validation 조건을 만족해야만 값을 추가할 수 있는 구현 클래스가 있었다고 할 때, 상위 클래스의 새로운 릴리즈 버전에서 추가된 메서드가 validation 체크 없이 데이터를 넣을 수 있는 우려도 발생될 수 있습니다. 기존에 이용하고 있던 커스텀 구현 클래스에서 그 메서드와 똑같은 시그니쳐를 가진 메서드를 보유하고 있을 경우 기존에 잘 되던 동작도 되지 않을 수 있고, 디버깅도 까다롭습니다 1. 상속의 문제점 상속의 문제점에 대해 알아..
2024.03.17 -
[Effective Java] Item17. 불변클래스를 이용하여 변경가능성을 최소화 하라
불변 클래스는 단순합니다. 그렇기 때문에 가변클래스보다 설계/구현/사용이 쉽습니다. 불변 객체는 생성시점부터 사용을 마치는 시점까지 값을 그대로 유지하기 때문에, 예상치 못한 오류를 방지할 수 있어서 안전합니다. ThreadSafe하고, 여러 스레드가 동시에 사용하더라도 훼손되지 않으며, 재활용이 편리합니다. 클래스를 불변으로 만들기 위해서는 아래의 규칙을 따라야 합니다. setter 를 제공하지 않는다 객체 내의 필드값을 수정할 수 없도록 합니다. 클래스를 final 설정하여 클래스를 확장할 수 없도록 합니다 하위 클래스를 통한 확장 중, 의도치 않게 객체 내의 필드값을 수정하는 상황이 발생할 수 있습니다. 모든 필드를 final로 선언합니다. ThreadSafe 하기 때문에 새로 생성된 인스턴스를 동..
2024.03.16 -
[Effective Java] Item 15. 상수로 사용하고자하는 필드값이 불변객체인지 고려해야한다
프로그램의 요소를 접근할 수 있는 권한은 최대한 최소화하는 것이 좋습니다. 반드시 공개되어야하는 요소들만 public으로 설정하는 것이, 유지보수 면에서도 좋습니다. public 클래스 내의 가변 필드값들은 모두 private 으로 설정 하는 것을 권장하고 상수필드의 경우 필요에 따라 public으로 설정합니다 상수로 이용하고자하는 필드값에는 public static final 를 설정하는데, 이때 주의해야할 점이, reference 타입 중 몇몇 타입은 private static final을 설정하여도 내용을 수정할 수 있다는 점입니다. 변경가능한 레퍼런스 타입 필드값 (array, modifiable 컬렉션들) 의 경우 내용 private static final을 설정해도 변경이 가능하다. 예시 1 ..
2024.03.16 -
[Effective Java] Item 14. Comparable을 구현할지 고려하라
Comparable 인터페이스 내에 선언된 유일한 메서드인 compareTo는 동치성 비교에 더해 순서 비교까지 가지고 있습니다. Comparable을 구현한 클래스를 담은 배열은 Arrays.sort()를 이용하여 정렬할 수 있습니다. compareTo 메서드 일반 규약입니다. 현재객체가 주어진 객체보다 작으면 -1, 같으면 0, 크면 1를 반환합니다. (현재객체와 비교할 수 없는 타입이 주어지는 경우에는 ClassCastException을 반환합니다.) x.compareTo(y) == -y.compareTo(x) x.compareTo(y) > 0 && y.compareTo(z) 일 경우, x.compareTo(z) > 0 를 만족해야 합니다. x.compareTo(y) == 0 일 경우, x.comp..
2024.03.10 -
[Effective Java] Item 10~11. equals는 일반 규약을 지켜서 재정의하라
1. equals 규약을 지키면서 값을 추가하기 equals를 override할 때에는 반드시 아래의 일반 규약을 만족해야 합니다. (아래 규약은 모두 null이 아닌 참조값 x에 대한 규약입니다) x.equals(x) 는 반드시 true 여야 하고 x.equals(y) == true 라면, y.equals(x) == true 여야 합니다. x.equals(y) == true 이고, y.equals(z) == true 라면, x.equals(z) == true 여야 합니다. x.equals(y) 결과는 여러번 호출하더라도 늘 같은 값을 반환해야 합니다. x.equals(null) 은 반드시 false 여야 합니다. 위의 특징을 고려했을 때, 어떤 구현클래스의 상속클래스는 이 규칙을 만족하지 못하게 됩니다..
2024.03.10