07 생성자와 변수의 초기화
● 생성자
○ 생성자 : 인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’
클래스이름 (타입 변수명, 타입 변수명, …) { }
Test(){ } Test(int a, String b, bollean c){ this.a = a; this.b = b; this.c = c; }
■ 인스턴스 변수의 초기화 작업에 주요 사용됨
■ 클래스 내에 선언됨
■ 생성자의 조건
(1) 생성자의 이름은 클래스의 이름과 같아야 함
(2) 생성자는 리턴 값이 없음
■ 생성자도 오버로딩이 가능함(매개변수에 차이를 둬서 다르게 인스턴스 생성 가능)
■ 연산자 new로 생성자를 통해 인스턴스를 생성하는 것
Test t = new Test();
(1) 연산자 new에 의해서 메모리(heap)에 Test클래스의 인스턴스가 생성됨
(2) 생성자 Test()가 호출되어 수행됨
(3) 연산자 new의 결과로, 생성된 Test인스턴스의 주소가 반환되어 참조변수 t에 저장됨
○ 기본 생성자
Test () {}
■ 클래스에서 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 것!
컴파일러가 기본생성자를 추가해줘서
■ 클래스의 접근 제어자가 public 인 경우 생성자도 public 클래스이름() 임
■ 기본생성자가 컴파일러에 의해 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때!
다른 생성자 있으면 기본생성자 자동으로 추가 안되고
내가 직접 추가해야 됨
○ 매개변수 있는 생성자
Test(int a, String b, bollean c){
a = a;
b = b;
c = c;
}
■ 매개변수 선언해서 호출 시 값을 넘겨받아서 인스턴스 초기화할 수 있음
인스턴스 내의 멤버변수는 접근 가능하니까~ ㅎㅎ
○ 생성자에서 다른 생성자 호출하기_this(), this
■ 생성자 간에 서로 호출 가능함! 그 조건
(1) 생성자의 이름으로 클래스이름 대신 this 사용
(2) 한 생성자에서 다른 생성자를 호출할 때 반드시 첫 줄에서만 호출 가능
생성자 내에서 초기화 작업 도중에 다른 생성자 호출하게 되면 다른 생성자 내에서 멤버변수 값을 초기화 할 수 있으니까, 이전 초기화 작업이 무의미해질 수 있음
■ this!
(1) 인스턴스 변수 앞에 붙여주는 this
□ 인스턴스 변수 앞 this : 참조변수. 인스턴스 자신을 가리킴
생성자의 매개변수와 클래스의 멤버변수 이름이 같은 경우 인스턴스 변수를 구별함
□ 인스턴스의 주소가 저장되어 있음
□ 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재(this를 써 주는 건 명시하는 거네)
□ static메서드는 this 사용할 수 없음
인스턴스 생성하지 않고도 static 메서드는 호출할 수 있으므로!
(2) this()
□ this(매개변수) 생성자.
□ 같은 클래스의 다른 생성자 호출할 때 사용
○ 생성자를 이용한 인스턴스의 복사
Test(Test t){
a = t.a;
b = t.b;
c = t.c;
}
■ Object 클래스의 clone메서드를 이용하면 간단히 인스턴스 복사할 수 있음
● 변수의 초기화
○ 초기화 : 변수를 선언하고 처음으로 값을 저장하는 것
■ 멤버변수는 초기화 하지 않아도 자동적으로 자료형에 맞는 기본값으로 초기화 됨!
■ 지역변수는 자동으로 초기화 안되므로 사용할 때 초기화 해야 됨
■ 멤버변수 초기화 방법
(1) 명시적 초기화
(2) 생성자
(3) 초기화 블록
- 인스턴스 초기화 : 인스턴스 변수 초기화에 사용
- 클래스 초기화 : 클래스변수 초기화에 사용
○ 명시적 초기화
■ 변수를 선언과 동시에 초기화 하는 것
■ 복잡한 초기화 작업 필요할 때는 생성자나 초기화 블록 이용
○ 초기화 블록
■ 클래스 초기화 블록 : 클래스 변수의 복잡한 초기화에 사용
인스턴스 초기화 블록 앞에 static 붙임
클래스 초기화 블록은 클래스가 메모리에 처음 로딩
0될 때 한번만 수행됨
■ 인스턴스 초기화 블록 : 인스턴스 변수의 복잡한 초기화에 사용
클래스 내에 블록{ } 만들고 그 안에 코드 작성
인스턴스 생성될 때마다 수행 됨
■ 초기화 블록 내에는 메서드처럼 조건문, 반복문, 예외처리구문 등 자유롭게 사용 가능
초기화 작업이 복잡하여 명시적 초기화로 부족한 경우 초기화 블록 사용
■ 생성자보다 초기화 블록이 먼저 수행됨
■ 인스턴스 변수의 초기화는 주로 생성자를 사용,
인스턴스 초기화 블록은 모든 생성자에서 공통으로 수행되어야 하는 코드 넣는데 사용
○ 멤버변수의 초기화 시기와 순서
■ 클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화 됨
■ 인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때마다 각 인스턴스별로 초기화 이루어짐
■ 클래스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블록
■ 인스턴스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 –> 생성자
■ 클래스 변수는 항상 인스턴스 변수보다 먼저 생성되고 초기화 됨
'JAVA > 이론' 카테고리의 다른 글
[java][이론] 009 package와 import (0) | 2020.07.06 |
---|---|
[java][이론] 008 상속 (0) | 2020.07.06 |
[java][이론] 006 변수와 메서드 (0) | 2020.07.02 |
[java][이론] 005 클래스와 객체 (0) | 2020.07.02 |
[java][이론] 004 배열 (0) | 2020.06.29 |