티스토리 뷰

728x90

서문



자바의 정석 기초편 챕터 2편을 기재합니다. 강좌를 들으면서 손으로 예제를 써보고 정리한 것을 올립니다.









본문

자바의 정석 ( 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', '\n' 없음
문자열 "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중 하나의 값을 가지며 조건식과 논리적 계산에 사용
  • 문자형 : 문자를 저장하는데 사용되며, 변수 당 하나의 문자만 저장
  • 정수형 : 정수를 저장하는데 사용되며, 주로 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$
S ( sign bit ) 7bit
음수 7bit
양수 7bit


  • short : $-2^{15}$ ~ $2^{15} -1$ = 32768
    • -32768 ~ 32767
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
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\n", 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'





  • 자바의 정석 Ch02에서는 변수, 상수, 리터럴, 값의 타입, 문자와 문자열, 기본형, 참조형의 종류 및 크기에 대해서 배웠습니다.
  • 또한 printf() 지시자와 Scanner, 문자와 숫자, 문자 숫자 문자열간의 변환에 대해서 배웠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함