[LIKELION] 221006

고관운·2022년 10월 6일

회고

😄 느낀점

  • 학교 다니면서 배운 것이 도움되는 것 같다.
  • 반복 실습을 통해 점점 빨라지는 것 같다.
  • Git도 많이 익숙해져서 편하다. (Git은 조금 꾸며야겠다)

😁 목표

  • CodeUp 100제 (1021~1030 풀기)
  • 백준 풀기
  • AWS, Mdis 가입
  • Mids에서 데이터 다운로드

3주차 Git, Java 실무 연습(67~79)

List 복습

🟢 List를 초기화 안해주고 add시 에러남

Set

Set이란

Set : 중복을 허용하지 않는 List (인덱스 개념이 없어서 인덱싱 메소드가 없음)
HashSet : 순서없이 값을 저장하며, 동일한 객체는 중복 저장하지 않음
TreeSet : 객체를 저장하면 자동 정렬됨

🟢 메소드

  • add(데이터) : 데이터 추가
  • remove(데이터) : 데이터 삭제
  • clear() : 전체 삭제

실습.중복 제거

public class SetExercise {
    public static void main(String[] args) {
        Set<String> set1 = new HashSet<>(); // tree set도 있음
        set1.add("고관운");
        set1.add("고관운");
        set1.add("김미미");
        System.out.println(set1);

        // 정수 중복 제거
        Set<Integer> setInteger = new HashSet<>();
        setInteger.add(1);
        setInteger.add(1);
        setInteger.add(2);
        setInteger.add(3);

        System.out.println(setInteger);
    }
}

🟢 set1은 고관운이 중복되므로 중복 저장 안됨
🟢 setInteger 역시 1이 중복되어 1,2,3만 저장됨

실습.랜덤한 수 생성 후 중복 제거

public interface NumberGenerator1 {
    int generate(int num);
}
public class RandomNumberGenerator1 implements NumberGenerator1{
    @Override
    public int generate(int num) {
        return (int)(Math.random() * num);
    }
}

🟢 인터페이스 NumberGenerator1을 받아 generate 오버라이딩

import java.util.HashSet;
import java.util.Set;

public class RndNumberWithoutDuplicated {
    public static void main(String[] args) {
        RandomNumberGenerator1 randomNumberGenerator = new RandomNumberGenerator1();

        Set<Integer> rndNumWithoutDuplicated = new HashSet<>();

        System.out.print("랜덤한 수(50개) : ");
        for(int i = 0; i < 50; i++) {
            int rndNum = randomNumberGenerator.generate(10);
            System.out.print(rndNum + " ");
            rndNumWithoutDuplicated.add(rndNum);
        }

        System.out.print("\n랜덤한 수 중복제거 : ");
        for (Integer integer : rndNumWithoutDuplicated) {
            System.out.print(integer + " ");
        }
    }
}

🟢 비교를 위해 랜덤한 수 50개 출력 후 Set에 넣어 중복 제거 후 출력

실습.랜덤한 알파벳 생성 후 중복 제거

방식은 위의 문제와 동일하기 때문에 랜덤한 알파벳 생성하는 함수만 확인

public class RandomAlphabetGenerator implements AlphabetGenerator{
    @Override
    public char generate() {
        return (char) ((int) (Math.random() * 26) + 65);
    }
}

🟢 ((int) (Math.random() * 26) + 65) : 아스키코드 65이상 91미만인 수를 가져와 (char)로 형변환하여 리턴

Map

Map이란

Map : Key와 Value로 구성된 객체를 저장하는 구조

🟢 메소드

  • put(a,b) : key : a, value : b로 Map에 들어감
  • get(a) : key가 a에 해당하는 value를 가져옴
  • containsKey(a) : Map이 a라는 키를 가지고 있다면 True 리턴

실습.이름과 깃주소를 Map에 넣고 출력, 하나의 깃주소를 가져와 알파벳별, 문자별 개수 출력

public class IsAlphabet {
    boolean checkIsAlphabet(char c){
        if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122)){
            return true;
        } else{
            return false;
        }
    }
}

🟢 c가 알파벳이면 true, 아니면 false 리턴

import java.util.HashMap;

public class MapExercise {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();

        map.put("권하준", "https://github.com/dongyeon-0822/java-project-exercise");
        map.put("조성윤", "https://github.com/kang-subin/Java");
        map.put("안예은", "https://github.com/KoKwanwun/LikeLion.git");

        // get으로 key 값에 해당하는 value값을 가져옴
        // System.out.println(map.get("권하준"));

        for (String s : map.keySet()) {
            System.out.println("이름 : " + s + ", 깃주소 : " + map.get(s));
        }
        System.out.println("총 개수 : " + map.size());

