🤝 활동/내배캠TIL

[내일배움캠프 17일차 TIL] enum & final 및 팀 프로젝트(필수 기능)

MNY 2024. 5. 8. 20:37
728x90
반응형
오늘의 진도 : 팀 프로젝트 필수 기능 merge까지...

황금연휴는 끝.났.다!... 다시 일상으로 돌아와 열공하기 위한 빌드업 중...
오늘의 학습, 팀 프로젝트, 면담, 오늘의 회고 이렇게 4개의 큰 틀로 나누어 정리할 것이다.

 

💡 오늘의 학습 키워드

- 면담 -
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); // 순서대로 열거 객체 출력
}

 

* 참고한 블로그

 

☕ 자바 Enum 열거형 타입 문법 & 응용 💯 정리

Enum 열거 타입 먼저 Enum은 "Enumeration"의 약자다. Enumeration은 "열거, 목록, 일람표" 라는 뜻을 가지고 있으며, 보통 한글로는 열거형이라고 부른다. 즉, 열거형(enum)은 요소, 멤버라 불리는 명명된 값

inpa.tistory.com

 

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
반응형