티스토리 뷰

학습정리-11-09.txt
0.00MB

 

 

1. 아래의 출력이 나오도록 만드시오.

public class HashPerson {

public static void main(String[] args) {

HashSet<Person> hSet = new HashSet<Person>();

hSet.add(new Person("LEE", 10));

hSet.add(new Person("LEE", 10));

hSet.add(new Person("PARK", 35));

hSet.add(new Person("PARK", 35));

System.out.println("저장된 데이터 수: " + hSet.size());

//System.out.println(hSet);

}

}

/*

저장된 데이터 수: 2

[LEE(10세), PARK(35세)]

*/

import java.util.HashSet;

class Person {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {
		return (age / 10);
	}

	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Person) {
			Person person = (Person)obj;
			
			if((this.name.equals(person.name)) && (this.age == person.age))
				return true;
		}
		return false;
	}

	@Override
	public String toString() {
		return name + "(" + age + "세)";
	}
}

class HashPerson {

	public static void main(String[] args) {
		HashSet<Person> hSet = new HashSet<Person>();

		hSet.add(new Person("LEE", 10));
		hSet.add(new Person("LEE", 10));
		hSet.add(new Person("PARK", 35));
		hSet.add(new Person("PARK", 35));

		System.out.println("저장된 데이터 수: " + hSet.size());
		System.out.println(hSet);
	}
}
/*
 * 저장된 데이터 수: 2 
 * [LEE(10세), PARK(35세)]
 */

 

 

 

 

 

2. 아래와 같이 출력이 나오도록 프로그래밍을 하시오.

HashSet<Num> set = new HashSet<>();

set.add(new Num(7799));

set.add(new Num(9955));

set.add(new Num(7799));

System.out.println("인스턴스 수: " + set.size());

for(Num n : set)

System.out.print(n.toString() + '\t');

System.out.println();

/*

====출력

인스턴스 수: 2

7799    9955

*/

import java.util.HashSet;

class Num{
	private int num;
	
	public Num(int n) {
		this.num = n;
	}
	
	@Override
	public String toString() {
		return String.valueOf(num); // int를 String으로 변환
	}
	
	// 1. hashCode() - 해쉬 알고리즘 - 분류한다(속도). 분류만 하기때문에 같은지 확인 불가	
	@Override
	public int hashCode() {
		return num % 3;
	} // hashCode 먼저 호출
	
	// 2. 동일한지 비교를 위해 true면 동일, false면 다름 (로직은 개발자가 직접 짜야한다.)
	@Override
	public boolean equals(Object obj) {
		if(this.num == ((Num)obj).num)		
			return true;
		else
			return false;
	} // hashCode 실행 후 호출 됨. 같은지 확인한다.
	
	// hashCode()나 equals() 둘 중 하나만 있으면 중복이 제거되지 않는다...3개 출력
	
}

public class HashSetEqualityTwo {

	public static void main(String[] args) {
		HashSet<Num> set = new HashSet<>();
		
		// set.add을 하게 되면 set이 알아서 hashCode() 호출! 그 다음 자동으로 equals()실행
		set.add(new Num(7799));
		set.add(new Num(9955));
		set.add(new Num(7799));
		
		System.out.println("인스턴스 수: " + set.size());
		
		for (Num n : set) {
			System.out.print(n.toString() + "\t");
		} // Set은 넣었던 순서는 상관없이 출력된다....		
		
	}
}

위에서 왜 hashcode를 오버라이딩 하지 않으면 중복 제거가 되지 않을까??

 

 

 

 

 

3.ThreeSet 과 HashSet 의 차이는?

​HashSet의 경우 순서대로 정렬이 되지 않지만(넣어준 순서대로 출력되지 않는다) TreeSet은 오름차순으로 출력할 수 있다.

​내림차순으로 변경하고 싶다면 implements Comparable<T>을 해준 후

compareTo 함수를 오버라이딩 해야한다.

import java.util.HashSet;
import java.util.TreeSet;

class Person implements Comparable<Person>{
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public int compareTo(Person o) {
		// return this.age - o.age; 오름차순
		return o.age - this.age  내림차순
	}

	@Override
	public String toString() {
		return name + "(" + age + "세)";
	}
	
	@Override
	public int hashCode() {
		return age; // return (age / 10); 10대, 20대 등으로 분류하겠다.
	}
	
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Person) {
			Person person = (Person) obj;
			if (this.name.equals(person.name) && (this.age == (person.age)))
				return true;

		}
		return false;

	}

}

