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)의 소개와 써야할 이유
클래스 메소드인데 객체의 생성을 담당하는 역할을 한다. 즉, 직접적으로 생성자를 통해 생성을 하는 것이 아니라 메소드를 통해 객체를 생성한다.
생성자가 존재하는데 왜 이렇게 메소드를 사용해서 객체를 생성할까?
참고: