package javajungsuk2_10;

public class Ch02_10 {

	public static void main(String[] args) {
		// 2-10 기본형과 참조형
		
		// 기본형 (Primitive type) - 자바에서 8개로 지정했다.
		// 1. byte, int, short, long
		// 2. char
		// 3. float, double
		// 4. boolean
		
		// 참조형 (Reference type) - 기본형을 제외한 나머지 String , System 등
		// 메모리 주소 저장 - 4byte or 8byte / 4byte가 표현할 수 있는 최댓값은 40억. 자세한 설명은 강의 다시보기.
		
		System.out.println("기본형은 실제 값을 저장한다.");
		System.out.println("정수형, 문자형, 실수형, 논리형");
		
		System.out.println("참조형은 메모리 주소를 저장한다.");
		System.out.println("참조형 변수는 객체의 주소를 저장하기 위한 것이라는 것을 알아두자."); // Date today; >> today = new Date();(객체생성)
		System.out.println("참조형은 얼마든지 우리가 추가할 수 있기 때문에 수가 정해져 있지 않다. 추가 방법은 6장에서.");
		System.out.println("기본형은 타입마다 크기가 있지만, 참조형은 타입의 관계없이 항상 4byte or 8byte다.");
	}

}

package javajungsuk2_10;

public class Ch02_11 {

	public static void main(String[] args) {
		// 2-11 기본형의 종류와 범위 [이 강의에서의 표 외우기]
		
		// 8bit에서 가장 왼쪽 1비트에서 부호를 나타낼 때 사용하는 것을 부호비트(사인비트)라고 한다.
		// 부호비트의 값이 0이면 양수, 음수면 1이다.
		// 정수형과 실수형에는 모두 부호가 있다. char는 음수를 표현할 필요가 없다.
		// 정수형과 달리 실수형은 저장하려는 값과 달리 실제 저장된 값에 오차가 발생할 수 있다.
		
		System.out.println("1bit = 2진수 1자리(0, 1)");
		System.out.println("1byte = 8bit"); // 4byte = 32bit / 8byte = 64bit
		System.out.println("1byte >> boolean, byte");
		System.out.println("2byte >> char(유니코드), short");
		System.out.println("4byte >> int, float"); // 정수형에서의 디폴트 타입은 int
		System.out.println("8byte >> long, double"); // 실수형에서의 디폴트 타입은 double
		
		System.out.println("n비트로 표현할 수 있는 값의 개수 = 2의 n제곱"); // 1byte = 2의 8제곱 = 256개
		System.out.println("n비트로 표현할 수 있는 부호없는 정수의 범위 = 0~2n제곱한 값에서 -1"); // 0~255
		System.out.println("n비트로 표현할 수 있는 부호있는(음수 값 포함) 정수의 범위 = -2n제곱-1~2n제곱-1한 값에서 -1");
		
		System.out.println("float 정밀도 - 7자리 / double 정밀도 - 15자리\""); // float의 2배라고 해서 double이다.
		System.out.println("실수형 저장형식 - 부호, 지수, 가수로 세 구분으로 나눠서 저장"); // 같은 크기인 int보다 큰 범위의 수로 표현 가능
	}

}
package javajungsuk2_10;

public class Ch02_12a13 {

