Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Tags
more
Archives
Today
Total
관리 메뉴

개발새발

생성자 (Construct) 본문

자바기초 다시보기

생성자 (Construct)

개발하는후추 2023. 12. 20. 15:51

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