본문 바로가기
JAVA

JAVA | 재귀호출, 변수의 초기화

by 개발송이 2022. 2. 5.

Ch6

3.10 재귀호출 recursive call

 

메서드의 내부에서 메서드 자신을 다시 호출하는 것

재귀호출 하는 메서드를 재귀메서드라고 한다.

public class Exam {

	public static void main(String[] args) {
		int result = factori(4);
		
		System.out.println(result);
	}
	
	static int factori(int n) {
		int result=0;
		
		if(n==1)
			result =1;
		else
			result = n *factori(n-1);
		
		return result;
	}

}


5.4 생성자에서 다른 생성자 호출하기

 

생성자 this()

-생성자에서 다른 생성자를 호출할 때 사용

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

(생성자가 하는 일 iv초기화)

(클래스 이름 대신 this쓴다고 생각)

 

참조변수 this

-인스턴스 자신을 가리키는 참조변수

-인스턴스 메서드(생성자 포함)에서 사용가능

-지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

Car(String c, String g, int d){
	color = c;
    gearType = g;
    door = d;
}  //color은 iv, c는 lv
   //같은 클래스 안에서는 앞에 this생략가능

Car(String color, String gearType, int door){
	this.color = color;
    this.gearType = gearType;
    this.door = door;
}  //this붙능넉 iv, 뒤에꺼는 lv
   //같은 클래스 안에서는 생략가능하지만 이름이 같으니까 생략안됨

this(), this(매개변수)  ->생성자 

: 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

this  ->참조 변수

:인스턴스 자신을 가리키는 참조변수, 인스턴스 주소가 저장되어 있다.

모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

 

*this와 this()는 비슷하게 생겼을 뿐, 완전 다른 것이다. 

 

class MyMath {
	long a, b;  //iv (this.a, this.b)
    
    MyMath(int a, int b) { //생성자
    	this.a = a;
        this.b = b; //이름이 같으니까 this붙여서 iv, lv구분
    }
    
    long add() { //인스턴스 메서드
    	return a+b; //this.a + this.b
    }
    static long add(long a, long b){ //클래스 메서드(static메서드)
    	return a + b;
    }
}

 

5.5 생성자를 이용한 인스턴스의 복사

-현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할때 생성자 이용

Car(Car c) {
    color = c.color;
    gearType = c.gearType;
    door = c.door;
}  //Car클래스의 참조변수를 매개변수로 선언한 생성자

 

6. 변수의 초기화

자동초기화 / 간단초기화(=) / 복잡초기화 {} cv-static(), iv-생성자

 

 

6.1 변수의 초기화

 

변수를 선언하고 처음으로 값을 저장하는 것을 변수의 초기화라고 한다.

지역변수는 사용하기 전에 반드시 초기화 해야한다.

class Test{
    int x;  //iv 자동초기화
    int y = x; //x선언만 하고 초기화 안해줘도 에러안남
    
    void method(){
    	int i;  //lv지역변수. 수동초기화해줘야함
        int j = i;  //지역변수 초기화 안해줘서 에러남
    }
}

*멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택이지만 지역변수의 초기화는 필수이다.

iv는 각 타입의 기본형으로 초기화 됨

>각 타입의 기본값

자료형 기본값
boolean false
char  '\u0000'
byte, short, int 0
long 0L
float 0.0f
double 0.0d or 0.0
참조형변수 null

 

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

1. 명시적 초기화 ('=' 대입연산자로) 

2. 생성자 (iv초기화, 복잡한 초기화)

3. 초기화 블럭

 

 

6.2 명시적 초기화 explicit initializtion

 

변수를 선언과 동시에 초기화 하는것 

대입연산자(=)로 초기화

class Car {
	int door = 4;
    
    '''
}

 

6.3 초기화 블럭 initialization block 

 

복잡한 초기화. 여러문장 넣는거

cv-클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용 static{ }

iv-인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용 {  }

 

클래스 초기화 블럭은 클래스가 메모리에 처음 로딩될 때 한번 수행

인스턴스 초기화 블럭은 생성자와 같이 인스턴스를 생성할 때 마다 수행

 

인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행돼야 하는 코드 넣는데 사용 -> 코드 중복 제거

public class Ex27 {	
	static {
		System.out.println("Static { }"); 
	}  //클래스 초기화 블럭
	   //메모리에 로딩될 때 한번만 수행 됨
	{
		System.out.println("{ }");
	}  //인스턴스 초기화 블럭
	   //인스턴스 생성될 때 마다 수행 됨
	
	public Ex27() {
		System.out.println("생성자");  
	}  //생성자
	
	public static void main(String[] args) {
		System.out.println("BlockTest bt");
		Ex27 bt = new Ex27();
		
		System.out.println("BlockTest bt2");
		Ex27 bt2 = new Ex27();
	}
}

 

 

6.4 멤버변수(cv, iv)의 초기화 시기와 순서

 

cv초기화 시점 : 클래스 처음 로딩될 때 마다 한번 초기화(메모리에 올라갈 때)

iv초기화 시점 : 인스턴스 생성될 떄 마다 각 인스턴스별로 초기화

 

cv초기화 순서 : 기본값 - 명시적 초기화 - 클래스초기화 블럭

iv초기화 순서 : 기본값 - 명시적 초기화 - 인스턴스초기화블럭 - 생성자

class StaticBlockTest{
	static int[] arr = new int[10]; //명시적초기화 cv (간단초기화)
    //배열안에 난수를 채우고 싶은데 명시적초기화로는 배열만드는거만 가능
    
    static { //클래스초기화블럭 - 배열arr을 난수로 채움(복잡한 초기화)
    	for(int i=0; i<arr.length; i++){
        	arr[i]=(int)(Math.random()*10)+1;
        }
    } //cv복잡초기화
}