behavior == 행위 == 기능 == method(메소드)
자바에서 소괄호 () 가 나오는 것은 오로지 딱 2개 밖에 없다. 첫번째는 생성자(constructor)에서 소괄호 ()가 사용되고,
두번째는 method(메소드)에서 소괄호 ()가 사용된다.
public class Member {
String id;
String pwd;
String name;
String email;
//회원의 정보를 출력해주는 기능을 만들기
void print_info() { // 인스턴스 메소드
//void == 리턴값이 없다.
System.out.println("===회원정보===\n" + "1.아이디: " + id + "\n" + "2.비밀번호:" +
"3.성명: " + name + "\n" + "4.이메일:" + email + "\n" + address + "\n");
// 문자열 사이의 + 는 문자열 결합을 뜻한다.
}
}
static void print_info() {
//클래스로 접근해서 바로 사용함 (별도 객체화 no)
}
public class Member_main {
System.out.println(">> lssMbr 이라는 인스턴스(객체)에 저장된 필드 값 출력");
lssMbr.print_info();
System.out.println(">> eom_mbr 이라는 인스턴스(객체)에 저장된 필드 값 출력");
eom_mbr.print_info();
}
print_info() 메소드에서 필드값을 출력한다. -> 이런 경우는 생성자로 짜는 것이 좋을 것 같다.
생성자는 인스턴스화 할때(인스턴스를 생성하자마자) 바로 호출이 된다.
<생성자 규칙>
1. 이름 == 클래스 이름(첫글자 대문자)
2. 반환 타입이 없다.
3. 매개변수가 있는 생성자가 없을 시 기본 생성자가 자동으로 생성된다(생략되어서 보이지 않을 뿐 존재함)
4. 매개변수 있는 생성자를 생성했을 시 기본 생성자를 개발자가 별도로 만들어줘야 한다.(꼭)
5.생성자는 반드시 호출되어야 한다.
6.생성자 오버로딩이 가능하다.
<생성자는 2개로 나뉘어진다.>
1. 기본 생성자: 매개변수가 없는 생성자. 생성자가 1개라도 있으면 기본 생성자가 자동 생성되나, 하나라도 있으면 자바는 생성하지 않는다.(개발자가 반드시 생성해야 함)
2. 파라미터가 있는 생성자:
!!!! 중요암기 !!!!
클래스를 생성할 때 생성자를 표기한 것이 없는 경우라면 Member(){} 기본생성자가 생략되어 있는 것이다. 그런데 파라미터(==매개변수)가 있는 생성자를 선언해 버리면 기본 생성자는 자동적으로 삭제된다. => 기본 생성자를 개발자가 만들어줘야 함. (인스턴스화해서 new할때 기본생성자 없어서 오류가 나게 되는 이유가 이것: Member member = new Member();<-이 괄호가 기본생성자이다.)
package my.day02.b.constructor;
public class Member {
// field, attribute, property, 속성
String userid;
String passwd;
String name;
String email;
int age;
int point;
Member() {
//기본 생성자
}
Member(String userid, String passwd, String name, int age, int point) {
/*
지역변수(매개변수 포함)명과 멤버변수명(instance변수,static변수 모두 가리킴)이 일치할 경우에는
지역변수가 더 우선된다.
*/
this.userid = userid;
this.passwd = passwd;
this.name = name;
this.age = age;
this.point = point;
}
// behavior, 행위, 기능, method
void info_print() {
System.out.println("===" + name + "님의 회원정보 ===\n"
+"1. 아이디: " + userid + "\n"
+"2. 비밀번호: " + passwd + "\n"
+"3. 성명: " + name + "\n"
+"4. 나이: " + age + "\n"
+"5. 포인트: " + point + "\n"
+"6. 이메일: " + email + "\n");
}
}
main클래스>>
public class Main_Member {
public static void main(String[] args) {
Member hongkd_mbr = new Member();
hongkd_mbr.userid = "hongkd";
hongkd_mbr.passwd = "qwer1234";
hongkd_mbr.name = "홍길동";
hongkd_mbr.age = 30;
hongkd_mbr.point = 100;
hongkd_mbr.info_print();
Member eomjh_mbr = new Member("eomjh", "qwer1234", "엄정화", 27, 200);
//매개변수 생성자 호출후 매개변수를 필드에 밀어넣음(초기화해줌)
eomjh_mbr.info_print();
}
}
this()를 통해 생성자 내부에서 자신의 생성자를 호출 가능하다.(이거 쓴다고 생성이 2번 되는 거 아님)
-> this(name,age,50); //생성자 코드의 첫줄에서만 사용 가능함, 리터럴 넣기도 가능함.
(*()는 2가지 사용: 메서드, 생성자 호출)
Member(String userid, String passwd, String name, int age, int point) {
this.userid = userid;
this.passwd = passwd;
this.name = name;
this.age = age;
this.point = point;
}
Member(String userid, String passwd, String name,String email,int age, int point) {
this.userid = userid;
this.passwd = passwd;
this.name = name;
this.email = email;
this.age = age;
this.point = point;
}
-> this() 생성자를 통해서 코드를 리팩토링할 수 있다.
Member(String userid, String passwd, String name, int age, int point) {
this.userid = userid;
this.passwd = passwd;
this.name = name;
this.age = age;
this.point = point;
}
Member(String userid, String passwd, String name,String email,int age, int point) {
this(userid,passwd,name,age,point);
this.email = email;
}
내가 헷갈렸던 부분!
생성자 호출은 반드시 생성자 내에서만 가능하다.
생성자로 사용되는 this() 또는 this(파라미터, 파라미터,...)는 오로지 생성자 내부에서만 호출 가능하므로 메서드 내부에서는 사용이 불가능하다.