[24.09.29] TIL

yy·2024년 9월 28일

개발일지

목록 보기
113/122

JAVA 공부중

백준 알고리즘 문제를 풀다가 발견한 EOF

A+B - 4 문제

EOF

EOF = End Of File : 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타내는 용어

사용자의 데이터를 불러오는 Scanner와 BufferedReader 둘 다 기능이 있음

Scanner

  • 내장함수 hasNext()이용 : 입력된 토큰이 있으면 true 반환, 없으면 false 반환.
  • 이 때 입력된 토큰이라는건 사용자의 입력값이라고 생각하면 될듯.
  • hasNext() : 어던 단어토큰(정수, 문자)이든 입력을 확인공백기준(있으면 true, 없으면 false) ("hello")
  • hasNextInt() : 정수형인걸 확인 (정수형이면 true, 아니면 false)
  • hasNextLine() : 어떤 문장단위로 입력을 확인_줄바꿈기준 ("hello world")
Scanner scanner = new Scanner(System.in);

while (scanner.hasNext()) { // hasNextInt()로 넣어야 문자를 입력했을때 예외없이 프로그램이 종료됨
	int num1 = scanner.nextInt();
    int num2 = scanner.nextInt();

	System.out.println(num1 + num2);
}

BufferedReader

  • EOF를 처리하는 내장 함수는 없음.
  • 입력값이 null이면 반복문을 종료하는 방법으로 가야함.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String input = br.readLine();

while(input != null) {
	int num1 = br.readLine();
    int num2 = br.readLine();
}




래퍼 클래스(Wrapper class)

래퍼클래스가 왜 생겼는가

  • 기본형의 한계
    • 객체가 아님 -> 객체 지향 프로그래밍의 장점 못살림 (메서드 제공 안됨)
    • null값을 가질 수 없음. -> 데이터가 없음을 못 표시함.
    • 기본값은 항상 값이 있어야함.

래퍼 클래스

  • 기본형을 감싸서 만드는 클래스. 기본형을 객체로 만든 클래스.
  • 참조형은 값이 없다는 null을 사용할 수 있음. 이를 이용해서 만든게 래퍼 클래스.

자바에서 기본 제공하는 래퍼 클래스

  • byte ➡️ Byte
  • short ➡️ Short
  • int ➡️ Integer
  • long ➡️ Long
  • float ➡️ Float
  • double ➡️ Double
  • char ➡️ Character
  • boolean ➡️ Boolean

자바 래퍼 특징

  • 불변
  • equals()로 비교해야함

자바 래퍼 클래스 사용방법

1. 생성 ( 박싱 Boxing )

// 생성방법 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);

2. 조회 ( 언박싱 Unboxing )

//값을 읽을 때 ~Value() 사용
int intValue = integerObj.intValue();
long longValue = longObj.longValue();

3. 오토박싱

기본형 <-> 래퍼로 자주 바꿔쓰니까 편리성을 위해 자바에서 컴파일할 때 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;




enum

  • 오타 등에서 타입 안전성이 떨어짐.

  • 대소문자등 데이터 일관성이 떨어짐.

  • String 사용 시 : 값의 제한이 부족함. 컴파일 시 오류 감지 불가.
    => 특정 범위로 값을 제한해야함

  • 문자를 상수로 만들어서 사용하는 방법 사용(컴파일 시점에 오류 발생하여 오류 찾기 쉬움) 해도 String 타입이 어떤 문자열을 입력할 수 있기때문에 근본적으로 직접 문자열을 사용해도 막을 수 있는 방법이 없음.

  • String 이 들어오지않도록 막는게 방법임. -> 타입 안전 열거형 패턴 (Safe Enum Pattern) 만듦

  • 타입 안전 열거형 패턴 (Safe Enum Pattern)
    • 장점 1. 타입 안정성 향상 : 정해진 객체만 사용 -> 잘못된 값 입력 원천차단
    • 장점 2. 데이터 일관성 : 정해진 객체만 사용 -> 데이터의 일관성 보장
    • 단점 1. 코드 많이 적어야함. -> 많은 사람들이 사용하기 때문에 편리한 기능 만듦 -> enum 타입
  • enum도 제약이 추가된 클래스이다.
    • 타입 안정성 향상 : 상수들로만 입력이 가능하고, 유효하지않은 값 입력 가능성 없음
    • 간결성 및 일관성 : 코드 간결, 데이터 일관성 보장
    • 확장성: 새로운 등급 추가하고 싶을 때 enum파일만 수정하면됨.
// 개선 전
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

profile
시간이 걸릴 뿐 내가 못할 건 없다.

0개의 댓글