@, #, ! 와 같은 특수문자 사용 불가
공백 불가
미리 정의된 키워드(예약어)는 식별자로 사용 불가
숫자 사용 가능(단, 첫글자로는 사용 불가)
자주쓰이는 자바의 예약어는 아래와 같으니 참고하면 될 것 같다.
데이터 타입
이 매우 중요하다!기본 타입(Primitive)
과 레퍼런스 타입(참조형, Reference)
이다.
📌 실수형 타입(float, double) 등의 기본 부동소수점 자료형은 근사값을 사용하므로 금융 계산과 같은 정밀도가 중요한 연산에는 적합하지 않다.
이때 BigDecimal 클래스
는 정확한 소수점 연산을 제공한다.
BigDecimal
: 불변 객체로 한번 생성되면 그 값을 변경할 수 없다. 기본 산술연산자(+,-,*./)를 직접 이용할 수 없고 메서드를 사용하면 된다.
사용하려면 import java.math.BigDecimal;
를 추가해줘야한다.
import java.util.Scanner; //뒤에서 이에 관련 내용 작성함
import java.math.BigDecimal;
public class Prac2 {
public static BigDecimal add(BigDecimal a, BigDecimal b) {
return a.add(b);
}
public static BigDecimal subtract(BigDecimal a, BigDecimal b) {
return a.subtract(b);
}
public static BigDecimal multiply(BigDecimal a, BigDecimal b) {
return a.multiply(b);
}
public static BigDecimal divide(BigDecimal a, BigDecimal b) {
return a.divide(b);
}
public static void main(String[] args) {
System.out.println("숫자를 두개를 입력하세요 ");
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
int b = scan.nextInt();
BigDecimal number1 = new BigDecimal(a);
BigDecimal number2 = new BigDecimal(b);
System.out.println("더하기: " + add(number1, number2));
System.out.println("빼기: " + subtract(number1, number2));
System.out.println("곱하기: " + multiply(number1, number2));
System.out.println("나누기: " + divide(number1, number2));
scan.close();
}
}
BigDecimal
클래스 에러-> 그런데 BigDecimal 클래스는 정확한 소수점 연산을 제공하기 때문에 만약 a,b에 1,3
과 같은 숫자를 입력하게 되면 아래와 같은 에러가 발생한다.
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.base/java.math.BigDecimal.divide(BigDecimal.java:1780)
-> 나눗셈 메서드를 사용할때 발생한 문제인데, 나눗셈의 결과가 무한 소수점 확장을 가지거나, 이를 정확하게 10진수로 표현할 수 없을 때 발생한다. 1을 3으로 나누려고 할 때도, 0.3333...과 같이 끝이 없는 소수점 결과가 나오기 때문에 에러가 발생한 것이다.
--> 이때는 근사값을 얻거나, 결과의 소수점 이하 자릿수를 제한해야한다.
import java.math.BigDecimal;
import java.math.RoundingMode;
// 결과를 소수점 이하 2자리까지 표현하고, 반올림 모드를 HALF_UP(가장 가까운 숫자로 반올림)으로 설정
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP);
배열에 대한 레퍼런스
클래스에 대한 레퍼런스
인터페이스에 대한 레퍼런스
System.in
에게 키를 읽게 하고, 읽은 값을 String, int, double, boolean, char 등 다양한 타입으로 변환하여 리턴한다.import java.util.Scanner; //import문이 필요하다.
Scanner scan = new Scanner(System.in); //Scanner 객체 생성
• next()
: 공백 이전까지의 문자열을 읽는다.
• nextLine()
: 엔터(\n) 이전까지의 문자열을 읽는다.
• next자료형()
• nextInt()
: 공백 이전까지의 정수를 읽는다.
• nextDouble()
: 공백 이전까지의 실수를 읽는다.
• nextBoolean(), nextFloat(), ..etc
• close()
: scanner 닫는 기능을 한다.
import java.util.Scanner;
public class Scan {
public static void main(String[] args) {
System.out.println("이름, 나이, 키, 결혼 여부를 빈칸으로 분리하여 선택하시오 ");
Scanner scan = new Scanner(System.in);
//System.in : 표준 입력 스트림을 나타내며, 주로 키보드 입력을 위해 사용
String name = scan.next();//공백 이전까지의 문자열 읽기
int age = scan.nextInt(); //공백 이전까지의 정수 읽기
double height = scan.nextDouble(); //공백 이전까지의 실수 읽기
boolean isMarry = scan.nextBoolean(); //공백 이전까지의 논리값 읽기
System.out.printf("이름은 %s, 나이는 %d, 키는 %.1fcm, 결혼은 %b",name,age,height,isMarry);
scan.close();
}
}
이전에 배웠던 언어에서 문자열을 비교할땐 if(name === "룰루")
라고 했다면, 자바에선 if(name.equals("룰루"))
이렇게 해줘야한다.
그리고 문자열을 JS에선 홑따옴표('')로 해도 문제없었지만, 자바는 무조건 쌍따옴표("")로 해야한다.
예시
import java.util.Scanner;
public class Condition {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 숫자 예
System.out.println("수를 입력하세요");
int num = scan.nextInt();
// if-else문
if(num % 3 == 0) {
System.out.println("3의배수입니다.");
}else {
System.out.println("3의 배수가 아닙니다.");
}
// switch 문
switch(num%3) {
case 0 :
System.out.println("3의 배수입니다.");
break;
default:
System.out.println("3의 배수가 아닙니다.");
}
// 문자열 비교(위의 if, switch 문 모두 주석처리하고 실행)
System.out.println("이름을 입력하세요.");
String name = scan.nextLine(); // 엔터이전까지 문자열 읽음
if (name.equals("홍길동")) {
System.out.println("홍길동님 환영합니다.");
} else {
System.out.printf("%s님 환영합니다.", name);
}
scan.close();
}
}
public class Loof {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
int i = 0;
while (i < 5) {
System.out.println("i = " + i);
i++;
}
}
}
//println으로 출력해서 문단띄어쓰기가 되어있다.
0
1
2
3
4
5
6
7
8
9
i = 0
i = 1
i = 2
i = 3
i = 4
한 클래스 내에서 동일한 이름의 메소드를 여러 개 정의
하는 것이다.각 메소드는 매개변수의 타입, 개수, 순서가 달라야한다.
public class Over {
//메소드 오버로딩
//정수 두개를 더하는 오버로딩
//add라는 메소드 이름은 동일하나, 매개변수 타입이나 개수, 순서가 다른 것을 확인할 수 있다.
public int add(int a, int b) {
return a + b;
}
//실수 두개를 더하는 메소드
public double add(double a, double b) {
return a+ b;
}
//정수 세개를 더하는 메소드
public int add(int a, int b, int c) {
return a + b+ c;
}
public static void main(String[] args) {
//실행되는건 main 아래
Over calc = new Over();
System.out.println(calc.add(10, 30));
System.out.println(calc.add(5.3, 7.2));
System.out.println(calc.add(10, 100,1000));
}
}