on
[JAVA] 자바의 정석 기초편 [Ch02] - Always From the Ground Up
[JAVA] 자바의 정석 기초편 [Ch02] - Always From the Ground Up
서문
자바의 정석 기초편 챕터 2편을 기재합니다. 강좌를 들으면서 손으로 예제를 써보고 정리한 것을 올립니다.
참고 자료 자바의 정석 기초편 강좌 : https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
본문
자바의 정석 ( ch.2 )
변수란?
하나의 값을 저장하는 메모리 공간 ( RAM )
변수 선언 값을 저장하는 공간을 마련하기 위해서 ( 선언함과 동시에 메모리 공간에 변수를 지정 )
변수 선언 방법 변수타입 변수이름; 선언과 동시에 값을 지정해줄 수 있음
변수 종류 클래스 인스턴스 지역 : 지역변수는 변수를 읽기 전에 꼭 초기화를 시켜주어야 함
String name; // 변수 선언 ( 메모리 공간 할당 ) name = "wi"; // 변수에 값을 저장 ( 메모리에 값을 저장 ) String name = null; // 선언과 초기화를 동시에
변수의 값 읽어오기
변수가 필요한 곳에 변수를 써서 연산처리할 수 있음
int a = 4; int b = 2; System.out.println(a+b); System.out.println(a+2);
변수의 타입
변수의 타입은 저장할 수 있는 값의 타입을 지정하는 것
저장할 값은 변수의 타입에 맞게 써야함
String name = "wi" // string 타입으로 값을 저장 int name = 1; // int(정수) 타입으로 값을 저장
값의 타입 (기본 8개)
문자 - char
논리 - boolean ( true, false )
숫자 정수 - byte, short, int, long 실수 - float, double
변수, 상수, 리터럴
변수( variable ) : 하나의 값을 저장하기 위한 공간, 변경 가능
: 하나의 값을 저장하기 위한 공간, 변경 가능 상수( consistant ) : 한 번만 값을 저장할 수 있는 변수, 변경 불가능
: 한 번만 값을 저장할 수 있는 변수, 변경 불가능 리터럴( literal ) : 그 자체로 값이 되는 것
int a = 100; a = 200; System.out.println(a); // 200 final int b = 100; // 처음이자 마지막의 초기화 b = 200; // 에러가 발생 char ch = 'A'; String str = "abs"; // 이 때 100, 200, A, abs 가 리터럴을 의미
리터럴의 접두사와 접미사
종류 리터럴 접미사(대소구분 x) 논리형 false, true 없음 정수형 123, 0b0101, 077, 0xff, 100L L(long) 실수형 3.14, 3.0e8, 1.4f , 0x1.0p-1 f(float), d(double) 문자형 'A', '1', '
' 없음 문자열 "ABC", "안녕", "True" 없음
boolean power = true; // true or false char ch = 'A'; // 문자형 하나, 작은 String str = "ABC"; // 문자열, 큰 byte b = 127; // int, -128 ~ 127 byte b = 128; // 에러 int i = 100; // 10진수 int b = 0b01; // 2진수 int oct = 0100; // 8진수 int hex = 0x10; // 16진수 long l = 10_000_000_000L; // 100억, int가 대략 20억까지 범위를 가져서 100억은 범위를 넘기 때문에 L를 생략 불가능. long ll = 100; // 이 땐 L을 생략 가능. float f = 3.14f; double d = 3.14d;
변수와 리터럴의 타입이 불일치 할 때 범위가 변수 > 리터럴 인 경우, ok
int i = 'A' // A의 아스키코드로 long l = 100; // long이 더 큰 범위를 가지기 때문에 에러 x double d = 3.14f; // double > float
범위가 변수 < 리터럴 일 때, error
int i = 30_000_000_000; // int 범위 20억을 초과 long l = 3.14f; // long < floag 실수형이 정수형보다 범위가 더 크기 때문에 long 8byte, float 4byte라고 할지라도 float f = 3.14; // float < double 실수 리터럴에 f,d가 없으면 d가 생략된 것
byte, short 변수에 int 리터럴 저장가능
byte b = 100;
문자와 문자열
문자는 하나의 문자가 들어가야 하고 비어 있으면 x
문자열은 연속된 문자들을 의미하고 비어 있어도 상관 x
문자열 + any type = 문자열 / 순서가 중요함
"" + 7 + 7 = "7" + 7 = "7" + "7" = "77";
7 + 7 + "" = 14 + "" = "14";
char ch = 'a'; char ch = 'AB'; //에러 char ch = ''; //에러 String str = "abc"; String str = "a"; String str = ""; String str = "ab"; String str = new String("ab"); String str2 = "a" + "b"; // "ab" String str3 = "a" + 7; // "a7" 숫자를 문자로 변환한 뒤에 결합 // "" + 7 + 7 = "7" + 7 = "7" + "7" = "77"; // 7 + 7 + "" = 14 + "" = "14";
두 변수의 값 교환
int x = 10, y = 20; int tmp; tmp = x; x = y; y = tmp; System.out.println(x); System.out.println(y);
값의 타입, 기본형, 참조형
기본형 ( 8 개 ), Primitive type 문자 - char 숫자 정수 - byte, short, int, long 실수 - float, double 논리 - boolean ( true, false )
실제 값을 저장
참조형, Reference type String, System 등등 메모리 주소를 저장 ( 4byte(32bit jvm) 대충 40억byte, 4gb, 쓸 수 있는 부분은 2gb정도 or 8byte(64bit jvm) 대충 160경byte, 1600만 tb )
Date today ; today = new Date(); // 참조형
기본형의 종류와 크기
논리형 : true와 false중 하나의 값을 가지며 조건식과 논리적 계산에 사용
: true와 false중 하나의 값을 가지며 조건식과 논리적 계산에 사용 문자형 : 문자를 저장하는데 사용되며, 변수 당 하나의 문자만 저장
: 문자를 저장하는데 사용되며, 변수 당 하나의 문자만 저장 정수형 : 정수를 저장하는데 사용되며, 주로 int, long을 쓰고, byte는 이진 데이터를 다룰 때 사용하고 short는 c언어와 호환할 때 사용(잘 사용하지 않음)
: 정수를 저장하는데 사용되며, 주로 int, long을 쓰고, byte는 이진 데이터를 다룰 때 사용하고 short는 c언어와 호환할 때 사용(잘 사용하지 않음) 실수형 : 실수 값을 저장하는데 사용되며, float와 double를 사용
기본형의 크기
종류 1byte 2byte 4byte 8byte 논리형 boolean 문자형 char 정수형 byte short int (default) long 실수형 float double
기본형 표현 범위
byte = 8bit / 1bit(0 or 1)
1bit 1bit 1bit 1bit 1bit 1bit 1bit 1bit
n비트로 표현할 수 있는 범위 : ${2^N}$ 개
n비트로 표현할 수 있는 부호없는 정수의 범위 : $0$ ~ $2^n-1$
n비트로 표현할 수 있는 부호있는 정수의 범위 : $-2^{n-1}$ ~ $2^{n-1} - 1$
byte : $-2^7$ ~ $2^{7} - 1$ 각각 128개 128개 = 256개 = $2^8$
: $-2^7$ ~ $2^{7} - 1$
S ( sign bit ) 7bit
음수 7bit
양수 7bit
short : $-2^{15}$ ~ $2^{15} -1$ = 32768 -32768 ~ 32767
: $-2^{15}$ ~ $2^{15} -1$ = 32768
S ( sign bit ) 15bit
char : 0 ~ $2^{16} - 1$ = 0 ~ 65535
16bit
char a = "A"; // 문자코드로 65
0000_0000_0100_0001
int : $-2^{31}$ ~ $2^{31} - 1$ = $1024 * 1024 * 1024 * 2$ = 대략 $2 * 10^9$ = 20억
S 31bit
long : $-2^{63}$ ~ $2^{63} - 1$ = $2^3 * 2^{60}$ = $8 * 10^{18}$ = 대략 800경 = -800경 ~ 800경 이보다 더 큰 범위를 가진 타입은 BigInteger class
: $-2^{63}$ ~ $2^{63} - 1$ = $2^3 * 2^{60}$ = $8 * 10^{18}$ = 대략 800경 = -800경 ~ 800경
S 63bit
float와 double $-3.4 * 10^{38}$ ~ $3.4 * 10^{38}$ 표현 불가능한 범위 : $-1.4 * 10^{-45}$ ~ $1.4 * 10^{45}$
자료형 저장 가능한 값의 범위 ( 양수 ) 정밀도( 오차 ) 크기 float 1.4E-45 ~ 3.4E38 7자리 32bit double 4.9E-324 ~ 1.8E308 15자리 64bit
float 1 + 8 + 23 = 32bit
S 부호 E(8) 지수 M(23) 가수
double 1 + 11 + 52 = 64bit
S 부호 E(11) 지수 M(52) 가수
형식화된 출력 : printf()
println()의 단점은 출력형식을 지정불가 실수의 자리수 조절불가 - 소수점 n자리만 출력하려면? 10진수로만 출력 - 8진수, 16진수로 출력하려면?
printf()는 위와 같은 형식을 제어할 수 있음
System.out.println(10.0/3); // 3.33333333~ System.out.println(0x1A); // 26 System.out.printf("%.2f", 10.0/3); // 3.33 System.out.printf("%d", 0x1A); // 26, 10진수 System.out.printf("%X", 0x1A); // 1A, 16진수
printf() 지시자, 가장 대표적인 지시자
기타 지시자는 javaAPI -> Formatter를 참조
지시자 설명 %b boolean형식으로 출력 %d 10진수 (decimal)형식으로 출력 %o 8진수 (octal)형식으로 출력 %x,%X 16진수 (hexa-decimal)형식으로 출력 %f 부동 소수점(floating-point)형식으로 출력 %e,%E 지수(exponent)형식으로 출력 %c 문자(character)형식으로 출력 %s 문자열(string)형식으로 출력
System.out.printf("age:%d, year: %d
", 14, 2021);
printf() 지시자2
정수를 10, 8, 16진수로 출력
System.out.printf("%d" 15); //15 10진수 System.out.printf("%o" 15); //17 8진수 System.out.printf("%x" 15); //f 16진수 System.out.printf("%s", Integer.toBinaryString(15)); // "1111" 2진수
8진수 16진수에 접두사 추가하여 출력 "#"을 넣어서 출력
System.out.printf("%#o", 15); // 017 System.out.printf("%#x", 15); // 0xf System.out.printf("%#X", 15); // 0XF
실수 출력을 위한 지시자 %f - 지수형식 %e, 간략한 형식 %g
float f = 123.4567890f; System.out.printf("%f", f); // 123.456787 소수점 6자리까지, float는 7자리까지 정밀하고 그 뒤의 자리수는 보장할 수 없다. System.out.printf("%e", f); // 1.234568e+02 지수형식, 반올림되어 표현 System.out.printf("%g", f); //123.457
printf() 지시자 3
System.out.printf("[%5d] %n", 10); // [ 10] 5자리인데 오른쪽부터 System.out.printf("[%-5d] %n", 10); // [10 ] 5자리인데 왼쪽부터 System.out.printf("[%05d] %n", 10); // [00010] 5자리인데 0을 채워서 System.out.printf("d=%14.10f %n", d); // 전체 14자리에서 소수점 아래 10자리까지 표현 System.out.printf("[%s] %n", url) // [www.codechobo.com] 17자리 url System.out.printf("[%20s] %n", url) // [ www.codechobo.com] System.out.printf("[%-20s] %n", url) // [www.codechobo.com ] System.out.printf("[%.8s] %n", url) // [www.code] 부분출력
화면에서 입력받기 : Scanner
Scanner란?
화면으로부터 데이터를 입력받는 기능을 제공하는 클래스
Scanner사용 import import java.util.* Scanner 객체 생성 Scanner sc = new Scanner(System.in); // 화면입력 Scanner 객체 사용 int num = sc.nextInt(); // 화면에서 입력받은 정수를 num에 저장 float num = sc.nextFloat(); // 실수 String input = sc.nextLine(); // 화면에서 입력받은 내용을 input에 저장 int num = Integer.parseInt(input); // 문자열(input)을 int형으로 바꾸어 num에 저장
계수기(counter) - 만보기
4자리짜리 counter가 있을 때
9999(max) + 1이 되면 0000(min)으로 바뀜
반대로 0000에서 - 1이 되면 9999가 됨
즉, bit로 표현가능한 범위를 넘어서면 이런 식으로 바뀜
타입간의 변환방법 문자와 숫자간의 변환 문자 -> 숫자 : 문자에 -'0'을 해주면 숫자 숫자 -> 문자 : 숫자에 +'0'를 해주면 문자 문자열로 변환 문자,숫자 -> 문자열 : ""을 더함 문자열 -> 숫자(정수) : Integer.parseInt(); 문자열 -> 숫자(실수) : Double.parseDouble(); 문자열 -> 문자 : "3".charAt(0) -> '3'
from http://orangebluestyle.tistory.com/34 by ccl(A) rewrite - 2021-12-22 01:02:10