-
Notifications
You must be signed in to change notification settings - Fork 3
Polymorphism - 팩토리 클래스 완성 및 V1 클래스 삭제 #8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
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.