ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🎮 [JAVA 자바] #2 | 자바의 기본타입, 식별자, 리터럴, 오버플로우, 형변환, Scanner, var, final
    CS/Java 2022. 4. 16. 20:00

     


    🎮 자바 프로그램의 기본 구조

    package week2_3;
    import java.util.Scanner;
    public class Circle {
        final static double PI = 3.14; // 원주율을 상수로 선언 (final 사용)
        
        public static void main(String[] args) {
            System.out.print("radius:") // 단순 안내 메세지
            Scanner scanner = new Scanner(System.in); // 레퍼런스 타입, 입력, System.in은 키보드 디바이스
            int radius = scanner.nextInt(); // 기본타입 변수 int, 정수로 받기
            
            double circleArea = radius*radius*PI; // 기본타입 변수 double
            
            System.out.println("원의 면적 = " + circleArea);
            scanner.close(); // 자원 쓰면 닫아주기 (자원해제, 파일 디스크립트)
        } // 메소드 끝
    } // 클래스 끝
    
    /* 출력
    radius:3
    원의 면적 = 28.26
    */

    🎮 자바 프로그램 기본 요소

     - 예약어 

    자바에서 의미가 이미 예약되어 있는 단어로, 클래스명이나 필드 변수명 또는 메소드 명으로 사용할 수 없다.

     

     - 식별자

    클래스, 변수, 상수, 메소드 등에 붙이는 이름 -> 클래스명, 변수명 ...

    길이 제한 없음

    대소문자 구문 (final은 예약어, Final은 식별자로 사용가능)

    한글, 유니코드 문자, 영문자, 특수문자중 '_', '$' 사용가능

     

    <식별자에 사용 불가능>

    : 특수문자('@','#'등), 공백, 탭

    : 숫자가 식별자의 제일 앞에 잇는 경우

    : 자바 예약어, boolean 리터럴(true, false), NULL 리터럴(null)   (리터럴은 '데이터 값 자체' 라는 뜻)

     

    <보통 자바 명명 규칙, 꼭 지킬 필요는 X>

    클래스 이름 : 첫번째 문자마다 대문자 (AutoVendingMaching)

    변수, 메소드 이름 : 첫 단어 이후 첫번재 문자마다 대문자 (myAge, getAge)

    상수 이름 : 모든 문자 대문자 (PI)

     

     - JAVA 데이터 타입 

    기본 타입(primitive type) 8개

       - 정수 : byte(1 byte), short(2), int(4), long(8)

       - 실수 : float(4), double(8)

       - 참과 거짓 : boolean(1)

       - 문자 : char(2)

       - CPU나 운영체제에 따라 변하지 않음

       - 기본 타입은 전달, copy

     

    레퍼런스 타입(reference type) 

       - 기본 타입이 아닌 모든 변수는 레퍼런스 변수, 배열/클래스/인터페이스 등

       - 레퍼런스 타입은 레퍼런스 전달

       - 레퍼런스 타입 변수들은 대입문에서 레퍼런스를 전달

    class Student { 
        public int id = 10;
    }
    
    public class HelloWorld {
        public static void main(String[] args) {
           Student a = new Student(); // 메모리 어딘가에 임의 객체 생성, 그 위치를 a에 할당
           Student b = a; // b에 a를 할당함으로 a와 b가 둘 다 new Student를 가리킴
           b.id = 20; // a와 b가 둘 다 가리키므로 a.id도 20
           System.out.println(a.id);
           System.out.println(b.id);
       }
    }   
    
    /* 출력
    20
    20
    */

     

    * 레퍼런스 : 객체의 메모리를 생성했을 때 메모리와 연결된 유일한 숫자값(메모리 주소가 드러나지 않음)

     


    🎮 오버플로우

     - 정수 오버플로우

    담을 수 있는 최대 용량이 있어서 발생. 넘으면 최솟값(음의 부호 가진 최댓값+1)으로 가서 순환.

    최댓값은 xxx.MAX_VALUE로 알 수 있다. (ex. Integer.MAX_VALUE))

     

     - 부동 소수점 오버플로우 

    부동소수점 값의 범위와 유효자리수. 유효숫자의 한계가 있어서 정확하지 않다.

    float z = 1e39f; -> 오버플로우 일어남. 

     

     - 컴퓨터에 실수가 저장되는 방법  

    부동 소수점으로 활용. IEEE 754표준을 따름.

    부호(Sign), 지수(Exponent), 가수(Mantissa)의 세영역으로 표시한다.

    single 부동소수 정수 : 4바이트, 32비트, 부호 1비트 + 지수 8비트  + 가수 23비트

    double 부동소수 정수 : 8바이트, 64비트, 부호 1비트 + 지수 11비트 + 가수 52비트

    (ex. float f = 10.11(2진수) = (-1)^0 * 1.011 * 2^1 -> 0 10000000 011000000...)


    🎮 리터럴

     - 리터럴(Literal) 

    프로그램 코드에서 직접 표현된 값

    종류 : 논리, 정수, 시루, 문자, 문자열, null (ex.34, 42.124,  ' %', "hello", true, false, null)

     

     - 논리  리터럴 

    true, false 2개뿐. boolean 타입 변수나 조건식에 사용. 자바에서는 1, 0을 참, 거짓으로 사용 불가(C언어와 차이점) while(1) 사용불가

     

     - 정수 리터럴 

    10진수, 8진수, 16진수, 2진수 리터럴. 정수 리터럴은 int 형으로 컴파일

    long 타입 리터럴은 l / L로 표현 (Ex. long g = 24L;)

    정수 리터러 중간 언더스코어('_') 넣기 가능 -> 앞/뒤에 넣으면 오류

    15 -> 10진수 리터럴 15
    015 -> 0으로 시작하면 8진수. 십진수로 13
    0x15 -> 0x으로 시작하면 16진수. 십진수로 21
    0b0101 -> 0b로 시작하면 2진수. 십진수로 5

    int age = 2___5; 
    long maxLong = 0x7fff_ffff_ffff_ffffL; 

    * Integer.toBinaryString(100) : 십진수 100을 2진수로 변환하는 정수 리터럴 API

    * Integer.toOctalString(100) : 십진수 100을 8진수로 변환

    * Integer.toHexString(100) : 십진수 100을 16진수로 변환

     

     - 실수 리터럴

    소수점 형태지수 형태로 표현한 실수 (ex. 12., 12.0, .1234, 0.1234, 1234E-4)

    double 타입으로 컴파일

    f / F (float), d / D (double) 명시 가능 (ex. float f = 0.1234f; double w = .1234D;) 

    * 주의 : float x = 1.5; 컴파일 에러, float을 double로 바꾸거나, 1.5를 1.5f로 바꿔준다.

     

     - 문자 리터럴 

    단일 인용부호('')로 문자표현 또는 \u유니코드 값으로 표현. 내부적으로 정수값 코드로 저장

    내부적으로 유니코드(2 byte) 사용 -> 문자리터럴은 2byte (16bit)

    * 유니코드 : 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준

    char x = 'A';
    char y = 65;
    char z = '\u0041';
    
    // 모두 같다.

     

     - escape sequence 

     

     - 기본 타입 이외의 리터럴

    null 리터럴 : 레퍼런스에 대입해서 사용. 기본 타입에 사용불가

    문자열 리터럴(스트링 리터럴) : 이중 인용부호로 묶어 표현. String 객체로 자동 처리

    int n = null; // 오류! 기본 타입에 사용불가
    String str = null;
    
    String str = "Good";

    🎮 var 키워드

     - var 

    타입 추론(type inference)이 가능한 경우, 지역 변수 선언할 때 타입 대신 사용 가능. 선언과 초기화를 동시에 해야한다. 

    약간 모호한데, auto 키워드랑 비슷하다. 타입 신경쓰지않고 다른 곳에 넘겨줄 때 주로 사용하기도 한다.

    var price = 200; // int 타입
    var name = "jumin"; // string 타입
    var point = new Point(); // point 타입
    var v = new Vector<Integer>(); // Vector<integer> 타입
    
    var name; // 컴파일 오류! 변수 name 타입 추론 불가능

    🎮 상수

     - final 키워드 

    선언 시 초기값 지정, 실행 중 값 변경 불가능. c++에서의 const와 비슷

    (ex. final double PI = 3.141592;)

     

    +) C++의 상수처리 

    * const int : 메모리 공간 할당

    * #define PI : 전처리기가 모든 값을 찾아서 바꿔준다.

     


    🎮 형변환

     - 자동 형변환  

    대입문에서는 왼쪽 변수의 형태에 따라 변환. 작은 타입은 큰 타입으로 자동 변환, 반대는 X

     

    - 강제 형변환 

    피연산자의 형태를 명시적으로 변환시킴. (형변환할 자료형)을 대입문에서 오른쪽 변수 앞에 써준다.

    long m = 25; // int -> long
    double d = 3.14*10; // 10->10.0
    int n = (int) d; // 강제 형변환으로, n=31 (손실이 일어난다.)
    
    byte b = n; // 컴파일 오류! int -> byte 자동 변환 불가
    byte b = (byte) n; // 강제 형변환 32비트 -> 8비트
    
    System.out.println((char)0x12340041) // char은 16진수니까 뒤에 4자리만 -> 0x41은 문자 A

     

    * 주의 : 연산의 결과값은 피연산자의 형태와 같다. 두 정수값으로 나누면 결과값이 정수가 된다. (ex. result = 10 / 4 ->  result = 2)

    -> 나눗셈 결과가 실수값이 되려면 피연산자 중에 하나는 실수값으로 해주면 된다. (ex. result = 10 / 4.0 -> result = 2.500000)


    🎮 Scanner

     - 표준 입력 스트림 

    System.in : 키보드로부터 직접 읽는 자바의 표준 입력 스트림, 바이트 스트림(1 byte)이므로 문자(2 byte)로 변환 

    키 값을 바이트 데이터로 넘겨주므로 응용프로그램이 문자 정보로 변환 해야 함(1,2,3 -> 123) -> Scanner가 함

     - Scanner 클래스 

    java.util.Scanner

    Scanner 객체의 사용을 명시해야 함

    스트림에서 입력된 바이트문자, 정수, 실수 등의 타입으로 변환

    입력되는 값에서 공백(' ', '\n', '\t')으로 토큰을 구분, 다양한 타입의 값으로 리턴 가능

    System.in에게 키 읽게하고, 원하는 타입으로 변환하여 리턴

    Scanner scanner = new Scanner(System.in); // 사용자가 Lim 22 45.5 true 입력
    
    String name = scanner.next(); // "Lim"
    int age = scanner.nextInt(); // 22
    double weight = scanner.nextDouble(); // 45.5
    boolean single = scanner.nextBoolean(); // true
    
    scanner.close();

    * String inputString = scanner.nextLine() : 공백 포함 한 줄을 입력

    * String binary = Integer.toBinaryString(100) : 십진수 100을 이진수로 변환

    * xxx.equals("123") : 두 string 비교하는 메소드로, 123과 같은지 비교하는 예시코드. ==사용하면 주소가 달라서 무조건 false 나옴.

    private static Scanner scanner;
    
    scanner = new Scanner(System.in);
    scanner = new Scanner(System.in);
    
    scanner.close();

    * 주의점1 : close()를 까먹지 말고, 프로그램 내에서 Scanner는 가급적 한 개만 생성한다.

    * 주의점2 : nextInt()와 nextLine()을 이어쓰면 nextInt() 후에 버퍼에 남아있던 '\n'이 nextLine()에 입력된다. -> nextLine에서 바로 입력도 안되고 리턴되어 종료된다. 해결방법은 nextInt()와 nextLine()사이에 scanner.nextLine()을 써서 '\n'을 소모해서 해결한다.