🌃 TIL
enum & final 및 팀 프로젝트(필수 기능)
MNY
2024. 5. 8. 20:37
728x90
반응형
💡 오늘의 학습 키워드
- 면담 -
enum
final
Enum
: 상수를 단순히 정수로 치부하지 말고 객체 지향적으로 객체화해서 관리하자는 취지
- 인터페이스와 같이 독립된 특수한 클래스
- new로 생성할 필요x
- 일반 클래스 처럼 바로 접근X
- 일종의 객체이기 때문에 힙(heap) 메모리에 저장
- enum 상수들은 별개의 메모리 주소값을 가짐으로써 완벽히 독립된 상수를 구성
enum 선언
- enum 명은 클래스와 같이 첫 문자를 대문자, 나머지는 소문자로 구성
- 열거 상수는 모두 대문자로 작성
- 열거 상수가 여러 단어로 구성될 경우, 단어 사이를 밑줄(_)로 연결
enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
enum 참조 방식
// 열거타입 변수 = 열거타입.열거상수;
Season spring = Season.SPRING;
enum 메서드 종류
메소드 | 설명 | 리턴 타입 |
name() | 열거 객체의 문자열을 리턴 | String |
ordinal() | 열거 객체의 순번(0부터 시작) | int |
compareTo() | 열거 객체를 비교해서 순번 차이를 리턴 | int |
valueOf(String name) | 문자열을 입력받아서 일치하는 열거 객체를 리턴 | enum |
values() | 모든 열거 객체들을 배열로 리턴 | enum[] |
* name() 메소드
- 열거 객체가 가지고 있는 문자열을 리턴
- 반환되는 문자열은 열거 타입을 정의할 때 사용한 상수 이름과 동일
Season season = Season.SPRING;
// 열거 객체의 문자열을 리턴
String seasonName = season.name();
System.out.println(seasonName); // SPRING
* ordinal() 메소드
- 열거 타입을 정의 할 때 주어진 순번을 리턴(0부터 시작)
- 전체 열거 객체 중 몇 번째 열거 객체인지 알려준다
Season season = Season.SPRING;
// 열거 객체의 순번(0부터 시작)을 리턴
// 전체 열거 객체 중 몇 번째 열거 객체인지 알려준다
int seasonNum = season.ordinal();
System.out.println(seasonNum); // 0
* compareTo() 메소드
- 매개값으로 주어진 열어 객체를 비교해서 순번 차이를 리턴
- 열거 객체가 매개값의 열거 객체보다 순번이 빠르다 -> 음수를 리턴
- 열거 객체가 매개값의 열거 객체보다 순번이 늦다 -> 양수를 리턴
// 열거 객체를 비교해서 순번 차이를 리턴(시작점을 어느 열거 객체의 기준으로 몇 번째 위치하는지)
Season s1 = Season.SPRING;
Season s2 = Season.AUTUMN;
// 열거 객체가 매개값의 열거 객체보다 순번이 빠르다 -> 음수를 리턴
int compare1 = s1.compareTo(s2); // AUTUMN 기준으로 SPRING 위치(2에서 0이 되기 위한 값)
System.out.println(compare1); // -2
// 열거 객체가 매개값의 열거 객체보다 순번이 늦다 -> 양수를 리턴
int compare2 = s2.compareTo(s1); // SPRING 기준으로 AUTUMN 위치(0에서 2가 되기 위한 값)
System.out.println(compare2); // 2
* valueOf() 메소드
- 매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴
// 문자열을 입력받아서 일치하는 열거 객체를 리턴
Season season = Season.valueOf("SPRING"); // season 변수는 Season.SPRING 열거 객체를 참조하게 됨
System.out.println(season); // SPRING
* values() 메소드
- 열거 타입의 모든 열러 객체들을 배열로 만들어 리턴
// 모든 열거 객체들을 배열로 리턴
Season[] s = Season.values();
System.out.println(Arrays.toString(s)); // [SPRING, SUMMER, SUTUMN, WINTER]
for (Season season : Season.vlaues()) { // 열거 순회
System.out.println(season); // 순서대로 열거 객체 출력
}
* 참고한 블로그
final
: 초기화가 된 이후 값을 변경할 수 없다. '마지막'의 의미를 가지고 있다.
- 생성자를 통한 초기화 : setter을 통해 값 변경X
- 필드 선언 및 초기화 : 생성자를 통한 값 변경X
팀 프로젝트
아래와 같이 필수 기능에 대해 1차적으로 팀원 전체가 main에 merge 했다.
이 과정에서 나는 Subject 클래스에 subjectType 필드 및 getter 메서드 추가가 필요하다고 팀장님께 조언을 받았다.
내 로컬에 변경해두었지만, 간단한 것이라 팀장님께서 따로 추가해주셨다.
면담
- Q) enum에 getter을 생성해두었는데 이게 맞는 건가? // 질문에 관련된 코드는 더보기 Click
더보기
public enum SubjectType { JAVA("Java", "MANDATORY"); private final String subjectName; private final String subjectType; // 질문한 부분 : getter String getSubjectName() { return subjectName; } String getSubjectType() { return subjectType; } }
- Q) 다른 분의 enum 사용에서 값 초기화시 new를 사용했던 것 같은데, 내 코드에는 에러가 뜨지 않는데 new를 사용해야 되는건가? // 질문에 관련된 코드는 더보기 Click
더보기
public class InitializeManager { private static InitializeManager instance; public static InitializeManager getInstance() { if(instance == null) { instance = new InitializeManager(); return instance; } else { return instance; } } // index 관리 필드 private int studentIndex; public final String INDEX_TYPE_STUDENT = "ST"; private int subjectIndex; public final String INDEX_TYPE_SUBJECT = "SU"; private int scoreIndex; public final String INDEX_TYPE_SCORE = "SC"; // 과목 타입 private final String SUBJECT_TYPE_MANDATORY = "MANDATORY"; private final String SUBJECT_TYPE_CHOICE = "CHOICE"; // 초기 데이터 생성 public void setInitData() { studentIndex = 1; subjectIndex = 1; scoreIndex = 1; StudentManager.getInstance().Initialize(); /* 내가 여쭤본 부분은 여기! me : subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.JAVA)); other : subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), new SubjectType.JAVA)); other 처럼 해야 하나??? */ // 과목 생성 ArrayList<Subject> subjectStore = StudentManager.getInstance().getSubjectStore(); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.JAVA)); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.OBJECT_ORIENTED)); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.SPRING)); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.JPA)); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.MYSQL)); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.DESIGN_PATTERN)); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.SPRING_SECURITY)); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.REDIS)); subjectStore.add(new Subject(sequence(INDEX_TYPE_SUBJECT), SubjectType.MONGO_DB)); // 초기 학생 생성 } }
- Q) 변경한 이후 Subject의 생성자에 매개변수가 다음과 같이 변경되었는데, enum으로 받은 매개변수는 필드로 저장할 필요가 없는가? // 질문에 관련된 코드는 더보기 Click
더보기public class Subject { private final String subjectId; // 여기 SubjectType subjectType... ?? public Subject(String seq, SubjectType subjectType) { this.subjectId = seq; } // Getter public String getSubjectId() { return subjectId; } }
- Q) final의 의미는 '마지막의'라는 뜻으로 변하지 않는 것을 의미하는데, 생성자를 통해 값을 가져오면 변경되는 것이 아닌가? // 질문에 관련된 코드는 위의 문항 코드와 동일
면담 결과
- 클래스의 특성
- 필드 : 고유 저장 공간
- 메서드 : 행위
- enum의 기본 개념
- 클래스 처럼 필드와 메서드를 가질 수 있다.
- getter 일반 클래스 처럼 바로 접근X
- static과 비슷한 유동적인 상수 관리 하기 위해 만든 거
- 다른 메모리 저장
- final은 초기화(생성자를 통한 초기화, 필드 생성 시 초기화)가 된 이후는 setter을 이용해서 값을 변경할 수 없다.
- enum에서 기본으로 제공하는 메서드에 대해 학습 -> enum을 활용하는 방법 습득
오늘의 회고
- 12시간 중 얼마나 몰입했는가?
시간 단위로 봤을 때 몰입도 높았던 시간은 12시간 중 8시간 정도라고 생각한다.
어제 갈피 못 잡았던 거에 비하면 많이 양호한 편..
- 오늘의 생각
Enum은 클래스에서 어떻게 사용하는지에 대해 계속 고민하게 된다. 내가 느끼기에는 조금 어렵다.
대략적으로 어떻게 클래스에 선언해서 사용되는지는 알겠는데 정확한 동작원리를 특정한 예시를 가지고 설명을 들었으면 좋겠다..?
오늘의 TMI : TIL 작성하니까 갑자기 졸음이 확하고 몰려온다..
- 내일 학습할 것은 무엇인지
내일은 아마 팀장님께서 에러나는 것들 잡으신 후에 추가 기능?을 구현할 듯 싶다.
오전에는 코드카타를 할 예정이다. 그러고 오후에 수준별 학습을 듣는다.
남는 시간들에는 개념 정리나 네트워크 관리사 공부하고 책 좀 읽을 예정.
728x90
반응형