참 생각없이 쓰면 쉬운 생성자와 초기화.. 하지만 조금이라도 알고나면 코드를 짜거나 할때 생각을 하며 더욱 질좋은 코드를 짤 수 있다!
생성자
- 생성자는 인스턴스가 생성될 때 호출 되는 '인스턴스 초기화 메서드'(객체 초기화)
- 초기화란 쉽게 말해 원하는 초기값을 세팅해 준다고 생각하면 된다
- 생성자를 생성할 때 규칙
- 이름이 클래스 이름과 같아야 한다.
- 생성자는 리턴값이 없다.(void 안붙임)
- 모든 클래스는 반드시 생성자를 가져야 한다.
기본 생성자
- 형태 : 클래스이름(){} -> Card() { }
- 매개변수가 없는 생성자
- 생성자가 하나도 없을 때만 -> 컴파일러가 자동 추가
- 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을때 뿐!
- 즉 클래스안에 다른 생성자가 하나라도 있으면, 기본 생성자가 자동으로 추가 되지 않기 때문에 새로 쓸때는 직접 내가 생성자를 넣어줘야 한다.
🕸️ 매개변수가 있는 생성자
- 매개변수가 있는 생성자를 만들어준다면, 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있다!
- 인스턴스를 생성한 다음 -> 인스턴스 변수의 값을 변경하는 것 보다 낫다!
(오른쪽 핑크 박스) -> 간결해진다.직관적이다.
생성자 this()
- 같은 클래스의 멤버들 간에 서로 호출 할수 있는것 처럼 생성자 간에도 호출이 가능!
- 생성자에서 다른 생성자 호출할 때 사용
- 다른 생성자 호출시 첫 줄에만 사용 가능
- 중복을 제거한 코드(왼쪽->오른쪽)
- 아무값도 입력하지 않으면
"white","auto",4
가 생성됨(초기화값) 이것을 코드 중복을 제거 하고 this를 사용한다.
- tip : 코드 중복을 제거하려면 어느 한쪽이 다른 한 쪽을 호출하게 만들어 주면 된다 (위 그림도, 위 코드에서 아래 코드를 호출하게 만듬)
참조변수 this (this != this())
- 생성자
this()
와는 전혀 다르다!
- 인스턴스 자기 자신을 가리키는 참조변수
- 인스턴스 메서드(생성자 포함)에서 사용가능
- 클래스 메서드(static메서드) 에서는 사용 불가
- 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
this.xxx
가 붙어야 인스턴스 변수로 인식을 한다.
- 아니면 지역변수(매개변수로 인식을 함)
정리하자면,
참조변수 this
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스의 주소가 저장되어 있다.
- 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재한다.
VS
생성자 this(), this(매개변수)
- 생성자. 같은 클래스의 다른 생성자를 호출 할때 사용한다
마지막 static 붙은 코드에서는 this를 사용할 수 없다. 이유는 static 메서드는 객체 생성없이 호출 하기 때문에 인스턴스 변수를 사용할수 없다
변수의 초기화
- 지역변수(lv)는 수동 초기화 해야함! (사용전에 꼭!)
- 멤버변수(클래스 안에서 선언됨)는 자동 초기화 된다!
- 지역변수(메서드or생성자 안에서 선언됨)는 자동으로 안 됨!
멤버변수의 초기화 3가지 방법
1. 자동 초기화
2. 간단 초기화
3. 복잡 초기화
- 초기화 블럭
- 인스턴스 초기화 블럭 : {} - 인스턴스 변수의 복잡한 초기화에 사용
- 클래스 초기화 블럭 : static {} - 클래스 변수의 복잡한 초기화에 사용
- 생성자
멤버 변수의 초기화 시기와 순서
- 클래스 변수 (먼저)
- 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번
- 초기화 순서 : 기본값 - > 명시적 초기화 ->클래스 초기화 블럭
- 인스턴스 변수 (클래스 변수 초기화 후)
- 초기화 시점 : 인스턴스가 생성될 때 마다
- 초기화 순서 : 기본값 - > 명시적 초기화 ->인스턴스 초기화 블럭->생성자
뭔가 머릿속에서 둥둥 떠다니던 개념들은 확실하게 잡은것 같다!
쉬운 코드라도 생각을 하면서 짤 수 있을것 같은 자신감이 생긴다!
무엇보다 무의식적으로 코드를 짜는게 아닌 의식적으로 생각!을 하며 진행 한다는게 정말 중요한데,
이 공부를 통해서 한 걸음 더 나아간듯 하다!