JAVA 공부중
백준 알고리즘 문제를 풀다가 발견한 EOF
EOF = End Of File : 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타내는 용어
사용자의 데이터를 불러오는 Scanner와 BufferedReader 둘 다 기능이 있음
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) { // hasNextInt()로 넣어야 문자를 입력했을때 예외없이 프로그램이 종료됨
int num1 = scanner.nextInt();
int num2 = scanner.nextInt();
System.out.println(num1 + num2);
}
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
while(input != null) {
int num1 = br.readLine();
int num2 = br.readLine();
}
자바에서 기본 제공하는 래퍼 클래스
- byte ➡️ Byte
- short ➡️ Short
- int ➡️ Integer
- long ➡️ Long
- float ➡️ Float
- double ➡️ Double
- char ➡️ Character
- boolean ➡️ Boolean
자바 래퍼 특징
- 불변
- equals()로 비교해야함
// 생성방법 1
Integer newInteger = new Integer(10); //미래에 삭제 예정, 대신에 valueOf() 사용
// 생성방법 2 (권장)
Integer integerObj = Integer.valueOf(10); //-128 ~ 127 자주 사용하는 숫자 값 캐싱해둠. 재사용, 불변
Long longObj = Long.valueOf(100);
Double doubleObj = Double.valueOf(10.5);
//값을 읽을 때 ~Value() 사용
int intValue = integerObj.intValue();
long longValue = longObj.longValue();
기본형 <-> 래퍼로 자주 바꿔쓰니까 편리성을 위해 자바에서 컴파일할 때 Integer.valueOf(), ~Value()를 붙여서 해주는거.
// 박싱, 언박싱
// Primitive -> Wrapper
int value = 7;
Integer boxedValue = Integer.valueOf(value);
// Wrapper -> Primitive
int unboxedValue = boxedValue.intValue();
//오토박싱, 오토언박싱
// Primitive -> Wrapper
int value = 7;
Integer boxedValue = value;
// Wrapper -> Primitive
int unboxedValue = boxedValue;
오타 등에서 타입 안전성이 떨어짐.
대소문자등 데이터 일관성이 떨어짐.
String 사용 시 : 값의 제한이 부족함. 컴파일 시 오류 감지 불가.
=> 특정 범위로 값을 제한해야함
문자를 상수로 만들어서 사용하는 방법 사용(컴파일 시점에 오류 발생하여 오류 찾기 쉬움) 해도 String 타입이 어떤 문자열을 입력할 수 있기때문에 근본적으로 직접 문자열을 사용해도 막을 수 있는 방법이 없음.
String 이 들어오지않도록 막는게 방법임. -> 타입 안전 열거형 패턴 (Safe Enum Pattern) 만듦
// 개선 전
int vip = discountService.discount("VIP", price);
System.out.println("VIP 등급의 할인 금액: " + vip);
// 1차 개선 - 상수 이용
public class StringGrade {
public static final String BASIC = "BASIC";
public static final String GOLD = "GOLD";
public static final String DIAMOND = "DIAMOND";
}
int gold = discountService.discount(StringGrade.GOLD, price); //StringGrade자리에 그냥 문자열을 입력할 수 있음.
// 2차 개선 - 타입 안전 열거형 패턴 (Safe Enum Pattern)
public class ClassGrade {
public static final ClassGrade BASIC = new ClassGrade();
public static final ClassGrade GOLD = new ClassGrade();
public static final ClassGrade DIAMOND = new ClassGrade();
//private 생성자 추가 -> 생성되지않도록함
private ClassGrade() {}
}
int gold = discountService.discount(ClassGrade.GOLD, price);
// 3차 개선 - enum
public enum Grade {
BASIC, GOLD, DIAMOND
}
int gold = discountService.discount(Grade.GOLD, price);
ENUM - 주요 메서드
- values(): 모든 ENUM 상수를 포함하는 배열을 반환한다.
- valueOf(String name): 주어진 이름과 일치하는 ENUM 상수를 반환한다.
- name(): ENUM 상수의 이름을 문자열로 반환한다.
- ordinal(): ENUM 상수의 선언 순서(0부터 시작)를 반환한다.
- toString(): ENUM 상수의 이름을 문자열로 반환한다.
- name() 메서드와 유사하지만, toString() 은 직접 오버라이드 할 수 있다.
※ ordinal()은 가급적 사용 X