일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Public
- 알고리즘
- 이펙티브 자바
- 개발
- 운영체제
- 깃허브
- 신입
- 컴퓨터과학
- IT
- Effective Java
- 디지털
- github
- 자바
- 컴퓨터공학
- 프로그래밍
- OS
- 정보처리기사
- java
- 스프링
- 우리카드
- 스터디
- CS
- 뮤텍스
- 메모리
- 세마포어
- 깃
- 신입사원
- package-private
- spring
- 공채
- Today
- Total
목록Java/이펙티브 자바 (23)
주니어 개발자 성장기
개요 가변인수와 제네릭을 함께 사용하면 힙 오염이 발생할 여지가 있으므로 신중히 사용해야만 한다.(2가지 조건을 준수하자.) 힙오염이 발생 가능한 이유? 가변인수를 사용하게되면 원래는 불가능한 제네릭으로 배열을 만드는 것이 가능해진다. 책에서 힙오염이 발생한다고 지목한 예제코드를 보자. // 코드 32-1 제네릭과 varargs를 혼용하면 타입 안전성이 깨진다! (191-192쪽) static void dangerous(List... stringLists) { List intList = List.of(42); Object[] objects = stringLists; objects[0] = intList; // 힙 오염 발생 String s = stringLists[0].get(0); // ClassCas..
개요추상클래스 대신 인터페이스를 우선적으로 활용하자. 인터페이스의 장점이 더 많다. 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다.2개 이상의 클래스를 동시에 상속받는 것은 불가능하다. 여러 클래스를 상속 받아야 하는 클래스가 이미 추상 클래스를 상속받았다면 이미 둘 간의 계층구조가 생겨 상속에 어려움이 생긴다. 반면 인터페이스는 한 클래스에서 여러번 구현하게 할 수 있고 기존에 어떤 클래스를 상속받고 있는 지에 관계 없이 기능을 추가할 수 있다. 인터페이스는 믹스인이 가능하다. 믹스인이란 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 ‘주된 타입’ 외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 준다. 인터페이스를 통해 어떤 클래스의 갖고 있는 주된 역할외에 ..
개요이전 아이템에서 상속 대신 컴포지션을 사용하라고 했지만 그래도 상속은 객체지향 프로그래밍의 가장 큰 특징들 중 하나이다. 코드의 재사용성을 높이는 방법 중 하나이다. 따라서, 상속을 허용할 때는 ‘잘’하는 것이 필요하다. 상속용 클래스는 내부 구현을 문서로 남겨야 한다. 하지만 이런 식은 “좋은 API문서란 ‘어떻게’가 아닌 ‘무엇’을 하는지를 설명해야 한다”라는 격언과는 대치되지 않나? 그렇다. 상속이 캡슐화를 해치기 때문에 일어나는 안타까운 현실이다. - 이펙티브 자바 3판 123p 어차피 상속으로 인해 캡슐화가 깨지기 때문에 내부 구현을 제대로 알아야 적절하게 오버라이딩할 수 있기 때문에, 상속용 클래스는 내부 구현을 자세하게 문서로 남겨야 한다는 것이다. 문서에 @implSpec과 함께 내부 ..
개요인터페이스 상속이 아닌 구현 상속보다는 컴포지션을 사용하는 것이 낫다. 상속의 문제점 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 상위 클래스에서 제공하는 메서드의 구현이 바뀌거나 새로운 메서드가 생긴다면 하위 클래스가 의도한 대로 동작하지 않을 확률이 높다. 결국 상속하려면 상위 클래스의 내부 구현을 알아야 하며 내부 구현이 바뀌면 변경에 대응해야 한다. 하지만 변경을 인지하기도 어렵다. 다음 코드는 상속의 잘못된 예시를 보여주는 클래스다.public class InstrumentedHashSet extends HashSet { // 추가된 원소의 수 private int addCount = 0; public Instrume..
17. 변경 가능성을 최소화하라. 개요 불변 클래스란 소멸될 때까지 인스턴스 내부의 값이 변경되지 않는 클래스다. 쓰는 이유는 간단하다. 쉽고 버그가 발생할 여지가 적어 안전하다. 특히, 멀티 쓰레드 환경에서 안전하게 쓸 수 있다. 캐싱해놓는다면 여러 쓰레드에서 공유하며 사용할 수도 있다. 규칙 1. 객체의 상태를 변경하는 메서드를 제공하지 않는다. setter같이 객체의 상태를 변경하는 메서드를 제공하지 않는다. 2.클래스를 확장(상속)할 수 없도록 한다. 불변 클래스를 상속하면 가변 클래스로 만들 수 있다. 따라서, final 로 클래스를 선언하거나 private생성자를 만들면 상속을 막아 가변 클래스가 되는 것을 방지할 수 있다. 3.모든 필드를 final로 선언한다. 변경하지 못하도록 final ..
개요 public 클래스에서는 public필드가 아닌 public 접근자를 만들어 주는 것이 바람직하다. public 필드를 API로 제공하는 대표적인 예시는 java.awt.package 패키지의 Point, Dimension 클래스를 들 수 있다. 이유 캡슐화의 이점을 제공하지 못한다. (아이템 15) 필드를 변경하려면 API를 변경해야 한다. 필드에 접근할 때 부수 작업을 할 수 없다.public 접근자 메서드를 API로 공개한다면 해당 필드에 접근 하기 전에 불변식을 수행하는 것과 같은 부수작업을 수행할 수 있다. package-private 클래스와 priavate 중첩 클래스 책에서는 package-private 클래스와 priavate 중첩 클래스는 데이터 필드를 노출해도 문제가 없다고 한다..