1. List 복습
1. List
•
실습
◦
students 리스트를 생성해서 값을 넣고 출력하기
import java.util.ArrayList;
import java.util.List;
public class ListExercise {
private List<String> students;
//생성자에서 student를 바로 사용할 수 없어서(student가 private으로 선언)
//get 메소드를 하나 만들어줘야함.
public ListExercise(){
this.students = new ArrayList<>();
students.add("이연재");
students.add("이연재2");
students.add("이연재3");
}
public List<String> getStudents(){
return this.students;
}
}
Plain Text
복사
import java.util.List;
public class Main {
public static void main(String[] args) {
ListExercise listExercise = new ListExercise();
//students를 만든이유: listExercise.getStudents()가 2번 반복되기 때문에
List<String> students = listExercise.getStudents();
for (String student: students ) {
System.out.println(student);
}
System.out.println(students.size());
}
}
Plain Text
복사
2. List와 ArrayList차이
//두 코드의 차이점?
ArrayList <Object> list = new ArrayList <>();
List <Object> list = new ArrayList <>();
Plain Text
복사
•
List는 인터페이스이고 ArrayList는 클래스이다.
•
두 코드는 같은 결과가 나오지만 List를 이용해서 ArrayList를 생성하면 유연성 효과를 볼수 있다.
•
데이터의 용도에 따라 빠른 탐색을 위해서 ArrayList를 사용할 때도 있고, 삽입/삭제를 위해 LinkedList를 사용해야 하는 경우도 있기 때문에 List를 이용한다.
•
예를 들면
◦
List list = new ArrayList();>
▪
도형 list = new 정사각형();
◦
ArrayList list = new ArrayList();>
▪
정사각형 list = new 정사각형(); 이런 느낌이다.
2. Set
1. set이란?
•
List와 달리 객체(데이터)를 중복해서 저장할 수 없는 컬렉션이다.
•
저장된 객체(데이터)를 인덱스로 관리하지 않기 때문에 저장 순서가 없다.
•
대표적인 클래스들로 HashSet, TreeSet등이 있다.
•
List보다 많이 쓴다.
2. 예제로 알아보기
예제(1)
•
random한 숫자 50개를 생성하고 출력하기
public interface NumberGenerator {
int generate(int num);
}
Plain Text
복사
public class RandomNumberGenerator implements NumberGenerator{
@Override
public int generate(int num) {
return (int)(Math.random()*num);
}
}
Plain Text
복사
public class RndNumbersWithoutDuplicated {
public static void main(String[] args) {
RandomNumberGenerator randomNumberGenerator = new RandomNumberGenerator();
for(int i = 0; i<50; i++){
int r = randomNumberGenerator.generate(10); //0~9사이 랜덤한 숫자 50개 출력
System.out.println(r);
}
}
}
Plain Text
복사
•
예제(1)에서는 0~9사이 랜덤한 숫자 50개가 중복되어 출력된다.
예제(2)
•
random한 숫자 50개를 생성하고 중복이 되지 않은 숫자만 남겨서 출력하기
public interface NumberGenerator {
int generate(int num);
}
Plain Text
복사
public class RandomNumberGenerator implements NumberGenerator{
@Override
public int generate(int num) {
return (int)(Math.random()*num);
}
}
Plain Text
복사
import java.util.HashMap;
import java.util.HashSet;
public class RndNumbersWithoutDuplicated {
public static void main(String[] args) {
RandomNumberGenerator randomNumberGenerator = new RandomNumberGenerator();
HashSet<Integer> numbers = new HashSet<>();
for(int i = 0; i<50; i++){
int r = randomNumberGenerator.generate(10); //0~9사이 랜덤한 숫자 50개
numbers.add(r);
}
System.out.println(numbers);
System.out.println("개수:"+numbers.size());
}
}
Plain Text
복사
•
예제(2)는 예제(1)과 달리 HashSet을 사용하여 중복을 제거한 0~9사이 랜덤한 숫자가 출력된다.
예제(3)
•
알파벳 A ~ Z 까지 랜덤한 알파벳을 50개 생성하고 중복을 제거한 후 출력하기
public interface alphabetGenerator {
int generate(int num);
}
Plain Text
복사
public class RandomAlphabetGenerator implements alphabetGenerator{
@Override
public int generate(int num) {
return (int)(Math.random()*num);
}
}
Plain Text
복사
import java.util.HashSet;
public class RndAlphabetWithoutDuplicated {
public static void main(String[] args) {
RandomAlphabetGenerator randomAlphabetGenerator = new RandomAlphabetGenerator();
HashSet<Character> alphabet = new HashSet<Character>();
for(int i = 0; i<100; i++){
int r = randomAlphabetGenerator.generate(26);
int a = 'A'+r;
alphabet.add((char)a);
}
System.out.println(alphabet);
System.out.println("개수:"+alphabet.size());
}
}
Plain Text
복사
•
예제(3)은 예제(2)와 비슷하지만 문자형(char)을 사용해 문자도 중복을 제거해 출력할 수 있음을 보여준다.
3. Map
1. Map이란?
•
Map은 Collection과 다른 방식으로 Map 인터페이스를 구현한 클래스들은 키와 값을 하나의 쌍으로 저장하는 방식을 사용한다.
•
값을 구할 때 순차적으로 구하는 방식이 아닌 key를 통해 value를 얻는 방식으로 구한다.
•
key: 중복을 허용하지 않음, value: 중복을 허용함
•
대표적인 클래스들로 HashMap, TreeMap등이 있다.
•
HashMap이 대부분 빨라서 자주 사용한다.
2. 예제로 알아보기
예제(1)
•
Map선언하고 값 넣기
import java.util.HashMap;
public class MapExercise {
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
//<key,value>
map.put("권하준", "https://github.com/dongyeon-0822/java-project-exercise");
map.put("조성윤", "https://github.com/kang-subin/Java");
System.out.println(map.get("권하준"));
}
}
Plain Text
복사
•
put()으로 key와 value를 넣고 get()으로 key값을 이용해 value를 출력한다.
예제(2)
•
특정 String s에 있는 a~z까지 알파벳의 개수를 세는 알고리즘 구현하기(대소문자 구분x)
import java.util.HashMap;
public class MapExercise2 {
public static void main(String[] args) {
String repoAddr = "Https://Github.com/yjyj1023?Tab=repositories";
//대문자 -> 소문자로 바꾸기
repoAddr = repoAddr.toLowerCase();
HashMap<Character, Integer> alphabetCnt = new HashMap<>();
for(char i = 'a'; i <= 'z'; i++){
int cnt = 0;
for(int j = 0; j < repoAddr.length(); j++){
if(repoAddr.charAt(j) == i){
cnt++;
}
}
alphabetCnt.put(i,cnt);
}
System.out.println(alphabetCnt);
}
}
Plain Text
복사
예제(3)
•
예제(2)와 동일한 문제를 다르게 구현
import java.util.HashMap;
import java.util.Map;
public class MapExercise3 {
public boolean isAlphabet(char ch) {
if ((ch >= 'A' && ch <= 'Z') | (ch >= 'a' && ch <= 'z')) {
return true;
} else {
return false;
}
}
public static void main(String[] args) {
MapExercise3 mapExercise3 = new MapExercise3();
String repoAddr = "Https://Github.com/yjyj1023?Tab=repositories";
HashMap<Character, Integer> alphabetCnt = new HashMap<>();
for (char c = 'A'; c < 'Z'; c++) {
alphabetCnt.put(c, 0);
}
for (int i = 0; i < repoAddr.length(); i++) {
char c = repoAddr.charAt(i);
boolean isAlphabet = mapExercise3.isAlphabet(c);
if (isAlphabet) {
alphabetCnt.put(c, alphabetCnt.get(c) + 1);
}
}
System.out.println(alphabetCnt);
}
}
Plain Text
복사
•
예제(3)번은 아래 3가지를 할 수 있는지 테스트하는 문제이다.
◦
1) String을 한글자씩 출력할 수 있어야 한다.
▪
charAt() 사용
◦
2) c가 알파벳인지 check하는 알고리즘을 작성할 수 있는가?
▪
boolean isAlphabet(char c) 작성
◦
3) Map에 a~z까지 등록 해놓고 cnt를 1개씩 올릴 수 있는가?
▪
for문으로 Map put하고 +1로 하나씩 올리기
4. File
1. 파일 읽기
•
파일을 읽는 방법으로는 FileReader, BufferedReader, Scanner, Files가 있다.
•
이 중 BufferedReader가 가장 빠르고 성능이 좋다Buffer라는 임시 저장 공간에서 모았다가 한번에 보내기 때문이다
◦
FileReader가 모래를 한알씩 옮기는 것이라면 BufferedReader는 모래를 모았다가 한번에 삽으로 옮기는 것과 같다.
2. 예제로 알아보기
예제(1)
•
지정한 파일의 맨 앞 한글자를 읽어오는 method 만들기
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile {
public char readOne(String filename) throws IOException {
BufferedReader br = new BufferedReader(
new FileReader(filename),
16*1024
);
return (char)br.read();
}
public static void main(String[] args) throws IOException {
ReadFile readFile = new ReadFile();
char c1 = readFile.readOne("./a_file.txt");
System.out.println(c1);
}
}
Plain Text
복사
예제(2)
•
지정한 파일의 맨 앞 두글자를 읽어오는 method 만들기
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile2 {
public String readtwo(String filename) throws IOException {
String s1 = "";
BufferedReader br = new BufferedReader(
new FileReader(filename),
16*1024 //버퍼사이즈
);
for(int i = 0; i<2; i++){
s1+=(char)br.read();
}
return s1;
}
public static void main(String[] args) throws IOException {
ReadFile2 readFile = new ReadFile2();
String s2 = readFile.readtwo("./a_file.txt");
System.out.println(s2);
}
Plain Text
복사
예제(3)
•
지정한 파일의 n글자를 읽어오는 method 만들기
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadFile3 {
private String filename;
public ReadFile3(String filename) {
this.filename = filename;
}
public String readN(int num) throws IOException {
String s1 = "";
BufferedReader br = new BufferedReader(
new FileReader(filename),
16*1024 //버퍼사이즈
);
for(int i = 0; i<num; i++){
int c = br.read();
if(c!=-1){
s1+=(char)c;
}
else{
System.out.println("글자 수를 초과했습니다.");
break;
}
}
return s1;
}
public static void main(String[] args) throws IOException {
ReadFile3 readFile = new ReadFile3("./a_file.txt");
int num = 100;
String s2 = readFile.readN(num);
System.out.println(num+"개 글자 출력:"+s2);
}
}
Plain Text
복사
예제(4)
•
현재 디렉토리 파일 목록 출력하기
import java.io.File;
public class fileList {
public static void main(String[] args) {
File dir = new File("./");
File files[] = dir.listFiles();
for (File file : files){
System.out.println(file);
}
/* 출력결과
.\.git
.\.idea
.\a_file.txt
.\File.iml
.\out
.\src
*/
}
}
Plain Text
복사