프로그래밍/자바공부 - Chapter별

Chapter02

leecoder 2021. 9. 6. 16:33

변수와 상수

  1. 변수
    • 수학적 의미 : 변하는 수
    • 프로그래밍 언어에서의 의미 : 어떤 값을 저장할 수 있는 메모리 상의 공간
  2. 자바에서 변수를 선언하는 방식
    • 자료형( Data Type ) 변수명 [= 초기값] ;
      <값의 종류에 따라 값이 저장될 공간의 크기와 형식의 정의
    • 이름을 저장할 변수를 선언 - String name;
    • 캐멀 케이스 사용 - ex) firstName
    • 한번 사용한 변수명을 또 선언할 경우 에러 발생 - Duplicate local variable name
  3. 자바에서 변수 초기화
    • 초기화란? 변수를 사용하기 전에 처음으로 값을 저장하는 것
    • name = “홍길동”
      • name이라는 변수에 "홍길동"이라는 값을 저장
      • “=”을 대입(할당) 연산자라고 부름
    • 대입(할당) 연산자
      • '='의 우측항의 값을 좌측 항의 변수에 할당(대입)함
      • 우측 항을 먼저 연산 후 좌측 항의 변수에 할당함
    • 지역변수(Local Variable)는 초기화 하지 않을 시 에러 발생
  4. 변수의 명명 규칙
    • 식별자
      • 프로그래밍에서 사용하는 모든 이름으로 개발자(사용자)가 선언한 이름
      • 대소문자를 구분하며 길이 제한은 없다. -> age와 Age는 다른 것이다.
      • 예약어를 사용할 수 없다. -> int, public 불가
      • 숫자로 시작할 수 없다. -> 0name 불가
      • 특수문자는 '_' , '$'만 사용할 수 있다. -> first name은 불가능하며 firstName나 first_name을 사용해야 한다.
        ex) days02 패키지명, Ex06 클래스명, age 변수명 등
    • 예약어(키워드)
      • 미리 의미가 부여된 식별자
        ex) package, public, class, static, void, String 등

변수의 타입

  1. 자료형의 종류
    • 기본형(primitive type) - 8가지
      • 숫자형
        - 정수계열 : byte : 1바이트(8bit) -> 2^8가지 정수 -128 ~ 127
                       short : 2바이트(16bit) -> 2^16 -2^15 ~ 2^15-1
                       int    : 4바이트(32bit) -> 2^32 -2^31 ~ 2^31-1
                        long : 8바이트(64bit) -> 2^64 -2^63 ~ 2^63-1
               문자 :  char : 2바이트(16bit)
        - 실수계열 : float : 4바이트(32bit)
                       double : 8바이트(64bit)
      • 불린 형(논리형) : Boolean (True, False) -> 참/거짓을 저장하는 자료형
      • 계산을 위한 실제 값을 저장한다.
        ex) 나이를 표현하기 위한 자료형 : byte – int를 사용할 경우 3바이트의 메모리 낭비
    • 참조형(reference type)
      1. 배열(Array), 클래스(Class), 인터페이스(Interface)
        문자열 자료형 : String 클래스
      2. 객체의 주소를 저장한다.
  2. 상수와 리터럴
    • 상수
      • 값을 한 번만 저장할 수 있는 공간
      • 변수 앞에 ‘final’이라는 키워드를 붙여준다..
      • 선언할 때는 모두 대문자로 선언하고 단어가 바뀔 때는 ‘_’를 사용한다.
      • 선언과 동시에 초기화를 해야 한다.
      • 필요한 이유? 여러 곳에 같은 의미를 가진 리터럴을 사용할 때 상수로 사용하면 편하게 값을 변경할 수 있다.
    • 리터럴
      • 그 자체로 값을 의미하는 것
        ex) 3.14, ‘A’, 10 등등
  3. 형식화된 출력
    • println() : print() + 개행(줄 바꿈)
    • print()
    • printf("출력형식 문자열", 출력변수)
        • %[argument_index$][flags][width][.precision]conversion
        • conversion  – d : 10진수 정수, o : 8진수, x : 16진수(소문자), X : 16진수(대문자)
                          – s : 문자열, c : 문자, f : 부동소수점, b : Boolean
      int score =10;
      System.out.printf("[%10d]\n",score); 		// 너비 10자리 우측 정렬
      System.out.printf("[%010d]\n",score); 		// 너비 10자리 우측 정렬 공백을 0으로 채움
      System.out.printf("[%-10d]\n",score); 		// 너비 10자리 좌측 정렬
      System.out.printf("%o\n",score); 		// 8진수
      System.out.printf("%x\t%X\n",score,score); 	// 16진수
      System.out.printf("%#o\n",score); 		// 8진수
      System.out.printf("%#x\t%#X\n",score,score); 	// 16진수
      
      double avg = 78.76545;
      System.out.printf("%f\n",avg);
      System.out.printf("%.2f\n",avg); 		// 소수점 2자리 : 78.77
      System.out.printf("%10.2f\n",avg); 		// 너비 10자리, 소수점 2자리 우측 정렬
      
      System.out.printf("%(d\n",-123); 		//(123) 음수인 경우 ()로 나타냄
      System.out.printf("%(d\n",123); 		//123
      System.out.printf("%,d\n",123456789); 		//123,456,789
    • 제어(특수) 문자
      • ‘\n’ : 줄 바꿈 -> System.out.println()도 사용, printf문에서는 %n도 사용할 수 있다.
      • ‘\t’ : tab키
      • ‘\b’ : backspace
      • ‘\’‘ : ‘ 출력
      • ‘\“’ : “ 출력
    • 연산자를 사용한 출력
      • 문자열(“10”) + 문자열(“10”) -> 문자열(1010)
      • 문자열(“10”) + 정수(10) -> 문자열(1010)
      • 정수(10) + 정수(10) -> 정수(20)
  4. Console에서 입력받기
    • 표준 입력 -> 읽기( 스트림, Stream ) -> System.in
    • 스트림:
      • 바이트 스트림 : System.in -> 문자변환 스트림 : InputStreamReader -> 한 라인 읽기 : BufferedReader
      • 문자 스트림
    • 클래스를 사용하기 위해서는 그 클래스가 포함된 패키지를 import 해 줘야 한다.
    • BufferedReader 형식
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      String name = br.readLine(); -> 오류 발생(Unhandled exception type IOException) 
      					└> throws 문으로 사용하여 예외처리 
                          
      readLine() ? 
        1) 입력한 값을 읽어오는 함수 
        2) 매개변수 X 
        3) 입력한 문자열(String) 값 반환​
    • Scanner 형식
      Scanner sc = new Scanner(System.in);
      String name2 = sc.nextLine();
      Int num = sc.nextInt();
      char ch = sc.next(). charAt(index); // charAt() 함수를 이용하여 문자열의 index 위치의 문자 추출

