1. ArrayList 와 LinkedList 의 장단점은?
ArrayList | LinkedList | |
장점 | 데이터마다 인덱스를 가지고 있어 탐색할 때 성능상의 이점을 가질 수 있다. | 데이터를 추가/삭제시 불필요한 복사가 없어 리스트의 내용이 변화가 많은 상황일 때 유리하다. |
단점 | 대량의 자료를 추가/삭제함에 있어 그만큼 복사의 횟수가 많아지므로 성능저하를 일으킬 수 있다. | 데이터를 탐색할때 처음부터 순회해야 하기 때문에 성능상의 문제가 있다. |
2. Scanner 클래스로 -1이 입력될 때까지 양의 정수를 입력받아 저장하고 검색하여 가장 큰 수를 출력하는 프로그램을 작성하라
> 정수(-1이 입력될 때까지)>> 10 6 22 6 88 77 -1 > 가장 큰 수는 88
2-1. 메인 클래스
import java.util.ArrayList;
import java.util.Collections;
import java.util.InputMismatchException;
import java.util.Scanner;
public class MaxNumMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> list = new ArrayList<>();
System.out.println("정수를 입력하시고 그만 입력하고자 한다면 끝에 -1을 기입하세요.");
System.out.println("ex. 10 6 22 6 88 77 -1");
System.out.println("------------------------------------------------");
try {
while (true) {
int var = scanner.nextInt();
list.add(var);
if (list.contains(-1)) {
break;
} else {
continue;
}
}
System.out.println("가장 큰 수는 " + Collections.max(list));
} catch (InputMismatchException e) {
System.out.println("올바르지 않은 입력 값 입니다. 다시 입력해주세요!");
}
scanner.close();
}
}
3. 로또 프로그램을 작성하시오.(Set 으로)
import java.util.Random;
import java.util.Set;
import java.util.HashSet;
//import java.util.Iterator; // Iterator 사용시 import
public class LottoMain {
public static void main(String[] args) {
Random random = new Random();
Set<Integer> set = new HashSet<>();
for (int i = 1; i <= 6; i++) // 로또 번호 6개 랜덤으로 받기
set.add(random.nextInt(45) + 1);
// 받은 로또번호 출력하기
System.out.println("Your Lotto Number");
System.out.println(set);
/*
for (Iterator<Integer> itr = set.iterator(); itr.hasNext();)
System.out.print(itr.next() + " ");
System.out.println();
*/
}
}
4. Set에 대하여 설명하시오.
: 집합을 의미하며 요소의(Elements) 순서가 없는(Unordered) 특징을 가진다. 또한 데이터의 요소에서 중복을 허용하지 않는 특성을 가진다.
5. 도시 이름, 위도, 경도 정보를 가진 Location 클래스를 작성하고, 도시 이름을 ‘키’로 하는 HashMap<String, Location> 컬렉션을 만들고, 사용자로부터 입력 받아 4개의 도시를 저장하라. 그리고 도시 이름으로 검색하는 프로그램을 작성하라.
도시, 경도, 위도를 입력하세요. >> 서울, 37, 126 >> LA, 34, -118 >> 파리, 2, 48 >> 시드니, 151, -33 ---------------------------------- 서울 37 126 LA 34 -118 파리 2 48 시드니 151 -33 ---------------------------------- 도시 이름 >> 피리 피리는 없습니다. 도시 이름 >> 파리 파리 2 48 도시 이름 >> 그만
5-1. 메인클래스
import java.util.HashMap;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;
public class LocationMain {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Location[] location = new Location[4];
HashMap<String, Location> map
= new HashMap<String, Location>();
System.out.println("도시, 경도, 위도를 입력하세요.");
System.out.println("ex) 서울, 37, 126");
try {
for(int i=0; i<location.length; i++) {
System.out.print(">> ");
String text = sc.nextLine();
StringTokenizer st = new StringTokenizer(text, ",");
String city = st.nextToken().trim();
int longitude = Integer.parseInt(st.nextToken().trim());
int latitude = Integer.parseInt(st.nextToken().trim());
location[i] = new Location(city, longitude, latitude);
map.put(city, location[i]);
}
Set<String> key = map.keySet();
Iterator<String> it = key.iterator();
System.out.println("----------------------------------");
while(it.hasNext()) {
String city = it.next();
Location s = map.get(city);
System.out.println(s.getCity() + " "
+ s.getLongitude() + " "
+ s.getLatitude());
}
System.out.println("----------------------------------");
while(true) {
System.out.print("도시 이름 >> ");
String city = sc.next();
if(city.equals("그만"))
break;
Location s = map.get(city);
if(s == null)
System.out.println(city + "는 없습니다.");
else
System.out.println(s.getCity() + " "
+ s.getLongitude() + " "
+ s.getLatitude());
}
} catch (NoSuchElementException e) {
System.out.println("잘못된 입력 값 입니다.");
System.out.println("쉼표 및 띄어쓰기를 누락하지 않으셨는지 다시 확인 후 입력해주세요.");
}
sc.close();
}
}
5-2. Location 클래스
public class Location {
private String city; // 도시이름
private int longitude; // 경도
private int latitude; // 위도
public Location(String city, int longitude, int latitude) {
this.city = city;
this.longitude = longitude;
this.latitude = latitude;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public int getLongitude() {
return longitude;
}
public void setLongitude(int longitude) {
this.longitude = longitude;
}
public int getLatitude() {
return latitude;
}
public void setLatitude(int latitude) {
this.latitude = latitude;
}
}
6. Scanner 클래스를 사용하여 6개 학점(‘A’, ‘B’, ‘C’, ‘D’, ‘F’)을 문자로 입력받아 ArrayList에 저장하고, ArrayList를 검색하여 학점을 점수(A=4.0, B=3.0, C=2.0, D=1.0, F=0)로 변환하여 평균을 출력하는 프로그램을 작성하라.
6개의 학점을 빈 칸으로 분리 입력(A/B/C/D/F) >> A C A B F D 2.3333333333333335
6-1. 메인 클래스
import java.util.ArrayList;
import java.util.Scanner;
public class ListAvgMain {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Double> list = new ArrayList<>();
System.out.println("6개의 학점을 띄어써서 입력해주세요.");
System.out.println("ex) 수 우 수 미 수 가");
System.out.print(">> ");
String str = scanner.nextLine();
String[] temp = str.split(" ");
for (int i = 0; i < temp.length; i++) {
if (temp[i].equals("수")) {
list.add(4.0);
} else if (temp[i].equals("우")) {
list.add(3.0);
} else if (temp[i].equals("미")) {
list.add(2.0);
} else if (temp[i].equals("양")) {
list.add(1.0);
} else if (temp[i].equals("가")) {
list.add(0.0);
}
}
double sum = list.stream().mapToDouble(Double::doubleValue).sum();
System.out.println("당신의 평균은 " + ((double)Math.round((sum / 6)*100)/100) + " 입니다.");
scanner.close();
}
}
7. 출력이 아래와 같이 나오도록 하시오
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
7-1. 메인 클래스(예제 보강)
import java.util.HashSet;
public class Set02 {
public static void main(String[] args) {
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.println(n.toString() + '\t');
}
System.out.println();
}
}
7-2. Num 클래스
public class Num {
private int num;
public Num(int n) {
num = n;
}
@Override
// hashCode() 메소드와 equals() 메소드와 병행이 되어야 중복이 없는 특성의 set 컬렉션을 출력할 수 있다.
public int hashCode() {
return num % 3; // num의 값이 같으면 부류도 같다.
}
@Override
public boolean equals(Object obj) { // num의 값이 같으면 true 반환
if (num == ((Num)obj).num) {
return true;
} else {
return false;
}
}
@Override
public String toString() {
return String.valueOf(num);
}
}
8. Set 호출되는 원리와 순서를 설명하시오.
: 4.에서 Set은 데이터의 중복이 허용되지 않는 특성을 가진다라고 언급을 하였다. 그렇다면 이러한 점을 가지는 알고리즘을 살펴볼때 다음과 같다.
위 그림과 같이 equals를 거쳐 hashCode 메소드를 통해 둘 모두 결과가 같을 경우 중복 판정이 되는데
- equals의 경우 두 인스턴스의 내용을 비교하여 같은 경우 true(1), 다른 경우 false(0)를 출력한다.
- hashCode의 경우 두 객체가 같은 객체인지 확인하여 native 키워드를 통해 메모리에서 가진 해쉬의 주소값을 출력한다.
따라서 Set은 동일 인스턴스에 대한 기준을 위과 같이 따르며 그 결과 순서가 없는 특성 또한 가질 수 있게 된다.
9. 아래와 같이 출력되도록 하시오.
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세)]
9-1. 메인 클래스
import java.util.HashSet;
public class PersonMain {
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);
}
}
9-2. Person 클래스
public 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;
}
@Override
public boolean equals(Object obj) {
if ((name == ((Person)obj).name)
|| (age == ((Person)obj).age)) {
return true;
} else {
return false;
}
}
@Override
public String toString() {
return name + "(" + age + "세)";
}
}
'WebDev > 본과정' 카테고리의 다른 글
JSP 개요 (0) | 2021.05.14 |
---|---|
Set, Queue, Map 자료구조와 정렬 및 탐색 (0) | 2021.05.14 |
Generic 심화 및 컬렉션 프레임워크 개요 (0) | 2021.05.13 |
Java의 기본 클래스 및 제네릭 개요 (0) | 2021.05.13 |
Clone과 Wrapper 클래스 (0) | 2021.05.13 |
최근댓글