[21.03.08~] JAVA

4day(1) _양수/음수교환, String의 split(), trim(), \\s*, next(),nextline(),문자열 비교, 증감연산자

습관그뤠잇 2021. 3. 11. 09:46

##정규표현식 \s* : regex 정규표현식으로 br같이 String regex(ctrl스페이스 눌렀을 때) 라고 뜨는 데서만 사용가능함. -br에선 가능 scanner에서 불가

코드의 모든 행에 설명 주석달아보기 _애매하게 알면 못달음,,나처럼,,

아침 문제 풀이

기본형 : 스택stack 영역에 저장

참조형 : new연산자에 의해 Heap(동적) 영역에 저장된 것(주소)을 스택영역에 가져와서 읽음
*배열, 클래스(스트링), 인터페이스

양수-음수/음수-양수 교환 코딩

x= -1x;
하면됨,,,,,

int x = 10;
x = -1*x; //하면 됨
x = -x;
  1. 아래 코딩에서 모든 틀린 부분을 찾아서 설명하세요
    System.out.println( "%d\n", 3 =! 7 );

println -> printf 형식 사용해 printf
%d\n -> %b\n 참거짓 형태로 불린 사용
3=!7 -> 3!=7 등위연산자 형태

or

System.out.println( 3 != 7 ); 이렇게 심플하게도 가능

배열array

: [동일한 자료형]을 메모리상에 [연속]적으로 놓이게 한 것

String[] names = new String[3];
names[0] = "조조";
names[1] = "wnnw";
names[2] = "주주";

선언형식 = 자료형 [] 배열명;
배열은 참조형이므로 new라는 연산자로 힙영역에 저장하고 스택영역으로 주소 참조.
배열명 = new 자료형[배열크기];

연산 우선순위

&&가 ||보다 우선인것 정도는 암기!★

단항 > 산술 > 비교 > 논리 > 삼항 > 대입

연산 우선순위 관련 문제

  1. 아래의 식이 처리되는 과정을 설명하세요
    (예) 3+5_2
    : 곱셈이 덧셈보다 우선순위가 높기에 5_2가 먼저 처리된후 3+10 이된다.

ㄱ. -x + 2 x에 음수를 띄우고 덧셈 연산
마이너스-x(단항 연산자) +(덧셈연산자)2
ㄴ. x + 3 > y - 2 좌항계산 우항 계산 후 비교연산
(산술 연산) 후 (비교 연산)
ㄷ. x > 3 && x < 5 좌항계산 우항 계산 후 둘다 참인지 확인
(산술 연산) 후 &&(논리 연산)
ㄹ. result = x + y * 3 : y*3을 수행한 후 x를 더함
대입연산자는 제일 나중.
ㅁ. x < -1 || x > 3 && x < 5
x > 3 && x < 5 양 쪽이 모두 참인지 확인한 후 x<-1과 확인한 값중 둘중 하나라도 참이면 참

short circuit으로 뒤에는 확인x
가독성을 위해 x < -1 ||( x > 3 && x < 5 ) 치기도 함(근데 거의 안침)

String 함수의 split() 함수

String [] values = value.split(","); //콤마로 잘라내겠다(다른 것도 가능)
name = values[0];
 //아래는 String -> int로 형변환해야함
kor = Integer.parseInt(values[1].trim() ); // 문자열의 공백 제거
  1. 기능: 문자열을 잘라내는 함수
  2. 매개변수: 잘라내기 위한 구분자(뭐로 잘라낼건지?)
  3. 리턴값(리턴자료형) : String []

regex = 정규표현식

package days04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/**
 * @author 조은주
 * @date 2021. 3. 11 - 오전 10:37:08
 * @subject 4일-1번 : String의 split 기능
 * @content String [] values = value.split(",")
 *                    콤마를 구분자로 split하겠다!
 */
