Constructor ( 생성자 )
- 객체가 클래스로 부터 생성될 때 기본적으로 가지고 있어야 할 값이나 실행되어야 될 코드를 정의하는 method의 일종.
- 직접 호출되지 않습니다. ( new 에 의해서만 호출 )
- 클래스의 이름과 동일하게 만들어지고 ( 대문자로 시작 ), 반환형이 없다.
- this나 super를 사용하여 클래스 내에 다른 생성자를 호출할 수 있습니다.
- Overload가 된다.
- 개발자가 생성자를 하나도 정의하지 않으면 compiler가 매개변수 없는 기본생성자( default constructor )를 생성해준다. 개발자가 생성자를 하나라도 정의하면 compiler
- 는 기본생성자를 생성하지 않는다.
문법)
접근지정자 클래스명( 매개변수... ) {
// 객체가 생성될 때 기본적으로 가지고 있어야 할 값
// 객체가 생성될 때 실행되어야 할 코드를 정의.
}
접근지정자)
public : 클래스 외부에서 객체 생성 가능.
protected : 같은 패키지의 다른 클래스에서 객체 생성 가능.
패키지가 다른 경우에는 자식클래스에서 생성 가능.
default : 같은 패키지의 다른 클래스에서 객체 생성가능.
패키지가 다르면 객체 생성불가
private : 클래스 안에서만 객체 생성가능.
(singleton pattern을 적용하여 클래스를 생성)
default constructor
- 매개변수가 없고 클래스의 접근지정자와 동일한 접근지정자를 가진 생성자.
class Test { // 패키지 안에서만 쓸 수 있다고 해서 [패키지 접근지정자]
}
// 위 class Test를 컴파일 하면
class Test {
Test() {
// 생성자
}
}
public class Test {
}
// 위 public class Test를 컴파일 하면
public class Test {
public Test {
// 생성자 접근지정자 public.
}
}
JVM Memory
- method 영역 : 실행되는 코드가 적재, static 변수가 저장, 가장먼저 실행
- stack 영역 : 지역변수가 저장
- heap 영역 : instance 변수가 저장, new 로만 사용가능 ( instance, 객체 )
class Test {
static int i; // static 변수 - method 영역
int j; // instance 변수 - heap 영역
public static void main(String[] args) {
int k = 0; // local 변수 - stack 영역
Test t = new Test();
Test t2 = new Test();
}//main
}//class
값 복사 ( Call by Value )
- method의 매개변수로 기본형이 선언되어 있으면, 값은 복사되어 전달됩니다.
public class Test{
public void swap(int i, int j) {
int temp = 0;
temp = i;
i = j;
j = temp;
System.out.println("swap method 안 i : " + i + ", j : " + j);
}// swap
public static void main(String[] args) {
// 객체화
Test t = new Test();
int i = 2025;
int j = 1;
System.out.println("swap methoe 호출 전 i : " + i + ", j : " + j);
t.swap(i,j);
System.out.println("swap methoe 호출 후 i : " + i + ", j : " + j);
}// main
}// class
주소전달 ( Call By Referance )
- 주소는 유일
- method의 매개변수가 참조형을 가진다면 ( 참조형 String class array ), 주소가 그대로 전달됨.(유일 : 어떤 method안에서 객체를 사용하더라도 해당 객체의 주소는 유일하기 때문에 해당객체를 변경시킨다.)
this
- keyword 형식, method 형식으로 사용할 수 있다.
- keyword 형식
- method를 호출하는 instance(객체) 의 주소로 변경된다.
- t.setI() = 이와 같이 method를 호출하면 t 의 주소를 this가 불러온다.
- 객체가 생성된 후 호출되는 instance 영역에서만 사용할 수 있다.( 객체를 사용하지 않고 클래스명.method() 명으로 호출되는 static 영역에서는 사용할 수 없다. )
- instance 변수명과 parameter 명이 같을 때, 두 변수를 식별하기 위해서 사용.( this.변수명 ⇒ heap에 생성되는 instance 변수명 )
사용법 ) - 변수 this.변수명 = 값 // heap 에 instance 변수 저장 - method 호출 this.method명() // 자식클래스
class Test { int i; public void setI(int i) { this.i = i; } public static void main(String[] args) { Test t = new Test(); // heap에 생성하고 heap에 주소를 stack에 할당 t.setI(100);// t - (heap 주소) 10번지를 사용하여 setI method 호출 해줘! Test t2 = new Test(); t2.setI(20);// } }
- ( 변수명 ⇒ stack에 생성되는 local 변수명 )
- keyword 형식