Java - Enumeration, Overloading

김지원·2022년 8월 5일
0

JAVA 총 정리

목록 보기
9/11

Enumeration 열거형

  • 그 값(종류)이 상당히 제한적이고 어플리케이션 실행 중 추가 / 삭제될 일이 없어 고정적으로 사용하고자 하는 것들의 집합
  • 협업하는 개발자들끼리의 원활한 소통을 가능케한다. 실수를 줄이고 개발 속도를 빠르게 한다.
  • 어떠한 열거형이 가지는 원소는 그 열거형 타입인 객체이다.

스타그래프트의 종족이 열거형의 조건에 부합하다.

PROTOSS은 객체이다.

  • . 을 했을 때 사용할 수 있는 메서드들이 나온다.
  • ❗️ Race.PROTOSS 는 객체이고 타입이 아니다!

enum이 어떻게 정적인 것을 확신할 수 있을까?
static final인 애들도 열거형처럼 UpperCase를 사용한다.

  • new 키워드없이 작성이 가능하며 UpperCase로 사용하였기 때문에
    상수이며 정적이다 라고 말할 수 있다.
  • 값 지정 또한 할 수 없다.

  • 열거형의 이름 자체가 찍히게 된다.
    이렇게 찍히는 것은 toString( ) 을 한 결과 값이 출력이 되는 것이다.
System.out.println(Race.PROTOSS.toString()); // 같은 결과다.

toString을 재정의하게 되면 우리가 원하는 대로 값을 출력을 할 수 있다.

  • 열거형의 원소들은 ,로 구분을 하는데 원소들의 나열이 끝나면 ;을 사용한다.
  • ; 을 찍고 난 뒤부터는 Race 타입의 클래스 부분이다.
    세 개를 객체화하는데 있어서 필요한 것들을 클래스 부분을 빌드해줌으로써 구현을 한다.

  • 클래스에는 항상 기본생성자가 있으니 여기 또한 기본생성자가 존재한다.
Race() {
   ..
}

열거형의 생성자는 접근 제한자를 가지지 않는다.

Race 클래스에 멤버상수를 만들어주자.

  • 멤버상수는 값을 선언과 동시에 초기화하거나 생성자를 통해 값을 지정해줘야한다.
  • 멤버상수를 지정하고 생성자에 추가를 해주니 열거형에도 같이 추가가 되었다.

  • () 안에 적어야하는 것은 생성자에 전달될 name을 적으면 된다.
    () 는 기본생성자일때는 생략이 가능하지만 생성자가 있다면 무조건 적어줘야한다.

  • 값이 이동은 이렇게 움직인다.

지금 toString 했을때 한글이름이 나왔으면 좋겠기때문에 toString 재정의해주자.
Race타입의 객체에 대해서 toString을 호출하면 우리가 지정해둔 name이 출력이 될 것이다.

@Override
public String toString() {
	return this.name;
}

  • main 출력결과 지정해준 한글이름이 뚝 나오게 된다.
Main → Object
Main main = new Main();
System.out.println(main);
→ dev.jwkim.studyenum.Main@372f7a8d

Object에 toString을 하면 주소값 비슷한 애들이 나올 거라고 예상을 하는데 왜 지정한 값이 나올까?
Main타입은 Object를 상속받고 있는게 맞다.
Race타입의 객체를 toString 했을때는 주소값 비슷한게 찍히지 않았다.
즉, Race타입의 직속부모가 Object 인게 아닌 것이다.

Race → Enum → Object
System.out.println(Race.PROTOSS);
System.out.println(Race.TERRAN);
System.out.println(Race.ZERG);
→ 프로토스
→ 테란
→ 저그

Race가 Enum을 상속받고 Enum은 Object를 상속받고 있다.

sout(Race.PROTOSS instaceof Enum);
  • true가 뜬다.
    Race → Object 가 아닌 enum을 끼고 있는 Race → Enum → Object 형태인 것이다.

  • toString override한 것을 보면 Enum 클래스에서 오버라이드된 메서드 라는 것을 명시해주는 걸 볼 수 있다.

그런데 왜 tostring 밖에 없을까? hashCode, eqauls 와 같은것들을 왜 재정의 할 수 없는 걸까?

  • Enum 클래스는 extends 라는 키워드를 명시하지 않았으니 object를 상속받고 있는게 맞다.

  • 메서드에 final이 붙으면 더 이상 재정의 할 수 없기 때문에 Enum을 상속받는 Race에서는 재정의 = override를 할 수 없다.
'equals(Object)' cannot override 'equals(Object)' in 'java.lang.Enum'; overridden method is final


public final abstract void doSomething();
추상적인건 무조건 재정의해야하는데 final은 재정의를 막기때문에 불가능하다.
public static abstract void doSomething();
추상적인 메서드는 정적일 수 없다.
public static final void doSomething();
되기는 하나 의미없음

오버로딩 (Overloading)

: 메서드의 이름을 같게하되, 매개변수의 구조를 달리하여 그 조치를 유연하게 하는 것.

  • 메서드 이름이 같은데 실행이 잘된다. 오버로딩을 한 것이다.

이름이 같다하더라도 전달인자가 매개변수와 자주 잘맞아 떨어지는 메서드를 알아서 호출해준다.

  • 켜서로 가르키고 있는 sum은 매개변수를 2개가진 sum을 의미한다.

  • println 은 오버로딩이 엄청나게 되어있다.
  • 마지막 Nullable Objectx 는 위에 명시된 나머지 타입 말고는 object로 받는다는 뜻이다.

  • 이런상황이면 5는 Object에도 int에도 들어갈 수 있는데 어딜 선택할까?
  • 가장 가까운 타입, 구조를 가진 것을 호출하기 때문에 위의 isOdd로 가게 된다.

배열을 이용한 주어진 정수들에 대한 합 sum 메서드

  • 숫자가 몇개가 오든 잘 실행이 된다.
public static int sum(int... numbers) {
	int sum = 0;
	for (int number : numbers) {
	sum += number;
	}
	return sum;
}

  • 값을 하나만 주거나 주지 않아도 실행이 된다.
profile
Software Developer : -)

0개의 댓글