public class HashCodeTest {

	public static void main(String[] args) {		
		
		TreeSet<Person> tree = new TreeSet<>();
		
		tree.add(new Person("YOON", 37));
		tree.add(new Person("HONG", 53));
		tree.add(new Person("PARK", 22));
		
		for (Person person : tree) {
			System.out.print(person + "\t");
		}

	}
}

/*
 * PARK(22세)	YOON(37세)	HONG(53세)
 */

 

 

 

 

 

 

 

4.하나의 학생 정보를 나타내는 Student 클래스에는 이름, 학과, 학번, 학점 평균을 저장하는 필드가 있다.

(1) 학생마다 Student 객체를 생성하고 4명의 학생 정보를 ArrayList<Student> 컬렉션에 저장한 후에, ArrayList<Student>의 모든 학생(4명) 정보를 출력하고 학생 이름을 입력받아 해당 학생의 학점 평균을 출력하는 프로그램을 작성하라.

학생 이름, 학과, 학번, 학점평균 입력하세요.

>> 황기태, 모바일, 1, 4.1

>> 이재문, 안드로이드, 2, 3.9

>> 김남윤, 웹공학, 3, 3.5

>> 최찬미, 빅데이터, 4, 4.25

----------------------------------

이름: 황기태

학과: 모바일

학번: 1

학점평균: 4.1

----------------------------------

이름: 이재문

학과: 안드로이드

학번: 2

학점평균: 3.9

----------------------------------

이름: 김남윤

학과: 웹공학

학번: 3

학점평균: 3.5

----------------------------------

이름: 최찬미

학과: 빅데이터

학번: 4

학점평균: 4.25

----------------------------------

학생 이름 >> 최찬미

최찬미, 빅데이터, 4, 4.25

학생 이름 >> 이재문

이재문, 안드로이드, 2, 3.9

학생 이름 >> 그만

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Student {
	private String name;
	private String major;
	private int stuNum;
	private double gradeAvg;
	List<Student> list = new ArrayList<>();

	public Student(String name, String major, int stuNum, double gradeAvg) {
		this.name = name;
		this.major = major;
		this.stuNum = stuNum;
		this.gradeAvg = gradeAvg;
	}

	public Student() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public String toString() {
		return "이름:" + name + "\n" + "학과:" + major + "\n" + "학번:" + stuNum + "\n" + "학점평균:" + gradeAvg;
	}

	public void getAll() {
		System.out.println(name + ", " + major + ", " + stuNum + ", " + gradeAvg);
	}

	public String getName() {
		return name;
	}

	public void setStuInfo() {
		Scanner sc = new Scanner(System.in);

		System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
		try {
			for (int i = 0; i < 4; i++) {
				System.out.print((i + 1) + "번 >> ");
				String name = sc.next();
				String major = sc.next();
				int stuNum = sc.nextInt();
				double gradeAvg = sc.nextDouble();

				Student student = new Student(name, major, stuNum, gradeAvg);
				list.add(student);

			}
		} catch (Exception e) {
			System.out.println("잘못된 입력입니다. 다시 입력해 주세요.");
			setStuInfo();
		}

	}

	public void printStuInfoAll() {
		for (int i = 0; i < 4; i++) {
			System.out.println(list.get(i));
			System.out.println();
		}

	}

	public boolean getStuInfo() {
		Scanner sc = new Scanner(System.in);

		System.out.print("학생 이름 (종료를 원하시면 '그만'을 입력하세요.) >> ");
		String name = sc.next();

		if (name.equals("그만")) {
			System.out.println("종료합니다.");
			return false;
		}

		for (int i = 0; i < 4; i++) {
			if (name.equals(list.get(i).getName()))
				list.get(i).getAll();

		}

		return true;
	}

}

class StudentGradeTest {

	public static void main(String[] args) {
		Student stu = new Student();
		
		stu.setStuInfo();
		
		stu.printStuInfoAll();
		
		boolean boo = true;
		while(boo) {
			boo = stu.getStuInfo();
		}

	}
}

클래스로 만들어서 객체 생성!......따로 입력 받는 거 말고 nextline 사용하고 싶은데 오류 발생.....

 

됐다?!?! 일단 정상 출력 확인

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

class Student {
	private String name;
	private String major;
	private String stuNum;
	private String gradeAvg;
	List<Student> list = new ArrayList<>();