        // 깃주소를 하나 가져와서 문자별로 개수 출력
        IsAlphabet isAlphabet = new IsAlphabet();
        HashMap<Character, Integer> alphabetCnt = new HashMap<>();
        HashMap<Character, Integer> charCnt = new HashMap<>();
        int cnt = 0;

        String strs = map.get("권하준");

        System.out.println("\n권하준의 깃주소 문자별 개수 출력");
        for (int i = 0; i < strs.length(); i++){
            char chr = strs.charAt(i);

            if (isAlphabet.checkIsAlphabet(chr)){
                cnt = alphabetCnt.containsKey(chr) ? alphabetCnt.get(chr) : 0;
                alphabetCnt.put(chr, cnt + 1);
            } else {
                cnt = charCnt.containsKey(chr) ? charCnt.get(chr) : 0;
                charCnt.put(chr, cnt + 1);
            }
        }
        System.out.println("알파벳별 개수 : " + alphabetCnt);
        System.out.println("알파벳이 아닌 문자별 개수 : " + charCnt);
    }
}

🟢 put으로 데이터를 넣고 get으로 value값을 가져옴
🟢 checkIsAlphabet 함수를 통해 알파벳인지 확인
🟢 alphabetCnt.containsKey(chr) ? alphabetCnt.get(chr) : 0 chr을 key로 가지고 있다면 그에 해당하는 value를 가져오고 아니라면 0을 가져옴

File

File 읽기

  • FileReader : character 파일을 읽을 수 있는 기능(String을 character로 여러번 부를 수 있음)
    🟢 read() : 한 글자씩 읽어서 char을 리턴(읽을 글자가 없다면, -1 리턴)
  • BufferedReader : buffer를 사용하면 FileReader보다 좀 더 효율적으로 읽어올 수 있음
    🟢 파라미터 : 첫번째는 Reader(FileReader을 넣을 수도 있음), 두번째는 buffer 크기(기본 buffer 사이즈는 8KB)
    🟢 readLine() : 한 줄씩 읽어서 리턴(더 이상 읽을 수 없다면 null을 리턴)

실습.한글자, 두글자, n글자 출력

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;

public class ReadFileByByte {
    private String filename;

    public ReadFileByByte(String filename) {
        this.filename = filename;
    }

    char readOneByte() throws IOException {
        BufferedReader br = new BufferedReader(
                new FileReader(filename),
                16 * 1024
        );
        return (char)br.read();
    }

    String readTwoByte() throws IOException {
        BufferedReader br = new BufferedReader(
                new FileReader(filename),
                16 * 1024
        );
        String nByte = br.readLine();

        int n = 2;

        if (nByte.length() < n){
            n = nByte.length();
        }

        return nByte.substring(0,n);
    }

    String readNByte(int n) throws IOException {
        BufferedReader br = new BufferedReader(
                new FileReader(filename),
                16 * 1024
        );
        String nByte = br.readLine();

        if (nByte.length() < n){
            n = nByte.length();
        }

        return nByte.substring(0,n);
    }
}

🟢 효율적으로 파일을 읽기 위해 BufferedReader 사용
🟢 한글자를 읽어올 때는 read사용
🟢 두글자, N글자는 readLine사용(N글자를 읽어올 때는 N이 한줄의 크기보다 클 수 있기 때문에 처리해줌)

실습.한줄, N줄 출력

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ReadLine {
    private String filename;

    public ReadLine(String filename) {
        this.filename = filename;
    }

    public String readOneLine() throws IOException {
        BufferedReader br = new BufferedReader(
                new FileReader(filename),
                16 * 1024
        );
        return br.readLine();
    }

    public List<String> readNLine(int n) throws IOException {
        BufferedReader br = new BufferedReader(
                new FileReader(filename),
                16 * 1024
        );
        List<String> strs = new ArrayList<>();

        for(int i = 0; i < n; i++){
            String str = br.readLine();
            if (str == null){
                break;
            }
            strs.add(str);
        }

        return strs;
    }
}

🟢 한줄은 readLine()으로 리턴
🟢 N줄은 List를 만들어 한줄씩 넣어주고 리턴

public class ReadLineMain {
    public static void main(String[] args) throws IOException {
        ReadLine readLine = new ReadLine("c_file.txt");

        System.out.println("한줄만 읽기");
        System.out.println(readLine.readOneLine());

        List<String> strs = new ArrayList<>();
        strs = readLine.readNLine(8);

        System.out.println("\nN줄 읽기");
        for (String str : strs) {
            System.out.println(str);
        }
    }
}

🟢 N줄은 리스트 형식으로 받아서 for문을 통해 출력

0개의 댓글