21일차

5. 참조타입

public class ReferenceVariableCompareExample {
    public static void main(String[] args) {
        int[] arr1;
        int[] arr2;
        int[] arr3;

        arr1 = new int[] { 1, 2, 3 };
        arr2 = new int[] { 1, 2, 3 };
        arr3 = arr2;

        System.out.println(arr1 == arr2); //false
        System.out.println(arr2 == arr3); //true
    }
}

arr1과 arr2은 배열객체를 new로 다르게 생성해서 다른 주소를 가지고 있다.
arr3은 arr2의 객체를 대입해서 같은 주소를 가지고 있다.

이게 배열에서만 일어나느냐? 아님 모든 참조타입에서 다 이렇게 이루어진다.

5.7 String

String도 원래는 new String으로 객체를 생성했어야 했다.

String str1 = new String("hello");
String str2 = new String("hello");
String str3 = str2;

System.out.println(str1 == str2); //false
System.out.println(str2 == str3); //true

5.7.1 String-2

String은 너무 자주 사용해서 생략을 할 수 있게 되었다.

public class C02String {
    public static void main(String[] args) {

        String str1 = new String("java");
        String str2 = "java";
        String str3 = "java";

        System.out.println(str2 == str3); //true
        System.out.println(str1 == str2); //false

        System.out.println(str1.equals(str2));  //true
        System.out.println(str2.equals(str3)); //true
    }
}

기본타입 처럼 사용할 수 있게해서 new를 제거하고 리터럴을 입력하면 같은 주소를 참조한다.
그래서 값만 비교할때는 eqauls메소드를 사용해야한다.
변수를 저장하는 영역은 Stack이라는 영역이고
참조변수를 저장하는 영역은 Heap이라는 영역에 저장된다.

5.7.2 null

변수는 있는데 참조하지 않고 있는 경우가 있다.

public class C01Null {
    public static void main(String[] args) {
        int[] arr1 = new int[] {1,2};
        arr1 = null; //참조하는 객체가 없음
        //null이라는 값으로 덮어씌운 것임
        //int[] {1,2};이 배열은 참조할 수없는 쓰레기 취급을 받게된다.

        //참조하는 객체 없음 실행할때 예외 발생(NullPointerException)
        int len = arr1.length; 
        int val =  arr1[0];

        System.out.println("실행 흐름...");
    }
}

null로 덮어쓰면 이전 instance를 사용할 수 없다.
메모리를 차지하고 있는 쓰레기 객체가 된다
이것들을 청소해야하는데 JVM이 쓰레기수집가(garbae collecter)를 자동으로 실행시켜 제거한다.
신경안써도 된다.

public class GarbaeObjectExample {
    public static void main(String[] args) {
        String hobby = "여행";
        hobby = null; // "여행"에 해당하는 String 객체를 쓰레기로 만듦

        String kind1 = "자동차";
        String kind2 = kind1; // kind1 변쉥 저장되어 있는 번지를 kind2 변수에 대입
        kind1 = null; // 자동차에 해당하는 String객체는 쓰레기가 아님.
        System.out.println("kind2: " + kind2);
    }
}

5.7.3 확인문제

5.7.3.1.백준9086번

문자열을 입력으로 주면 문자열의 첫 글자와 마지막 글자를 출력하는 프로그램을 작성하기.
입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다.
각 테스트 케이스는 한 줄에 하나의 문자열이 주어진다.

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int T = Integer.parseInt(sc.nextLine());

        for (int i = 0; i < T; i++) {
            String str = sc.nextLine();

            char c1 = str.charAt(0);
            char c2 = str.charAt(str.length()-1);

            String result = c1 + "" + c2;
            System.out.println(result);
        }
    }
}

5.7.3.2 특정문자제거하기

프로그래머스 120826
문자열 my_string과 문자 letter이 매개변수로 주어집니다.
my_string에서 letter를 제거한 문자열을 return하도록
solution 함수를 완성해주세요.

public String solution(String my_string, String letter) {
    String answer =  my_string.replace(letter, "");
    return answer;
}

5.7.3.3 잘라서배열로저장하기

프로그래머스 120913
문자열 my_str과 n이 매개변수로 주어질 때,
my_str을 길이 n씩 잘라서 저장한 배열을 return하도록
solution 함수를 완성해주세요.

내풀이
public String[] solution(String my_str, int n) {
int len = 0;
int k = 0;
String str = "";

    if (my_str.length() % n == 0) {
        len = my_str.length() / n;
    } else {
        len = my_str.length() / n + 1;
    }

    String[] answer = new String[len];

    for (int i = 0, count = 0; i < len; i++, count += n) {
        if (count + n > my_str.length()) {
            str = my_str.substring(count);
        } else {
            str = my_str.substring(count, count + n);// 0~6 6 12
        }
        answer[i] = str;
    }
    return answer;
}

배열의 길이는 만약 9 개를 3으로 나누면 딱맞아서 my_str.length() / n
마지막문자가 남는다면 my_str.length() / n +1 해줌
증감식 배열의 크기만큼 도는데
0번인덱스부터 n번앞까지 자르고
0+n번 인덱스부터 n+n번까지 자르고 배열에 넣는 방식으로 품
substring메소드는 인덱스가 맞지 않으면 예외를 발생시킴.
그래서 count + n이 원본문자열의 인덱스를 넘을때는 마지막까지 다 출력하도록 인자를 하나만 넣어줌.

강사님 풀이

