익숙하지만 생각해보면 문제가 있다.“전화번호는 없고 주소만 있으면 어떡하나요?”Info(String author, int address) 이런 건 불가능하다. 이미 String, int를 인자로 받는 생성자가 존재하기 때문이다.하지만 편법을 써서 Info(int add
위의 코드를 살펴보자. 일반적으로 음식에 들어가는 영양성분 클래스인데 대부분은 0으로 들어가는 것들이 많은 도메인이다. 그래서 프로그래머들은 이럴 때 점층적 생성자 패턴(telescoping constructor pattern)을 즐겨 사용했다.
싱글톤 혹은 싱글턴(Singleton), (저는 싱글톤이라고 하겠습니다.)이란, 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다.싱글톤을 만드는 방식은 크게 두가지이다.위에서 private 생성자는 public static final 필드인 Elvis.INSTA
정적 메소드와 정적 필드만 가진 클래스를 살펴보자. 객체지향에서는 욕을 먹을 방법이지만, 쓸데는 있을 것이다. (java.lang.Math, java.lang.Arrays) 그리고 final 클래스와 관련한 메소드를 모을 때도 final 클래스를 상속해서 하위 클래스
맞춤법 검사기는 많은 언어를 지원해야 한다. 첫 번째 예시는 정적 유틸리티로 구현한 예시, 두번째는 싱글톤으로 구현한 예시이다.두 방식은 모두 사전이 단 하나만 존재한다고 가정할 때 썩 좋아보이지는 않는다. 일반적으로 생각해볼때 사전은 다양한 언어를 지원하고, 다양한
객체는 항상 생성하는 것보다 있던 걸 재사용하는 것이 좋을 때가 많다.다음은 하지 말아야 할 예시다.이 문장은 실행될 때마다 새로운 String 인스턴스를 만든다.
JAVA에는 GC(Garbage Collector)가 있어서 메모리 관리에 더 이상 신경을 쓰지 않아도 된다.맞을까? 정답은 아니다 이다. 나는 자바를 배우면서 여태까지 맞다라고 생각했는데 흥미롭다.아래의 코드를 살펴보자.
자바를 처음 배울 때 들었던 말은 finalizer를 그냥 쓰지 말라는 말이었다. 근데 왜?라는 궁금증은 해결하지 못한 채 그냥 넘어갔는데 책에서 이렇게 소개해주니 너무나도 좋다. 그럼 시작해보겠다!자바에서는 두 가지 객체 소멸자가 존재하는데..
자바 라이브러리 중에는 close로 닫아줘야 하는 자원들이 많은데 InputStream, java.sql.Connection 등이 그 예다.item8에서 close의 안전망으로 finalizer를 사용하는 경우도 있다고 했지만 사실상 사용하면 안된다.
equals 메소드는 굉장히 중요하다! 대부분의 경우에는 우리가 원하는 비교를 수행해준다. 정 그래도 재정의를 해야겠다면 조심해야 한다. 재정의를 할 때는 아래의 체크리스트를 확인해보자.각 인스턴스가 본질적으로 고유함: 다른 객체는 절대 같을 수가 없다
item10과 연결되는 내용인데, equals를 재정의할 때는 hashCode도 재정의해야 한다.그렇지 않으면, HashMap, HashSet에서 문제를 일으킬 것이다.아래는 Object 명세에서 발췌된 규약이다.
Object의 기본 toString 메소드를 사용해서 객체를 출력하면 Address@abcdd 같이 클래스명@16진수\_해시코드로 반환된다.여기서 어떤 유익한 정보를 얻을 것 같은가? Address 클래스는 주소지를 알려주는 것이 훨씬 유익할 것이다.
clone 메소드는 원본 객체의 필드값과 동일하게 새로운 객체를 생성해주는 메소드이다.여기서 native라는 키워드가 있는데 자바에서 다른 언어를 사용할 수 이게 만들어주는 키워드이다.
코딩을 하면서 값을 비교하는 경우는 굉장히 많다! 다양한 경우가 많은데 새로운 객체를 만들 때는 Comparable을 구현할지 고려해야 할 것이다.Comparable 인터페이스는 다음과 같이 생겼다.equals의 규약과 compareTo의 규약은 비슷하다.
일반적으로 캡슐화가 잘 이루어지면 잘 설계된 컴포넌트라고 한다. 내부 구현과 공개 API를 철저히 분리한다.내부 정보를 숨기는 것에는 장점이 많은데 다음과 같다.시스템 개발 속도를 높인다: 병렬 개발 가능시스템 관리 비용을 낮춘다.
해당 클래스에 필드는 자유롭게 접근가능하므로 캡슐화가 이루어지지 못한다.불변식을 보장할 수 없고, 외부에서 필드에 접근할 때 추가적인 작업을 할 수도 없다. (ex. Locking)public 클래스라면 이 방식으로 접근자를 제공함으로써 유연성을 얻을 수 있다.
불변 클래스라 함은 인스턴스의 내부 값을 수정할 수 없는 클래스를 의미한다. 이는 생성부터 객체가 파괴될 때까지 변함없다.다음은 클래스를 불변으로 만들기 위한 다섯 가지 규칙이다.객체의 상태를 변경하는 메소드를 제공하지 않는다.클래스를 확장할 수 없도록 한다:
우리가 코드를 재사용할때 상속을 썼었다. 그런데 상속이 항상 최선의 방법일까?같은 패키지 안이거나 확장적인 목적이고 문서화가 잘된 클래스는 문제가 없다.이런 케이스가 아닌 이상 구체 클래스를 상속하는 것은 위험하다..(인터페이스 간, 인터페이스 상속 제외)
평소에 개발할 때 상속을 하여 개발할 일이 많을 것이다. 근데 이러한 상속하는 과정에서 다양한 것을 고려하지 않으면 에러가 발생할 수 있다. 한번 알아보자. 먼저, 문서화를 해야 한다!
추상 클래스와 인터페이스는 모두 인스턴스 메소드를 구현 형태로 제공할 수 있다.하지만 추상 클래스를 구현하는 클래스는 반드시 하위 클래스가 되어야 한다는 것이다. 자바에서는 단일 상속만 지원하기 때문에 엄청난 부담이 될 것이다.인터페이스의 장점을 알아보자.
자바 8 전에는 인터페이스에 메소드를 추가할 방법이 없었다. 그런데 디폴트 메소드라는 방법이 생겼는데 이것을 사용하면 되지 않을까라는 물음이 생길 수 있다.
인터페이스는 클래스에 자신이 어떤 기능을 할 수 있는지를 알려주는 역할이다. 인터페이스는 오직! 이 용도로만 사용되어야 한다.이 용도 외에 잘못 설계된 예시가 있는데, 바로 상수 인터페이스이다. 상수 인터페이스는 static final 필드로만 이루어진 인터페이스다.
다음 예시와 같이 현재 표현하는 의미를 태그로 알려주는 클래스를 가끔 볼 수 있다. shape 멤버 변수로 나타내는 것이다.이러한 코드는 일단 문제가 많다. 열거 타입을 선언해야 하고, area 메소드의 switch 문 등의 비효율적인 코드가 들어가게 된다.