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복잡초기화
}
'JAVA' 카테고리의 다른 글
| JAVA | 추상클래스, 인터페이스 (0) | 2022.02.10 |
|---|---|
| JAVA | final 상수 (0) | 2022.02.06 |
| JAVA | instanceof연산자, 매개변수 다형성, 객체 배열로 다루기 (0) | 2022.02.03 |
| JAVA | 다형성, 참조변수의 형변환 (0) | 2022.01.28 |
| JAVA | 오버라이딩, package, import, 제어자 (0) | 2022.01.26 |