본문 바로가기
Programming/Java, Spring

[Java 기초문법] 객체지향 | Gradle, Enums, Enum의 여러 기능들

by Renechoi 2022. 10. 19.

[Java 기초문법] by Professional Java Developer Career Starter: Java Foundations @ Udemy

 


 

Enums is a very special type of Java class that can represent a finite set of values. 

 

These values will usually be related to each other in some way, like they will be a set. 

 

 


 

프로젝트에서 Gradle system으로 만들기 

 

 

 

 

 

with Gradle system, we get these built automatically. 

 

 

그래이들이란 무엇일까? 

 

IntelliJ is actually downloading libraries which is stored in Maven. So when we use junit, a third party library, we wanted that to become a dependency in some of our projects. 

 

=>라이브러리를 불러올 때 dependency 를 형성한다. 

 

As maven gives us an esay way, to pull those libraries, Gradle as well give us to build our projects using libraries.

 

by using Maven or Gradle to manage buiding the project and managing its dependencies, we can be completely independent from whatever IDE we're using, which is advantages for developers. 

 

These tools, M and G, require a configuration file in order to specify how to build your project and what its dependencies should be. 

 

 


 

객체지향 관점으로 블랙잭 카드 세팅해보기  

 

먼저 어떤 데이터타입인지를 살펴보자. 

 

 

 

52개의 카드와 13개의 종류를 어떻게 나눌지를 생각해야 한다. 

 

let's start with suit and rank 

 

 

constructor와 getters and setters를 같이 만들어준다.

 

이때 constrictor는 basicaly a method that allows you to initialize a newly created object. 

 

 

 

 

 

컨스트럭터를 생성했고 suit와 rank를 받도록 했기 때문에 input을 넣도록 요청받고 있다. 

 

 

 

 

두개의 카드를 만들었다. 

 

 

 

이 때 이 카드는 특정 유저에게 소속된다고 가정하면, 두개의 값을 더하도록 요구받는다. 

 

 

Now enum을 생각해보자. 

 

when we have a situation where you can have a property that can be set to a finite set of values, 

이럴 때 enum은 protect and limit the values 함으로써 유용하다.

 

ex) suits => Clubs, Diamonds, Hearts, Spades, / from users setting other values other than these values. 

 

 

Enum Class 생성. 

 

 

 

 

 

 

 

일반적으로 enum에서 변수를 생성할 때 constant로 한다. 

 

 

 

 

 

 

이때 이전의 class에서 정의한 crad class를 to use this enum 리팩토링 => type migration 

 

 

 

이제 card의 선택이 정의한대로 제한된다. 

 

 

 

Rank도 똑같이 정의해주자. 

 

이때 문제는 rank의 경우 숫자와 string이 섞여 있다는 것이다. 따라서 통일해줄 필요가 있다.

 

 

 

 

 

테스트 클래스를 만들어보자. 

 

Card > ctrl + shirft + T 

 

 

 

 

 

get_value 메소드가 있다고 먼저 가정하고 테스트 시나리오를 세팅한다.

 

 

TDD의 진행 순서는 => 만들고 에러 발생으로 연결 확인 => 하드코딩으로 2 입력으로 성공하는 상황 발생 

 

 

 

 

비슷한 조건의 메소드 생성 후 재테스트 

 

 

 

Enum의 성격을 다시 생각해보자. 

 

Enum actually have a few methods and properties inherent in them. one of the mthods that is available is a method called ordinal. 

 

that it can return ordinal number. 

 

정렬된 constant의 index를 리턴할 수 있다는 것이다. 

 

 

 

 

 

ordinal을 적용했더니 actual이 1개씩 모자라는 것을 보여주고 있다. 

 

 

해결 

=> 

public int getValue() {
    return this.rank.ordinal()+1;
}

 

 

 

그렇다면 JACK, ACE는 어떻게 테스트할까 ? (ACE = 1 or 11) 

 

 

 

하지만 다른 Face 카드들에 대해서 조정을 해줘야 하기 때문에 

 

switch 문으로 구현 

 

 

 

 

 

여기서 한 번 생각해보자. this.rank 문장에서 rank는 어디서 부터 올까? 

=> enum class itself. 

 

그렇다면 여기서 이 메소드를 enum class로 가져가는 것은 어떨까? 

 

 

 

 

그런 후에 enum의 테스트 클래스를 만들어서 테스트를 구현해본다. 

 

 

It works. 

 

=>This way, we can directly implement the getvalue method DIRECTLY on the enum. 

 

변수 호출과 실제 저장간의 거리를 좁히기 위해 enum class 자체를 활용했다. 

 

 

 

 

 

2 Points 

 

1) that enums are essentially special classes, and because that, they do share a few of the same capabilities as a class. and amongst them is that you can put methods on them. (이눔 클래스도 methods를 가질 수 있음) 

 

2) you will usually want to keep your methods as lose to the data that they work with as possible as you can. 

 

 

이렇게 함으로써 Push it one level down, => more efficient. 

 

=> Encapsulation (only allow outside access to just the narrowest amount of data that is necessary.) 

 

 


 

Enum fields 

 

Enum은 또한 Fields를 가질 수 있다. 

 

 

 

 

 

여기서 Rank constants를 살펴보면 

 

actually, each time we define a constant for an enum, it is fairly equivalent to having a line of code like this. 

 

// Rank KING = new Rank("KING);

 

따라서 Constructor를 만들어보자.

 

 

이때 int를 설정하고 있기 때문에 에러가 발생한다. 

 

 

 

여기서 value를 각각 정의해줌으로써 더이상 ordinal을 쓸 필요가 없게 된다. 

 

getValue 함수는 따라서 

 

public int getValue() {
    return value;
}

 

 

마찬가지로 ranks에 대해서도 

 

 

 

 

 

이를 string으로 출력하기 위해 tostring 메소드를 가져와서 override한다. 

 

 

 

 

 

 

 

똑같이 테스트셋을 만들어서 돌려보면 

 

컴파일 에러 발생 ! 

 

error: unmappable character (0xEC) for encoding x-windows-949
    CLUBS('\u2663'),    // ?��?��코드�? 문자�? ?��?��

 

 

Setting>Editor>File Encodings> UTF-8로 세팅을 변경 

 

 

제대로 출력이 되므로  테스팅 코드를 바꿔주면 

 

 

성공 

 

 

 

지금까지의 포인트

=> 커스텀 constructor를 생성하고 enum에서 자체 field와 constants 별 속성을 갖게 세팅

 

 


 

 

메인에서도 출력을 위해 toString 메서드를 호출해준다.

 

 

 

만약 string으로 받아서 enum으로 연결하려면 어떻게 해야할까? 

 

 

 

fields를 추가하고

 

 

이 메소드에서 valueof를 사용해 가져올 수 있다. 

 

 

 

 

 

 

 

 

 

반응형