Polymorphism - 팩토리 클래스 완성 및 V1 클래스 삭제#8
Conversation
|
코드의 구조나 각 객체들의 역할과 책임 등에 대해서는 피드백 할 거리가 없을 만큼 잘 작성되었습니다. 👍 굳이 한가지를 꼽자면 코드 작성 스타일에 대해서도 한 번 고민해보면 좋을 것 같습니다.
|
|
저의 경우에는 클래스를 다음과 같은 스타일로 작성합니다.
|
클래스 내용의 순서를 적절히 잘 신경쓰면 더 가독성 있는 코드를 만들 수 있겠군요! ㅎㅎ 감사합니당 "Egyptian brackets" 부분은 아마도 if (someCondition) throw ;와 같이 작성된 부분을 보고 말씀해주신 것 같은데 혹시 맞을까요? 해당 부분은 얼른 수정해보겠읍니당 |
|
위에서 말한대로 코드에 대해 더이상 할 이야기가 없을만큼 잘 작성된 것 같습니다. 특히 클래스 내용(변수, 메소드)의 순서에 대해서는 한번도 고민해보지 않았던 주제라서 매우 흥미게 읽었습니다. 그런데 한가지 궁금한점이 그렇다면 아래 코드처럼 필드에 바로 초기화 할 수도 있는데 굳이 초기화 블럭을 사용하여 초기화하는 이유는 무엇이라고 생각하시나요? |
일단 중요한 것은 클래스에서 쓰이는 필드(static이 붙은 필드)와 인스턴스 범위에서 쓰이는 필드들이 묶여있다는 것이 중요하다고 생각합니다. public class Student {
// 클래스 범위
private final static String COMPANY_NAME= "스파르타 코딩클럽";
private static int someClassNumber;
private static String someClassString;
// 인스턴스 범위
private final int GENERATION;
private final int SOME_COMPLEX_NUMBER;
private int someInstanceString;
protected String campName;
{
campName = "내일배움캠프";
}
public Student(int generation) {
this.generation = generation;
}
}
클래스 초기화 블럭(혹은 스태틱 초기화 블럭, static이 붙은 것)의 실행 시점은 프로그램이 실행되고 난 직후 클래스들이 로드될 때 입니다. 해당 시점에 필요한 클래스 필드들의 복잡한 초기화를 실행하거나 필요한 로직들을 수행시킬 수 있습니다. private static final Logger logger = LoggerFactory.getLogger(TargetClass.class);
...
static {
complexNumber = ...뭔가 엄청나게 복잡한 계산을 수행한 후...
SOME_COMPLEX_NUMBER = complexNumber;
log.info("스태틱 초기화 블록의 실행 시점은 필드의 직접 초기화가 수행된 이후이기 때문에")
log.info("이처럼 로그를 남기는 것과 같은 로직들을 수행시킬 수도 있습니다.");
}인스턴스 초기화 블럭(static이 붙지 않은 것)의 실행 시점은 객체의 생성자를 호출하고, super 생성자를 호출한 다음입니다. public class Crew extends Student {
private final String SUBJECT;
private final String CLASS;
{
log.info("{}에 새로운 대원이 합류했습니다!", super.campName);
}
public Crew(int generation) {
super(generation);
SUBJECT = "스프링";
CLASS = "B반";
}
...
}물론 다음과 같이 메소드로 사용하는 방법이라도 동작은 크게 다르지 않습니다. public class Crew extends Student {
...
public Crew(int generation) {
super(generation);
logWelcome();
SUBJECT = "스프링";
CLASS = "B반";
}
public Crew(int generation, String subject) {
super(generation);
logWelcome();
SUBJECT = subject;
CLASS = "B반";
}
public Crew(int generation, String subject, String class) {
super(generation);
logWelcome();
SUBJECT = subject;
CLASS = class;
}
private void logWelcome() {
log.info("{}에 새로운 대원이 합류했습니다!", super.campName);
}
} |
No description provided.