목록분류 전체보기 (174)
개발 기록
(12) toString을 항상 재정의하라 [toString의 일반 규약]- 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야한다- 모든 하위 클래스에서 이 메서드를 재정의하라 [호출]-println, printf, 문자열 연결 연산자(+), assert 구문에 넘길 때, 혹은 디버거가 객체를 출력할 때 자동으로 사용됨-> toString을 제대로 재정의하지 않으면 쓸모없는 메시지만 로그에 남을 것이다. [메서드 구현시 고려사항]1. 그 객체가 가진 주요 정보 모두를 반환하는 게 좋다.-- 그렇지 않았을 때의 문제점 : 왜 실패 했는지 알 수 없음Assertion failure: expected {abc, 123}, but was {abc, 123}.// 단언 실패: 예상값 {abc, 123},..
(11) equals를 재정의하려거든 hashCode도 재정의하라- 재정의 하지 않으면 hashCode 일반 규약을 어기게 되어 HashMap 같은 컬렉션의 원소로 사용할 때 문제가 발생함. - Object 명세 규약-- equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 같은 값을 반환해야 한다.-- equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.-- equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 ..
(7) 다 쓴 객체 참조를 해제하라 가비지 컬렉터가 있더라도 메모리 관리에 신경써야 함! *메모리 누수* 가비지 컬렉션 언어에서는 메모리 누수를 찾기가 어려움.객체 참조를 하나 살려두면 그 객체 + 그 객체가 참조하는 모든 객체 +.. 를 회수 하지 못 함. 해법! 1. 해당 참조를 다 썼을 때 null 처리 (참조 해제)**예외적인 경우에 사용 : 자기 메모리를 직접 관리하는 클래스일때ex. 스택 클래스에서 pop 메서드를 제대로 구현 (꺼낸 객체는 참조가 더 이상 필요 없음)public Object pop() { if (size = 0) throw new EmptyStackException(); Object result = elements[--size]; elements[size] = nul..
(6) 불필요한 객체 생성을 피하라 1. String s = new String("bikini"); -> String s = "bikini";- new String 은 실행될 때 마다 String 인스턴스를 새로 만든다.- 개선된 코드는 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용함.- jvm에서는 문자열을 캐싱한다.자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있다. name1과 name2 변수가 동일한 문자열 리터럴을 참조할 경우 name1과 name2는 동일한 String 객체를 참조하게 된다출처: https://woonys.tistory.com/221 [WOONY's 인사이트:티스토리]Java의 Heap에는 String Pool 이라는 특별한 영역에서 ..
(4) 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 메서드와 정적 필드만을 담은 클래스는 인스턴스로 만들어 사용하려는 클래스가 아님.- 생성자를 명시하지 않을 경우 컴파일러가 자동으로 기본 생성자를 만들어줌- 이때는 private 생성자를 추가하면 클래스의 인스턴스화 막을 수 있음public class UtilityClass { // 인스턴스화 방지용 private Utilityclass() { throw new AssertionError(); }}- 클래스 안에서 실수라도 생성자 호출을 막기위해 error 를 던져도 좋음- 하지만 생성자를 호출하지 않는 코드라 한번에 이해가 어려우니 주석을 달자.- 상속 불가능. (5) 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 클래스가 내..
(3) private 생성자나 열거 타입으로 싱글턴임을 보증하라 *싱글턴 : 인스턴스를 오직 하나만 생성할 수 있는 클래스싱글턴 인스턴스는 가짜 구현으로 대체할 수 없기 때문에 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다.(타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든게 아니라면.) 보통 싱글턴을 만드는 방식.1. public static final 필드 방식의 싱글턴public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... }}장점 : 간결함, 해당 클래스가 싱글턴임이 API에 명백히 드러난다. 2..

base 64 디코딩 중 발생한 에러.base 64 문자열에 유효하지 않은 문자열이 포함되어 있어서 발생하는 것으로 알고 있는데 character 20가 뭔지는 알기 어려웠다. base64 라이브러리를 보면 20은 16진수이다. HEX가 16진수코드이고 20은 Space라는 걸 알 수 있다!실제로 문자열에 공백이 포함되어 있어 디코딩 오류가 났다.
- 생성자에 매개변수가 많다면 빌더를 고려하라 생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 것이 좋다. 선택적 매개변수가 많은 클래스의 생성자 혹은 정적 팩터리 패턴 3가지 1. 점층적 생성자 패턴받는 매개변수 개수에 따라 생성자를 여러개 만든다.(-)코드 작성시 매개변수의 의미나 개수가 헷갈려서 실수 할 수 있다. 읽기도 어렵다.Test t = new Test(240, 8, 100, 0, 35, 27); 2. 자바빈즈 패턴매개변수가 없는 생성자로 객체를 만든 후, 세터(setter) 메서드들을 호출해 원하는 매개변수의 값을 설정한다.(+)인스턴스 만들기가 쉽고 읽기 쉽다.(-) 객체 하나를 만들기 위해서는 세터 메서드를 여러개 호출해야한다. 객체 생성 코드와 값을 설정하는..