초록꼬마의 devlog
article thumbnail

2021.10.14(목)

🌿 출력문

/* 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("스트링은 한 쌍의 \"\"\"로 앞뒤를 감싸주세요.");

 

🌿 입력

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 메서드 영역 끝

} // 클래스 영역 끝

 

🌿 형 변환(자동)

/* 형 변환(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형

}

 

📗 소감

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