Day 22

ChangWoo·2023년 4월 26일
1

자바의 정석

목록 보기
22/71

ch 6-36,37 생성자 this(), 참조변수 this

생성자 this()

생성자에서 다른 생성자 호출할 때 사용
다른 생성자 호출시 첫 줄에서만 사용가능

  • 원래 Car2 클래스를 사용해야 하지만 this()를 사용
Ex) Car(String color) {
	door = 5; // 첫 줄에 사용하지 않아서 에러
    Car(color, "auto", 4); // 클래스 이름 대신 this를 쓰지 않아서 에러
}
  • 생성자 = 코드의 중복을 제거를 위해 서로 호출하는 경우가 많다.
  • 지정해주지 않으면 디폴트 값을 주어야 한다. (그런데 밑의 코드와 비슷하므로(코드가 중복되므로) 제거해줘야 한다.)
  • 코드의 중복을 제거하기 위해서는 n개 중 하나가 호출하면 된다.

참조변수 this

인스턴스 자신을 가리키는 참조변수
인스턴스 메서드(생성자 포함)에서 사용가능
지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

  • 참조변수.변수이름
  • this가 없을때는 lv로 간주되나, this가 붙으므로써 iv로 간주된다.
  • 같은 클래스 안에서는 this 생략 가능

참조변수 this와 생성자 this()의 차이


  • 클래스에서 this를 선언하지 않아도 같은 클래스일 때, 인스턴스 메서드일 때 사용 가능하다.
  • static 메서드 = 객체 생성 없이 호출하기 때문에, iv 사용불가/this사용 불가
  • this = 인스턴스 메서드에서만 사용 가능

ch 6-38~41 변수의 초기화, 멤버변수의 초기화

변수의 초기화

지역변수(lv)는 수동 초기화 해야함(사용전 꼭!!)
멤버변수(iv,cv)는 자동 초기화된다. (0으로)

Ex) class InitTest {
	int x;		  //  인스턴스 변수
    int y = x;	 //  인스턴스 변수    
    void method1() {
    	int i;		// 지역변수
        int j = i;  // 에러. 지역변수를 초기화하지 않고 사용
    } 
}
  • i의 값을 모르는데 j에 넣으려고 하기 때문에 에러가 발생
  • 이유 : 호출 스택에 쌓이고 없어지는 재사용이 빈번한 메모리(=짧은 시간동안 다른 메모리가 같은 공간을 썼다가 지웠다를 반복 / 0으로 초기화하면 성능이 떨어져서 새로운 값으로 덮어쓴다.)

자동 초기화 되는 유형과 값

  • 타입마다 조금씩 다르지만, 근본적으로는 0으로 초기화 된다.

멤버변수(iv,cv)의 초기화

1. 명시적 초기화(=) (간단 초기화)

  • 선언식(대입연산자)로 초기화
class Car {
	int door = 4;  			 // 기본형(primitive type) 변수의 초기화
    Engine e = new Engine(); // 참조형(reference type) 변수의 초기화 
  • 참조형 변수가 가질 수 있는 값은 null 아니면 객체주소다.
  • null은 기본값으로 0이므로 초기화 해주지 않으면 값이 없다.(=객체가 없다.)
  • 참조변수 초기화 = 객체를 넣는 것O / null로 만드는 것X

2.초기화 블럭 (복잡 초기화)

  • 괄호 안에 여러 문장을 넣을 수 있다.
  • 인스턴스 초기화 블럭 : {} (iv 초기화)
  • 클래스 초기화 블럭 : static{} (cv 초기화)

3.생상자 (복잡 초기화)

  • iv 초기화
car(String color, String gearType, int door) {	// 매개변수 있는 생성자
		this.color = color;
        this.gearType = gearType;
        this.door = door;
}

cv와 iv의 초기화 방법

  1. 자동초기화 : 알아서 0으로 초기화
  2. 간단초기화 : 대입연산자로 초기화
  3. 복잡초기화 : 블럭으로 초기화 / static블럭으로 초기화 / 생성자
  • 복잡 초기화 중 static{} 초기화 / 생성자가 많이 사용된다. (각각 cv / iv에 사용)

멤버변수의 초기화 - static {}

  1. 명시적 초기화(=)
  2. 초기화 블럭 - {}, static{} : cv
  3. 생성자(iv초기화)
  • arr = cv
  • 대입 연산자는 배열 생성 작업만 가능 / 난수를 채우기 위해 static{}를 사용한다.

멤버변수의 초기화 생성 시점과 순서

클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번 (클래스가 메모리에 올라갈 때)
인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다

  • = 은 간단 초기화
  • {}, static{}은 복잡 초기화
    Ex) InitTest it = new InitTest();

    <cv초기화 과정>
  • 1 : 자동 초기화
  • 2 : 명시적 초기화(간단 초기화)
  • 3 : 복잡 초기화(클래스 초기화)
  • cv 초기화 과정이 끝나고 iv 초기화 과정이 시작된다.
    <iv초기화 과정>
  • 1 : 자동 초기화 (cv는 계속 2, iv는 0)
  • 2 : 명시적 초기화(간단 초기화) (cv는 2, iv는 1)
  • 3 : 복잡 초기화 (cv는 2, iv는 2)
  • 4 : 생성자 (cv는 2, iv는 3)
    cv가 먼저 초기화 되고, iv가 초기화 된다.
    초기화 순서는 1.자동(0으로 만듦) -> 2.간단(=) -> 3.복잡(static{} / 생성자)
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글