진법 변환

  1. 정수, 문자의 진법 변환
    • 10 -> 0000 0000 0000 0000 0000 0000 0000 1010
    • 'A' -> ASCII(65) -> 0000 0000 0100 0001
  2. 음수의 진법 변환 -10 -> [S][0][0][0] [1][0][1][0]
                                    └> 부호 비트 -> 양수 : 0, 음수 : 1
    • 부호와 절대치 ㅣ-10ㅣ -> 10
      • [0][0][0][0] [0][0][0][0] +0
      • [1][0][0][0] [0][0][0][0] -0
      • 0이 중복되어 현재는 사용 x
    • 1의 보수법
      • 절댓값 구하기 |-10| == 10
      • 2진수로 변환                     0000 1010
      • 보수 0 -> 1, 1 -> 0으로 변환 1111 0101
    • 2의 보수법 (현재 사용 중)
      • 절댓값 구하기|-10| == 10
      • 2진수로 변환                      0000 1010
      • 보수 0 -> 1, 1 -> 0으로 변환 1111 0101
      • 1 더하기(1의 보수 +1)                      1
                                               1111 0110
    • ex1) -13 -> 13(0000 1101) -> 1111 0010 -> 1111 0011
      • 절댓값 구하기 |-13| == 13
      • 2진수 구하기          0000 1101
      • 1의 보수 구하기      1111 0010
      • 2의 보수 구하기(+1) 1111 0011
    • ex2) 1011 1011 -> 1011 1010 -> 0100 0101 ->1 + 4+ 64 = 69 -> -69
      • 1의 보수 만들기(-1) 1011 1010
      • 보수                     0100 0101
      • 10진수로 변환        1 + 4 + 64 = 69
      • (-) 부호 붙이기        - 69
  3. 실수의 진법 변환
    • 10진 소수점수 -> 2진 소수점수
      1. 0.625(10) -> ?(2)
      2. 2 곱하기 -> 0.625 * 2 = 1.25
      3. -1 하기   -> 0.25 -- 1 ↓
      4. 0.25 * 2  -> 0.5   -- 0 ↓
      5. 0.5 * 2   -> 1.0    -- 1 ↓
      6. 1)소수점이 없을 때까지 2) ~ 4) 반복
      7. 2)무한인 경우?
      8. 위에부터 읽기 0.101(2)
    • 2진 실수 -> 10진 실수
      • 0.101(2) -> 2^-1 + 2^-3 -> 0.625
  4. 정수형의 오버플로우
    1. 타입이 표현할 수 있는 값을 넘어간 것
      ex) byte => -128~127
      [1][1][1][1] [1][1][1][1] == -128
      + 1 -> 0000 0000

