본문 바로가기
반응형

개발/JAVA31

[effective java 3/E] 상속보다는 컴포지션을 사용하라 상속은 코드를 재사용할 수 있는 강력한 수단이지만 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다. 상속은 캡슐화를 깨뜨릴 수 있다. 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다는 말이다. 예를 한번 들어보도록 하겠다. 시나리오는 아래와 같다. 1. 우리에게는 HashSet 을 사용하는 프로그램이 있다. 2. HashSet은 처음 생성된 이후 원소가 몇 개 더해졌는지 알 수 있어야한다. 방법은 매우 간단하다. 몇개가 추가되었는지 알 수 있는 변수 1개와 추가되는 개수를 변수에 더해주기만 하면된다. 우리는 상속을 이용한다면 아래와 같이 작성할 수 있을것이다. package item18; import java.util.Collection; import java... 2020. 7. 5.
[effective java 3/E] equals는 일반 규약을 지켜 재정의하라. equals를 재정의 해야한다면 일반 규약을 지키면서 재정의하자!! equals를 재정의 하지않아도 될 때 아래의 상황 중 하나에 해당한다면 재정의 하지않아도 된다. 각 인스턴스가 본질적으로 고유할 때 논리적 동치성을 검사할일이 없을 때 상위 Class의 equals를 사용해도 문제 없을 때 Class가 private이거나 package-private이고 equals를 사용할일이 없을 때 equals를 재정의 해야할 때 논리적 동치성을 확인 해야하는데 상위 Class의 equals가 논리적 동치성을 비교하도록 재정의 되지 않았을 때 재정의 해야한다. equals를 재정의 할 때 지켜야 할 일반 규약 아래의 사항들을 지켜서 재정의 해야한다. 반사성 : null이 아닌 모든 참조 값 x에 대해, x.equa.. 2020. 7. 5.
[effective java 3/E] 자원을 직접 명시하지말고 의존 객체 주입을 사용하라 이게 무슨소리야? 조금 풀어서 말하면 클래스가 내부적으로 하나 이상의 자원에 의존한다면 이 자원들을 직접 만들게 해서는 안된다는 말이다. 그러면 자원은 어떻게 만들지? 라는 의문이 들것이다. 자원을 직접 생성하는것이 아닌 생성자(+ 빌더, 정적 팩토리 메소드)에 넘겨준다. 글로만 보아서는 이해가 어려울수도 있다. (필자가 그랬다...) 그래서 간단한 예제를 만들어 보았다. 시나리오 - 한국어 사전이 있다. - 한국어 맞춤법 검사를 지원한다. 위와같은 시나리오에서 클래스 내부에서 new 연산자를 이용하여 생성한다면 어떻게 코드를 작성하겠는가? 아마도 대부분 아래와 같이 작성할것이다. 한국어 사전.Class public class KoreaLexicon { public KoreaLexicon() { } } .. 2020. 6. 28.
[effective java 3/E] private 생성자나 열거타입으로 싱글턴임을 보증하라 싱글톤이란 ? 인스턴스를 오직 하나만 생성할 수 있는 클래스 new 연산자를 이용하여 SingTon 인스턴스를 생성한다면 1개를 만들면 1개 10개를 만들면 10개의 인스턴스가 생성될 것이다. 또한 생성할때마다 메모리에 추가될것이며 모두가 다른 인스턴스일것이다. 반면 싱글톤패턴이란 최초 실행할때 1회만 생성하며 이후부터는 만들어진 객체를 할당하여 사용하는 방식이다. 아래와 같은 SingTon 클래스가 있다고 가정해보자. 생성자를 private 으로 제한하고 유일하게 인스턴스에 접근할 수 있는 수단으로 public static 변수를 하나 생성한다. public class SingleTon { int firstValue = 0; public static final SingleTon SINGLE_TON = .. 2020. 6. 26.
[effective java 3/E] 생성자에 매개변수가 많다면 빌더를 고려하라 앞서 소개한 정적 팩터리와 생성자에는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기가 힘들다는 점이다. 아래와 같은 클래스가 있다고하자. 필드의 개수가 매우많다. public class ManyFieldClass { private int a; private int b; private int c; private int d; private int e; private int f; private int g; private int h; private int i; private int j; private int k; private int l; private int m; private int n; private int o; private int p; private int q; private i.. 2020. 6. 21.
[effective java 3/E] 생성자 대신 정적 팩터리 메서드를 고려해보자 클래스는 생성자와 별도로 정적 팩터리 메소드를 제공할 수 있다. 정적 팩터리 메소드란 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드를 일컫는다. 아래의 CustomBoolean Class 는 자바에 있는 Boolean 에서 설명에 필요한 부분만 발취해서 만든 간단한 클래스이다. 아래의 기본 생성자 CustomBoolean 은 boolean 필드에 값을 세팅해서 새로운 인스턴스를 만들어준다. 정적 메서드 valueOf는 기존에 만들어져있던 CustomBoolean 인스턴스를 반환해준다. public class CustomBoolean { public static final CustomBoolean TRUE = new CustomBoolean(true); public static final Custom.. 2020. 6. 21.
이 클래스는 아무것도 상속받지 않을까요 ? Door라는 클래스를 하나 생성했다. 여기서 문제! 이 클래스는 상속을 받고 있을까요 ? 정답은 Yes입니다. 언뜻보기에는 아무것도 받지 않는것 같아보입니다. 하지만 getSuperClass() 메소드도 결과를 찍어보면 아래와 같이 나옵니다. 어째서 이런 결과가 나올까요? 클래스를 상속받지 않는 클래스에는 기본적으로 Object 클래스를 상속받도록 해놨기때문입니다. 그렇기때문에 모든 클래스에서는 Object가 가지고있는 메소드를 사용할 수 있는것입니다. 2020. 4. 19.