언어
-
이펙티브 자바 Item15 - 클래스와 멤버의 접근 권한을 최소화하라언어/Effective Java 2024. 5. 29. 17:28
잘 설계된 컴포넌트란?캡슐화가 얼마나 잘 되었는지.노출되는 API와 실제 구현이 얼마나 잘 분리되었는지.메시지를 주고받는 두 컴포넌트가 서로의 내부 동작을 신경쓰지 않는지. 캡슐화를 잘 지켰을 때 장점서로의 구현을 몰라도 되기 때문에 병렬로 개발이 가능하여 개발 속도가 빨라진다.잘 분리되어있는 컴포넌트는 관리 포인트가 작다. 디버깅도 빠르고, 교체도 빠르다잘 분리되어있는 컴포넌트는 최적화도 그 컴포넌트만 하면 되기 때문에 좋다.외부 컴포넌트에 종속되지 않기 때문에 재사용성이 높다.전체 시스템이 완성되지 않아도 개별 컴포넌트를 검증할 수 있기 때문에 큰 시스템 개발하는 난이도를 낮춰준다.1. 캡슐화의 핵심은 "접근제어자" 공개 API를 설계하고 그것만 public으로 지정한다 > 나머지는 private으로..
-
이펙티브 자바 Item 14 - Comparable을 구현할지 고려하라언어/Effective Java 2024. 5. 29. 16:16
1. Comparable 인터페이스란?Comparable 인터페이스는 객체를 정렬하는데 사용되는 메서드인 compareTo를 정의하고 있다.Comparable 인터페이스를 구현한 클래스는 반드시 compareTo를 정의해야 한다. 1.1 Comparable 인터페이스 특징자바에서 같은 타입의 인스턴스를 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다.Boolean 타입을 제외한 래퍼 클래스와 알파벳, 연대같이 순서가 명확한 클래스들은 모두 정렬이 가능하다.기본 정렬 순서는 작은 값에서 큰 값으로 정렬되는 오름차순이다. 1.2 Comparable 인터페이스 구현Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 의미한다.public clas..
-
이펙티브 자바 Item 13 - clone 재정의는 주의해서 진행하라언어/Effective Java 2024. 5. 29. 15:34
clonable의 역할복제해도 되는 클래스임을 나타내는 믹스인 인터페이스이다.Object 클래스에 protected clone()라는 메서드가 있다.Cloneable 인터페이스는 clone() 메서드의 동작 방식을 결정한다.Cloneable을 구현하지 않는 인스턴스에서 clone()를 호출하면 CloneNotSupportedException을 던진다.clone() 사용해보기static class Entry implements Cloneable { String key; String value; public Entry(String key, String value) { this.key = key; this.value = value; ..
-
이펙티브 자바 Item 12 - toString은 항상 재정의하라언어/Effective Java 2024. 5. 29. 14:25
Object의 기본 toString은 클래스_이름@16진수로_표시한_해시코드를 반환한다. toString 규약 사람이 읽기 쉬운 정보를 반환하라 모든 하위 클래스에서 재정의하라 toString 메서드는 객체를 println,printf 문자열 연결, assert 구문에 넘길 때, 디버거가 객체를 출력할 때 자동으로 사용된다. 좋은 toString은 이 인스턴스를 포함하는 객체에서 유용하게 쓰인다. toString() 메서드 재정의 시 주의점 객체가 가진 주요 정보는 모두 보여주는 것이 좋다.정보가 너무 많을 때는 간단히 요약된 정보를 보여줄 수도 있다. 포맷을 명시하기로 했으면, 명시한 포맷에 맞는 문자열과 객체를 상호전환 할 수 있는 정적 팩토리나 생성자 함께 제공하면 좋다. toString이 반환..
-
이펙티브 자바 Itme 10 - equals는 일반 규약을 지켜 재정의 하라언어/Effective Java 2024. 5. 28. 21:46
1. equals를 재정의 하면 안 되는 경우 1. 각 인스턴스가 본질적으로 고유할 때 값 클래스(Integer, String 처럼 값을 표현) 가 아닌 동작하는 개체를 표현하는 클래스(Thread)2. 인스턴스의 '논리적 동치성' 검사할 일이 없을 때 (동등성)논리적 동치성 검사의 1가지: Pattern의 인스턴스가 같은 정규 표현식을 나타내는 지 검사 3. 상위 클래스에서 재정의한 equals가 하위 클래스에도 들어맞을 때 같은 특징을 가지면 equals를 상속받아 사용하는 걸 권장한다.4. 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없을 때 // equals가 실수로 호출되는 걸 막고 싶다면@Override public boolean equals..
-
이펙티브 자바 Item 11 - equals를 재정의하려거든 hashCode도 재정의하라언어/Effective Java 2024. 5. 28. 16:12
equals를 재정의한 클래스는 hashCode도 재정의 해야한다. 그렇지 않으면 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제가 발생한다. 동등성: 객체가 주소값이 다르더라도 내용이 같다면 같은 거로 보는 것 (equals())동일성: 객체의 주소값이 다르면 아무리 같은 내용이더라도 같지 않다고 보는 것 (ex == ) 값만 같은지 아예 같은 객체인지 비교하기 위해선 동등성과 동일성이 보장되어야함!!1.hashCode 일반 규약 equals 비교에 사용되는 정보가 변경되지 않았다면, hashCode도 변하면 안 된다.애플리케이션을 다시 실행한다면, 이 값이 달라져도 상관없음equals가 두 객체가 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환한다.논..
-
이펙티브 자바 Item 9 - try-finally 대신 try-with-resources를 사용하라언어/Effective Java 2024. 5. 28. 12:04
자바 라이브러리에는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다.ex)InputStream, OutputStream, java.sql.Connection 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다.전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. try-finally는 자원을 회수하는 최선의 방책이 아니다! static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputStream(dst); try { byte[] bu..
-
이펙티브 자바 Item7 - 다 쓴 객체의 참조를 해제하라언어/Effective Java 2024. 5. 28. 11:29
자바에서 사용하지 않는 객체의 경우 GC에서 알아서 회수를 해주며, 메모리 관리를 해준다. 하지만 GC가 메모리 관리를 해준다고 완전 신경을 꺼야하는 건 아니다! GC에서는 특정 상황에서 메모리 누구가 발생하고, 우리는 그러한 상황을 인지하고 대응해야한다. 메모리 누수는 겉으로 잘 드러나지 않아 수년간 잠복하는 사례도 존재한다. 철저한 코드리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도한다. 따라서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다.메모리 누수가 발생하는 경우 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_CAP..