2021.10.14(목)
1. 🌿 출력문
<java />
/* 1. 지금까지 9개의 자료형을 위와 같이 선언했고,
* 2. 9개의 값을 초기화 진행했음
* 3. 9개의 값이 제대로 들어갔는지 확인해보기
* 출력양식: "변수이름 : 변수값"; Run 클래스에서 실행
*/
System.out.println("isTrue : " + isTrue);
System.out.println("isFalse : " + isFalse);
System.out.println(); // 콘솔 출력에서 가독성을 위해 한 줄 띄어쓰기
System.out.println("bNum : " + bNum);
System.out.println("sNum : " + sNum);
System.out.println("iNum : " + iNum);
System.out.println("lNum : " + lNum);
System.out.println();
System.out.println("fNum : " + fNum);
System.out.println("dNum : " + dNum);
System.out.println();
System.out.println("ch : " + ch);
System.out.println("str : " + str);
System.out.println();
// System.out.println("어쩌고 : " + 저쩌고);
// 출력문의 종류
// System(클래스).out(출력 관련).println(), print(), printf() 등은 메서드
// 1. System.out.println(); 줄(ln = line의 약자)바꿈(개행, 행을 열어줌/바꿔줌)해서 콘솔에 출력함
// 2. System.out.print(); 줄바꿈하지 않고 출력
System.out.print(isTrue);
System.out.println(isFalse);
System.out.println();
// 3. System.out.printf("출력하고자 하는 데이터 형식"); 구멍 뚫은 부분의 변수의 값을 형식(format)에 맞춰서 출력; 줄바꿈은 해주지 않음; 구멍과 메꿀 변수의 갯수,순서,종류가 명확해야 함
// System.out.printf(str, null);
System.out.printf("isTrue의 값은 %b입니다.\n", isTrue); // \n 개행(줄바꿈); printf() 메서드 안에서 사용 가능한 escape character(탈출 문자)
System.out.printf("isFalse의 값은 %b입니다.\n\n", isFalse);
// %b: true, false 논리형 변수를 담을 수 있게 뚫어주는 구멍
System.out.printf("bNum : %d\n", bNum);
System.out.printf("sNum : %d\n", sNum);
System.out.printf("iNum : %d\n", iNum);
System.out.printf("lNum : %d\n\n", lNum);
// %d: byte, short, int, long 정수형 변수를 담을 수 있게 뚫어주는 구멍
System.out.printf("fNum : %.4f\ndNum : %.1f\n\n", fNum, dNum);
// %f: 실수형 변수를 담을 수 있게 뚫어주는 구멍; 소수점 아래 7번째에서 반올림되어 6번째 자리까지만 출력이 되는 형식
// %.1f: 소수점 아래에서 2번째 자리로부터 반올림되어 1번째 자리까지만 출력이 되는 형식
System.out.printf("소문자 ch : %c\n대문자 ch : %C\n", ch, ch);
System.out.printf("소문자 str : %s\n대문자 str : %S\n\n", str, str);
// %c : 문자형 변수를 담을 수 있게 뚫어놓은 구멍; 대문자를 소문자로 변경하는 것은 불가능
// %C : 해당 문자형 변수를 담을 수 있는데, 대문자로 변경해서 출력할 수 있게 해주는 포맷
// %s : 문자열형 변수를 담을 수 있게 뚫어놓은 구멍; 대문자를 소문자로 변경하는 것은 불가능
// %S : 해당 문자열형 변수를 모두 대문자로 변경해서 출력할 수 있게 해주는 포맷
System.out.printf("개행은 \"\\n\"를 사용합니다.\n"); // 강조하고자 하는 특수문자(", \ 등) 앞 escape문자 \는 printf() 뿐만 아니라 println()에서도 사용 가능
System.out.println("스트링은 한 쌍의 \"\"\"로 앞뒤를 감싸주세요.");
2. 🌿 입력
<java />
package com.kh.variable;
import java.util.Scanner; // java.util에 있는 Scanner라는 클래스를 가져옴
public class B_KeyboardInput { // 클래스 영역 시작
public void inputTest() { // 메서드 생성/영역 시작
/* 키보드로 사용자로부터 값을 입력받으려면 Java에서 사용자의 편의를 위해 이미 제공하고 있는 java.util.Scanner라는 클래스를 사용함
* -> Scanner 클래스 안에 있는 메서드들을 호출해서 사용
* -> 그러기 위해 3행처럼 import
*/
Scanner sc = new Scanner(System.in); // System 클래스 안에 있는 in(System.in; 입력받은 값들을 받아들이겠다, byte 단위로)을 사용하자..
// Scanner는 이름이 대문자로 시작하니 클래스이지만 괄호()가 붙어있으니 메서드(기능을 가진.. 생성자)
// [KEY 이해 내용] Scanner는 클래스이자 참조형 -> 이 type의 변수 sc는 어떤 주소값을 갖는다..
// 사용자의 인적사항(이름, 나이, 성별, 키, 주소)을 입력받아 출력해보자
// 입력받고자 하는 내용을 먼저 질문(service msg)해서 입력을 유도
System.out.print("당신의 이름은 무엇입니까? : ");
// 사용자가 입력한 값을 문자열로 받아오는 메서드: nextLine(), next(), nextInt()..
String name; // 사용자의 이름을 받을 변수 선언/공간 받아둠
name = sc.nextLine(); // 메서드 nextLine()가 있는 위치(=Java가 만들어서 제공해주는 클래스 Scanner)를 알려줘야 함 -> 참조연산자 . 사용
// 오른쪽에 있는 값을 왼쪽에 대입/저장함
// nextLine(): 사용자가 입력한 값 중 공백이 있을 경우, 공백에 무관하게 한 문장을 다 출력 e.g. 주소
// - \n이 나올 때까지 한 라인을 입력받고 \n을 버린 나머지를 반환함
// - 개행문자 전까지의 문자열 입력받기
// next(): 사용자가 입력한 값 중 공백이 있을 경우, 공백 이전까지만 입력 받음 e.g. 이름
// - 다음 입력받은 것을 반환함
// nextInt(), nextDouble(), nextFloat(), nextLong(): 다음 입력받은 특정 자료형을 반환함; \n 등 무시하고 자신에게 필요한 자료만 가져감
System.out.println(name + "님, 안녕하세요!");
System.out.print("당신의 나이는 몇 세입니까?");
int age = sc.nextInt();
System.out.println(name + "님은 " + age + "세입니다.");
System.out.print("당신의 키는 어떻게 됩니까?");
double height = sc.nextDouble();
System.out.println(name +"님의 키는 " + height + "cm입니다.");
// nextLine(); 개행문자를 없애주기 때문에, 필요한 경우 한 번 더 사용이 가능함
sc.nextLine(); // nextLine 앞에서 사용한 next(Int) 등으로 인해 (입력)buffer공간에 남아있는 \n을 사용해서 없애주어 buffer를 비움
System.out.print("당신은 어디에 사십니까? : ");
String address1;
address1 = sc.nextLine();
System.out.println("1. nextLine() 출력 : " + name + "님의 주소는 " + address1 + "입니다.");
System.out.print("당신은 어디에 사십니까? : ");
String address2;
address2 = sc.next();
System.out.println("2. next() 출력 : " + name + "님은 " + address2 + "에서 거주하고 있습니다.");
sc.close();
}
public void inputTest2() { // 메서드(이름: inputTest2) 만들기
// 변수(식별자) 생성해서 대입하고,
// 이름, 나이, 성별(M/F), 주소 각각의 정보 입력받고,
// 아래 표시형식으로 출력
// ------- 회원 가입 -------
// OOO 님의 개인정보
// OOO 님의 이름 : OOO
// OOO 님의 나이 : OO
// OOO 님의 성별 : M/F
// OOO 님의 주소 : OOO OO OO
System.out.println("------- 회원 가입 -------");
Scanner sc = new Scanner(System.in);
System.out.print("당신의 이름은 무엇입니까?");
String name = sc.nextLine();
System.out.print("당신의 나이는 몇 세입니까? (정수로 입력 부탁드립니다)");
int age = sc.nextInt(); //next()로 입력받아도 됨..
sc.nextLine();
System.out.print("당신의 성별은 무엇입니까?");
char gender = sc.nextLine().charAt(0); // 단일문자만 입력받는 입력 메소드가 없음 -> charAt() 이용해서 한 글자만 입력받을 수 있음 -> charAt(0): 문자열을 입력받은 후 그 문자열의 0번째 문자를 추출하는 메서드
// 만약에 해당 문자열의 길이보다 더 큰 숫자를 index범위(괄호 안)에 적게 되면 StringIndexOutOfBounds 오류("exception") 발생
// 메서드(method) = 특정 자료형/클래스에 사용할 수 있는 기능 -> charAt() 메서드는 문자열 자료형에 사용할 수 있는 기능
// 문자열 변수(참조자료형) 선언 시 String 키워드 사용 + String은 클래스
// sc.nextLine(); // nextLine 앞에서 next(Int) 등이 사용된 경우 이 줄 코드를 써서 buffer를 비워야 함; 여기서는 nextLine(79행)()를 사용했으므로 이 줄 필요 없는 듯 [KEY 이해 내용]
System.out.print("당신은 어디에 살고 계십니까?");
String address = sc.nextLine();
System.out.println(name + " 님의 개인정보");
System.out.println(name + " 님의 이름 : " + name);
System.out.println(name + " 님의 나이 : " + age);
System.out.println(name + " 님의 성별 : " + gender);
System.out.println(name + " 님의 주소 : " + address);
System.out.println("----------------------");
System.out.println("그나저나 " + name + " 님, " + (age - 3) + "세로 보여요 >.<");
sc.close();
} // inputTest2 메서드 영역 끝
} // 클래스 영역 끝
3. 🌿 형 변환(자동)
<java />
/* 형 변환(type casting): 값의 종류, 즉 자료형,을 바꾸는 개념
*
* 컴퓨터 안에서 값을 처리하는 규칙
* 1. =(대입연산자)를 기준으로 왼쪽, 오른쪽이 같은 자료형이어야 함 -> 같은 자료형에 해당되는 literal 값만 대입이 가능함; 자료형이 다를 경우 (오른쪽의) 값을 바꿔서 대입해야 함
* 2. 같은 자료형들끼리만 (사칙)연산(+ - * / 등)이 가능함 -> 다른 자료형들끼리 연산을 하고 싶다면 둘 중에 하나는 '형 변환'을 해서 나머지 하나와 동일하게 만들어줘야 함
* 3. 연산의 결과물도 같은 자료형이어야 함
* e.g. 1 + 1 = 2(정수), 1.1 + 1.1 = 2.2(실수)
*
* 표현법: (바꿀자료형)값
* - ()는 형 변환/cast 연산자; 수학에서 ()는 우선 연산..
*
* 종류
* 1. 자동형변환(promotion): 자동으로 형 변환이 진행; 내가 형 변환 할 필요 없음
* - 작은 크기의 자료형 -> 큰 크기의 자료형 e.g. byte형(-128~127 표현 가능) -> int형(약-21.47억~약21.47억)
* 2. 강제형변환(type casting): 자동형변환이 되지 않는 경우에 진행; 직접 내가 형 변환을 해야 함; ()연산자 통해서 진행
* - 큰 크기의 자료형 -> 작은 크기의 자료형; 값의 손실이 발생할 수 있어 신중하게 해야 함
*/
// 자동형변환: 작은 바이트 -> 큰 바이트
public void autoCasting() {
//1. int(4bytes, 정수) -> double(8bytes, 실수)
int i1 = 10;
System.out.println(i1);
double d1 = /*(double)*/i1; // 이 줄의 대입연산자의 오른쪽은 i1 변수 안에 대입되어 있는 값(o)변수(x) -> 그 값을 d1이라는 변수에 대입/저장
// 자동형변환이 되는 경우이기 때문에 오른쪽 리터럴 변수명 앞에 (double) 쓸 필요 없음
System.out.println(d1);
// 자동형변환 완료: int는 정수, double은 실수; d1 = 10 -> 10.0
//2. int(4bytes, 정수) -> long(8bytes, 정수)
int i2 = 12345678;
long l3 = i2;
System.out.println(l3);
// 특이케이스 3. long(8bytes, 정수) -> float(4bytes, 실수): 정수가 실수로 담길 때 큰 사이즈(여기서 '사이즈'는 '해당 자료형에 대해 미리 규정된/정해진 저장공간' ou '숫자의 크기/범위' 의미?)의 정수가 작은 사이즈의 실수에 대입이 가능
// - 4bytes의 float형이 long형보다 담을 수 있는 값의 범위가 더 크기(x) 훨씬 더 많은 숫자를 표현할 수 있기(o) 때문임
long l4 = 1000000L;
float f5 = l4;
System.out.println(f5);
// 특이케이스 4. char(2bytes) <-> int(4bytes): char와 int는 양방향 형 변환이 가능; ASCII codes 표 참조하기
char ch = 98;
System.out.println(ch); // 출력 결과 = b
// System.out.printf(%d, ch); // error
int num = ch;
System.out.println(num); // 출력 결과 = 98
System.out.println('김'); // 출력 결과 = 문자 '김'
System.out.println((int)'김'); // 출력 결과 = 44608 = '김'의 유니코드 값
System.out.println('김'+(char)2); // 숫자/정수 2를 char형으로 강제 형 변환 -> + 연산자는 (1) 피연산자 하나가 문자열이면 문자열로 더하고 결과도 문자열이 되고, (2) 기타 피연산자들을 int형으로 바꿔서 결과도 int형으로 냄..
// 출력 결과 = 44610 (-> 2021/10/14 마지막 교시 이해 안 되네.. ㅜ.ㅜ -> 2021/10/15 1교시 수업으로 이해)
System.out.println('김'+2); // char형이 int형으로 자동형변환되어 +연산 수행 -> 출력 결과 = 44610
System.out.println(2);
System.out.println((char)2); // 출력 결과 = 제어문자 STX
System.out.println('2');
System.out.println('김'+'2'); // 문자 2 .. 출력 결과 = 44658
System.out.println(2); // 2
System.out.println('2'); // 2
System.out.println('2'+ 2); // 52
// ctrl + alt + 화살표 위↑/아래↓: 커서가 위치하고 있는 행 위/아래로 복사
// ctrl + d: 커서가 위치하고 있는 행 삭제
int a = 2;
System.out.println(a); // 정수형 변수 a에 저장/대입되어있는 10진수/정수 값(숫자2) 출력
System.out.println((char)a); // 숫자2를 char형으로 바꾸면 제어문자 STX가 되며, 이 제어문자는 이클립스가 표현할 수 없음; 단 컴퓨터는 STX로 인식해서 일함
char c = '2';
System.out.println(c); // char형 변수 c에 저장되어 있는 문자 2 출력
// 비교 연산자: 좌항과 우항의 값을 비교해서 결과값(논리값 true/false 형식)을 반환
System.out.println(2=='2'); // 다르므로 false
System.out.println(2==a); // 같으니까 true
System.out.println(c=='2'); // 같으니까 true
System.out.println(a==c); // 다르므로 false
System.out.println(2==(int)'2'); // 2 != 50 -> 다르므로 false; 66~68행은 같은 내용임..
System.out.println((char)2=='2'); // STX != 2 -> 다르므로 false
System.out.println((int)a==(int)c); // 2 != 50 -> 다르므로 false
System.out.println(2+'2'); // 52
System.out.println(2+2); // 4
System.out.println((char)2+(char)'2'); // 52
System.out.println((char)2+(char)2); // 4
// 특이케이스 5. byte, short 간의 연산
byte b1 = 1;
byte b2 = 2;
System.out.println(b1 + b2); // byte끼리의 연산의 결과값은 int형 -> CPU가 값을 처리하는 기본크기 int형의 크기(4bytes)
// byte resultB = b1 + b2; // int형 자료를 더 작은 byte형에 저장하려고 해서 error
byte resultB = (byte)(b1 + b2); // int -> byte로 강제형변환
// byte b3 = 128; // 표현 범위: -128~127(256개의 10진수 숫자 표현 가능)
byte b3 = (byte)128;
System.out.println(b3); // 출력 결과 = -128 -> overflow
byte b4 = 127;
byte b5 = 127;
System.out.println(b4 + b5); // byte끼리의 연산의 결과값은 int형
}
4. 📗 소감
- 형 변환 개념 배울 때 자료형이 아직 익숙치 않아 헷갈렸다. 그래도 큰 개념 위주로 이해하자!
'back-end dev > Java' 카테고리의 다른 글
[KH정보교육원] 5일차_조건문 (0) | 2021.11.07 |
---|---|
[KH정보교육원] 4일차_강제형변환, 연산자 (0) | 2021.11.07 |
[KH정보교육원] 2일차_Java 프로그래밍 시작, 변수 (0) | 2021.11.07 |
[KH정보교육원] 1일차_환경 설정 (0) | 2021.11.07 |
[Java] 입력받은 월의 최대 일수 출력하기 (0) | 2021.08.07 |