
2021.02.03 ~ 2021.02.15
다른 패키지에서 default 패키지를 import 할 수 없다.
-> default 패키지 사용 지양
인스턴스를 생성할 필요가 없는 클래스의 생성자는 private으로 선언해주어 인스턴스 생성을 못하게 막는 것이 좋다. static 메소드만 존재하는 클래스가 이런 경우이다. 클래스명.메소드명으로 호출할 수 있기 때문에 인스턴스를 생성할 필요가 없다.
인스턴스 변수는 인스턴스의 생성 ~ 소멸
클래스 변수는 JVM이 클래스 load ~ 클래스 unload
- 클래스 load: 클래스가 사용되는 시점에 클래스의 바이트코드를 읽어서 메모리에 할당
- 클래스 unload: 클래스가 더 이상 사용되지 않을 때 메모리에서 해제
참고: 효과적인 이름짓기
공백 라인을 나눌 때 문맥이 분리되는 경우에만 사용한다. 문맥별로 나누다 보면 메소드 추출로 이어질수도 있다. 의미없이 공백 라인을 사용하면 안된다.
List<Car> carList; 등 변수이름에 List 같은 자료형이 들어가지 않게 하기
다른 언어와 달리 java는 기본적으로 불변이 아니다. 값이 변하지 않는 경우는 final을 명시적으로 붙여줘서 불변으로 만들어주는 것이 좋다.
구현 코드에 테스트를 하기 위한 새로운 메소드는 만들지 마라. 생성자는 예외.
domain(model): 핵심 비지니스 로직 객체
view: UI 관련 객체
controller: domain과 veiw를 연결
view는 domain에 의존 but domain은 view에 의존 x
일반적으로 getter는 객체 내부 변수와 같은 타입을 반환. 아래의 예제로 보면 바로 String으로 값을 꺼낸다면, 1)Car객체의 Racer를 꺼내야하는 경우나 2)다른 사람이 내 코드를 읽을 때 의미가 모호해 질 수 있다.
public class Car {
private Racer racer;
// 객체 내부 변수와 같은 타입
public Racer getRacer() {
return racer;
}
// 객체 내부 변수와 다른 타입
/*
public String getRacer() {
return racer.getName();
}
*/
}
getter를 통해 값을 꺼내오기보다는 객체에 메세지를 보내서 처리하기
// 잘못된 경우
if (this.position.getPosition() == car.position.getPosition()) {
}
// 올바른 경우
if(this.position.isSame(car.position)) {
}
Pattern.compile은 비용이 많이 든다. 미리 만들어 놓고 사용하기
한 줄에 점을 하나만 찍기(무조건 적인 것은 아니다. 예를 들어 stream()). 다른 객체 내부에서 또 다른 객체를 알아내는 식으로 해서는 안된다. 이런식으로 코딩되어 있다면 메소드 체이닝 중간에 값의 타입이 바뀐다거나 하는 경우에 연결된 모든 클래스를 수정해야 할 수 있다. 즉 변화에 유연하게 대처하지 못하게 된다.
name.equals(EMPTY)와 EMPTY.equals(name)의 차이는?
name이 만약 null로 들어온다면 name.equals(EMPTY)에서는 NullPointerException이 발생할 것이다. 하지만 EMPTY.equals(name)에서는 equals에서 null을 처리하기 때문에 Exception이 발생하지 않는다.
boolean 반환 메소드의 메소드명은 isXXX나 canXXX로
이런 기본적인 메소드는 클래스 가장 하단에 위치하게 하는 것이 일반적이다.
클래스 내부에서만 사용하는 메소드는 private을 붙여준다. 코드 작성시 일단 접근제어자를 private으로 시작한 이후 필요시 접근제어자를 변경하는 습관.
List<Car> cars;
cars.add(); // 가능
Cars cars;
cars.add(); // Cars에 add라는 메소드가 있으면 가능 없으면 조작 불가
참고: 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유
클래스 메소드인데 객체의 생성을 담당하는 역할을 한다. 즉, 직접적으로 생성자를 통해 생성을 하는 것이 아니라 메소드를 통해 객체를 생성한다.
생성자가 존재하는데 왜 이렇게 메소드를 사용해서 객체를 생성할까?
참고: