1. 생성자
생성자
: 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
- 인스턴스 생성시 수행할 작업에 사용됨
- 초기값이 필요한 인스턴스 변수의 값을 초기화 해줌
생성조건
- 이름이 클래스 이름과 같아야 함
- return 값이 없어야 함
- void는 붙이지 않음
- 오버로딩 가능
기본생성자
: 매개변수가 없는 생성자
- 생성자가 하나도 선언되어 있지 않았을 때는 컴파일러가 자동으로 추가해줌
- 기본 생성자는 없고 오버로딩한 생성자만 있을 경우 컴파일러가 기본 생성자를 만들어주지 않기 때문에 기본 생성자를 사용하려고 하면 Error 발생함
class Tv9_1 {
// 속성: 변수 선언
boolean power; // 전원상태
int channel; // 채널
String color; // 색깔
long price; // 가격
// 기본 생성자
public Tv9_1() {
power = false;
channel = 1;
}
// 오버로딩 한 생성자 - 매장 진열용일 경우, 가격과 색깔의 초기화가 필요
public Tv9_1(String color, long price) {
power = false; // this.power, power 둘다 지금 상황에서는 인스턴스 변수를 명확하게 판단할 수 있어 어떤걸 사용해도 상관 X
channel = 1;
this.color = color;
this.price = price;
}
// 기능: 메서드 선언
void power() { // 전원 기능
power = !power;
if (power) {
System.out.println("전원 ON");
} else {
System.out.println("전원 OFF");
}
}
void channelUp() { // 채널 증가
channel++;
System.out.println("채널 증가");
}
void channelDown() { // 채널 감소
channel--;
System.out.println("채널 감소");
}
}
class Tv9_1Main {
public static void main(String[] args) {
// 기본 초기화된 Tv9_1 생성
Tv9_1 tv = new Tv9_1();
System.out.print("기본 생성자 TV: ");
tv.power();
// 진열 용 Tv9_1 생성
Tv9_1 exTv = new Tv9_1("보라색", 3456789);
System.out.print("오버로딩 생성자 TV: ");
exTv.power();
System.out.println("exTv.color = " + exTv.color);
System.out.println("exTv.price = " + exTv.price);
}
}
2. this
this
: 인스턴스 자신을 가리키는 참조변수
- 인스턴스 메서드(생성자 포함)에서 사용 가능
- 지역 변수와 인스턴스 변수를 구별할 때 사용
class Tv10_1 {
// 속성: 변수 선언
boolean power; // 전원상태
int channel; // 채널
String color; // 색깔
long price; // 가격
// 기본 생성자
public Tv10_1() {
this.power = false;
this.channel = 1;
}
// 오버로딩 한 생성자 - 매장 진열 용 일 경우에는 가격과 색깔의 초기화가 필요
public Tv10_1(String color, long price) {
this.power = false;
this.channel = 1;
this.color = color;
this.price = price;
}
// 기능: 메서드 선언
void power() { // 전원 기능
this.power = !power;
if (this.power) {
System.out.println("전원 ON");
} else {
System.out.println("전원 OFF");
}
}
void channelUp() { // 채널 증가
this.channel++;
System.out.println("채널 증가");
}
void channelDown() { // 채널 감소
this.channel--;
System.out.println("채널 감소");
}
// 색깔을 수정하고 자기 자신을 반환하는 메서드
Tv10_1 changeColor(String color) { // 반환 타입으로 자기자신인 Tv 선언
this.color = color;
System.out.println("색깔 변경 완료!");
return this; // this는 자기 자신을 가리키는 참조변수
}
}
class Tv10_1Main {
public static void main(String[] args) {
// 기본 초기화된 Tv10_1 생성
Tv10_1 tv = new Tv10_1();
System.out.print("기본 생성자 Tv10_1: ");
tv.power();
// 진열용 Tv10_1 생성
Tv10_1 exTv = new Tv10_1("보라색", 3456789);
System.out.print("오버로딩 생성자 Tv10_1: ");
exTv.power();
System.out.println("exTv.color = " + exTv.color);
System.out.println("exTv.price = " + exTv.price);
System.out.println();
// 진열용 Tv10_1의 색깔을 수정하고 수정된 객체를 참조변수에 저장
Tv10_1 exTvThis = exTv.changeColor("파란색");
// 색깔이 변경된 Tv의 주소가 저장된 참조변수 exTvThis를 사용해 변경된 색깔 확인
System.out.println("색깔이 변경되었는지 확인 exTvThis.color : " + exTvThis.color);
System.out.println("exTv.color = " + exTv.color);
}
}
3. this()
this()
: 생성자에서 다른 생성자를 호출할 때 사용
class Tv10_2 {
// 속성: 변수 선언
boolean power; // 전원상태
int channel; // 채널
String color; // 색깔
long price; // 가격
// 기본 생성자
public Tv10_2() {
this.power = false;
this.channel = 1;
}
// 오버로딩 한 생성자 - 매장 진열 용 일 경우에는 가격과 색깔의 초기화 필요
public Tv10_2(String color, long price) {
// 이럴 때 this() 사용
// this.power = false;
// this.channel = 1;
this(); // 기본 생성자 호출
// Tv10_2() // 이렇게는 불가능함
this.color = color;
this.price = price;
// this(); // 생성자 호출은 반드시 첫 줄에서만 가능
}
// 기능: 메서드 선언
void power() { // 전원 기능
this.power = !power;
if (this.power) {
System.out.println("전원 ON");
} else {
System.out.println("전원 OFF");
}
}
void channelUp() { // 채널 증가
this.channel++;
System.out.println("채널 증가");
}
void channelDown() { // 채널 감소
this.channel--;
System.out.println("채널 감소");
}
// 색깔을 수정하고 자기 자신을 반환하는 메서드
Tv10_2 changeColor(String color) { // 반환 타입으로 자기자신인 Tv 선언
this.color = color;
System.out.println("색깔 변경 완료!");
return this; // this는 자기 자신을 가리키는 참조변수
}
}
class Tv10_2Main {
public static void main(String[] args) {
// 기본 초기화된 Tv10_2 생성
Tv10_2 tv = new Tv10_2();
System.out.print("기본 생성자 Tv10_2: ");
tv.power();
// 진열용 Tv10_2 생성
Tv10_2 exTv = new Tv10_2("보라색", 3456789);
System.out.print("오버로딩 생성자 Tv10_2: ");
exTv.power();
System.out.println("exTv.color = " + exTv.color);
System.out.println("exTv.price = " + exTv.price);
System.out.println();
// 진열용 Tv10_2 의 색깔을 수정하고 수정된 객체를 참조변수에 저장
Tv10_2 exTvThis = exTv.changeColor("파란색");
// 색깔이 변경된 Tv의 주소가 저장된 참조변수 exTvThis 를 사용하여 변경된 색깔 확인
System.out.println("색깔이 변경되었는지 확인 exTvThis.color : " + exTvThis.color);
System.out.println("exTv.color = " + exTv.color);
}
}
4. 변수의 초기화
수동/자동 초기화
- 지역변수는 수동으로 초기화 해야 함
- 지역변수가 동작하는 스택 메모리는 재사용이 빈번하기 때문에 매번 초기화해주면 성능이 떨어져서 해당 메모리에 있는 값으로 덮어 씌움.
근데 해당 주소에 어떠한 값이 있는지 모르기 때문에 Java는 개발자에게 수동으로 초기화하라고 요구함
- 지역변수가 동작하는 스택 메모리는 재사용이 빈번하기 때문에 매번 초기화해주면 성능이 떨어져서 해당 메모리에 있는 값으로 덮어 씌움.
- 멤버변수(인스턴스 변수, 클래스 변수)는 자동으로 초기화됨
멤버변수의 초기화
- 클래스 변수: 클래스가 처음 로딩될 때 단 한 번만 초기화 됨
- 인스턴스 변수: 인스턴스가 생성될 때마다 초기화 됨
5. 초기화 방법
명시적 초기화 (=)
class Tv11_1 {
boolean power = false; // 기본형 변수의 초기화
int channel = 1; // 기본형 변수의 초기화
//Audio audi = new Audio(); // 참조형 변수의 초기화 / 참조형은 객체주소 or null 로 초기화
// 참조형의 기본값은 null
}
초기화 블럭
class Tv11_2 {
static boolean power;
int channel;
// 클래스 초기화 블럭
static
{
power = false;
}
// 인스턴스 초기화 블럭
{
channel = 1;
}
}
생성자 초기
class Tv11_3 {
// 속성: 변수 선언
boolean power; // 전원상태
int channel; // 채널
String color; // 색깔
long price; // 가격
// 기본 생성자
Tv11_3() {
this.power = false;
this.channel = 1;
}
}
'내일배움캠프(Sparta) > Java Handbook' 카테고리의 다른 글
[Java Handbook] Part 5-3 (0) | 2023.09.13 |
---|---|
[Java Handbook] Part 5-2 (0) | 2023.09.13 |
[Java Handbook] Part 5-1 (0) | 2023.09.12 |
[Java Handbook] Part 4-2 (0) | 2023.09.12 |
[Java Handbook] Part 4-1 (0) | 2023.09.12 |