[core.java]Java学習(Chapter 3)


Chapter 3. 基本プログラミング構造in java

3.3 Data Types


: int(byte, int, short, long), float(float, double), char, boolean

float & Bigdecimal


  • F接頭辞を含まない浮動小数点数は常に2種類である.(3.14 == 3.14D)

  • positive number/0 == positive infinity
    0/0 == NaN(not a number)
    note
  •  if (x == Double.NaN) // is never true
     // == 는 객체 레퍼런스 주소 값 비교이기 때문에 항상 false 출력
     if (Double.isNaN(x)) // check whether x is "not a number"
     // .equals(x) 비교 방식과 동일하게 값을 비교한다.
  • 浮動小数点数は切り込み誤差を生じ、財務計算には適していない.
  • System.out.println(2.0 - 1.1);
    // -> 0.899999~
    // 예상했던 0.9가 출력되지 않는다.
  • BigDecimalを使用すると、浮動小数点の丸め誤差の問題を解決できます.
    BigDecimalとは?
    :BigDecimalは数字を正確に表現する方法です.(BigIntegerもあります.)
    Javaでお金や小数点を扱う場合、BigDecimalは選択ではなく必須です.
  • import java.math.BigDecimal;
    
    public class Main {
    	public static void main(String args[]) {
        		double a = 5.001; 
    		double b = 3.000;
    		System.out.println(a+b);
    		// 기댓값 : 8.001
    		// 실제값 : 8.001000000000001
            
        		BigDecimal c = new BigDecimal("5.001");
            	BigDecimal d = new BigDecimal("3.000");
                	System.out.println(c.add(d)); // 8.001
            	System.out.println(c.subtract(d));
            	System.out.println(c.multiply(d));
            	System.out.println(c.divide(d));
        	}
    }

    Promotion & Casting


    Promotion
  • 自動変換(Promotion)
    :自動変換は、メモリサイズの小さいデータ型をメモリサイズの大きいデータ型に変換する動作です.
  • byte a = 10; 
    int b = a;
    // byte(1) < int(4) 이므로 자동 형변환 가능
  • 強制変換
  • double x = 9.997;
    int nx = (int) x; // x -> double
    // nx == 9
  • [注意]ex)整数値を文字値に変換->自動変換不可
  • byte byteValue = 65;
    char charValue = byteValue; // -> 컴파일 에러 발생
    // byte(1) < char(2) 이므로 char 메모리 크기가 더 크긴 하지만 char의 범위는 0~65535로 음수가 저장될 수 없기에 예제처럼 자동 형변환이 일어날 수 없다.
    
    char charValue2 = (char) byteValue; 
    // 강제 형변환 실행시 'A' 라는 결과값이 출력된다.

    3.6 Strings


    Concatenation


    ex)
    int age = 13;
    String rating = "pc"+age;
    // rating == "pc13"

    Equality Test


    :javaでは、equals()メソッドと==演算子で値を比較できます.

  • equals()メソッドと==演算子を理解する前に,CBVとCBRを理解した.

  • CBV(Call By Value):デフォルトでは、ターゲットはアドレス値を持たず、指定値として使用されます.例えばint,float,charの8種類の基本タイプである.

  • CBR(Call By Reference):ターゲットを宣言すると、参照タイプ(Array、enum、class、interface、Objectなど)などのアドレス値が与えられます.
    //基本タイプ以外のすべてのタイプを参照タイプと呼びます.

  • equals()メソッドと==演算子の違いを見てみましょう.
    equals()メソッドによりオブジェクト間でコンテンツを比較します.
    ==は、ターゲットアドレスを比較するための比較演算子です.
    ex)
  • public class Main {
        public static void main(String args[]) {
            int a = 1;
            System.out.println(a==1); // true
            
            String b = "hello"; // heap 영역의 공통된 객체를 공유하게 된다. 
            System.out.println(b=="hello"); // 같은 heap 영역을 공유하므로 -> true
            System.out.println(b.equals("hello")); // true
            String c = new String("hello"); 
            // 새로운 heap 영역을 가지는 String 객체 생성 
            // -> 즉 b와 c 가 가지는 heap 영역은 다르다.
            System.out.println(b==c); // false
        }
    }
    // static, stack, heap 으로 이해하는 것이 더 쉽다.
    // url :https://m.blog.naver.com/heartflow89/220954420688

    Empty and Null Strings

  • String変数が空かどうかを決定する方法
  • if (str.length() == 0)
    // or
    if (str.equals(""))
    

    String, StringBuffer, StringBuilder

  • 整理のUrlアドレス
    : https://velog.io/@dhlee/JAVA-String-StringBuffer-StringBuilder-%EC%B0%A8%EC%9D%B4
  • 3.7 Input and Output


    Formatting Output

  • printf
  • System.out.printf("%.2f", 10000.0 / 3.0);
    // 3333.33
    System.out.printf(%,.2f", 10000.0 / 3.0);
    // 3,333.33
  • String format
  • String name = "Lee Dohun";
    int age = 28;
    String message = String.format("Hello, %s. Next year, you'll be %d", name, age);
    // Hello, Lee Dohun. Next year, you'll be 28

    File Input and Output

  • スキャナ->ファイルが存在しない場合は例外
    PrintWriter->ファイル名が作成できない場合、例外
  • が発生します.
    public static void main(String[] args) throws IOException
    {
         Scanner sc = new Scanner(Paths.get("file.txt", "UTF-8");
    }

    3.8 Control Flow


    continue,break,return書いてもいいですか?

  • ループで制御をスキップすると、コードが理解しにくくなり、エラーが発生する可能性があります.ここでcontinue()はif()によって解決できる.
  • if () {
       continue;
    }
    method();
    =>
    if !() {
       method();
    }

  • continueとbreakの存在は上記の問題を引き起こす可能性がありますが、削除したい場合は、コードを変更するとコードの複雑さが増す可能性があります.これらは両面的な構文であるため、コードの複雑さを理解し、使用することが望ましい.

  • 戻り文ではリソースの漏洩などが発生する可能性があるため、関数の実装中に一度だけ使用することを推奨します.ただし、この場合がない場合は、複数のreturn文を使用できます.
  • ベスト3Java終了時のインフラストラクチャ
    ありがとうございます.