일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- OS
- IT
- 스프링
- spring
- 우리카드
- 컴퓨터과학
- 정보처리기사
- 이펙티브 자바
- 개발
- 신입사원
- 메모리
- 뮤텍스
- 프로그래밍
- 깃
- 신입
- package-private
- java
- 깃허브
- 자바
- 컴퓨터공학
- github
- 세마포어
- Effective Java
- CS
- 공채
- 스터디
- 알고리즘
- 디지털
- 운영체제
- Public
- Today
- Total
목록Effective Java (10)
주니어 개발자 성장기
개요 public 클래스에서는 public필드가 아닌 public 접근자를 만들어 주는 것이 바람직하다. public 필드를 API로 제공하는 대표적인 예시는 java.awt.package 패키지의 Point, Dimension 클래스를 들 수 있다. 이유 캡슐화의 이점을 제공하지 못한다. (아이템 15) 필드를 변경하려면 API를 변경해야 한다. 필드에 접근할 때 부수 작업을 할 수 없다.public 접근자 메서드를 API로 공개한다면 해당 필드에 접근 하기 전에 불변식을 수행하는 것과 같은 부수작업을 수행할 수 있다. package-private 클래스와 priavate 중첩 클래스 책에서는 package-private 클래스와 priavate 중첩 클래스는 데이터 필드를 노출해도 문제가 없다고 한다..
개요잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 완벽히 숨겨서 구현과 API를 깔끔히 분리한다. 컴포넌트간 통신은 오직 API를 통해서만 이루어지며 내부 동작 방식에는 전혀 관심이 없다. 이것을 정보 은닉 혹은 캡슐화라고 한다. 이것은 소프트웨어 설계의 근간이 되는 원리라고 한다. 그리고 자바에서 캡슐화를 달성하기 위해 필요한 원칙 중 하나가 바로 클래스와 멤버의 접근 권한 최소화이다. 정보 은닉의 장점 시스템 개발 속도를 높인다.→ 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다.컴포넌트간에 설계된 인터페이스를 통해서 통신하기 때문에 사용하는 측과 구현하는 측 모두 인터페이스에 맞춰서 개발하면 된다. 이는 각 모듈의 동시 개발을 가능케한다.(팀 단위 개발에서 효율적)..
개요 Object에 포함되는 인터페이스는 아니지만, 널리 사용될 수 있는 인터페이스이다. Object.equals에 더해서 순서까지 비교할 수 있으며 Generic을 지원한다. CompareTo규약 반사성 대칭성 추이성 일관성 권장 compareTo가 0을 반환한다면 equals도 true를 반환하도록 구현하는 것이 좋다. BigDecimal 클래스의 경우 equals와 compareTo의 결과가 다를 수도 있도록 구현되었다. BigDecimal oneZero = new BigDecimal("1.0"); BigDecimal oneZeroZero = new BigDecimal("1.00"); System.out.println(oneZero.compareTo(oneZeroZero)); // Tree, Tre..
방어적 복사란? 개요방어적 복사(Defensive Copy)란 Java에서 불변 객체(immutable objects)에서 쓰이는 용어이다. 불변 객체는 일단 생성이 된 뒤에는 객체 내부의 상태가 변경되어서는 안된다. 그리고, 방어적 복사는 불변 객체 내부의 상태(즉, 필드)에 변경을 방지하기 위해서 사용하는 기법이라고 할 수 있다. 문제 상황다음과 같은 FooCalendar라는 클래스가 있다고 가정해보자.public final class FooCalendar { private final Date standardDate; public FooCalendar(Date date) { standardDate = date; } public Date getStandardDate() { return standardD..
구현 - 불변 객체 Cloenable은 텅 비어 있는 인터페이스지만 clone을 이용하려면 반드시 구현(implements)해주어야 한다. 그 다음 clone 메서드를 super.clone을 사용해 오버라이딩해줘야 한다. 접근 제한자는 public 으로 설정, 반환 타입은 자신의 클래스로 변경한다. Clone 규약 x.clone() != x clone 반드시 원본과 다른 인스턴스를 반환해야 한다. (레퍼런스 자체가 달라야한다.) x.clone().getClass() == x.getClass()가 반드시 true이여야 한다. 원본의 클래스와 동일한 인스턴스를 반환해야 한다. x.clone().equals(x)가 true가 아닐 수도 있다. 복사를 한 인스턴스가 원본과 달라야만 한다면 true가 아닐수도 있..
기본 구현 Object에서 기본적으로 제공하는 toString은 클래스명 + 16진수hashCode값을 반환한다. ← 그닥 유용하지 않다. 재정의 해당 데이터에 적합한 형태로 표현해주는 것이 좋다. toString에 들어가는 필드(혹은 정보)는 외부에 공개할 수 있는 데이터만 공개하는 것이 좋다. 외부에 노출 할 수없는 정보(사용자 정보)는 최대한 숨기자. Getter를 제공하여 toString에 나오는 정보를 접근 가능하게 하자. 어차피 해당 정보를 얻기 위해서 클라이언트가 정해진 포맷에 따라 toString을 파싱할 것이다. IDE나 Lombok을 사용할 수도 있지만 자동으로 생성되는 포맷이 원하는 포맷이 아닐 수도 있다. 그럴 때는 직접 정의하자. 아래와 같이 정적 팩토리 메서드로 정해진 포맷이 입..