3day _Integer.toBinaryString(i), 로컬변수, Interger.클래스, 형변환, 연산자, 배열(개요)
* 클래스 등 이름 바꿀 때 : 마우스오른쪽 - refactor - rename에서 바꾸기
* ctrl + shift + o : 필요한 import 문 자동추가됨
* br.readLine() 등 ctrl + 스페이스로 자동완성해야 위에 import문 자동추가됨
* String.ValueOf() 안써도 7+""하면 간단히 스트링 변환됨!
<함수(메서드)를 사용할 때 알아야할 3가지> _ 1기능 2매개변수 3리턴값(리턴자료형)
1. 어떤 기능을 하는 함수
2. 필요한 것(인자, 인수, 파라미터, 매개변수)
예) ㅇㅇㅇ한테 심부름 가정(커피값, 커피이름)-args(argument의 줄임말)
실명인증 필요(이름, 주민등록번호)
3. 리턴값(리턴자료형) - 커피 다시 갖다줘야됨
main(String[] args)함수
1. java.exe
Hello -> main
2. String [] args -> 메인함수의 매개변수
//String[] 배열(배열명 args)이 매개변수입니다.
3. void 리턴자료형
리턴값x -> void
Integer.toBinaryString(i)
: int 10진수 정수값을 2진수로 변환하는 함수
Integer.toBinaryString(i) : i 자리에 int 값이 들어가야함
System.out.println(Integer.toBinaryString(i));
로컬변수
Local variable(로컬변수, 지역변수) : 그 영역안에서만 사용되는 변수
{ int a = 10;
}
System.out.println(a);
-> 이런 경우 a 가 범주 벗어나서 에러 발생
(a cannot be resolved to a variable)
5. int x = 10, y = 20; 두 기억공간의 값을 교환해서 출력하는 코딩을 하세요.
temp는 저 연산에서만 사용되고 사용되지 않을 것이므로 지역변수로 범주화해서 코딩하는게 더 경제성있음
[I]nteger 클래스(물건,객체,개체,object)설명
int의 최대값 출력하라
int= 4byte 2^32승 /2 = 2^31(양수) - 1(0빼는거)
Integer클래스
기본형 int를 사용하기 편리하도록 기능(함수), 속성을 정의(구현)한 클래스
- Integer 클래스 안에 16진수로, 8진수로 변환해주는 기능이 있음
wrapper 클래스(각 기본형의 wrapper 클래스가 존재) _ [I]nteger 같은!
long(기본형long)을 쉽게 쓰게 해주는 wrapper 클래스 = Long
boolean Boolean도 마찬가지
/*
* int max = 2^31-1;
* System.out.println(max);
*/
// ^비트연산자랑 -뺄셈연산자로 (의도와 다르게) 계산해서 에러는 안남
int max = Integer.MAX_VALUE; //final(상수)& 최대값구하는 툴
int min = Interger.MIN_VALUE //최소값 구하는 툴
System.out.println(max);
패키지
패키지 ; 서로 관련된 클래스들의 묶음.
클래스의 실제이름(full name); 패키지명을 포함함
예) String 클래스: java.lang.String
▶ 하나의 소스파일에는 첫문장의 패키지 하나만을 선언
▶ 모든 클래스는 반드시 하나의 패키지에 속해야 함
▶ 패키지는 점(.)을 구분자로 하여 계층구조로 형성
▶ 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리.
11. 이름을 키보드로 입력받아서 출력하는 전체 코딩을 하세요.
[입력형식]
이름을 입력하세요 ? 홍길동
[출력형식]
이름은 "홍길동" 입니다.
-> 이런 형식으로 입력하는거 자주 출제되니 연습해두는게 좋음
printf()형식
%[arguement_index$][flags][width][.precision]conversion
index = 1$
flags = 0
width =4
.precision = .2
conversion = d, c, s 등
여러개 쓰는거, 플래그, 길이(너비), 소수점 이하 정확도
.parse 기본형
parseInt() : 문자열(String) -> 정수로 바꾸는 함수
parse: 해당 문자열이 꼭 '숫자'로만 되어 있어야 함
parse를 뭐할 때 쓰드라...?
<먼저 parseInt()의 기능은 String타입의 숫자를 int타입으로 변환해주는 녀석이다.
이게 왜 필요한가 궁금할 수도 있는데
예를 들자면 이런 경우가 있을 수 있다.
예시1)
String number1 = new String("1234");
String number2 = new String("4321");
System.out.println(number1 + number2);
이런 예시가 있다고 생각해보자.
일단 결과를 출력하면 12344321이라고 출력이 될 것이다.
원래라면 숫자 2개를 + 연산을 했으니 당연히 1234 + 4321이 되어
결과가 5555가 출력되어야 한다고 생각할 수 있겠지만
현재 number1과 number2의 타입은 숫자 타입이 아니라 String, 즉, 문자열 타입이기 때문에
- 연산을 사용하면 계산이 아니라 단순히 문자열을 연결해주는 것 밖에 되지 않는다.
따라서 1234라는 문자열 뒤에 4321이라는 문자열을 연결시켜 출력하는 것이다.
그렇담 여기에서 number1과 number2를 숫자 타입으로 바꿔서 결과가 5555가 나오게 할 순 없을까?
그래서 등장한 것이 바로 parseInt()라는 녀석이다.
아니 애초에 처음부터 int타입으로 숫자를 저장하면 되는거 아니냐라고 할 수도 있겠지만
의외로 저런 문자열로 숫자를 입력하는 경우가 꽤 발생하기 때문에
이 녀석이 등장하게 되었고 또 우리들도 앞으로 자주 사용하게 될 것이다.>
출처: https://colossus-java-practice.tistory.com/32
byte x - Byte.parseByte(문자열); //문자열 -> byte
Integer.parseInt() //문자열 -> int
Boolean.parseBoolean() //문자열 -> boolean
Double.parseDouble() //문자열 -> double
BufferedReader 함수는 string만 담을 수 있음
-> String으로 입력받은 값을 int등의 정수로 바꿔주어야 하기 때문에 변환
import문 자동추가
- 'ctrl + 스페이스'로 자동완성해야 위에 import문 자동추가됨
- **ctrl + shift + o **: 필요한 import 문 자동추가됨 (혹시 빠졌나 싶을 때나 확인용)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
"BufferedReader"(2Day 다시 참고)
▶Scanner : 통해 입력을 받을경우 Space Enter를 모두 경계로 인식.
▶BufferedReader : Enter만 경계로 인식, 받은 데이터가 String으로 고정. Scanner에 비해 다소 사용하기 불편하지만 많은 양의 데이터를 입력받을경우 BufferedReader로 입력받는 것이 효율적
- 작업속도에 차이가 많이난다. ( 알고리즘의 효율성 검사에 유리1. readLine() 리턴값은 String으로 고정(다른타입으로 입력을 받을려면 형변환 필요)
- 예외처리를 꼭 해주어야한다.(보편적으로 throws IOException을 통하여 예외처리)
(try & catch를 활용하여 예외처리 또한 가능))
출처: https://machine-geon.tistory.com/79
★ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 활용문
이거 다하면 1,2일차부터 다 따라왔다고 할만큼 중요!
package days03;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author 조은주
* @date 2021. 3. 10 - 오전 11:19:50
* @subject 3일-2번
* @content 키보드로 입력받아 결과 출력하기 예시
*BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
*활용문
*이거 다하면 1,2일차부터 다 따라왔다고 할만큼 중요!
*/
public class Ex02 {
public static void main(String[] args) throws IOException {
String name;
byte kor, eng, mat;
short tot;
double avg;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//이름용 망치, 국어용 망치 따로 만들필요 없음 이거 하나로!
System.out.println("1. 이름 입력하세요? ");
name = br.readLine(); //왼쪽 오류 더블클릭해서 throw IOEx- 추가
//String을 입력받아 출력할 때\[기본형태\]
System.out.println("2. 국어 입력하세요? ");
kor = Byte.parseByte(br.readLine());
//입력받은 문자열(스트링) 값을 바이트로 변환
//자료형 배우는 중이라 Byte로 선언 후 연습
System.out.println("3. 영어 입력하세요? ");
eng = Byte.parseByte(br.readLine());
System.out.println("4. 수학 입력하세요? ");
mat = Byte.parseByte(br.readLine());
tot = (short) (kor + eng + mat);
avg = (double) tot / 3;
System.out.printf("> 이름: %s, 국어: %d, 영어: %d, 수학:%d \n, 총점:%d \n, 평균:%.2f \n", name, kor, eng, mat, tot, avg);
}
}
//[결과]
// > 이름: 조은주, 국어: 100, 영어: 90, 수학:80,
// 총점:270,
// 평균:90.00
Scanner scanner = new Scanner(System.in); 예시
package days03;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
/**
* @author 조은주
* @date 2021. 3. 10 - 오전 11:19:50
* @subject 3일-2번 : br(BufferedRead) - >Scanner 클래스로 변환
* @content Scanner 관련 정석책 p40
*
*/
public class Ex02_03 {
public static void main(String[] args) throws IOException {
//Console은 이클립스에서 사용 불가하므로, Scanner 클래스 사용
//[문제]
//입력: 이름, 국어, 영어, 수학성적
//출력: 총점, 평균
String name;
byte kor, eng, mat;
short tot;
double avg;
// scann -> 대소문자 구분없이 쓰고, ctrl +space. 뒤에도 한칸띄고 뭐 치지말고 ctrl+space로 타이핑하면 됨 다
Scanner scanner = new Scanner(System.in);
System.out.print("> 이름 국어 영어 수학을 입력하세요 ?");
name = scanner.next();
kor = scanner.nextByte();
eng = scanner.nextByte();
mat = scanner.nextByte();
//입력할 때 콤마 구분자X
//scanner 기본 구분자 = space (공백)
//입력부(이름 국어 영어 수학 - 한번에 입력받고 엔터로가 좋음 -> 나중에)
tot = (short) (kor + eng + mat);
avg = (double) tot / 3;
System.out.printf("> 이름: %s, 국어: %d, 영어: %d, 수학:%d \n, 총점:%d \n, 평균:%.2f \n", name, kor, eng, mat, tot, avg);
}//main
}//class
평균 등 구할 때 유의 (int값으로 나누기/, 나머지% double값 구할 때)
tot = (short) (kor + eng + mat);
// short = int; 인 상황
//(캐스트 연산자)(이걸 최우선으로 처리해라 - 전부다 연산한 값으로! 캐스트 해야함 ) = () 각각 다른 의미
//ERR: Type mismatch: cannot convert from [int] to short
//Ex02_02 , 교재 29쪽 (상단 왜냐하면~)참고
avg = (double) tot / 3;
// tot/ 3 = short / int = int
// 10(short) / 3(int) = 3.3333 이라도 s/i = int가 나옴
// ->3 정수값만 돌려줌 거기에 실수처리 하니 n.00
//앞에든 뒤에든 double처리해라 (3.0과목이라고는 잘 안하니 앞에 걍)
실수의 2진수 변환
: 정수는 2로 나눴다면, 실수는 2를 곱해서 정수 자리를 뗀값에서 계속 나누는 것 반복 해 소수점 이하가 0값이 될때까지 반복함
▶실수는 double을 주로 쓰지만(정밀도가 높아서) 더블 또한 오차가 있다는 것 정도! 알아두기
(double) (long) 등 더 캐스팅할 때 유의 (위에 이어서)
long l =(long) i + j;
//대입연산자: 우측항 먼저 연산. int+int = int
넘친 int 값을 long에 담아봤자 애초에 잘못된 값..
//이럴 때 i나 j를 강제형변환 long+int = long
(long)(i+j)랑 (long) i +j 차이 ★
->전자는 (i+j)를 우선 처리 후 long 캐스팅하는것이므로
잘못되버린 값에 캐스팅하는 것. long 씌워도 의미없게 됨
표현범주를 벗어나게 연산했을 때(오버플로우)
: 에러가 나는 것이 아니라 오버플로우로 음수(잘못된 값)이 나옴.
int i = Integer.MAX_VALUE;
int j = 100;
long l =(long) i + j;
//대입연산자: 우측항 먼저 연산. int+int = int : 넘친 int 값을 long에 담아봤자 애초에 잘못된 값..
//이럴 때 i나 j를 강제형변환 long+int = long
System.out.printf("%d + %d = %d \n", i, j, l);
//2147483647 + 100 = -2147483549
//표현범주 넘치니(오버플로우) 음수가 나와버림..
//오버플로우든 언더플로우든 에러가 나는게 아니고 잘못된 값이 나와버림
도움말 참고할 때
file:///C:/class/download/1.%20JDK/jdk-8u281-docs-all/docs/api/index.html
Java api doc -scanner class를 찾는다면?
스캐너가 어떤 패키지인지 기억안날때
: scanner 치고 ctrl +스페이스 하면 위에 임포트문 뜨니까 그거 보고 가면됨
ctrl+ f 해도 대충 가긴하는거 같음
형변환 : Str -> i, Str ->불린
자동 형변환 : 더 큰 자료형에 변수를 할당하면 자동으로 자료형 변환
int a = 5; long d = a; // long = int [][][][][][][][] = [][][][] 더 큰 자료형에 변수 할당하면 자동으로 자료형 변환 long b = 7; = 대입(할당) 연산자 우측항의 값을 좌측항(변수)에 할당(대입) 좌측항 = 우측항 우측항 먼저 연산 int a + long b = long [][][][] [][][][][][][][] 작은 자료형 + 큰자료형 연산 => 자동으로 형변환 되어 큰 자료형long으로 출력 long c = a+b; System.out.printf("%d + %d = %d",` a, b, c);
강제 형변환 - 더 작은 자료형에 할당할 때. [cast 연산자] 강제 형변환
float f = 3.14; //기본적으로 숫자는 int(정수)와 double(실수)로 인식함 //ERR: Type mismatch: cannot convert from double to float 좌측(float)보다 우측(double)이 더 커서 자동형변환X > 해결 1: float f = 3.14f; ->형변환은 아님(float임을 보여주는 표기법일 뿐) > 해결 2: float f = (float) 3.14;
정수형/실수형 변수의 선택기준
byte나 short을 쓰면 메모리 절약을 할 수는 있지만, 범위가 작아 잘못된 값을 얻기 쉬움.
-> 정수형은 int 사용!
float가 더 가볍긴하지만 정밀도를 높이고 싶다면
-> 실수형은 double 사용!
(double도 오차는 존재할 수 있음)
2-6
패턴 : 정규표현식
밑에를 패턴으로 쓰겠단 소리
String input = "1 fish 2 fish red fish blue fish";
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
//delimiter : 구분자(설정 안하면 기본=스페이스)
//스캐너는 반드시 닫아야함.(밑에 s.close();가 관련문)
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
s.close();
/*결과값
1
2
red
blue */
\\s : 공백 space
'\*' 반복횟수 zero~여러개(무한대)까지 가능 (콤마처럼 잘라내는 구분자 기능)
fish라는 문자
\\s : 공백 space
- : 반복횟수 zero~여러개(무한대)
// scanner : system.in도 되지만 new file도 string도 가능
//delimiter : 구분자(설정 안하면 기본=스페이스)
연산자
연산자operator: 연산을 수행하는 기호(+. /등)
피연산자operand : 연산이 되는 작업대상(변수, 상수, 리터럴, 수식)
연산자의 기능별 분류
대입연산자
x = 3;
Lvalue : Leftvalue. 왼쪽 피연산자(x)
Rvalue : Rightvalue. 오른쪽 피연산자(3)
산술연산자
- * /
산술연산자 주의사항*
/나누기나 %나머지 구할 때 정수를 '0'으로 나누기 하거나 나머지 구하면 오류나거나 에러 생김
/* 정수 나눗셈*/
System.out.println(3 / 0);ccccccc
//ERR: Exception in thread "main" java.lang.ArithmeticException: / by zero
//at days03.Ex07.main(Ex07.java:36)
//에러난다.
/* 실수 나눗셈 */
System.out.println(3.14 / 0);
//[결과] Infinity (라는 리터럴값이 나옴)
System.out.println(3.14 % 0);
//[결과] NaN (Not a Number라는 리터럴값이 나옴)
x = x + 1;
//우측 먼저 계산해서(x에 1을 더해서) 왼쪽 x 기억공간에 할당하겠다.
몫 연산자, 나누기 연산자
System.out.println(3 *5); //15
System.out.println(3 / 5); //int/int = int(0)정수값으로 나옴
// 몫 연산자라고 흔히 함. 3.54면 결과로 몫 3이 나오니까
System.out.println(3%5); //나머지 연산자(%)
비교연산자
< >= <= == !=
-결과 값으로 boolean이 나옴. true or false
System.out.println(4 == 5); //주의 ==
//급히 치다보면 두 수가 같냐고 했는데 =칠수도 있음
//System.out.println(4 = 5);
//ERR: The left-hand side of an assignment must be a variable
//왼쪽편은 변수여야 한다. 대입연산자이기 때문에 우측항을 왼쪽항에 저장하려면 변수가 있어야 함
System.out.println(4 != 5); // 주의 != (=!아님)
논리연산자
- 일반 논리 연산자
ㄱ. 일반 논리 AND 연산자 - && (논리곱 연산자) (1x1만 1이니까)
: '둘다 참일 때'만 참이 나옴.
true && true =>true
true && false =>false
false && false =>false
false && true =>false
System.out.println( 13<5 && 15>4); //false
//각 연산에 굳이 ()안해도 된다는건 논리연산자가 비교보다 우선순위가 낮다는 뜻
ㄴ. 일반 논리 OR 논리 연산자 - || (논리합 연산자)
: '둘 중 하나라도 참'일 때 참
true && true =>true
true && false =>true
false && false =>true
false && true =>false
System.out.println( 13>5 || 15<4); //true
ㄷ. 부정(NOT) 연산자 - !
//not 붙여서 반대로 바꾸거나 부정해서 연산에 사용하겠다
!true = false
!false = true
- 비트 논리 연산자
ㄱ. 비트논리 AND 연산자 - &
System.out.println(10 & 5);
10 이진수로 = 0000 1010
4 이진수로 = 0000 0100
0000 0000
ㄴ. 비트논리 OR 연산자 - |
System.out.println(10 | 5);
10 이진수로 = 0000 1010
4 이진수로 = 0000 0100
0000 1110
ㄷ. 비트 부정 연산자 - ~ (틸드 연산자)
System.out.println(~10); //\[결과\] -11
byte var 1 = 10;
byte var2 = ~var1; //컴파일 에러
->
byte var1 = 10;
int var2 = ~var1;
//이렇게 변경해야 합니다.<출처:https://m.blog.naver.com/PostView.nhn?blogId=rain483&logNo=220569934074&proxyReferer=https:%2F%2Fwww.google.com%2F>
// ~0000 1010
** 1111 0101** ->이거에 2의 보수법
=> -11
효율적인 연산(short circuit evaluation) 의미
: 짧게 회로(노선)를 평가하는 것. 하나만 참이면 되는 연산이라면 앞의 값에서 판단이 서면 뒤의 값은 계산하지 않음.
System.out.println( 13<5 && 15>4); //false
-> 둘다 참이어야 하는데 앞이 거짓이면 뒤에 연산안하고(처리 자체가 안됨) 넘어감 ★
ㄹ. XOR 연산자 - ^
eXclusive OR 연산자(XOR)여서 비트논리에만 있어서 비트 굳이 안씀
exclusive = 배타적인.
0,1 두 값이 '서로 다를 때' 참이다.
단항 연산자
++ -- + - ~ ! (type) [] .
[] 인덱스index 연산자 ★★★★★
String[] args에 있던 것 //String[] 배열(배열명 args)이 매개변수
//한 학생의 국어점수를 저장할 변수를 선언하세요.
int kor;
//세 학생의 국어점수를 저장할 변수를 선언하세요.
int kor1, kor2, kor3;
//5만명 학생의 국어점수를 저장할 변수를 선언하세요.
int kor1, ko2, ... ,kor50000;
배열array
배열을 182쪽.. 담에 일주일정도 배움 엄청 중요함
▶배열의 정의: 동일한 자료형 + 메모리상에 연속적으로 놓이게 한 것
▶배열 선언 형식: 자료형 [] 배열명;(변수명이라고 해도됨(더 포괄적))
(자료형 배열명[]도 가능하나 일단 위에 것 자주 쓰니 기억)
int [] kors; // kors = 배열명
kors = new int[5(=배열크기)];
배열명[첨자값]
kors[0] = 첫번째 자리. 0:첨자(index값). 기억공간 주소 지명
▶heap 영역 = 동적 메모리 영역(실제 기억 공간 할당)
▶stack 영역 = 힙영역에서 주소값을 참조해 옴
표 91쪽 연산순서
내일 문제
scanner로, br로 두개 다 작성하기
index 연산자
이외에도 일반논리연산자 종류별 설명
코딩 결과물 뭐나올까요 이런거
서술, 단답하는거 많을 듯