public class Ex01 {
    public static void main(String[] args) throws IOException  {

        //이름,국어,영어,수학 받아서 총점, 평균까지 출력
         String name;
         int kor, eng, mat, tot;
         double avg;

        System.out.printf("> 이름, 국어, 영어, 수학 입력하세요.");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String value = br.readLine();
        //빨간밑줄: 예외처리 클릭

        // 조은주,80,90,85

        // => 통째로 입력한 값이 하나의 "문자열"
        //"조은주" "80" "90" "85" 콤마로 구분한다면
        //String 클래스 안에 split() 함수(메서드)가 있음 [잘라내겠다]
        // (기능), 매개변수, 리턴값 알아야 제대로 씀
        //System.err.println("> 입력값: " + value);

        String [] values = value.split(","); //배열
          //아래 따로 된 코드블럭확인( \\s* 관련)

        //split 잘 되는지 확인해봄
//        System.out.println(values[0]); //얘도 스트링 ->name에 저장
//        System.out.println(values[1]); //얘도 밑에도 다 스트링 _int로 형변환해서 ->kor
//        System.out.println(values[2]);
//        System.out.println(values[3]);

        name = values[0];
      //String -> int로 형변환해야함
        kor = Integer.parseInt(values[1].trim() ); // 문자열의 공백 제거
        eng = Integer.parseInt(values[2].trim() ); 
        mat = Integer.parseInt(values[3].trim() );

//        kor = Integer.parseInt(values[1]); //String -> int로 형변환
//        eng = Integer.parseInt(values[2]);
//        mat = Integer.parseInt(values[3]);

        tot = kor + eng + mat;
        avg = (double) tot /3;

        System.out.println(">이름: "+ name); 
        System.out.println(">국어: "+kor) ; 
        System.out.println(">영어: "+eng ); 
        System.out.println(">수학: "+mat ); 
        System.out.println(">총계: "+tot ); 
        System.out.println(">평균: "+avg ); 

        //홍길동 ,   90, 80, 77 -> 사이사이에 콤마 외에 공백주면 에러발생
        //String은 상관없지만 parseInt에 공백있으면 안됨
        //ERR: Exception in thread "main" java.lang.NumberFormatException: For input string: "   90"


    }//main
}//class

String - trim()

앞뒤 공백 제거한 문자열을 돌려줌

System.out.print( "이 안에서 출력할거 쓰고 ".trim() );

package days04;

/**
 * @author 조은주
 * @date 2021. 3. 11 - 오전 11:14:52
 * @subject 4일-2번 : 에러방지-공백 제거하는 코딩 trim()
 * @content    String 클래스 내의 trim()
 *
 */
public class Ex02 {

    public static void main(String[] args) {

        //String 클래스 내에 split()
        //String 클래스 trim() => 앞뒤 공백 제거한 문자열을 돌려줌 
        System.out.println("["+"    90    ".trim() +"]");

        //[결과] : [90]

    }

}

\s*

여러 문자열을 입력하며 필요없는 공백 입력으로 생기는 오류를 없애자

String [] values = value.split(","); //콤마를 구분자로 사용하는 split()
String [] values = value.split("\\s*,\\s*"); 
        //trim 보다 더 간결하게 표현가능(더 좋은 코딩)
        //    \\s 공백(space)이 * zero or more times 있어도 된다

\s 왜 두개지? _ '특수문자 표현법' _57p

carriage return : \r

역슬래쉬(\): \\

        String path = "C:\\Program Files\\Java\\jdk1.8.0_281";
        // 역슬래쉬 \t, \n를 표현하듯 역슬래쉬(\) 문자 표현을 위해 두개 찍힘 

scanner next(), nextline(), nextInt() 차이

[표준입출력] nextInt(), nextLine() 차이

int, double, String을 순서대로 입력받은 다음에, String, Double, int 순으로 다시 출력하는 문제
https://developer-alle.tistory.com/213
관련 예시 정리된 블로그.
추가로 참고할 것.

문자열(내용) 비교 (v1.equals(v2)) _ == 연산자 사용 못함!

'==' 연산자 -> 가리키는 주소를 비교하는 거라서 잘못된 값이 나옴

**s1변수와 s2변수 (둘다 String) 같은 값을 담는가? 비교시
**

->** s1.equals(s2)**

public class Ex03 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        //두 문자열 비교

        String s1 = "홍길동";
        String s2;

        //키보드로부터 문자열을 입력받아 s2라는 변수에 저장
        //s1과 s2 동일한지 비교해 boolean값찍기

        Scanner scanner = new Scanner(System.in);

        System.out.println("> 이름을 입력하세요 ");
        s2 = scanner.next();

        System.out.println(s1 == s2);        // 같아도 달라도 false도출
        //464p
        // == 연산자 : 주소를 비교하는 거라서

        System.out.println(s1.equals(s2));

scanner 가 더 편한데 수업에서 BufferedReader 쓴 이유

I/O, stream 할 때 익숙해지라규,,

단항연산자 中 '증감연산자' ++ --

어떤 기억공간의 값을 1 증가 시키거나 1 감소시키고 싶을 때.

[증감연산자] ++ --

93p

int x = 10;

기억공간 1 증가시키는 4가지 방법

x = x+1;
x +=1;  //+= 복합대입연산자
x++; //후위형 증감연산자
++x; //전위형 증감연산자

**'+=' 복합대입연산자 **
: 변수명이 길어지거나 한다면 훨씬 더 간결하고 짧은 코딩

x += n;        // x = x + 10
x -= n;        // x = x - 10
x *= n;          //  x = x * 10
x /= 10;       //   x = x / 10

전위형과 후위형의 차이점 ***