인프런 커뮤니티 질문&답변

윤미라님의 프로필 이미지
윤미라

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

퀴즈 #9

quiz_09 를 이렇게 작성해도 되나요?

해결된 질문

작성

·

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();

궁금증 해결에 도움되길 바라겠습니다 😊
감사합니다.

윤미라님의 프로필 이미지
윤미라

작성한 질문수

질문하기