[core.java] 자바학습(Chapter 3)

Chapter 3. 기본 프로그래밍 구조 in java

3.3 Data Types

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

float & Bigdecimal


  • F 접두어를 포함하지 않는 floating-point numbers 는 항상 double 타입이다. (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) 비교 방식과 동일하게 값을 비교한다.
  • float number는 반올림오차(roundoff)가 발생하기 때문에 financial calculation을 하는데 적절하지 않다.
System.out.println(2.0 - 1.1);
// -> 0.899999~
// 예상했던 0.9가 출력되지 않는다.
  • BigDecimal 사용해 float의 반올림오차 문제를 해결할 수 있다.

    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) 이므로 자동 형변환 가능
  • 강제 형변환(Casting)
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

: 자바에서 equals() 메서드와 == 연산자를 통해 값을 비교할 수 있습니다.

  • equals() 메서드와 == 연산자를 알아보기 전에, 먼저 CBV, CBR 에 대해 알아보겠습니다.

    • CBV(Call By Value) : 기본적으로 대상에 주소값을 가지지 않는 것으로 값을 할당받는 형태로 사용됩니다. 예를 들어 int, float, char 등 primitive 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 변수의 empty 여부 확인 방법
if (str.length() == 0)
// or
if (str.equals(""))

String, StringBuffer, StringBuilder


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

  • Scanner -> 해당 파일 없을 경우, exception 발생
    PrintWriter -> 만들 수 없는 파일 이름일 경우, exception 발생
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 문은 자원누수(Resource Leak)과 같은 일이 발생할 수 있기 때문에 함수 구현 중 1번만 사용하는 것이 바람직합니다. 하지만 이런 문제가 발생하지 않는다고 가정할 때, return 문을 여러 개 사용하여도 괜찮습니다.

3강. Fundamental Programming Structures in Java 끝

감사합니다.

좋은 웹페이지 즐겨찾기