ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이것이 자바다 2장
    JAVA 2022. 11. 27. 16:41

    *공부하고 기록하는 글입니다*

     

     

    CH02. 변수와 타입

     

    2.1 변수 선언

    - 컴퓨터 메모리(RAM)은 수많은 번지들로 구성된 데이터 저장 공간.

    - 변수는 하나의 값을 저장할 수 있는 메모리 번지에 붙여진 이름

    - 자바의 변수에는 한가지 타입의 데이터만 저장이 가능하다. (정수, 실수, string, boolean....)

    - 변수 이름은 1. 첫번째 글자가 소문자 2. 카멜 케이스

    - 변수 선언은 1. 변수의 타입 설정 2. 변수 이름 설정 // but 메모리에 할당된건 아니야!

    - 변수에 값을 최초로 대입하는 행위 -> 변수 초기화 & 이를 초기값이라 함!

     

    2.2 정수 타입

     

    - 타입의 종류 8가지

    값의 분류 기본 타입
    정수 byte, char, short, int, long
    실수 float, double
    논리(true/false) boolean

    - 정수 타입 메모리 사용 크기 순

    종류 byte short int long
    메모리 사용 크기 (단위 bit) 8 16 32 64

    - 메모리 사용 크기를 n으로 하면

    n n-1 n-2 .. .. .. .. 2 1

    -> 메모리 사용 크기 (단위는 bit)

    -> n은 최상위 bit로 부호를 나타냄! (양수 : 0, 음수 : 1)

    -> 나머지 bit [1~n-1] 는 2진수! 값의 범위를 나타냄

     

    - 리터럴 : 코드에서 프로그래머가 직접 입력한 값 -> 변수에 대입할 정수 리터럴은 진수에 따라 작성하는 방법이 달라!

    • 2진수 : 0b 또는 0B로 시작하고 0과 1로 작성 (ex. 0b0101 = 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 5)
    • 8진수 : 0으로 시작하고 0~7 숫자로 작성 (ex. 013 = 0*8^2 + 1*8^1 + 3*8^0 = 11)
    • 10진수 : 소수점이 없는 0~9 숫자로 작성
    • 16진수 : 0x 또는 0X로 시작하고 0~9 숫자나 A,B,C,D,E,F 또는 a,b,c,d,e,f 로 작성

    - 만일 byte 타입 변수에 초과한 값을 대입하는 경우 -> 컴파일 오류 발생! 

     

    - long 타입은 수치가 큰 데이터를 다루는 프로그램에서 사용 ( 값에 l, L을 붙여서 타입을 알려주기)

     

    2.3 문자 타입

    - 문자를 ''로 감싼 것을 문자 리터럴이라 함.

    - 문자 리터럴은 유니코드로 변환되어 저장된다.

    - 유니코드는 세계 각국의 문자를 0~65535 숫자로 매핑한 국제 표준 규약

    - 자바는 이런 유니코드를 저장할 수 있도록 char 타입 제공

    - 유니코드는 정수, char 타입도 정수 타입

    - 'A' 는 유니코드로 65

         -> println 하면 char v1 = 'A', char v2 = 65

         => 둘다 A나와!

    - char 타입의 변수를 초기화 하려고 '' 빈 스트링을 넣어주면 -> 컴파일 에러 발생!

       => ' ' 공백을 포함시켜서 초기화 하기

     

     

    2.4 실수 타입

    - 실수 타입에는 float, double이 있어

    - 메모리 크기, 저장되는 값의 허용 범위, 유효 소수 이하 자리 등 값의 범위와 정밀도가 달라.

    - 컴파일러는 실수 리터럴을 기본적으로 double 타입으로 해석하니깐

    - float 타입을 알려주려면 값 뒤에 f, F 붙여!

     

     

    2.5 논리 타입

    - true / false

    - 두가지 상태값을 저장할 필요가 있을 때 사용

     

    2.6 문자열 타입

    - (' ') 작은 따옴표로 입력한 값은 char 타입으로 유니코드로 변환

    - (" ") 큰 따옴표로 입력한 값은 문자열! String!

    - 문자열 중간에 역슬래쉬 ( \ ) - 이스케이프 입력으로 특정 문자를 포함 가넝

    이스케이프 문자  
    \' ' 문자 포함
    \" " 문자 포함
    \\ \ 문자 포함
    \u 16진수 16진수 유니코드에 해당하는 문자 포함
    \t 출력시 탭만큼 띄움
    \n 출력시 줄바꿈
    \r 출력시 캐리지 리턴

     

     

    2.7 자동 타입 변환

    - 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 대입될 때 발생

    - byte < short, char < int < long < float < double

    - 정수 타입이 실수 타입으로 대입될 경우에는 무조건 자동 타입 변환이 된다!

    - 예외도 있는데 ( byte -> char 는 불가넝 )  => 왜냐믄 char 타입은 음수를 포함하지 않으니깐 변환 안됨 (-> 컴파일 에러)

     

    2.8 강제 타입 변환

    - 큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환이 불가능 함

    - 그러나 쪼개서 타입 변환 하는건 가능 => 강제 타입 변환

    - 강제 타입 변환의 목적은 원래 값이 유지되면서 타입만 바꾸는거야

    - 캐스팅 연산자로 괄호 ( ) 를 사용 => (쪼개서 바꿀 작은 허용 범위 타입) 이렇게 사용

    - [int -> byte] : 앞의 3byte는 삭제되고 끝에 1byte 값만 byte 타입 변수에 저장

       => -128 ~ 127 int 값만 원래 값을 보존 가능

    - [int -> char] : char 타입의 허용 범위인 0~65535 사이의 값만 원래 값을 유지 가능

    - [실수 -> 정수] : 소수점 이하 부분은 버려지고, 정수 부분만 저장됨

     

     

    2.9 연산식에서 자동 타입 변환

     

    - 자바는 실행 성능을 향상시키기 위해 컴파일 단계에서 연산을 수행

    - 자세히 보자면

    byte result = 10 + 20; // 컴파일 : byte result = 30

    자바 컴파일러는 컴파일 단계에서 10+20 을 미리 연산해서 30을 만들고

    result 변수에 30을 저장하도록 바이트코드를 생성

    따라서 실행 시에 덧셈 연산이 없으므로 실행 성능이 좋아져!

     

    but, 정수 리터럴이 아닌 변수가 피연산자면 실행 시 연산을 수행하지.

    그래서 정수 타입 변수가 피연산자로 들어오면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환이 된다는 말

     

    byte a = 10;
    byte b = 20;
    byte c = a + b; // 컴파일 에러
    int c = a + b;

    결론은 특별한 이유가 없다면!

    정수 연산에서 변수가 사용될 경우에

    int 타입으로 변수 선언하는게

    타입 변환이 일어나지 않기 때문에 실행 성능에 도움이 됨.

    항상 int로 하라는 말은 아님! int 보다 허용 범위가 큰 long 타입이 피연산자로 사용되면 long 타입으로 변환되니까 이때는 long 으로 변수 저장 해야함!

     

    float + double -> double

    int + double -> double

     

     

    2.10 문자열을 기본 타입으로 변환

     

    변환 타입
    String -> int String str = "30000";
    int value = Integer.parseInt(str);
    String -> boolean String str = "true";
    boolean value = Boolean.parseBoolean(str);
    기본 타입의 값 -> String String str = String.valueOf(기본 타입 값);

     

    2.11 변수 사용 범위

    - main() 메소드 블록 내에 다른 중괄호 {} 블록 사용 가능

    public static void main(String[] args) {
    	
        int var1; // 메소드 블록에서 선언
        
        if (...) {
        	int var2; // if 블록에서 선언
        }
        
        for (...) {
        	int var3; // for 블록에서 선언
        }
    	
        // var1 사용가능
        // var2, var3 사용 불가넝
    }

     

     

    2.12 콘솔로 변수값 출력

     

    메소드 의미
    println(내용) 괄호 안의 내용을 출력하고 행을 바꿔!
    print(내용) 괄호 안의 내용을 출력하고 행은 바꾸지 마!
    printf("형식문자열", 값1, 값2, ...) 형식 문자열에 맞추어 뒤의 값을 출력해!

     

    - printf 에서 형식 문자열은 -> % ........ conversion (변환 문자) => 이렇게 두개는 필수 입력!

    - % 는 형식 문자열 시작을 의미

    - conversion 에는 제공되는 값의 타입에 따라 d(정수), f(실수), s(문자열)

    - 문자열에 포함될 값이 두 개 이상인 경우에는 1$, 2$ 로 순서를 같이 적어줘야해

    System.out.printf("이름 : %s", "삼다수") // 이름 : 삼다수
    System.out.printf("나이 : %d", "11") // 나이 : 11
    System.out.printf("이름 : %1$s , 나이 : %2$d", "삼다수", 11) // 이름 : 삼다수 , 나이 : 11

    - 자주 사용되는 형식 문자열

    형식화된 문자열 설명 출력 형태
    정수 %d
    %6d
    %-6d
    %06d
    정수
    6자리 정수, 왼쪽 빈자리 공백
    6자리 정수, 오른쪽 빈자리 공백
    6자리 정수, 왼쪽 빈자리 0 채움
    123
    ___123
    123___
    000123
    실수 %10.2f
    %-10.2f
    %010.2f
    정수 7자리+소수점+소수 2자리.왼쪽 빈자리 공백
    정수 7자리+소수점+소수 2자리.오른쪽 빈자리 공백
    정수 7자리+소수점+소수 2자리.왼쪽 빈자리 0 채움
    ____123.45
    123.45____
    0000123.45
    문자열 %s
    %6s
    %-6s
    문자열
    6자리 문자열. 왼쪽 빈자리 공백
    6자리 문자열. 오른쪽 빈자리 공백
    abc
    ___abc
    abc___
    특수 문자 \t
    \n
    %%

    줄바꿈
    %


    %

     

    2.13 키보드 입력 데이터를 변수에 저장

     

    - 키보드로 부터 입력받은 데이터를 변수에 저장하는 가장 쉬운 방법 -> Scanner

    Scanner scanner = new Scanner(System.in);
    // 스캐너 변수 선언     // 스캐너 객체 생성
    
    String inputData = scanner.nextLine();
    // inputData 변수에 키보드로 입력된 값을 저장

    - scanner.nextLine() 은 enter 키가 입력되기 전까지 블로킹 상태!

    - enter 입력시 입력된 모든 값을 문자열로 받는거!

     

    'JAVA' 카테고리의 다른 글

    이것이 자바다 3장  (0) 2022.11.27
    이것이 자바다 1장  (0) 2022.11.27
    이것이 자바다 6장 5-9  (0) 2022.11.20
Designed by Tistory.