intellij 디버깅

break point에 우클릭하면 조건으로 break를 걸 수가 있다.

(productId가 2L일때만 위 point에서 break가 되도록 지정)

특히나 for, while등의 반복적인 행위속에, 특정값이 들어올때만 break를 하고 싶은 때가 있다.
이때 정말 유용하게 사용할 수 있는 기능이다.

https://jojoldu.tistory.com/149

숫자와 문자열을 차례로 입력받을 때 주의

Scanner sc = new Scanner(System.in);
        
int num = sc.nextInt();
sc.nextLine();
String str = sc.nextLine();
        
System.out.printf("num : %d  str : %s ",num,str);

위의 예제는 한개의 int형 데이터와 한개의 string형 데이터를
키보드로 입력받는 예제이다.
그런데 4째줄의 sc.nextLine(); 을 제거하고 실행해보면
정수형 데이터를 키보드로 타이핑하자마자 입력이 완료되어 버린다.
예를 들어 7을 입력했다 치면 7 + Enter 가 키보드로 입력받게 되었고
7은 sc.nextInt 메소드의 호출을 통해 읽혀진다. 하지만 enter는 여전히
읽혀지지 않은 상태로 남아있게 된다. 이렇게 남아있는 enter는 보통
문제가 되지 않지만 다음에 nextLine이 온다면 문자열의 입력을 그냥 완료해
버린다.
그렇기 때문에 위와 같은 sc.nextLine(); 으로 enter의 입력을 강제로
완료해야 한다.

Scanner 클래스의 next() 와 nextLine() 메소드

public class ScannerExample2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("문자열입력: ");
        String str1 = scanner.nextLine();
        System.out.println(str1);
        
        System.out.println("문자열입력: ");
        String str2 = scanner.next();
        System.out.println(str2);
    }
}


위에서 보다시피 next() 메소드는 안녕하세요만 리턴한걸 알수 있다. nextLine()과 next()메소드의 차이는 nextLine()메소드는 Enter를 치기 전까지 쓴 문자열을 모두 리턴한다는 것이고 next() 메소드는 스페이스 즉 공백 전까지 입력받은 문자열을 리턴한다는 것이다. 그래서 공백이 있는 문자열 한줄을 리턴받고 싶으면 nextLine() 메소드를 사용하고 그냥 한 단어만 쓰고 싶다면 next()를 쓰는거지만 nextLine()을 써도 상관없다. 하지만 이것 때문에 치명적인 논리적 오류가 발생한다. 다음 예제를 보자

public class ScannerExample2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("첫번째 정수입력: ");
        int i = scanner.nextInt();
        System.out.println(i);
        
        System.out.println("첫번째 문자열입력: ");
        String str1 = scanner.nextLine();
        System.out.println(str1);
        
        System.out.println("두번째 정수입력: ");
        int j = scanner.nextInt();
        System.out.println(i);
        
        System.out.println("두번째 문자열입력: ");
        String str2 = scanner.next();
        System.out.println(str2);
    }
}

nextInt() 메소드 다음에 nextLine() 메소드를 실행하려고 할때 nextLine()메소드가 그냥 넘어가버리는 오류가 생겨난다. 이 이유는 nextInt()메소드를 실행 할 때 20을 콘솔에 입력하고 엔터를 누를때 20을 리턴시켰지만 Enter값은 그대로 남아있다. nextLine() 메소드는 Enter값을 기준으로 메소드를 종료시키기 때문에 nextLine()메소드가 실행될 때 남아있는 Enter값을 그대로 읽어 바로 종료된 것이다. 그래서 첫번째 문자열입력: 이 넘어가고 두번째 정수입력: 이 출력된 것이다.

만약 정수를 입력하고 그다음 문자를 입력하려고 할 때 next() 메소드를 사용하여야 한다. 아니면 위에 nextLine()메소드를 한번더 써줘서 enter값을 없애줘야한다.

Character 클래스의 메소드

문자를 대문자로 바꾸는 경우

char t;
t = 'a';
t = Character.toUpperCase(t); // 문자를 대문자로 바꾸기

Character.isLowerCase(t); // 문자가 소문자인지 확인

String 클래스의 메소드

str.charAt(i) // str의 i번째 문자에 접근

특징

  • +연산으로 이어붙이기가 가능하다.
String answer = "";
answer += 'a';		// answer-> a
answer += "bc";		// answer-> abc

향상된 for문에 String을 이용하는 방법

향상된 for문에는 배열이나 iterator를 제공하는 Collection(ArrayList, List등)이 와야한다. String이 나올 수 없다. 따라서 String을 문자의 배열로 바꾸어주어야한다. String의 toCharArray()메소드를 사용하면 해당 문자열을 문자 배열로 바꿔서 리턴해준다. 원본에 영향을 주지 않는다. 즉, 원본은 수정되지 않는다.

String str = "abc";
for (char ch : str.toCharArray()){
            if (ch == 'a')
                count++;
        }
profile
정팔입니다.

0개의 댓글