기본형 - 실수

  1. 실수를 나타내는 자료형 : float(4), double(8)
    3.141592    지수 부분(E : 8자리)         가수(M : 23자리)
    float [S] [1][2][3][4] [5][6][7][8] [1][][] [][][][] [][][][] [][][][] [][][][] [][][][]
                        지수 부분(E : 11자리)                가수(M : 52자리)
    double [S] [1][2][3] [4][5][6][7] [8][9][10][11] [1][][][] [][][][] [][][][] [][][][]...
    정밀도 : float     -> 7자리 0.1234567XXXX 단정도 정밀도 -> 둘 다 오차가 있는 자료형
               double -> 15자리 0.123456789012345XXX 배정도 정밀도
  2. 실수형의 저장 형식
    • 값을 부동소수점 형태로 저장
                       └> +-M * 2^E 실수를 표현한 것
    • ex) 10진 소수 (9.1234567)
      • 2진 소수로 변환 : 정수 부분 : 9 -> 1001
                               소수 부분 : 0.1234567 * 2 -> 000111111001101011011011...
                               => 1001.000111111001101011011011...
      • 정규화 1.XXX * 2^ E (부동소수점 표현)
        => 1.001000111111001101011011011... * 2^3 (3이 나온 이유 : 1001 == 1.001*10^3)
                    └> M                                     └>E(8bit에 3을 저장)
      • 기저법 – 특정 수(127)를 E에 더함 -> 127 + 3 = 130
                     E = [1][0][0][0] [0][0][1][0]

형 변환

  1. 정의
    • 변수 또는 상수의 타입을 다른 타입으로 변환하는 것 : A 자료형 -> B 자료형 변환
    • ex) int -> byte, int -> double, String -> int, int -> String, char -> String, float -> double
  2. 형 변환하는 이유 : 서로 다른 타입 간의 연산을 수행해야 하는 경우 자료형이 같아야 해서
  3. 변환방법
    • 자동으로 형 변환 (2가지 경우)
      • int i = 100; 4byte - [][][][]
        long l = 100L; 8byte - [][][][] [][][][]
        - i + l -> 200이 나오지만 8byte의 long형 200이다.
        - 연산하려면 자료형이 같아야 하지만 자동으로 자료형이 변환된다.
        - 작은 자료형 '연산' 큰 자료형 = 큰 자료형
      • int i = 10; 4byte - [][][][]
        long l = i; [][][][] [][][][] = [][][][]
        - 우측의 항 값이 작은 자료형일 경우 좌측 큰 자료형에 대입(할당)될 때 큰 자료형으로 변환된다.
        - 우측이 큰 자료형일 경우 자동으로 형 변환이 안 되어서 에러가 발생한다.
             └> Type mismatch: cannot convert from long to int
      • 자료형의 크기 비교 : byte < short / char < int < long(8) < float(4) < double
    • 강제로 형 변환
      • byte + byte + byte -> int?
        why? JVM의 피연산자 스택이 피연산자를 4byte 단위로 저장하기 때문에 4byte 이하의 자료형은 4byte로 변환하여 연산을 수행
      • 큰 자료형을 작은 자료형으로 변환할 때 사용
        ( ) cast 연산자 사용 -> (바꾸려는 자료형) 값
        -> Boolean형을 제외한 기본형끼리는 가능하다.
        -> 문자열(String)은 클래스 형식으로 참조형이므로 형 변환을 할 수 없다.
      • 소수점 자리가 더 있지만 0으로 나오는 경우
        why? short / int -> int형으로 나옴 -> 소수점이 0으로 나옴
        -> 소수점을 정확하게 나오게 하기 위해서는 강제 형 변환을 해서 하나를 double 형이어야 한다.
    • String에서 숫자로 형 변환
      • byte => Byte.parseByte();
      • int => Integer.parseInt();
      • double => Double.parseDouble();
      • Boolean => Boolean.parseBoolean();
      • xxx 형 변환 => Xxx.parseXxx();
      • 기본형 자료형을 사용하기 쉽도록 포장한 클래스가 있다.
        -> 래퍼(Wrapper) 클래스
        기본형 자료형           래퍼 클래스
              byte                     Byte
              short                    Short
              int                       Integer
              long                     Long
              char                     Character
              float                     Float
              double                  Double
    • Wrapper 클래스 숫자를 8, 16진수로 변환
      • 16진수 : Integer.toHexString(값)
      • 8진수   : Integer.toOctalString(값)
      • 2진수   : Integer.toBinaryString(값)
    • 숫자를 문자로 변환
      int 100 -> String "100"
      • Integer.toString(100)
      • String.valueOf(100)
      • String.format(“% d”,100)
      • "" + 100 -> 문자열 + 숫자 => 문자열
    • 원하는 형식의 문자열로 변환
      • String.format(“원하는 형식”, 변환하려는 값) 함수 사용
    • 문자열에서 원하는 문자 추출
      • 문자열.charAt(Index, 추출하려는 문자의 위치)

'프로그래밍 > 자바공부 - Chapter별' 카테고리의 다른 글

Chapter04  (0) 2021.09.08
Chapter03  (0) 2021.09.06
Chapter01  (0) 2021.08.24