객체가 new
연산자를 통해 Heap 메모리 영역에 할당될 때, 객체 안에서 만들어지는 필드 초기화 + 생성 시 필요한 기능 수행
생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록
⇒ 새롭게 클래스를 만드는 기능을 수행
Student student = new Student();
생성자의 선언은 메소드 선언과 유사하나 반환 값이 없음
생성자명을 클래스명과 똑같이 지정해주어야 함
[접근제한자] [예약어] class 클래스명 {
[접근제한자] 클래스명() { } // 기본 생성자
[접근제한자] 클래스명(매개변수) { (this.)필드명 = 매개변수; } // 매개변수가 있는 생성자
}
public class Academy {
private int studentNo;
private String name;
public Academy() {} // 기본 생성자
public Academy(int studentNo, String name) { //매개변수 있는 생성자
this.studentNo = studentNo;
this.name = name;
}
}
: 작성하지 않은 경우, 클래스 사용 시 컴파일러가 자동으로 기본 생성자 생성
객체 생성 시 전달받은 값으로 객체를 초기화 하기 위해 사용
매개변수 생성자 작성 시 컴파일러가 기본 생성자를 자동으로 생성해주지 않음
상속에서 사용 시 반드시 기본 생성자를 작성
오버로딩을 이용하여 작성
MVC 패턴
Model - View - Controller
간단한 이해로, 다음과 같이 생각하면 됨
- Model: 클래스 등의 모음
- View: 사용자가 보는 결과물
- Constroller: 모델의 명령을 보내는 기능적인 것, 상태 변경 등
→ Constroller, Service, DAO, DTO(= VO, Value Object) 등이 있음
: 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법
오버로딩 ≠ 오버라이딩 개념 숙지!
메소드 이름이 동일해야 함
매개변수의 자료형, 개수, 순서가 달라야 함
반환형은 같아도 되고, 달라도 됨
public User() {
// 기능
System.out.println("기본 생성자로 User 객체 생성");
// 필드 초기화
userId = "user01";
userPw = "pass01";
userName = "홍길동";
userAge = 20;
userGender = 'M';
}
// 필드 일부를 초기화 하는 목적의 매개변수 생성자
public User( String userId, String userPw ) {
this.userId = userId;
this.userPw = userPw;
// 매개 변수로 전달받은 값을 필드에 초기화(this 참조변수)
}
// 필드를 전부 초기화 하는 목적의 매개변수 생성자
public User(String userId, String userPw, String userName, int userAge, char userGender) {
this(userId, userPw); // this() 생성자
this.userName = userName;
this.userAge = userAge;
this.userGender = userGender;
}
// public User() {} // Error: 기본 생성자가 이미 작성되어 있어 중복으로 인식
public User(String userId) {} // 매개변수의 개수가 같은 생성자가 없어서 오버로딩 성립
public User(int userAge) {} // 매개변수의 개수는 같지만, 타입이 달라서 오버로딩 성립
public User(String userId, int userAge) {} // 매개변수의 개수는 같지만, 타입이 달라서 오버로딩 성립
public User(int userAge, String userId) {} // 매개변수의 개수와 타입은 같지만, 순서가 달라서 오버로딩 성립
// Error: 매개변수의 개수, 타입, 순서가 모두 같음 (변수명은 신경쓰지 않음)
// public User(int userAge, String userName) {}
/* Error: 매개변수의 개수, 타입, 순서가 모두 같음 (변수명은 신경쓰지 않음)
*
* public User(String userId, String userPw, String userName) {}
* public User(String userName, String userId, String userPW) {}
*/
public class Overloading{
// 매개변수가 없는 경우 오버로딩 성립의 조건이 안됨
// 반환 타입은 오버로딩 조건과 무관
public void test(){}
public int test(){ return 0; }
// 매개변수의 갯수와 타입이 동일해서 성립하지 않음
// 매개변수 이름은 오버로딩 조건과 무관
public void test(String str){}
public void test(String s) {}
// 매개변수의 갯수와 타입이 동일해서 성립하지 않음
// 접근 제한자는 오버로딩 조건과 무관
public void test(int i) {}
private void test(int i){}
}
모든 인스턴스의 메소드에 숨겨진 채 존재하는 레퍼런스로, 할당된 객체를 가리킴
→ 참조형
함수 실행 시 전달되는 객체의 주소를 자동으로 받음
public class Academy{
private String name;
public Academy() {}
public Academy(String name) {
this.name = name;
}
}
this
객체를 이용하여 대입되는 변수가 필드라는 것을 구분해줌생성자, 같은 클래스의 다른 생성자를 호출할 때 사용, 반드시 첫 번째 줄에 선언해야 함
public class Academy{
private int age;
private String name;
public Academy() { this(20, “김철수”); }
public Academy(int age, String name) {
this.age = age;
this.name = name;
}
}