티스토리 뷰
[자바의 정석] Ch 6-36 생성자 this()란? Ch 6-37 참조변수 this란? Ch 6-37 this()와 this의 차이란? Ch 6-38 변수의 초기화란?
da_devel 2022. 6. 21. 01:07
🤔 생성자 this()란?
생성자에서 다른 생성자를 호출할 때 사용한다.
다른 생성자 호출 시 첫 줄에서만 사용가능!
다음의 예시를 살펴보자.
Car(String color) {
door = 5;
Car(color, "auto", 4); // 에러, 다른 생성자 호출 시 반드시 첫 줄에서만 사용가능!!
// 또한 같은 클래스 안의 생성자를 호출할 때 Car(color, "auto", 4); 로 호출하면 안되고
// this 사용해야함.
}
// 올바른 사용법
Car(String color) {
this(color, "auto", 4);
}
🤔 참조변수 this란?
인스턴스 자신을 가리키는 참조변수
인스턴스 메서드(생성자 포함)에서 사용가능
지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
this.이 붙은 변수들은 인스턴스 변수이고,
= 뒤의 변수(흰색)은 지역변수이다.
⭐ 이렇게 지역변수와 인스턴스 변수를 구분 지을 때 '참조변수 this'를 사용한다❗❗
만약 여기서 참조변수 this를 사용하지 않으면 어떨까?
color = color;
gearType = gearType;
door = door;
이렇게 작성했다면 둘다 지역변수가 될 것이다.
(가까운 위치의 변수값을 사용하기 때문)
➕ 그럼 또 한가지 질문이 있을 것이다!
지역변수와 인스턴스 변수의 이름이 다르다면?
다음의 코드를 보자.
Car2(String c, String g, int d) { // lv(local variable)
this.color = c;
this.gearType = g;
this.door = d;
}
Car2(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
지역변수와 인스턴스 변수의 이름이 다르다면
위의 방식처럼 this를 써도 되고
아래의 방식처럼 this를 생략 가능하다.
📌 this()와 this의 차이란?
this와 this()는 완전히 다르다!
this는 '참조 변수'이고,
this()는 '생성자' 이다!
❌ static 메서드에서 this 사용 불가하다.
다음의 코드를 보자.
class MyMath {
long a, b; // this.a, this.b가 iv의 진짜 이름이다.
MyMath(int a, int b) { // 생성자
this.a = a;
this.b = b; // 무조건 this 사용해야함. 왜냐? iv와 lv이름 같으니까!
}
long add() { // 인스턴스 메서드
return a + b; // return this.a + this.b; // 생략가능(왜냐? iv 사용하니까)
}
/**
* 생성자, 인스턴스 메서드에서 this 사용 가능
* static 메서드에선 this 사용 불가
*/
static long add(long a, long b) { // 클래스 메서드(static 메서드)
return a + b; // this 사용 불가능
/**
* static 메서드에서는 this사용 불가, iv 사용불가
* 왜냐? this는 객체를 의미하는데 객체가 있을 수도 없을 수도 있으니까 사용불가
* iv도 객체 생성 후 사용할 수 있는게 객체가 있을 수도 없을 수도 있으니까 사용불가
*/
}
}
🤔 변수의 초기화란?
지역변수(iv)의 경우 수동으로 초기화 해주어야 한다.
멤버변수(iv, cv)의 경우 자동 초기화된다.
✅ 멤버변수 초기화의 종류
1. 명시적 초기화(=)
선언시 =(대입연산자) 사용
class Car {
int door = 4; // 기본형(primitive type) 변수 초기화
Engine e = new Engine(); // 참조형(reference type) 변수 초기화
2. 초기화 블럭
복잡한 초기화(여러 문장)
인스턴스 초기화 블럭 : {}
클래스 초기화 블럭 : static {}
3. 생성자
iv 초기화, 복잡한 초기화
Car(String color, String gearType, int color) { // 매개변수 있는 생성자
this.color = color;
this.gearType = gearType;
this.door = door;
}
✅ 멤버변수의 초기화 시점
✔ 클래스 변수 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번
(메모리에 올라갈 때)
✔ 인스턴스 변수 초기화 시점 : 인스턴스가 생성될 때 마다
class InitTest {
static int cv = 1; // 명시적 초기화
int iv = 1; // 명시적 초기화
static { cv = 2; } // 클래스 초기화 블럭
{ iv = 2; } // 인스턴스 초기화 블럭 // iv 초기화
InitTest() { // 생성자
iv = 3; // iv 초기화
}
}
다음 포스팅은 자바의 정석 Ch 7장으로 돌아오겠다.
그럼 오늘도 열공하자 🔥
'프로그래밍 > 자바' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 백준
- 해커랭크
- hackerrank
- 자바
- 코드
- 자바의 정석
- stack
- 정보처리 산업기사
- 해커랭크 자바
- challenges
- 해커랭크 자바 챌린지
- Java
- ORM
- LinkedList
- JPA
- 정보처리산업기사
- 풀이
- BAEKJOON
- 디버깅
- 챌린지
- 해커랭크 챌린지
- 소스코드
- 정보처리산업기사 공부법
- 22 정보처리 산업기사
- 그리디
- 22 정보처리산업기사
- 강의
- queue
- 개발자
- hackerrank challenges
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |