오늘 배운 것
01. printf()
02. Scanner
03. 실수 자료형의 정밀도
04. 입출력 실습
05. 비트 단위 연산자
06. 논리 연산자
07. 삼항 연산자
08. 주요 특수문자 영문이름
01. printf()
print(), printf() 는 인자 없이 사용할 수 없다.
boolean, char, String은 %b, %c, %s 로 지정한다.
%h : 16진수 (hex)
%o : 8진수 (oct)
%10d : 10진수 정수를 10자리 확보한 후 출력한다.
%010d: 10자리 중 빈 공간은 0으로 채운다.
%f : 기본 정밀도인 소수점 6자리까지 출력
%.2f: 소수점 2자리까지 출력(반올림)
%8.2f : 8자리 확보 후, 소수점 2자리까지, 비는 공간은 공백으로 출력.
이 때, 데이터 길이보다 공간이 작아도 잘리지 않고 모두 출력된다.
-%d : 음수 부호는 형식 지정자 앞에 붙는다.
%d, -15 : 넘겨주는 값에만 음수 부호를 붙여도 된다.
실습 016
public class Test016{
public static void main(String[] args){
//System.out.print(); <error>
System.out.print("\n"); //개행
System.out.printf("%d + %d = %d\n",10,20,30);
System.out.printf("abc\n");
System.out.printf("abc%n");
//System.out.printf(); <error>
System.out.printf("%10d\n",123); // 123
System.out.printf("%8d\n",123); // 123
System.out.printf("%010d\n",123); //0000000123
System.out.println(365); //365
System.out.println(+365); //365
System.out.println(-365); //-365
System.out.printf("%+d\n", 365); //365
System.out.printf("+%d\n", 365); //365
// System.out.printf("%-d\n", 365); <runtime error>
System.out.printf("-%d\n", 365); // -365
System.out.printf("%d\n", -365); // -365
// System.out.prinf("%d\n",'A'); <runtime error>
System.out.printf("%c\n",'A'); // A
//System.out.printf("%c\n",'ABCD'); <runtime error>
System.out.printf("%s\n","ABCD"); // ABCD
System.out.printf("%h\n", 24); // hex. 16진수
System.out.printf("%o\n", 24); // oct. 8진수
System.out.printf("%b\n" ,true);
System.out.printf("%b\n" ,false);
System.out.printf("%f\n", 123.23); //123.230000
System.out.printf("%.2f\n", 123.23); //123.23
System.out.printf("%.2f\n", 123.235); //123.24 (반올림)
// 전체 공간 8 확보 ,소수점 2번째 자리까지(앞 두자리가 빈다)
System.out.printf("%8.2f\n", 123.236); // 123.24
// 전체 공간이 데이터보다 작으면 알아서 늘어나며 출력.(잘리지 않음)
System.out.printf("%2.2f\n", 123.236); //123.24
}
}
02. Scanner
- 단락 문자 패턴을 사용하여 입력값을 토큰에 따라 분할.
- 디폴트로 사용되는 단락 문자는 공백(개행)이다.
- 값 작성 후, 토큰은 next() 메소드 사용
- 다른 자료형의 값으로 변환할 수 있다.
* 토큰: 데이터를 구분자를 기준으로 잘라냄
* BufferedReader 에 비해 사용하기 간단하지만,
기능을 많이 가지고 있어 성능은 낮다.(다기능의 단점. 속도 느림)
- 번역기도 내장되어있어 생략 가능. 인스턴스 생성구문이 매우 짧다.
* BufferedReader는 스캐너가 라인 하나를 다 읽는다면
Scanner는 공백을 디폴트로 잘라 가져온다.
그래서 전자는 br.readLine() , 후자는 sc.next() 라는 이름.
실습 017
java.util.Scanner sc = new java.util.Scanner(System.in);
상단 import대신 이렇게 작성 가능하지만 하지 않음.
한 번만 import 하면 되는데 계속 명시해줘야하므로.
import java.util.Scanner;
public class Test017{
public static void main(String[] args) {
/*--------- ① 주요 변수 선언 ---------*/
// Scanner 클래스 기반의 인스턴스 생성.
Scanner sc = new Scanner(System.in);
String name;
int kor, eng, mat;
/*---------- ② 연산 및 처리 ----------*/
System.out.print("이름 입력: ");
name = sc.next();
System.out.print("국어 점수 입력: ");
// cf. kor = Integer.parseInt.(br.readLine()); // (BufferedReader)
// kor = Integer.parseInt(sc.next()); 이것도 가능하지만
kor = sc.nextInt(); // 내장 기능으로 간단하게 작성가능.
System.out.print("영어 점수 입력: ");
eng = sc.nextInt();
System.out.print("수학 점수 입력: ");
mat = sc.nextInt();
/*--------- ③ 결과 출력 ------------*/
System.out.println();
System.out.println(">> 이름: " + name);
System.out.println(">> 총점: " + (kor + eng + mat));
}
}
실습 018
기본 단락 문자가 공백이므로, 한 번에 입력값 받기.
import java.util.Scanner;
public class Test018{
public static void main(String[] args){
/*--------- ① 주요 변수 선언 ---------*/
Scanner sc = new Scanner(System.in);
String name;
int kor, eng, mat, tot;
/*---------- ② 연산 및 처리 ----------*/
System.out.print("이름, 국어, 영어, 수학점수를 공백 구분하여 입력: ");
name = sc.next();
kor = sc.nextInt();
eng = sc.nextInt();
mat = sc.nextInt();
tot = kor + eng + mat;
/*----------- ③ 결과 출력 ------------*/
System.out.println();
System.out.println(">> 이름: " + name);
System.out.println(">> 총점: " + tot);
}
}
실습 019
\(역슬러시) 출력은 형식 지정자 %를 printf에서 출력할 때
%%로 입력한 것과 마찬가지로 \\ 로 작성한다.
// System.out.println("\"); 세미콜론까지 색상변하면서 오류
System.out.println("\\"); // 역슬러시 1개 출력.
역슬러시는 문자열 내에서 형식 지정자처럼 쓰인다.
*Delimiter : 구분자.
.useDelimiter() : 인자로 구분자 형식을 받는다.
import java.util.Scanner;
public class Test019{
public static void main(String[] args){
/*--------- ① 주요 변수 선언 ---------*/
Scanner sc = new Scanner(System.in);
String name;
int kor, eng, mat, tot;
/*---------- ② 연산 및 처리 ----------*/
System.out.print("이름, 국어, 영어, 수학점수를 『,』로 구분하여 입력: ");
sc = new Scanner(sc.next()).useDelimiter("\\s*,\\s*");
// ----------- ------------
// "우주,90,80,70" 임의의 모든 문자열(\s*) 사이의 ,
name = sc.next();
kor = sc.nextInt();
eng = sc.nextInt();
mat = sc.nextInt();
tot = kor + eng + mat ;
/*----------- ③ 결과 출력 ------------*/
System.out.println("\n>> 이름: " + name);
System.out.println(">> 총점: " + tot);
}
}
03. 실수 자료형의 정밀도
: 실수형 데이터 타입의 정밀도 테스트.
단순 값 저장에서 float는 괜찮지만 연산에서는 문제 될 수 있으므로 double 권장.
실습 020
public class Test020{
public static void main(String[] args){
float a = 0;
double b = 0;
for(int i =1; i<= 100000; i++ )
{
a+= 100000; // a를 100000 만큼 증가
b+= 100000; // b를 100000 만큼 증가
}
System.out.println("float a : " + (a/100000));
// float a : 99996.055
System.out.println("double b : " + (b/100000));
// double b : 100000.0
}
}
04. 입출력 실습
% 형식지정자를 출력할 때는 %%로 입력
실습 021
/*======================= 02/2(목) =========================
임의의 정수를 사용자 입력 받고, 사칙 연산 및 나머지 연산을
수행 후 결과를 출력하는 프로그램 구현.
단, 입력은 BufferedReader를, 출력은 printf() 메소드를 사용.
나눗셈 연산은 편의상 정수 기반으로 처리.(원래 double 권장)
* Modulus Operator : 나머지 연산자.
===========================================================*/
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Test021{
public static void main(String[] args) throws IOException{
/*--------- ① 주요 변수 선언 ---------*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num1, num2;
int plus, minus, multi, divid, modul;
/*---------- ② 연산 및 처리 ----------*/
System.out.print("첫 번째 정수 입력: ");
num1 = Integer.parseInt(br.readLine());
System.out.print("두 번째 정수 입력: ");
num2 = Integer.parseInt(br.readLine());
plus = num1 + num2;
minus = num1 - num2;
multi = num1 * num2;
divid = num1 / num2;
modul = num1 % num2;
/*----------- ③ 결과 출력 ------------*/
System.out.printf("\n====[결과]====\n");
System.out.printf("%d + %d = %d\n", num1, num2, plus);
System.out.printf("%d - %d = %d\n", num1, num2, minus);
System.out.printf("%d * %d = %d\n", num1, num2, multi);
System.out.printf("%d / %d = %d\n", num1, num2, divid);
System.out.printf("%d %% %d = %d\n", num1, num2, modul); // 퍼센트 기호를 %%로 수정
System.out.printf("==============\n");
/* 출력 결과 =========================
첫 번째 정수 입력: 10
두 번째 정수 입력: 2
====[결과]====
10 + 2 = 12
10 - 2 = 8
10 * 2 = 20
10 / 2 = 5
10 % 2 = 0
계속하려면 아무 키나 누르십시오 . . .
==========================================*/
/* 오류 ("%d % %d 로 작성했을 때) ===================================================
첫 번째 정수 입력: 10
두 번째 정수 입력: 2
====[결과]====
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = ' ' ... 생략
================================================================================================*/
}
}
05. 비트 단위 연산자
실습 022
~ (bit not , 틸드) : 비트열 반전(부호가 바뀐 후 1 작아진다.)
public class Test022{
public static void main(String[] args){
int a = 10, b = -10;
System.out.printf("~a: %d\n", ~a);//bit not ~a: -11
/*-----------------------------
a = 10 → 00001010
↓ ~a
11110101 → -11
-------------------------------*/
System.out.printf("~b: %d\n", ~b);//bit not ~b: 9
/*-----------------------------
b = -10 → ??? = 11110110 (음수10)
↓ ↓ ~b
양수10 00001010 00001001
↓ ↓
11110101 + 1 8 + 1 → 9
↓
음수10 11110110
-------------------------------*/
}
}
실습 023
& (앰퍼센드, bit and ) : 둘 다 참이어야 참.
| (버티컬바, bit or) : 둘 중 하나라도 참이면 참
^ ( 서컴플렉스/카릿, bit exclusive or ): 배타적 논리합(서로 달라야 참)
public class Test023{
public static void main(String[] args)
{
int a = 13, b =7;
int c , d, e;
c = a & b; // bit and
d = a | b; // bit or
e = a ^ b; // bit exclusive or
System.out.printf("a & b = %d\n", c);
System.out.printf("a | b = %d\n", d);
System.out.printf("a ^ b = %d\n", e);
/*
a & b = 5
a | b = 15
a ^ b = 10
계속하려면 아무 키나 누르십시오 . . .
*/
}
}
실습 024
xor 연산자 활용. 두 변수 값 바꾸기(swap)
//xor 연산자 활용: 두 변수에 담긴 값 바꾸기(스왑) swap
public class Test024{
public static void main(String[] args){
int x = 20, y= 23 ;
int temp; // 임시 저장
// 연산 처리 전 값 확인
System.out.printf("x → %d, y → %d\n", x, y);
/* 일반 연산 처리 ------------------------------*/
temp = 20;
x = y;
y = temp;
/* 비트 연산 처리 (임시변수 필요 없음) ----------*/
x = x^y;
y = y^x;
x = x^y;
/*
y = y^x;
x = x^y;
y = y^x;
*/
System.out.printf("x → %d, y → %d\n", x, y); //결과 출력
}
}
실습 025
<< , >>, >>> (비트 시프트 연산자)
>> : 빈 공간을 양수면 0, 음수면 1로 채운다.
<<, >>> : 빈 공간을 0으로 채운다.
모든 연산자 중 가장 속도가 빠르다.
public class Test025{
public static void main(String[] args){
int x = 128; // 00000000 00000000 00000000 10000000
//참고: 실제 비트열은 공백이 없음. 편의상 표현
System.out.printf("x << 3 : %d\n", x << 3);
// 00000000 00000000 00000000 10000000 == 128
// ↓
// 00000000 00000000 00000100 00000000 == 1024 == (128 * 8) == (128 * (2의3제곱))
System.out.printf("x >> 3 : %d\n", x >> 3);
// 00000000 00000000 00000000 10000000 == 128
// ↓
// 00000000 00000000 00000000 00010000 == 16
System.out.printf("x / 8 : %d\n", x / 8); // x / 8 = 16
System.out.printf("x << 24 : %d\n", x << 24);
// 00000000 00000000 00000000 10000000 == 128
// ↓
// 10000000 00000000 00000000 00000000 == -2147483648
//(int 표현범위 최소값인 -21억 정도)
System.out.printf("x << 25 : %d\n", x << 25);
// 1일 것 같지만 0.
System.out.printf("x << 26 : %d\n", x << 26);
// 계속 0... 넘어가다가, 다시 자기 자리로 가기 전까지는 잠복기
System.out.printf("x << 32 : %d\n", x << 32);
// 128. ( int는 32비트니까 원래 값으로)
System.out.printf("x << 64 : %d\n", x << 64); // 128.
/*--- 출력 결과
x << 3 : 1024
x >> 3 : 16
x << 24 : -2147483648
x << 25 : 0
x << 26 : 0
x << 32 : 128
x << 64 : 128
*/
}
}
06. 논리 연산자
2개 이상의 조건문에 무조건 포함되는 연산자.
public class Test026{
public static void main(String[] args){
boolean a = true, b = false;
System.out.printf("a && b : %b\n", (a && b));
System.out.printf("a || b : %b\n", (a || b));
System.out.printf("!a : %b\n", !a);
System.out.printf("!b : %b\n", !b);
/* a && b : false
a || b : true
!a : false
!b : true */
}
}
07. 삼항 연산자(조건 연산자)
피연산자 ? 피연산자 : 피연산자
1항의 연산 결과가 true → 2항을 수행
:(조건 연산자 전체 구문이 2항으로 덮어씌워지는) 치환
1항의 연산 결과가 false → 3항을 수행 (치환)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException; // readLine 사용에는 IOException이 필수.
public class Test027{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n; // 입력값 정수
String strResult; // 홀수 짝수 판별 결과
// 연산 및 처리 --------------------------------
System.out.print("임의의 정수 입력: ");
n = Integer.parseInt(br.readLine());
strResult = (n % 2 == 0) ? "짝수" : "홀수" ;
// bool 결과에 따라 치환된 값을 변수에 담는다.
// strResult = (n % 2 != 0) ? "홀수" : "짝수" ; // 다른 표현
// 결과 출력 -----------------------------------
System.out.println("\n====[판별 결과]====\n");
System.out.printf("%d → %s\n\n", n , strResult);
/* 임의의 정수 입력: 8
====[판별 결과]====
8 → 짝수
계속하려면 아무 키나 누르십시오 . . . */
}
}
/*----------------[꼼꼼하게 과정 보기]----------------------
쉬워보이더라도 치환 과정에 대해 자세하고 정확하게 이해해야
코드가 길어지고, 조건 연산이 중첩되었을 때 헷갈리지 않음.
ex) n이 39라면..
strResult = (n % 2 == 0) ? "짝수" : "홀수";
strResult = (39 % 2 == 0) ? "짝수" : "홀수";
strResult = (1 == 0 ) ? "짝수" : "홀수";
strResult = (false) ? "짝수" : "홀수";
strResult = "홀수";
------------------------------------------------------------*/
08. 주요 특수문자 영문이름
` → Grave (비격식 Backtick)
~ → Tilde
! → Exclamation Point
@ → At Sign , Commercial Sign
# → Crosshatch, Sharp, Pound Sing
$ → Dollar Sign
% → Percent Sign
^ → Circumflex
& → Ampersand
* → Asterisk
( → Left Parenthesis
) → Right Parenthesis
() → Parentheses // 복수형 -ses
- → Hyphen, Dash, Minus Sign
_ → Underscore, Underline, Underbar
= → Equal Sign
+ → Plus Sing
| → Vertical Bar // 글꼴에 영향 받음
[ → Left Bracket
] → Right Bracket
[] → Brackets *브라켓(권장) / 각괄호
{ → Left Brace
} → Right Brace
{} → Brace //복수 형태로 사용 안 함 *브레이스
; → Semicolon
: → Colon
" → Qutation Mark // (더블)쿼테이션 (원래 얘만 쿼테이션인데)
' → Apostrophe // 싱글 쿼테이션 / 어포스트로피 (관습적으로 싱글 쿼테이션이라고 함)
, → Comma
. → Dot, Period, Full Stop
< → Less Than Sign, Left Angle Bracket
> → Greater Than Sign, Right Angle Bracket
<> → Angle Brackets // 앵글 브라켓, 레스댄 사인, 그레이터댄 사인
/ → Slash, Virgule
\ → Back Slash, Won Sign // 글꼴에 영향 받음
? → Question Mark 물음표 / 퀘스쳔 마크
→ Space 공백 / 스페이스
'정리 노트 > 쌍용 KDT_(자바 Spring)' 카테고리의 다른 글
23.02.06(월): 조건문 if, switch (다중 선택문) (0) | 2023.02.23 |
---|---|
23.02.03(금): 조건 연산자, 윤년/평년, 조건문 if (4) | 2023.02.16 |
23.02.01(수): BufferedReader, read(), skip(), 이름 표기법 (0) | 2023.02.12 |
23.01.31(화) : 연산자, 변수와 자료형, 상수, 진수와 접두사 (0) | 2023.02.11 |
23.01.30(월): 음의 2진수, 실수/정수 자료형, 가비지 컬렉터 , 자동 형 변환 (0) | 2023.02.07 |