int age; // 인스턴스 변수(클래스 내에 선언된 변수 p.159 참고)
@Override
public String toString() { ... }
은 인스턴스 메서드 (클래스 내에 정의된 메서드 p.159 참고)
Person 클래스 안에서 Person형 참조변수 선언 가능, 내가 Person형 인스턴스 생성위해서 Person형 참조변수 선언을 하는 거니까 다음과 같은 문장 삽입이 가능하다.
public static final Person MAN = new Person();
누구를 가리키겠다는 메모리 관점에서의 선언
Person 인스턴스 두개
참조변수를 가지고 Person이 Person을 참조
그러면 Person 클래스 내에 Person형 참조변수 선언이 가능해야 한다.
Person 클래스 내에서 Person형 인스턴스 생성 가능해?
만약
public final Person MAN = new Person();으로 선언되어 있다 가정해보자.
컴파일까지는 과정 그러나 인스턴스 생성 과정에서 Person 안에 Person 있고, 또 그 안에 Person 있고 이걸 반복해서 문제가 생긴다. 재귀적인 인스턴스 구성이 끊기지 않기 때문에 (Person 안에 Person 인스턴스 생성) 문제...
그런데 책 본문의 코드
public static final Person MAN = new Person();
static 선언으로 되어있다:(메모리 공간 상으로)자리 빌려 잠깐 있는 거기 때문에 Person 인스턴스와 아무런 상관이 없다.
Person 인스턴스 관점에서 public static final Person MAN = new Person(); 문장은 있으나 마나다.
넓게 볼 때 열거형은 클래스라 할 수 있다. 그런데 class 대신 enum으로 선언하는 순간 독특한 특성을 갖게 된다.
enum Person은 Object 클래스를 상속하기 때문에 toString 메서드를 오버라이딩 할 수 있다.
System.out.println 메서드는 인자로 전달된 인스턴스의 toString 메서드를 호출해서 그 때 반환되는 값을 출력한다.
실행 결과를 보면 toString 메서드의 return 값을 출력했다.
System.out.println의 인자로 Person.MAN을 전달할 수 있다 => Person.MAN은 인스턴스다. )특정 인스턴스를 참조하는 참조값이라고 볼 수 있다.
private 생성자 나옴 private Person()
열거형의 정의에도 생성자가 없으면 디폴트 생성자가 삽입되는데 이 생성자는 private로 선언이 되어 직접 인스턴스를 생성하는 것이 불가능하다.
Person을 대상으로 new를 이용한 인스턴스 생성을 하지 않겠다.
enum Person은 폭넓은 관점에서 보면 클래스인데, 일반적인 클래스와 달리 new로 인스턴스 생성이 불가능한 클래스다. 생성자가 private로 선언되어 있어서
유일한 방법-열거형 값을 통해서 인스턴스 생성 가능
이번에도 println 메서드로 인자를 전달했다. Person.MAN과 Person.WOMAN
"Person constructor called"가 두번 호출되었다.
MAN과 WOMAN에 대해서 두번 호출 되었다. MAN이라는게 결국 Person형 인스턴스 생성으로 이어졌다. WOMAN 또한 Person형 인스턴스 생성으로 이어지고 그 과정에서 "Person constructor called"가 두번 출력되었다.
Person.MAN, Person.WOMAN으로 접근 가능하니 public, static-enumeration 이름(Person)을 통해 접근이 가능해서
이름을 갖고 있는 Person형 참조변수 MAN이라 가정하면 MAN이 참조하는 대상 못 바꿔서 final
참조변수 MAN이 참조하는 대상은 Person 클래스의 인스턴스다.
사실 생성자 Person()은 private로 선언되는게 열거형 값의 규칙이어서 위의 문장
public static final Person MAN = new Person();은 컴파일 되지 않는다.
void 생성자가 아닌 인자값을 받는 생성자 private Person(int age) { ... }
인스턴스 변수 선언도 있다. int age;
MAN(29); // 인스턴스를 생성하는데
Person MAN=new Person(29);로 인스턴스를 생성하는데 인자로 29를 전달한다.
그래서 파란색으로 칠한 생성자가 필요하다.
결론적으로, 인자를 전달받는 생성자를 정의할 수 있다.
static으로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수다.
즉, 인스턴스 내에 존재하는 변수가 아니라 '어떠한 인스턴스에도 속하지 않는 상태로 메모리 공간에 딱 하나만 존재하는 변수'다.
다만 이 변수가 선언된 클래스의 인스턴스들은 이 변수에 바로 접근할 수 있는 권한이 있을 뿐이다.
static 변수 접근 시에는 클래스 이름.static 변수 이름의 형식으로 접근한다.
-값을 딱 한 번만 할당할 수 있다.
-한 번 할당된 값은 변경이 불가능하다.
자바 getter setter 복습 노트 (0) | 2022.09.21 |
---|---|
25-2. 매개변수의 가변 인자 선언 (0) | 2022.09.13 |
25-1. 열거형 ① (0) | 2022.09.10 |
익명(anonymous) 내부 클래스 참고 자료 및 정리 (0) | 2022.09.10 |
멤버변수(필드)와 지역변수 개념 (0) | 2022.07.08 |
댓글 영역