Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

까마귀코딩.log

백기선 자바스터디 11주차 본문

백기선 자바스터디

백기선 자바스터디 11주차

까마귀코딩 2023. 2. 2. 17:08
더보기
왜? 라는 생각을 달고 살자!

<< 총 15주차 까지 진행되며 주어지는 키워드를 가지고 블로그에 정리하며 공부하는 스터디 입니다 ! >>


 

목표

인용의 나열형에 대해 알아내세요.

학습할 것 (필수)

  • 열거형을 정의하는 방법
  • 열거형이 제공되는 경우 (values()와 valueOf())
  • java.lang.Enum
  • 열거형 집합

 


열거형을 정의하는 방법 ( 이넘 정의하기 )


이넘 타입이란 뭘까 ? 

 

관련이 있는 상수들을 묶어놓은것이다. 

 

자바에서는 final 로 String 과 같은 문자열이나 숫자들을 나타내는 기본 자료형의 값을 고정할수 있다. 

 

이렇게 고정된 값을 상수라고 한다 !

 

 

enum 으로 상수정의하기 !

 

열거형인 enum 은 서로 연관된 상수들의 집합이라고 할수 있습니다. !!

 

 

 

enum 생성자는 왜 private 인가요 ? 

 

-> java에서 enum 타입은 열거형을 의미하는 특별한 클래스입니다. 

그렇기 때문에 일반 클래스와 같이 생성자가 있어야 합니다. 

 

물론 생성자를 만들어 주지 않아도 java가 default 생성자를 만들어 주긴하지만,

enum 의 경우에는 다른 클래스들과 달리 일반적으로 생성자의 접근제어자를 private으로 지정해야합니다. 

 

enum 타입의 생성자를 접근제어자 일반클래스의 생성자와 같이 public 이나 protected로 하면 에러발생 !!!

 

어떤 에러가 발생 ? 

 

 

 

이넘써서 좋은이유 ??

 

1. 문자열과 비교했을때, IDE의 적극적인 지원을 받을 수 있다 ! 

-ex) 자동완성, 오타검증, 텍스트리펙토링 등등 

 

2. 허용가능한 값들을 제한할수 있다 !

 

3. 리팩토링시 변경범위가 최소화된다 !

-ex) 내용의 추가가 필요하더라도, enum코드 외에 수정할 필요가 없다 ~

 

 

 

 

자바의 Enum은 완전한 기능을 갖춘 클래스이다!

 

 

 

1. 데이터들간의 연관관계 표현 

 

매일 배치돌면서 하나의 테이블에 있는 내용을 2개의 테이블에 등록하는 기능이 있다. 

문제가 됐던것은 origin테이블 값은 "Y" , "N"인데 

table1, table2는 "1"/"0", true/false 형태인것이다. 

그러다보니 구 정산시스템에선 이를 분류하는 메소드를 만들어 사용해왔습니다. 

 

기능상의 문제는 없지만, 몇가지 문제가 있었습니다. 

 

"Y" , "1" , "true" 는 모두 같은 의미라는것을 알수 없습니다. !

 

그걸 확인하려면 항상 위에서 선언된 클래스와 메소드를 찾아야 함 !!!

 

불필요한 코드량이 많습니다. 

 

위의 3개 이외에 R, S 등의 추가값이 필요한 경우 ?? 

 

if문을 포함한 메소드 단위로 코드가 증가하게 된다 !

 

 

동일한 타입의 값이 추가되는것에 비해 너무 많은 반복성 코드가 발생하게 됩니다 !

 

 

 

 

빨간색 네모부분에서 확인할수 있는것 ? 

 

"Y" , "1" , "true"  --> 한묶음이다. 

"N", "O", "false" -->  한묶음이다. 

 

추가 타입이 필요한 경우에도 Enum 상수와 get메소드만 추가하면 된다 !

 

 

(만약 lombok의 @Getter을 사용하신다면 Enum의 get 메소드까지 제거가 되어 더욱 깔끔한 코드가 됩니다.)
이를 사용하는 곳에서도 역시 깔끔하게 표현이 가능합니다

 

 

 

 

1. 코드가 단순해져서 가독성 조아저 

2. 인스턴스 생성과 상속을 방지해 ! 그럼 상수값의 타입안정성이 보장돼.

3. enum class를 사용해 새로운 상수들의 타입을 정의함으로 정의한 타입이외의 타입을 가진 데이터값을 컴파일 할때 체크해

4. 키워드 enum 을사용하니가 구현의도가 열거이구나~ 하고 알수있어


이넘이 제공되는 메소드 ( 열거형의 메소드 )


 

values() 메서드  : 

열거형의 모든 상수를 선언한 순서대로 배열을 만듦 ! 그리고 리턴함 !

 

 

ValuesOf() 메서드 : 

열거 상숫값을 조사하여 리턴하는데, 

사용자가 직접 입력한 문자열이나 db의 값으로부터 열거상수를 받을때 필요하다 !

 

 

 

string name() : 열거값의 이름 문자열을 조사한다. 

int ordinal() : 열거값의 순서값을 조사한다. 0 부터 시작한다.

int compare To( E o ) : 순서값을 비교한다. 호출객체가 더 앞ㄷ쪽이면 음수, 뒤쪽이면 양수가 리턴된다.

 


java.lang.Enum


모든 enum 은 해당 클래스를 상속받고있으며

Enum.class 의 메서드들은 다음과 같다.

 

 

Enum.class 의 메서드들은 다음과 같다.

자주 쓰는건 name(). equals() 말고 잘 안쓰는듯

 


열거형 집합 :  EnumSet


Set 자료구조를 구현하고 있음으로 Set 이 가지고 있는 특성을 그대로 가지고 있다. 

 

말 그대로 열거타입의 set자료구조이며 

 

열거타입에 set 자료구조가 필요할때  ??  -- HashSet 보다 EnumSet이 훨씬 좋아 !!!