카테고리 없음

의식의 흐름이랄까....(다른 포스팅 참고해야됨)

ejyoovV 2021. 3. 15. 21:43

enum 의 장점. 타입 안전한 코딩을 할 수 있게 함.

enum이 없을 때 상수를 쓸 때 static final int로 정의해서 상수인것처럼 사용했었음.

상수 A=1, B=1 이 있다 했을 때, 변수 명은 다르지만 내부 값이 같으므로 문제가 됨.

이런 경우를 막아보고자 하는것이 enum임.

 

enum을 코딩하는 방법

enum이라는 키워드가 있음.

우리가 타입 선언할 때 class 키워드를 사용하는데, 그런것처럼 enum도 키워드를 사용한다.

enum 다음에 내가 사용하고자 하는 타입 이름을 정해준다.

그 다음 상수로 사용할 값들을 쭉 나열한다.

이것을 하나의 타입으로 존재하게 된다.

 

선언하는 방법

1. enum을 키워드를 사용한다.

2. 타입 이름을 정해준다.

3. 상수로 사용할 값을 쭉 나열한다.

 

Season에서 괄호가 있다.

Season 생성자를 생성과 동시에 빨간줄이 없어진다.

위에서는 괄호가 없어서 디폴트 생성자가 자동으로 생성된것이고

Season을 생성할때에는 괄호가 있으므로 생성자를 만들어주어야 한다.

 

생성자는 private로 선언한다.

season에는 private를 사용하지 않았지만 내부 컴파일러가 컴파일 시작하는 시점에 자동으로 private를 만들어준다.

 

함수를 의미하는 객체는 하나만 만들어서 사용한다. (상수이기때문에 메모리 낭비 없이 하나만 만들어도 된다.)

그런 의미로 내부적으로 객체를 사용하는 시점에 동일한 객체를 사용할 수 있도록 제한한다.

상수인것처럼 함수를 쓰는것이다.

 

 enum으로 생성된것들은 하나의 타입이라고 생각하면 된다.

enum 키워드를 만든 이유는 상수이다.

enum 키워드가 없을때에는 개발자 실수로 상수 값이 같을 수 있다.

이러한 경우를 막기 위해서 enum을 생성한것이다.

city 타입 season타입 내 같은 값이 있어도 타입이 다르므로 다른값이다.

 

enum은 멤버값을 가질 수 있다. enum도 객체이기 때문이다.

enum도 내부 필드값을 정의할 수 있다.

 

클래스라고 생각하면 비슷한 점이 많다.

저장하고 필요할 때 꺼내쓸 수 있다.

getStr() 게터 메서드도 정의할 수 있다.

이렇게 정의하면 생성자에서 String 선언시 str에 저장하고 str이 필요하면 getStr을 호출하여

객체 다루듯이 할 수 있다.

enum문법을 통해서 상수를 만들면 객체처럼 사용할 수 있지만 일반 객체와 다르게 하나만 만들 수 있고

값이 같다해도 타입이 다르므로 다른값이 된다.

city.대전 season.대전 은 다른것.

개발자가 실수를 줄여준다.(컴파일이 막아줌)

 

 

enum.......나열하고 열거한다.

상수를 나열한다.

상수를 정의하기 위해 사용하는 문법이다.

enum을 사용하면 장점이 타입 안전한 코딩을 할 수 있다.

실수로 타입을 미처 생각하지 못해서 발생할 수 있는 버그 여지를 컴파일러가 막아줄 수 있다.

간접적으로는 enum에 데이터가 변경이 되었을 때 다른 코드에 영향을 받지 않고 컴파일을 다시 안해도 된다.

enum 쓴 이유는 타입 안전한 코드를 작성할 수 있다 라는 것 때문에 쓰게 된다.

 

enum의 사용법

1. enum 키워드를 사용한 뒤 enum 상수 이름을 적어준다.

2. 괄호에 사용할 enum 상수를 나열해준다.

3. 클래스와 모양이 비슷함. enum상수가 만들어지면 객체를 만들어지므로, 이 상수도 constance라는 생성자를 호출하게 된다. 따로 생성자를 정의하지 않으면 디폴트 생성자가 자동으로 생성되어 동작됨.

4. 생성자가 필요한 경우 생성자를 정의할 수 있다.

괄호 열고 생성자 정의하면 해당 enum 객체가 만들어지는 시점(생성자가 호출되는 시점) 그 정보를 받아서 데이터를 받아 다룰 수 있다.

Season 소괄호 내 생성자에 던져줄 String값을 미리 넣어준다.

봄, 여름, 가을, 겨울 enum 객체가 만들어지는 시점에 String이 생성자로부터 전달을 받기때문에

str이라는 필드값을 정의한 뒤 필요할때 꺼내서 쓸 수 있다. (클래스 처럼) getter로

 

클래스와 특이하게 따로 정의하지 않아도 접근 제어자는 private이기 때문에 enum 객체를 외부에서 만들 수 없다.(외부에서 생성자가 보이지 않아 접근할 수 없다.)

 

객체가 private한 이유는 상수기 때문에 여러개를 만들 필요가 없으므로, private로 정의한 것이다.

객체 생성을 통제하기 위해서 private로 선언함.

 

signton도 마찬가지이다. 외부에서 만들 수 없는 패턴이므로, 받고 싶으면 이미 만들어져있는 객체를 재사용하기위함인데, 이것도 enum과 비슷하게 외부에서 못만들도록 제한한다.

 

 enum은 3가지 메서드를 가지고 있다.


  열거형에서 사용하는 메서드
  1. name() => 열거형 상수의 이름을 문자열로 반환한다.
  2. ordinal() => 열거형 상수가 정의된 순서값을 반환한다.(기본적으로 0부터 시작)
  3. valueOf("열거형상수이름"); => 지정된 열거형에서 '열거형상수이름'과 일치하는 열거형 상수를 반환한다.

 

name을 하면 리턴타입은 이름을 가져온다. 

상수를 정의했지만 이 상수는 enum 객체로 만들어지는데, City타입 Season 타입 객체가 생성된다.

City.서울 가져오면 City타입 객체를 가져오는것이지 String이 아니다.

 

String이 필요할 때 가져오는 메서드는 name() 이다.

ordinal() 순서를 가져온다.

상수 정의할 때 순서에대해서는 의미가 있다는 의미임. (순서자체를 의미있는 정보로 사용할 수 있음)

순서정보를 얻어올 때 사용하는 메서드 

순서는 0부터 시작된다.

 

valueOf() : String도 있고 int도 있고, 이것은 타입을 변환해주는 목적으로 기능을 하는데,

String 정보에 해당하는 enum의 객체를 얻고 싶을 때, enum의 문자를 가져오고 싶을 때,

enum 객체를 가져온 뒤 getter를 사용하여 뽑아올 수 있다.

name() : 이름

valueOf() :