Chapter 3. 기본 프로그래밍 구조 in java
: int(byte, int, short, long), float(float, double), char, boolean
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) 비교 방식과 동일하게 값을 비교한다.
System.out.println(2.0 - 1.1);
// -> 0.899999~
// 예상했던 0.9가 출력되지 않는다.
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
byte a = 10;
int b = a;
// byte(1) < int(4) 이므로 자동 형변환 가능
double x = 9.997;
int nx = (int) x; // x -> double
// nx == 9
byte byteValue = 65;
char charValue = byteValue; // -> 컴파일 에러 발생
// byte(1) < char(2) 이므로 char 메모리 크기가 더 크긴 하지만 char의 범위는 0~65535로 음수가 저장될 수 없기에 예제처럼 자동 형변환이 일어날 수 없다.
char charValue2 = (char) byteValue;
// 강제 형변환 실행시 'A' 라는 결과값이 출력된다.
ex)
int age = 13;
String rating = "pc"+age;
// rating == "pc13"
: 자바에서 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
if (str.length() == 0)
// or
if (str.equals(""))
System.out.printf("%.2f", 10000.0 / 3.0);
// 3333.33
System.out.printf(%,.2f", 10000.0 / 3.0);
// 3,333.33
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
public static void main(String[] args) throws IOException
{
Scanner sc = new Scanner(Paths.get("file.txt", "UTF-8");
}
if () {
continue;
}
method();
=>
if !() {
method();
}
continue, break 의 존재는 위와 같은 문제를 발생시킬 수 있지만, 이를 제거하고자 할 때 코드를 수정할 때 코드의 복잡성이 올라갈 수 있습니다. 양면을 지닌 구문들이기 때문에 코드의 복잡성을 파악하며 사용하는 것이 좋다.
return 문은 자원누수(Resource Leak)과 같은 일이 발생할 수 있기 때문에 함수 구현 중 1번만 사용하는 것이 바람직합니다. 하지만 이런 문제가 발생하지 않는다고 가정할 때, return 문을 여러 개 사용하여도 괜찮습니다.
3강. Fundamental Programming Structures in Java 끝
감사합니다.