일단 이것저것 해 보는 블로그

(Do it! 자바, 4주차-4) 12장 되새김 문제 풀이(작성 중) 본문

2026/Do it Java 스터디(2026.01.~02.)

(Do it! 자바, 4주차-4) 12장 되새김 문제 풀이(작성 중)

뷔구룽 2026. 1. 31. 21:02

사용한 학습 자료: 박은종, 2025, <Do it! 자바 프로그래밍 입문 [개정판]>, 이지스퍼블리싱.

https://ebook-product.kyobobook.co.kr/dig/epd/ebook/E000010942415

 

Do it! 자바 프로그래밍 입문 [개정판] | 박은종 저자

eBook Do it! 자바 프로그래밍 입문 [개정판] | 3만 6천 부 이상 팔린 초판의 성공에 힘입어 좀 더 입문자의 눈높이에 맞춰 내용을 수정하고 최신 개발 트렌드에 맞게 개정판을 출간했습니다. 저자인

ebook-product.kyobobook.co.kr

 

01. 컬렉션 프레임워크

-> 자료 구조를 사용하기 편리하도록 자바에서 제공하는 라이브러리

 

02. 제네릭 프로그래밍

-> 클래스에서 여러 자료형을 사용할 때 자료형을 명시하지 않고 자료형을 의미하는 문자로 선언한 후 실제 클래스를 생성할 때 자료형을 명시하는 프로그래밍 방식

 

03. Iterator (인터페이스)

-> Collection 인터페이스를 구현한 클래스를 순회하기 위해 사용하는 인터페이스

 

04. TreeSet을 사용할 때 Comparable 인터페이스를 구현해야 하는 이유 

-> TreeSet의 값(노드)을 어떤 기준으로 비교해 트리로 정렬해야 하는지 정의하기 위해
-> 구체적으로 정의(구현)하지 않으면 오류 발생

Exception in thread "main" java.lang.ClassCastException: 클래스 이름 caannot be cast to class ~Comparable ~

 

05. (중요) 학번이 중복되는 학생 정보를 HashSet에 추가하지 않기 위해, Student 클래스 내에 hashCode( )와 equals( ) 메서드 재정의 필요

- hashCode( ) 재정의 예시

// hashCode() 재정의
@Override
public int hashCode( ) {
	return studentId; // 학번 값을 반환하도록 재정의
}

 

- equals( ) 재정의 예시

// equals() 재정의
@Override
public boolean equals(Object obj) {
	if (obj instanceof Student) { // 매개변수가 Student형인지 확인
		Student student = (Student) obj; // 맞으면 Student 변수에 매개변숫값 대입
		if (this.studentId == student.studentId) { // 두 학번 값이 같으면
			return true;
		else
			return false;
	}
	return false;
}

 

- 문제에서 알 수 있는 조건

* Student 클래스에 필요한 속성(변수): 학번(int studentId), 학생 이름(String studentName)

-> (수정) 예제 코드에 학번이 "숫자"(문자열) 형태로 작성되어 있으므로 studentId(학번)은 우선 String형으로 선언

* 구현할 기능(메서드)

1) 생성자 Student( ): 학번과 학생 이름을 매개변수로, 두 값을 반환받음.

2) 재정의할 메서드: hashCode() (학번 값을 반환해), equals() (학번의 중복 여부를 체크하고 참 혹은 거짓 반환)

-> 학번이 중복되는 객체는 HashSet에 추가하지 않기 위함.

toString() (학생 정보의 출력 형태 재정의)

* 출력 결과 예시

100:홍길동, 200:강감찬, 300:이순신, 400:정약용

 

- 최종 소스 코드

package collectionframework.question;

public class Student {
    String studentId;
    String studentName;

    public Student(String studentId, String studentName) {
        this.studentId = studentId;
        this.studentName = studentName;
    }

    @Override
    public int hashCode() {
        return Integer.parseInt(studentId); // Integer.parseInt(매개변수): 문자열 타입의 숫자를 정수로 변환
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student) {
            Student student = (Student) obj;
            if (this.studentId == student.studentId) {
                return true;
            }
            else
                return false;
        }
        return false;
    }

    @Override
    public String toString() {
        return studentId + ":" + studentName;
    }
}

* hashCode() 메서드의 Integer.parseInt(String studentId)란? 문자열(String) 형태의 정수를, 정수형(int)으로 변환하는 메서드

참고: 저자 풀이 코드(깃허브) 및

거신, [자바 프로그래밍 기초] 5. Integer.parseInt(String타입의 값), [자바 프로그래밍 기초] 5. Integer.parseInt(String타입의 값) (260131 최종접속)

 

06.

 

07. 409쪽의 예제 코드 중, Powder(powder)만 Plastic(plastic)으로 바꿔주면 OK.

GenericPrinter<Plastic> plasticPrinter = new GenericPrinter<Plastic>( );
plasticPrinter.setMaterial(new Plastic( ));
Plastic plastic = powderPrinter.getMaterial( ); // 형 변환 하지 않음.

 

08.

 

09.