4day(1) _양수/음수교환, String의 split(), trim(), \\s*, next(),nextline(),문자열 비교, 증감연산자
##정규표현식 \s* : regex 정규표현식으로 br같이 String regex(ctrl스페이스 눌렀을 때) 라고 뜨는 데서만 사용가능함. -br에선 가능 scanner에서 불가
코드의 모든 행에 설명 주석달아보기 _애매하게 알면 못달음,,나처럼,,
아침 문제 풀이
기본형 : 스택stack 영역에 저장
참조형 : new연산자에 의해 Heap(동적) 영역에 저장된 것(주소)을 스택영역에 가져와서 읽음
*배열, 클래스(스트링), 인터페이스
양수-음수/음수-양수 교환 코딩
x= -1x;
하면됨,,,,,
int x = 10;
x = -1*x; //하면 됨
x = -x;
- 아래 코딩에서 모든 틀린 부분을 찾아서 설명하세요
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 자료형[배열크기];
연산 우선순위
&&가 ||보다 우선인것 정도는 암기!★
단항 > 산술 > 비교 > 논리 > 삼항 > 대입
연산 우선순위 관련 문제
- 아래의 식이 처리되는 과정을 설명하세요
(예) 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() ); // 문자열의 공백 제거
- 기능: 문자열을 잘라내는 함수
- 매개변수: 잘라내기 위한 구분자(뭐로 잘라낼건지?)
- 리턴값(리턴자료형) : 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