개발새발
생성자 (Construct) 본문
this
initMember(String name...) 의 코드를 보면 메서드의 매개변수에 정의한 String name 과 Member 의 멤버 변수의 이름이 String name 으로 둘다 똑같다.
나머지 변수 이름도 name , age , grade 로 모두 같다
- 멤버 변수보다 매개변수가 코드 블럭의 더 안쪽에 있기 때문에 매개변수가 우선순위를 가진다.
- 따라서initMember(String name,...) 메서드 안에서 name 이라고 적으면 매개변수에 접근하게 된다.
- 멤버 변수에 접근하려면 앞에 this. 이라고 해주면 된다. 여기서 this 는 인스턴스 자신의 참조값을 가리킨다.
this.name = name; //1. 오른쪽의 name은 매개변수에 접근
this.name = "user"; //2. name 매개변수의 값 사용
x001.name = "user"; //3. this.은 인스턴스 자신의 참조값을 뜻함, 따라서 인스턴스의 멤버 변수에 접근
정리
매개변수의 이름과 맴버 변수의 이름이 같은 경우 this 를 사용해서 둘을 명확하게 구분해야 한다.
this 는 인스턴스 자신을 가리킨다.
this의 생략
- this 는 생략할 수 있다. 이 경우 변수를 찾을 때 가까운 지역변수(매개변수도 지역변수다)를 먼저 찾고 없으면 그 다음으로 멤버 변수를 찾는다.
- 멤버 변수도 없으면 오류가 발생한다.
package construct;
public class MemberThis {
String nameField;
void initMember(String nameParameter) {
nameField = nameParameter;
}
}
예를 들어서
- nameField 는 앞에 this 가 없어도 멤버 변수에 접근한다.
- nameField 는 먼저 지역변수(매개변수)에서 같은 이름이 있는지 찾는다. 이 경우 없으므로 맴버 변수에서 찾는다.
- nameParameter 는 먼저 지역변수(매개변수)에서 같은 이름이 있는지 찾는다. 이 경우 매개변수가 있으므로 매개변수를 사용한다.
생성자 - 필요한 이유
- 객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자(Constructor)를 이용하면 된다.
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
package construct;
public class MethodInitMain {
public static void main(String[] args) {
MemberConstruct member1 = new MemberConstruct ("user1", 15, 90);
}
}
- 생성자의 이름은 클래스 이름과 같아야 한다. 따라서 첫 글자도 대문자로 시작한다.
- 생성자는 반환 타입이 없다. 비워두어야 한다.
생성자 호출
- 생성자는 인스턴스를 생성하고 나서 즉시 호출된다.
- 생성자 이름과 매개변수에 맞추어 인수를 전달하면 된다.
new 생성자이름(생성자에 맞는 인수 목록)
new 클래스이름(생성자에 맞는 인수 목록)
new MemberConstruct("user1", 15, 90)
장점
- 중복 호출 제거 : 생성자 덕분에 객체를 생성하면서 동시에 생성 직후에 필요한 작업을 한번에 처리할 수 있게 되었다.
//생성자 등장 전
MemberInit member = new MemberInit();
member.initMember("user1", 15, 90);
//생성자 등장 후
MemberConstruct member = new MemberConstruct("user1", 15, 90);
- 제약 - 생성자 호출 필수 : 객체를 생성할 때 직접 정의한 생성자가 있다면 직접 정의한 생성자를 반드시 호출해야 한다
MemberConstruct(String name, int age, int grade) {...}
다음과 같이 직접 정의한 생성자를 호출하지 않으면 컴파일 오류가 발생
MemberConstruct member3 = new MemberConstruct(); //컴파일 오류 발생
member3.name = "user1";
기본 생성자
- 매개변수가 없는 생성자를 기본 생성자라 한다.
- 클래스에 생성자가 하나도 없으면 자바 컴파일러는 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다.
- 생성자가 하나라도 있으면 자바는 기본 생성자를 만들지 않는다.
package construct;
public class MemberInit {
String name;
int age;
int grade;
public MemberInit () {
}
}
생성자 - 오버로딩과 this()
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
//추가
MemberConstruct(String name, int age) {
this.name = name;
this.age = age;
this.grade = 50;
}
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
MemberConstruct(String name, int age)
MemberConstruct(String name, int age, int grade)
이렇게 하면 grade가 없을 경우 default로 50으로 들어간 인스턴스 생성
MemberConstruct - this() 사용
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
//추가
MemberConstruct(String name, int age) {
this(name, age, 50)
}
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
이 코드는 첫번째 생성자 내부에서 두번째 생성자를 호출한다.
java MemberConstruct(String name, int age) -> MemberConstruct(String name, int age, int grade)
- this() 를 사용하면 생성자 내부에서 다른 생성자를 호출할 수 있다.
- 이 부분을 잘 활용하면 지금과 같이 중복을 제거할 수 있다. 물론 실행 결과는 기존과 같다.
this 규칙
- this() 는 생성자 코드의 첫줄에만 작성할 수 있다.
'자바기초 다시보기' 카테고리의 다른 글
자바 메모리 구조 (0) | 2023.12.21 |
---|---|
접근 제어 (0) | 2023.12.21 |
객체 지향 프로그래밍 vs 절차 지향 프로그래밍 (1) | 2023.12.20 |
Java Null (0) | 2023.12.19 |
클래스, 객체, 인스턴스 정리 (1) | 2023.12.19 |
Comments