1. 3일차 수업 복습 문제
1) 일반 논리 연산자 중 우선순위가 높은 순서 : ! > && > ||
2) 연산자를 사용해서 수식으로 나타내세요.
ㄱ. 1) ch 문자는 대문자('A' ~ 'Z')이다.
'A' <= ch && ch <= 'Z'
65 <= ch && ch <= 90
ㄴ. ch 문자는 숫자('0' ~ '9')이다.
'0' <= ch && ch <= '9'
48 <= ch <= 57 [문자코드 값이 48이라서 가능]
// 0 정수
// '0'문자 -> ASCII(문자코드) 48 정수
// '1'문자 -> ASCII(문자코드) 49 정수
// '2'문자 -> ASCII(문자코드) 50 정수
ㄷ. x는 15보다 같거나 크고, 40보다 같거나 작다.
x > = 15 && x <= 40
ㄹ. x는 2의 배수 또는 3의 배수이다.
(x % 2 == 0) || (x % 3 == 0) > 가독성 굳
x % 2 == 0 || x % 3 == 0 > 성능 굳
// 어떤 정수의 배수 > x를 2로 나누어서 떨어진다.== 나머지 0
2. 출력서식 형식
출력서식 형식 : %[argument_index$][flags][width][.precision]conversion
+ %conversion > %c %b %f %e %t %s %d 등등
+ %[.precision]conversion
% .2 f > 소수점 2자리 출력
+ %[width][.precision]conversion
% 10 .2 f > 총자리수 10자리를 잡고 우측으로 정렬, 소수점 2자리까지 출력
+ %[flags]conversion
% # d
% ( d
% , d
% 0 d
+ %[argument_index$]
% 1$
출력서식 형식 ex)
String name = "홍길동";
System.out.printf("%1$s\n%1$s\n%1$s\n", name);
// 결과
// 홍길동홍길동홍길동
String name1 = "홍길동";
String name1 = "김철수";
System.out.printf("%1$s\n%2$s\n%1$s\n", name1, name2);
// 결과
// 홍길동김철수홍길동
만약 System.out.printf("%s\n%s\n%s\n", name, name, name); 이렇게 코드를 선언하면 에러가 발생한다.
에러메시지 : java.util.MissingFormatArgumentException
해석 : 인자가 빠졌다.
2-1. 소수점 n자리 출력
1) %f : 기본으로 소수점 6자리까지만 출력
결과 : avg=87.324200
2) %10f : 총자리수 10자리를 잡고 우측으로 정렬하여 출력
결과 : avg=[ 87.324200]
3) %10.2f : 총자리수 10자리를 잡고 우측으로 정렬하여 소수점 2자리만 출력
결과 : avg=[ 87.32]
4) %.2f : 소수점 2자리만 출력
> 10이나 0.2는 다른 숫자를 넣으면 그 숫자대로 변경이 되어 코딩이 된다.
결과 : avg=[87.32]
1) %(d : 음수일 경우에는 (정수)로 출력이 되고 양수일 경우에는 그냥 정수 값만 나온다.
결과 : score=(70)
1) %,d : 1000단위마다 ,(콤마)를 찍어줌
결과 : money=12,345
위에서 언급한 코드는 제외하고 정리하자면,
1) %010d : 총자리수 10자리를 잡고 우측으로 정렬, 빈자리에는 0으로 채워서 출력하라
결과 : kor=[0000000010]
2) %04d : 4자리의 숫자형식 출력
'\t' : 탭(Tap) 제어문자
결과 : 0005 0300
3) %-10d : 총자리수 10자리를 잡고 좌측으로 정렬하여 출력
결과 : kor=[10 ]
1) %o : 8진수 정수 형태로 출력
결과 : kor=[012]
2) %x : 16진수 정수 소문자 형태로 출력
결과 : kor=[0xa]
3) %X : 16진수 정수 대문자 형태로 출력
결과 : kor=[0XA]
> % 앞에 #을 붙이면 8진수는 0, 16진수는 0x가 같이 출력된다.
3. 비트논리 연산자(days03 연산자 수업에서 이어지는 부분)
비트논리 연사자의 종류는 총 4가지이며, 아래와 같다.
여기서 비트는 0/1 값만 가질수 있으며, 0은 false이고 1은 true를 뜻한다.
1) ~ : 틸드 연산자(비트 부정 연산자)
2) & : 비트 논리 AND 연산자
3) ^ : XOR 연산자(eXclusiveOR) 연산자 -> 배타적인 == 서로다르다 -> 서로 다를 때 true인 연산자
4) | : 비트 논리 OR 연산자
1) ~ : 틸드 연산자(비트 부정 연산자)
2) & : 비트 논리 AND 연산자
3) ^ : XOR 연산자(eXclusiveOR) 연산자 -> 배타적인 == 서로다르다 -> 서로 다를 때 true인 연산자
4) | : 비트 논리 OR 연산자
4. 쉬프트(Shift) 연산자(days03 연산자 수업에서 이어지는 부분)
쉬프트(shift) 연산자의 종류는 3가지이며, 아래와 같다.
1) >> : 비트 값을 오른쪽으로 이동 후 첫 번째 비트 값이 0이면 0으로 1이면 1로 남은 자리 채우기
2) << : 비트 값을 왼쪽으로 이동 후 첫 번째 비트 값이 0이면 0으로 1이면 1로 남은 자리 채우기
3) >>> : 비트 값을 오른쪽으로 이동 후 남은 자리는 무조건 0으로 채우기
☞ 참고
x << n은 x * 2^n의 결과와 같다.
x >> n은 x / 2^n의 결과와 같다.
> 쉬프트 연산자는 곱셈, 나눗셈보다 처리속도가 빠르지만, 가독성이 떨어지므로 곱셈, 나눗셈을 주로 사용하고 보다 빠른 실행속도가 요구되어지는 곳에 쉬프트 연산자를 사용하자
5. 10진수 n을 2, 8, 16진수로 출력하기
1) Integer.toBinaryString(n) : 10진수 n을 2진수로 출력
2) Integer.toOctalString(n) : 10진수 n을 8진수로 출력
3) Integer.toHexString(n) : 10진수 n을 16진수로 출력
6. 증감연산자[++ --]
증감연산자는 [피연산자개수]로는 단항연산자, [기능]적으로는 증감연산자이다.
1) 1을 증가시키는 코드
ㄱ. n = n + 1;
ㄴ. n++; > 후위형 증감연산자
ㄷ. ++n; > 전위형 증감연산자
2) 1을 감소시키는 코드
ㄱ. n = n - 1;
ㄴ. n--; > 후위형 증감연산자
ㄷ. --n; > 전위형 증감연산자
3) 전위형/후위형 증감연산자
ㄱ. 단독으로 사용될 때는 전/후 동일한 결과 ex) ++n;, n++;
ㄴ. 다른 (대입)연산자와 같이 사용될 때는 동일한 결과 X ***
ex) 전위형/후위형 증감연사자 > 결과 : x=11, y=10
+ 증감연산자 예제
7. 삼항연산자[ ?: ]
삼항연산자는 항갯수로는 삼항연산자이고, 기능적으로는 조건연산자이다.
1) 사용법 : 참거짓을 판단할 수 있는 수식(항1)? 항2 : 항3
> 항1이 참이면 결과는 항2가 되고, 항2가 거짓이면 결과가 항3이 된다.
즉, 항1 결과가 true이면 항2를, false이면 항3을 결과값으로 가진다.
ex) 결과 : 100
+ 삼항연산자 + BufferedReader 예제)
8. 인덱스 연산자(index operator)와 배열(Array)
1) 배열(Array) 정의 : [동일한 자료형]을 메모리 상에 [연속적]으로 놓이게 하는 것
2) 배열 선언 형식 : 자료형 [] 배열명 = new 자료형[배열크기];
ex) int [] kors = new int[3];
ㄴ heap(힙) : 동적 메모리 영역 > int * 3
배열명 == 참조변수(실제 기억공간의 시작주소를 참조하기때문에) == 변수
+ 매일 보던 main 메소드의 매개변수는 String[] args > 문자열 배열 args 이다.
배열을 선언하고 값을 넣기 위해서는 인덱스 연산자를 사용하여 값을 넣고 출력을 할때도 인덱스 연산자를 사용하여 출력한다.
- 선언시 : 배열명[인덱스값] = 할당할 값;
- 출력시 : 배열명[인덱스값]
8-1. 배열을 사용한 예제
1) String data = br.readLine(); > "홍길동,90,88,75" > 입력받은 값을 data라는 String형 변수에 넣기
2) String[] dataArray = data.split(",");
> 홍길동,90,88,75 입력받은 값을 ,(콤마)를 기준으로 분리하여 dataArray라는 배열에 하나씩 값을 넣기
+ data.split("구분자");
ㄱ. 기능 : 하나의 문자열을 구분자를 가지고 분리
ㄴ. 매개변수 : 자르고자 하는 구분자(String regex)
ㄷ. 리턴값, 리턴자료형 : String[]
3) name = dataArray[0].trim();
kor = Integer.parseInt(dataArray[1].trim()); // "90" -> 90
eng = Integer.parseInt(dataArray[2].trim()); // "88" -> 88
mat = Integer.parseInt(dataArray[3].trim()); // "75" -> 75
+ String.trim() 메소드 : 문자열 앞뒤에 있는 공백제거하는 메소드
8-2. BufferedReader br 사용하지 않고 [Scanner] 사용하기
- useDelimiter(String pattern) :
문자열 중에서 구분자(pattern)을 이용하여 여러개의 작은 문자열인 토큰(token)으로 잘라내는 방법
- \\s : space(공백)
- * : 반복 회수 0 ~ 여러번
8-2-1. Java API Doc의 Scanner 예제
9. 효율적인 연산(short circuit evaluation)
> 위의 코드와 같이 앞의 수식에서 결과가 바로 나오게 되면 뒤에 있는 수식은 처리하지 않는다.
10. 대문자를 소문자로, 소문자를 대문자로 변환하기
11. 실수값을 소수점 4번째 자리에서 반올림해서 출력하기(로직이해하기)
1번 풀이 결과 : 3.142
2번 풀이 결과 : 3.142
3번 풀이 결과 : 3.141592
- String.format("%.3f", pi); : pi(3.141592)를 %.3f 형식(소수점 3자리만)으로 문자열로 변환해서 strPI 변수에 담아라
12. equals(); 메소드
- 두 문자열을 비교할 때는 equlas(); 라는 메소드를 사용한다.
* 다음 주부터는 조건문과 반복문에 대해서 배운다.
오늘 조건문에서 제어문을 살짝 배웠는데 이 부분은 다음 주 수업 정리를 하면서 같이 정리하고자 한다.
'TIL > Java' 카테고리의 다른 글
[SIST] Java_days05 (0) | 2022.02.21 |
---|---|
[Java] 대소문자 구별없이 비교하기 : equalsIgnoreCase() (0) | 2022.02.20 |
[SIST] Java_days03 (0) | 2022.02.17 |
[SIST] Java_days02 (0) | 2022.02.16 |
[SIST] Java_days01 (0) | 2022.02.15 |