[생성자]
package construct;
public class MemberInit {
String name;
int age;
int grade;
}
1) 생성자가 없을 때
package construct;
public class MethodInitMain1 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
member1.name = "user1";
member1.age = 15;
member1.grade = 90;
MemberInit member2 = new MemberInit();
member2.name = "user2";
member2.age = 16;
member2.grade = 80;
MemberInit[] members = {member1, member2};
for (MemberInit s: members){
System.out.println("이름: "+s.name + "나이: "+s.age + "성적: "+s.grade);
}
}
}
2) initMember 생성자가 있을 때
package construct;
public class MethodInitMain1 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
initMember(member1, "user1", 15, 90);
MemberInit member2 = new MemberInit();
initMember(member2, "user2", 16, 80);
MemberInit[] members = {member1, member2};
for (MemberInit s: members){
System.out.println("이름: "+s.name + "나이: "+s.age + "성적: "+s.grade);
}
}
static void initMember(MemberInit member, String name, int age, int grade){
member.name = name;
member.age = age;
member.grade = grade;
}
}
1. this
package construct;
public class MemberInit {
//멤버변수
String name; // == this.name
int age; // == this.age
int grade; // == this.grade
void initMember(String name, int age, int grade){ // 매개변수
this.name = name;
this.age = age;
this.grade = grade;
}
}
this를 사용해 자기자신의 인스턴스를 가르킨다.
Q. 멤버 변수와 메서드의 매개변수의 이름이 같으면 둘을 어떻게 구분해야할까?
A. 그냥 name은 함수의 initMember 매개변수를 의미하는것이기때문에 this.name에 name을 대입해야한다,
package construct;
public class MethodInitMain2{
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
member1.initMember("user1", 15, 90);
MemberInit member2 = new MemberInit();
member2.initMember("user2", 16, 80);
MemberInit[] members = {member1, member2};
for (MemberInit s: members){
System.out.println("이름: "+s.name + "나이: "+s.age + "성적: "+s.grade);
}
}
}
2. 생성자
[코드]
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age , int grade){
System.out.println("생성자 호출 name"+name+",age = "+age+",grade = "+grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
다음 부분이 바로 생성자이다.
MemberConstruct(String name, int age , int grade){
System.out.println("생성자 호출 name"+name+",age = "+age+",grade = "+grade);
this.name = name;
this.age = age;
this.grade = grade;
}
생성자 VS 메서드
- 생성자 이름 == 클래스 이름
- 생성자는 반환타입이 없다
- 나머지는 메서드와 동일
package construct;
public class ConstructMain1 {
public static void main(String[] args) {
//인스턴스 생성과 동시에 생성자 호출
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
MemberConstruct member2 = new MemberConstruct("user2", 16, 80);
MemberConstruct[] members = {member1, member2};
for (MemberConstruct s: members){
System.out.println("이름: "+s.name + "나이: "+s.age + "성적: "+s.grade);
}
}
}
인스턴스를 생성하고 즉시 해당 생성자를 호출한다.
//생성자 등장 전
MemberInit member = new MemberInit();
member.initMember("user1" , 15, 90);
//생성자 등장 후
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
3. 기본 생성자
기본생성자란?
매개변수가 없는 생성자
클래스에 생성자가 하나도 없으면 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다,
[코드]
해당 코드에서 MemberInit() 생성자를 자동으로 생성한다.
package construct;
public class MemberInit {
String name;
int age;
int grade;
MemberInit(){ //생성자 필요
}
void initMember(String name, int age, int grade){
this.name = name; //this를 사용해 자기자신의 인스턴스를 가르킴
this.age = age;
this.grade = grade;
}
}
package construct;
public class MethodInitMain1 {
public static void main(String[] args) {
MemberInit member1 = new MemberInit();
initMember(member1, "user1", 15, 90);
System.out.println("이름: "+member1.name + "나이: "+member1.age + "성적: "+member1.grade);
}
static void initMember(MemberInit member, String name, int age, int grade){
member.name = name;
member.age = age;
member.grade = grade;
}
}
따라서 위 코드에서 다음처럼 생성자를 호출할 수 있다!
MemberInit member1 = new MemberInit();
4. 생성자 오버로딩
[코드]
같은 이름의 생성자 생성
package construct;
public class MemberConstruct {
String name;
int age;
int grade;
//생성자1
MemberConstruct(String name, int age){
this.name = name;
this.age = age;
this.grade = 50;
}
//생성자2
MemberConstruct(String name, int age , int grade){
System.out.println("생성자 호출 name"+name+",age = "+age+",grade = "+grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
package construct;
public class ConstructMain2 {
public static void main(String[] args) {
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
MemberConstruct member2 = new MemberConstruct("user2", 16);
MemberConstruct[] members = {member1, member2};
for (MemberConstruct s: members){
System.out.println("이름: "+s.name + ",나이: "+s.age + ",성적: "+s.grade);
}
}
}
→ 출력:
생성자 오버로딩을 통해 원하는 생성자를 호출한다!
[코드2]
생성자 코드에서 중복제거
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){
System.out.println("생성자 호출 name"+name+",age = "+age+",grade = "+grade);
this.name = name;
this.age = age;
this.grade = grade;
}
}
첫번째 생성자 내부에서 두번째 생성자를 호출하는 코드
+ this() 규칙!
생성자 코드의 첫줄에서만 사용할수있다!
MemberConstruct(String name, int age) {
System.out.println("go");
this(name, age, 50);
}
다음과 같은 코드는 사용 불가!
'[김영한 자바 강좌] 정리 > 기본' 카테고리의 다른 글
[김영한의 실전 자바 (기본편)] 섹션5 - 패키지 (0) | 2024.04.30 |
---|---|
[김영한의 실전 자바 (기본편)] 섹션3 - 객체지향 프로그래밍 (0) | 2024.04.20 |