초록꼬마의 devlog
article thumbnail

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. 📗 소감

- 형 변환 개념 배울 때 자료형이 아직 익숙치 않아 헷갈렸다. 그래도 큰 개념 위주로 이해하자!