	public Student(String name, String major, String stuNum, String gradeAvg) {
		this.name = name;
		this.major = major;
		this.stuNum = stuNum;
		this.gradeAvg = gradeAvg;
	}

	public Student() {
		// TODO Auto-generated constructor stub
	}
	
	

	@Override
	public String toString() {
		return "이름:" + name + "\n" + "학과:" + major + "\n" + "학번:" + stuNum + "\n" + "학점평균:" + gradeAvg;
	}

	public void getAll() {
		System.out.println(name + ", " + major + ", " + stuNum + ", " + gradeAvg);
	}

	public String getName() {
		return name;
	}

	public void setStuInfo() {
		Scanner sc = new Scanner(System.in);

		System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
		
			for (int i = 0; i < 4; i++) {
				
				System.out.print((i + 1) + "번 >> ");
				String info = sc.nextLine();
				
				StringTokenizer st = new StringTokenizer(info, ", ");
				
				while(st.hasMoreTokens()) {
					
					list.add(new Student(st.nextToken(), st.nextToken(), st.nextToken(), st.nextToken()));
					
				}
				
			}
		 
	}

	public void printStuInfoAll() {
		for (int i = 0; i < 4; i++) {
			System.out.println(list.get(i));
			System.out.println();
		}

	}

	public boolean getStuInfo() {
		Scanner sc = new Scanner(System.in);

		System.out.print("학생 이름 (종료를 원하시면 '그만'을 입력하세요.) >> ");
		String name = sc.next();

		if (name.equals("그만")) {
			System.out.println("종료합니다.");
			return false;
		}

		for (int i = 0; i < 4; i++) {
			if (name.equals(list.get(i).getName()))
				list.get(i).getAll();

		}

		return true;
	}

}

class StudentGradeTest {

	public static void main(String[] args) {
		Student stu = new Student();
		
		stu.setStuInfo();
		
		stu.printStuInfoAll();
		
		boolean boo = true;
		while(boo) {
			boo = stu.getStuInfo();
		}

	}
}

난 왜 이렇게 짰지...ㅋㅋ.....선생님이랑 너무 다르네..........

 

import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;

class Student {
	private String name;
	private String dept;
	private String number;
	private double grade;
	

	public Student(String name, String dept, String number, double grade) {
		this.name = name;
		this.dept = dept;
		this.number = number;
		this.grade = grade;
	}

	
	public String getDept() {
		return dept;
	}

	public void setDept(String dept) {
		this.dept = dept;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public double getGrade() {
		return grade;
	}

	public void setGrade(double grade) {
		this.grade = grade;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}


	public void findStudent(String name) {
		if(this.name.equals(name)) {
			System.out.println(this.name + ", " + this.dept + ", " + this.number + ", " + this.grade);
		}
		
	}

}

class StudentGradeTest {

	public static void main(String[] args) {
		final int STU_NUM = 4;
		Scanner sc = new Scanner(System.in);
		System.out.println("학생 이름, 학과, 학번, 학점평균 입력하세요.");
		
		ArrayList<Student> arrList = new ArrayList<>();
		
		for(int i = 0; i < STU_NUM; i++) {
			System.out.print(">> ");
			String text = sc.nextLine();
			
			StringTokenizer st = new StringTokenizer(text, ",");
			// nestLine이 space 단위로 끊어 인식하기 때문에 ,하나만 조건으로 넣어줘도 된다.
			String name = st.nextToken().trim(); // trim() 앞뒤 공백으로 자르는 것! 실무에서 자주 사용
			String dept = st.nextToken().trim();
			String num = st.nextToken().trim();
			double grade = Double.valueOf(st.nextToken().trim());
			
			arrList.add(new Student(name, dept, num, grade));
			
		}
		
		for(int i = 0; i < arrList.size(); i++) {
			System.out.print("------------------------");
			Student student = arrList.get(i);
			
			System.out.println("이름: " + student.getName());
			System.out.println("학과: "+ student.getDept());
	        System.out.println("학번: "+ student.getNumber());
	        System.out.println("학점평균: "+ student.getGrade());

		}
		
		System.out.print("------------------------------------");
		
		while(true) {
			System.out.println("학생 이름 >> ");
			String name = sc.next();
			
			if(name.equals("그만"))
				break;
			
			for(int i = 0; i < arrList.size(); i++) {
				Student s = arrList.get(i);
				s.findStudent(name);
			}
		
		}
		
		System.out.println("종료");
		
	}
}

 

 

 

5. 개별 진척도 오늘 못한거 정리 해 주세요.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함