	public static void main(String[] args) {
		// 2-12, 2-13 printf()를 이용한 출력
		
		// println() - 출력형식 지정불가 / 모든 정수를 10진수로만 출력 / 줄바꿈 O
		// printf()  - 출력형식 지정가능 / 지시자를 사용하여 다양하게 출력가능 / 줄바꿈 X
		// 지시자 표는 영상을 다시보거나 Java api문서를 찾아보기 / Java api >>formatter
		// 개행문자 - 줄바꿈 %n
		
		System.out.println(10/3); // 정수/정수 = 정수이다. 정수인 3이 출력이 된다.
		System.out.println(10.0/3); // 실수(소수점)으로 출력이 되려면 한 쪽을 실수로 바꿔주면 실수로 출력이 된다.
		System.out.println(0x1A); // 8진수, 16진수로 값을 넣으면 10진수로 출력이 된다. 26
		
		System.out.printf("%.2f%n", 10.0/3); // 3.33 - 소수점 둘째자리까지 출력하라.
		System.out.printf("%d%n", 15); // 15 - 10진수
		System.out.printf("%o%n", 15); // 017 - 8진수
		System.out.printf("%x%n", 15); // 0xf - 16진수
		System.out.printf("%s%n", Integer.toBinaryString(15)); // 1111 - 2진수
		// 지시자가 여러개라면 지시자의 개수만큼 값의 개수도 같아야한다.
		
		float f = 123.456789f;
		System.out.printf("%f%n", f); // 123.4567 7자리까지만 정확하게 출력이 된다.
		System.out.printf("%e%n", f); // 지수형태로 출력이 된다.
		System.out.printf("%g%n", f); // 더 간단하게 나오는 것을 골라 출력이 된다. 소수점 포함해서 7자리로 나왔다.
		
		System.out.printf("[%5d]%n", 1234567); // 지정한 자리수와 상관없이 모두 출력한다.
		System.out.printf("[%5d]%n", 10); // 지정한 자리수가 더 크다면 공백으로 채운다.
		System.out.printf("[%-5d]%n", 10); //  왼쪽 정렬
		System.out.printf("[%05d]%n", 10); // 공백을 0으로 채운다.
		
		double d = 1.23456789;
		System.out.printf("%14.10f%n", d); // 정수 앞에는 공백, 소수점에는 0으로 채워졌다.
		
		System.out.printf("[%s]%n", "가나다라마바사"); // 문자출력
		System.out.printf("[%10s]%n", "가나다라마바사");
		System.out.printf("[%.4s]%n", "가나다라마바사");
	}

}

package javajungsuk2_10;

import java.util.*; // Scanner / 1. import문 추가

public class Ch02_14 {

	public static void main(String[] args) {
		// 2-14 화면으로부터 입력받기
		
		// 문자열을 숫자로 >> Integer.parseInt() / 숫자를 문자열로 >> "" + 숫자
		// 파일도 입력받을 수 있지만 화면으로 입력받기 위해 System.in을 사용하는 것이다.
		// scanner.nextInt를 써서 쉽게 하나로 쓸 수도 있고 잍에 2줄처럼도 가능하다.
		
		Scanner scn = new Scanner(System.in); // 2. Scanner 클래스의 객체 생성
		
		// 3. Scanner 객체를 사용
		int num = scn.nextInt();
		int num2 = scn.nextInt();
		
		System.out.println(num);
		System.out.println(num2);
		
		
		String input = scn.nextLine();
		int num3 = Integer.parseInt(input);
		System.out.println(num3);
		
		System.out.println("Scanner : 화면으로부터 데이터를 입력받는 기능을 제공하는 클래스"); // 클래스 : 기능을 제공해주는 것

		scn.close();
	}

}

package javajungsuk2_10;

public class Ch02_15a16 {

	public static void main(String[] args) {
		// 2-15, 2-16 정수형의 오버플로우
		
		// 오버플로우 : 표현할 수 있는 범위를 넘어섰다. (계수기 4자리 9999에서 다시 한번 1증가시키면 0000)
		
		System.out.println("최댓값에서 1을 증가시키면 최솟값이 된다."); // 10진수 - 9999 >> 0000 / 2진수 - 1111 >> 0000
		System.out.println("최솟값에서 1을 감소시키면 최댓값이 된다."); // 10진수 - 0000 >> 9999 / 2진수 - 0000 >> 1111
		System.out.println("부호 있는 정수와 없는 정수도 마찬가지다."); // 0~15 , -8~7
	}

}

package javajungsuk2_10;

public class Ch02_17 {

	public static void main(String[] args) {
		// 2-17 타입간의 변환방법 - 꼭 외울필요는 없지만 중요하기때문에 외우면 좋다.
		
		String str = "3";
		
		System.out.println(str.charAt(0) - '0'); // "3" >> '3'
		System.out.println('3' - '0' + 1); // 3 + 1 >> 4
		System.out.println(Integer.parseInt(str) + 1); // "3" >> 3 / 3 + 1 >> 4
		System.out.println("3" + 1); // 문자열과 숫자를 더하기 위해서 1이 "1"로 변환되고 "3" + "1" = 31
		System.out.println(3 + '0'); // '0'은 숫자로 48 >> 3 + 48 >> 51
		System.out.println((char)(3 + '0')); // 3이 문자로 변환되면서 '3' + '0' = '3'
	}

}