public String[] solution(String my_str, int n) {
    int len = my_str.length();

    int answerLength = (len - 1) / n + 1;

    String[] answer = new String[answerLength];

    int start = 0;
    int end = n;

    int i = 0;
    while (start < len) {
        if (end > len) {
            end = len;
        }

        // 부분문자열 잘라서
        String sub = my_str.substring(start, end);

        // 배열에 넣고
        answer[i++] = sub;

        // start, end 변경
        start += n;
        end += n;

    }

    return answer;
}

5.7.3.4 문자열안에문자열

프로그래머스 120908
public int solution(String str1, String str2) {
int answer = 0;
if (str1.contains(str2)){
answer = 1;
} else {
answer = 2;
}
return answer;
}

5.7.4 Split

특정 문자 패턴으로 문자열을 나누어서 배열로 리턴

public class C03Split {
    public static void main(String[] args) {
        String str1 = "hello,java,world,html,css";
        String[] arr1 = str1.split(",");

        System.out.println(arr1.length); // 5
        System.out.println(arr1[0]); // hello
        System.out.println(arr1[4]); // css

        String str2 = "spring react vue angular jsp sass";
        String[] arr2 = str2.split(" ");
        System.out.println(arr2.length); // 6
        System.out.println(arr2[0]); // spring
        System.out.println(arr2[4]); // jsp

        String str3 = "I'm ironman.";
        String[] arr3 = str3.split("");
        System.out.println(arr3.length); // 12
        System.out.println(arr3[0]); // I
        System.out.println(arr3[arr3.length -1]); //.
    }
}

5.7.4.1 확인문제

백준 1152번문제
영어 대소문자와 공백으로 이루어진 문자열이 주어진다.
이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

풀이
public class Main {
public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        String str = sc.nextLine();


        String[] strArr = str.trim().split(" ");
        if(str.equals(" ")){
            System.out.println(0);
        } else {
            System.out.println(strArr.length);
        }

        System.out.println(strArr.length);

        /*
        StringTokenizer st = new StringTokenizer(str, " ");

        System.out.println(st.countTokens());
        */
    }
}

split일때는 주어진 단어가 빈문자열일때 앞뒤를 제거하고 빈문자열을 제거하더라도 빈문자열이 배열에 들어가서 배열갯수가 세진다.
그래서빈문자열일 때 0이 출력되게 해줘야한다.
split를 사용할때 빈문자열이 들어올 가능성을 생각하고 다른 문제를 풀때 주의해야할 것 같다.

StringTokenizer은 말그대로 토큰만 뽑아내기때문에 토큰갯수를 세주면된다.

5.8 확인문제

5.8.1 7번

주어진 배열에서 최대값을 출력하는 코드

public class ex7 {
    public static void main(String[] args) {
        int[] array = {1,5,3,8,2};
        int max = array[0];
        for (int i = 0; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        System.out.println(max);
    }
}

5.8.2 9번

학생 점수 분석프로그램 최고점수 및 평균점수를 출력하는 코드
구조적 프로그램으로 짜보았다.

public class ex9 {
    public static void main(String[] args) {
        int stNum = 0;
        int[] scores = null;
        boolean run = true;

        while (run) {

            int menu = mainMenu();

            switch (menu) {
            case 1:
                stNum = inputNum();
                scores = new int[stNum];
                break;
            case 2:
                input(scores);
                break;
            case 3:
                list(scores);
                break;
            case 4:
                analyse(scores);
                break;
            case 5:
                run = quit();
                break;
            }
        }
    }

    public static int mainMenu() {
        Scanner sc = new Scanner(System.in);
        System.out.println("-------------------------------------------------------");
        System.out.println("1.학생수 | 2.점수입력 | 3. 점수리스트 | 4.분석 | 5.종료");
        System.out.println("-------------------------------------------------------");
        System.out.print("선택> ");
        int memuNum = Integer.parseInt(sc.nextLine());
        return memuNum;
    }

    public static int inputNum() {
        Scanner sc = new Scanner(System.in);
        System.out.print("학생수> ");
        int stNum = Integer.parseInt(sc.nextLine());
        return stNum;
    }

    public static void input(int[] scores) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < scores.length; i++) {
            System.out.printf("scores[%d]> ", i);
            scores[i] = Integer.parseInt(sc.nextLine());
        }
    }

    public static void list(int[] scores) {
        for (int i = 0; i < scores.length; i++) {
            System.out.printf("scores[%d]: %d\n", i, scores[i]);
        }
    }

    public static void analyse(int[] scores) {
        int total = 0;
        double avg = 0;
        int max = 0;

        for (int i = 0; i < scores.length; i++) {
            if (scores[i] > max) {
                max = scores[i];
            }
            total += scores[i];
        }
        avg = (double) total / scores.length;
        System.out.println("최고 점수: " + max);
        System.out.println("평균 점수: " + avg);
    }

    public static boolean quit() {
        System.out.println("프로그램 종료");
        return false;
    }
}

2023.02.23 후기

leetcode가입
유료사이트이고 무료문제들도 있다.
problems
정말 어려운 문제를 맞이하였을 때 풀지 못했다.
출력이 되는 모습을 미리 적어 놓고 풀고 조금씩 구현해나가면 풀 수 있는 것 같다.
천천히 풀어보려고 노력해봐야할 것 같다.

'국비 > Java' 카테고리의 다른 글

2023.02.27 23일차 Java  (0) 2023.02.27
2023.02.24 22일차 Java  (0) 2023.02.24
2023.02.22 20일차 Java  (0) 2023.02.22
2023.02.21 19일차 Java  (0) 2023.02.21
2023.02.20 18일차 Java  (0) 2023.02.20

+ Recent posts