///////
Search

list,set,map,file_이연재

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
복사