해결된 질문
작성
·
340
1
안녕하세요! 좋은 강의를 통해 아주 조금씩이나마 자바를 알아가고 있습니다.
Quiz_09의 조건을 잘못 이해하고 아래와 같이 구현을 하였습니다. 코드를 이렇게 작성할 경우 문제점이 발생할 수 있는지, 있다면 어떤 문제점이 있는지 알고 싶습니다.
[_Quiz_09.java]
package chap_09;
import chap_09.student.Student;
public class _Quiz_09 {
public static void main(String[] args) {
Student st = new Student("자바");
st.getStudent();
}
}
[student > Stundent.java]
package chap_09.student;
import java.util.HashMap;
public class Student {
public String license;
public Student(String license) {
this.license = license;
}
public void getStudent() {
HashMap<String, String> map = new HashMap<>();
map.put("유재석","파이썬");
map.put("박명수","자바");
map.put("김종국","자바");
map.put("조세호","C");
map.put("서장훈","파이썬");
for(String key : map.keySet()) {
if(map.get(key).contains(license)){
System.out.println(key);
}
}
}
}
답변 1
0
안녕하세요?
퀴즈에서 요구한 조건과는 다르지만 그래도 충분히 고민하시고 코드를 작성하시는 과정에서 이번 장에서 배운 내용을 복습하는 좋은 계기가 되었으리라 확신합니다 😊
작성하신 코드를 토대로 간단히 리뷰를 하면서 보완해볼게요.
※ Student 클래스는 학생 개개인의 정보를 관리하기 위해 만들어야 하지만, 여기서는 학생들의 정보를 관리하는 역할을 한다고 가정하겠습니다.
1. 생성자
public Student(String license) {
this.license = license;
}
먼저 Student 의 생성자에 license 를 받도록 하셨는데 이렇게 하게 되면 처음 st 객체를 만들 때 지정한 자바 자격증을 보유한 학생이 아닌 다른 자격증을 보유한 학생을 얻기는 어렵습니다. 물론 st.license = "파이썬" 과 같은 형태로 직접 설정할 수도 있지만 그보다는 getter, setter 를 사용하는 것이 권장됩니다.
그래서 생성자 대신 이렇게 변경해보겠습니다. 외부에서 직접적인 접근을 막도록 license 변수도 private 으로 정의하겠습니다.
private String license;
public void setLicense(String license) {
this.license = license;
}
public String getLicense() {
return license;
}
2. 학생 정보 등록
현재는 getStudent() 메소드에서 학생의 정보를 모두 관리하고 반환까지 하고 있지만 Student 클래스 자체가 학생들의 정보를 관리하는 역할을 수행하므로 인스턴스 변수로 map 을 옮기고 학생 정보를 등록하는 메소드를 별도로 만들겠습니다.
다음과 같이 해볼 수 있겠네요. 혹시 모르니 map 이 null 인 경우 새로 생성하고 그렇지 않은 경우 기존에 입력된 값이 있을수도 있으니 clear() 를 통해 한 번 지워주겠습니다.
private HashMap<String, String> map;
public void registerStudent() {
if (map == null) {
map = new HashMap<>();
} else {
map.clear();
}
map.put("유재석","파이썬");
map.put("박명수","자바");
map.put("김종국","자바");
map.put("조세호","C");
map.put("서장훈","파이썬");
}
3. 자격증 보유 학생 조회
getStudent() 메소드와 같이 get 으로 시작하는 메소드는 이름에서 보는 것처럼 무언가를 얻어와야 합니다. 즉 반환값이 있는 것이 일반적이죠. 작성하신 것처럼 메소드 내에서 모든 동작을 처리하고 끝내는 경우라면 굳이 반환값 없이 그냥 printStudent() 와 같은 형태의 이름으로 바꿔도 되겠습니다. 특정 자격증을 보유한 학생 정보를 바로 출력해버리고 메소드의 동작을 마치는 것이죠.
단, 학생 정보(map) 가 등록되지 않았거나 자격증 정보(license) 가 올바로 등록되지 않은 경우에 대한 처리를 해주도록 할게요.
public void printStudent() {
if (map == null) {
System.out.println("학생 정보가 등록되지 않았습니다.");
return;
}
if (license == null || license.length() == 0) {
System.out.println("조회할 자격증 정보가 설정되지 않았습니다.");
return;
}
for(String key : map.keySet()) {
if(map.get(key).contains(license)){
System.out.println(key);
}
}
}
이 정도면 보다 나은 형태의 클래스가 된 것 같습니다.
마지막으로 main 메소드에서는 자바 자격증을 보유한 학생 정보를 출력하는 코드를 이렇게 만들 수 있어요.
public class Quiz09 {
public static void main(String[] args) {
Student st = new Student();
st.registerStudent();
st.setLicense("자바");
st.printStudent();
}
}
만약 자바가 아닌 파이썬 자격증을 보유한 학생이라면 이렇게만 바꿔주면 되겠네요.
Student st = new Student();
st.registerStudent();
st.setLicense("파이썬"); // 변경된 코드
st.printStudent();
궁금증 해결에 도움되길 바라겠습니다 😊
감사합니다.