유미의 기록들

[개인 과제 - Java] 계산기 프로그램 (Level 3) 본문

대외활동 기록/내일배움캠프

[개인 과제 - Java] 계산기 프로그램 (Level 3)

지유미 2024. 8. 2. 11:40
728x90
반응형

📌요구사항

1. Enum 타입을 활용하여 +,-,*,/,%의 연산자 타입에 대한 정보를 관리하도록 구현 - Enum

2. 양의 정수 뿐만 아니라 실수 타입의 값을 전달 받았을 경우에도 연산이 수행되도록 구현 -제네릭

3. Scanner로 입력 받은 값보다 큰 결과값들을 출력 - Lamda & Stream

 

 

📝궁금한점

Enum타입 

요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형, 즉 상수 데이터들의 집합

프로그래밍을 하다보면 배열과 리스트처럼 여러개의 묶음 데이터를 다루는 일이 많다. 이런 데이터 중에는 '요일', '계절'과 같은 제한된 값만 가지는 경우가 존재한다

ex)  요일  - 월,화,수,목,금 / 계절 - 봄, 여름, 가을, 겨울

이런 데이터 묶음을 Enum타입으로 묶어주면 구조적인 프로그래밍이 가능하다

enum Day{
	MONDAY,TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
enum Month{
	JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, 
	AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
}

이렇게 객체지향적으로 객체화 해서 관리 할 수 있다

 

장점

1. 코드가 단순하고, 가독성이 좋아진다

2. Enum에서 한번에 관리하기 때문에 수정이 필요하면 Enum 코드에만 수정하면 된다

→ 리팩토링 시 변경 범위가 최소화 된다 

3. IDE의 지원(오타검증, 자동완성 등)을 받을 수 있다

4. switch문에서도 사용할 수 있다

5. 키워드 enum을 사용해서 구현 의도가 열거 임을 알 수 있다

 

 

제네릭 (Generic)

클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법

ArrayList나 HashMap 등을 생성할 때 <>안에 타입을 지정해준다. 이때 <>가 바로 제네릭이

그런데 Integer타입도 지원하고, Double타입도 지원하고 싶을 때 타입에 따라 하나씩 만드는 방법은 너무 비효율적이다 따라서 이 문제를 해결하기 위해서 제네릭을 사용한다

class Calculator<T> {
    List<T> results = new ArrayList<>();

    public void add(T result) {
        results.add(result);
    }
}
// 제네릭 타입 매개변수에 정수 타입을 할당
Calculator<Integer> calculator = new Calculator<>(); 

// 제네릭 타입 매개변수에 실수 타입을 할당
Calculator<Double> calculator = new Calculator<>(); 

// 제네릭 타입 매개변수에 문자열 타입을 할당
Calculator<String> calculator = new Calculator<>();

 

Calculator클래스에서 식별자 기호 T를 클래스 필드와 메소드 매개변수 타입으로 지정한 다음

생성코드에 <>안에 지정해주고 싶은 타입을 할당해주면 제네릭 클래스에서 T가 지정된 타입으로 모두 변환되어 클래스의 타입이 결정되는 것이다.

 

외부에서 지정한 타입을 받아와서 클래스 내부의 <T> 타입이 구체적으로 설정되는 것으로 구체화라고 한다

 

장점

1. 비슷하나 기능을 지원하는 경우, 코드의 재사용성이 높아진다

2. 클래스 외부에서 타입을 지정해주기 때문에 타입 관리하기가 편하다

3. 잘못된 타입이 들어 올 수 있는 것을 컴파일 단계에서 방지할 수 있다

 

 

제네릭 타입을 두개로 둘 수도 있다

public class ClassName <T, K> { ... }

 

 

제한된 Generic과 와일드 카드

만약에 특정 범위 내로 좁혀서 제한하고 싶다면 extends, super, ? (와일드 카드) 세가지 방식이 있다

 

extends 뒤에 오는 타입이 최상위 타입으로 한계가 정해지는 것 (T타입의 자식타입만 가능)

super 뒤에 오는 타입이 최하위 타입으로 한계가 정해지는 것 (T타입의 부모타입만 가능)

<?> 는 <? extends Object> 와 마찬가지이다 (Object는 자바에서 모든 사용자 클래스의 최상위 타입)

즉, 어떤 타입이든 상관없다는 의미이다

 

수를 표현하는 클래스만 받고 싶은 경우에는 extends Number로 표현할 수 있다

 Integer, Long, Byte, Double, Float, Short와 같은 래퍼클래스들은 Number  클래스의 상속을 받기 때문이다

<K extends Number>

 

728x90
반응형
Comments