✍Constructor (생성자)
객체 생성 + 필드 초기화 + 필요 기능 수행
- 객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때 객체 안에서 만들어지는
생성된 객체의 필드값을 초기화하고 지정된 기능을 수행 하는 것이 목적.
필드 초기화 + 생성 시 필요한 기능 수행
- 생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록
= 일종의 기능으로 생성된 객체의 필드에 값을 집어넣는다.
Korean k1 = new Korean();➡ Korean 클래스를 보고 새로운 객체를 만드는 기능 수행한다.
➡ () == 기능 호출
참고 파일: user 클래스, ConstructorService
1. 생성자 규칙
생성자의 선언은 메소드 선언과 유사하나 반환 값이 없으며 생성자명을 클래스명과 똑같이 지정해주어야 함
public void example1() { } public int getAge() { return 10; }
➡ void : 리턴하는 값의 자료형이므로 쓰지 않는다.
➡ int : 생성자는 반환값이 없기 때문에 int를 제외
==> public Korea() { } 이런식으로 작성된다.
🚩 생성자 작성 규칙
1) 생성자의 이름은 반드시 클래스명과 같아야한다.
2) 생성자는 반환형이 존재하지 않는다.
3) 생성자가 하나라도 존재하는 경우
컴파일러에 의해서 기본 생성자가 자동 추가되지 않음. == (하나도 없어야 자동추가해준다.)
➡ 매개 변수 있는 생성자 작성 시 기본 생성자를 반드시 명시해 주는 것이 좋다.
참고)반환형 : (return) 반환하는 값의 자료형
1) 생성자 표현식
[접근제한자] [예약어] class 클래스명 {
[접근제한자] 클래스명() {}
[접근제한자] 클래스명(매개변수) { (this.)필드명 = 매개변수; }
}
public Academy() {} ➡ 기본 생성자public class Academy { private int studentNo; private String name; public Academy() {} // 기본 생성자 public Academy(int studentNo, String name) { //매개변수 있는 생성자 this.studentNo = studentNo; this.name = name; } }
public Academy(int studentNo, String name) { ➡ 매개변수 있는 생성자 (괄호 안에 있는 것들은 매개 변수)
new Academy(); ➡ 기본 생성자를 이용해 객체 만들기
2) 기본 생성자
생성자를 작성하지 않은 경우, 클래스 사용 시 컴파일러가 자동으로 기본 생성자 생성
user에서 내용이 없는경우에도 constructorService 클래스에서 컴파일러가 자동으로 기본 생성자 생성
user1.setUserId에서 초기화 (private이라서 간접접근하기 위해 set으로 접근)
전달 받은 것 == 매개변수
this.(현재객체의 필드 userId에 저장한다.)
예제
ConstructorService클래스
user2.setUserId("user02")
User클래스
public void setUserId(String userId) {
this.userId = userId;
}
user2.setUserId("user02")에 대입한 값은
user클래스 String userId에 대입되어 this.userId로 ConstructorService클래스에 반환.
3) 매개변수 생성자
== 매개변수가 있는 생성자
- 객체 생성 시 매개변수로 전달 받은 값을 이용해서 객체의 필드를 초기화 하는 용도의 생성자
-> 객체가 생성되자마자 필드에 값이 들어가 있다
- 매개변수 생성자 작성 시 컴파일러가 기본 생성자를 자동으로 생성해주지 않음
- 상속에서 사용 시 반드시 기본 생성자를 작성
- 오버로딩을 이용하여 작성
매개 변수 한개로 필드 1개 초기화
매개 변수 2개 == 필드 2개 초기화
==> 필요한만큼 매개변수 수를 늘린다.
그러면 게터는 없어도 되나? -> getter는 값을 얻어갈 수 있게 하는 기능이기 때문에 세팅하지 않는다.
예제
User 클래스
public String getUserId() { // 현재 객체의 필드에 있는 userId를 반환 return userId; } public void setUserId(String userId) { // 매개변수로 전달 받은 userId를 현재 객체의 필드에 있는 userId에 저장 this.userId = userId; } //userPassword public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } ........ }
➡ 이런식으로 게터 / 세터의 반복을 해야한다 ➡ 코드가 길어진다.
public User(String userId, String userPassword, String userName, int userAge, char userGender) { // 매개 변수 5개 == 전달 받는 값이 5개 this.userId = userId; this.userPassword = userPassword; this.userName = userName; this.userAge = userAge; this.userId = userId; this.userGender = userGender; }
➡ 매개 변수를 이용해 setter 들을 다 합쳐 준다.
➡ 매개 변수 있는 생성자를 만들어 setter 여러 개를 한번에 수행하는 모양으로 5개 세터를 한번에 합친다).
service 클래스//user2 객체 새롭게 생성 + 필드 초기화 // User user2 = new User(); //기본생성자로 user2만들기 // // user2.setUserId("user02"); // user2.setUserPassword("pass02"); // user2.setUserName("봉봉봉"); // user2.setUserAge(3); // user2.setUserGender('남'); //위에 있는 user2의 6줄과 같은 의미다. User user2 = new User("user02", "pass02", "봉봉봉", 3, '여'); // 매개 변수 있는 사용자 사용 이유 // -> 코드 길이의 감소
public void example1() { User user2 = new User("user02", "pass02", "봉봉봉", 3, '여'); System.out.println(user2.getUserId()); System.out.println(user2.getUserPassword()); System.out.println(user2.getUserName()); System.out.println(user2.getUserAge()); System.out.println(user2.getUserGender()); }
생성 후 service 클래스에서 자동완성 된 것을 볼 수 있다.
2. 오버로딩
Over : 넘치다 + Loading : 적재하다.
➡ Over Loading : 과적
- 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법
- 하나의 메소드 이름에는 하나의 기능이 있어야 되지만
하나의 메소드 이름에 여러 기능이 적재되는 기술
ex) user 에서 기본 생성자와 매개변수 있는 생성자 두개가 있는것은 오버로딩이다.
1) 오버로딩 조건
같은 메소드 이름 (user이름이 같다)
다른 매개변수의 개수 또는 다른 매개변수 타입, 순서 // 매개변수있는 생성자는 매개변수가 5개이다.
user 클래스
// 생성자 오버로딩 -> 1) 매개 변수의 개수가 다르면 성립한다.
public User(String userId, String userPassword) { this.userId = userId; this.userPassword = userPassword; }
// 생성자 오버로딩 -> 2) 매개 변수의 개수가 같으나 타입이 다르면 성립
public User(String userId, int userAge) { this.userId = userId; this.userAge = userAge; }
// 생성자 오버로딩 -> 3) 매개 변수의 개수, 타입은 같으나 순서가 다르면 성립
public User(int userAge, String userId) { this.userId = userId; this.userAge = userAge; }
2) 오버로딩 시 주의사항
변수명이 달라도 타입이 같으면 오버로딩이 성립 안된다.
변수명은 상관없고 3)과 매개변수의 개수가 똑같아서 성립되지 않는다.
// 오버로딩 시 주의사항 ->
public User(int userAge, String userName) {
this.userName = userName;
this.userAge = userAge;
}
service클래스
예제
public void example2() {
// 오버로딩
// 순서와 타입에 따라 실행되는 순서가 달라진ㅇ다.
// 매개 변수가 여러개일 경우, 매개 변수 순서에 맞게 알맞은 값을 작성해야한다.
User user1 = new User(20, "user01"); // userAge, userId
User user2 = new User("user02", 25); // userId, userAge
User user3 = new User("user03", "pass03"); // userId, userPassword
}
3. this () 생성자가 다른 생성자 호출할 떄 쓰는것 이유: 코드길이 줄이려고
setter, 매개변수 있는 생성자에서 사용== 현재 객체
- 코드 길이 감소를 위해서 쓰는데 코드 작성시 중복 코드가 없고, 짧고, 효율적이다.
모든 인스턴스의 메소드에 숨겨진 채 존재(this)하는 레퍼런스로, 할당된 객체를 가리킴 함수 실행 시 전달되는 객체의 주소를 자동으로 받는다.
: this 참조변수라고 부르는데 그 이유는, 객체의 시작 주소를 저장하고 있기 때문이다.
: 할당된 객체를 가리킨다 == 객체의 시작주소를 저장하고 있다.
+ 그림참고
1) 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용, 반드시 첫 번째 줄에 선언해야 함
다른 생성자를 호출 = 오버로딩
public User(String userId, String userPassword, String userName, int userAge, char userGender) {
// this.userId = userId;
// this.userPassword = userPassword;
this(userId, userPassword);//this 생성자
//밑에 있는 생성자 오버로딩 1)과 같다.
// -> 같은 클래스 내부에 작성된 다른 생성자를 호출할 때 사용
// -> 중복 제거를 통한 코드 길이 감소 효과를 위해 사용
// (주의 사항) 반드시 생성자 첫 번째 줄에 작성해야한다.
this.userName = userName;
this.userAge = userAge;
this.userGender = userGender;
}
// 생성자 오버로딩 -> 1) 매개 변수의 개수가 다르면 오버로딩 성립한다.
public User(String userId, String userPassword) {
this.userId = userId;
this.userPassword = userPassword; }
'Backend > Java' 카테고리의 다른 글
[Java] OOP 4_Method(메소드), 객체 배열 (0) | 2021.09.08 |
---|---|
[JAVA] 분기문_break, continue (0) | 2021.09.08 |
[Java] OOP 2 _Class, Field (접근제한자, 예약어, 멤버·클래스 변수) (0) | 2021.09.07 |
[Java] OOP 1_Object Oriented Programming(객체지향) (1) | 2021.09.06 |
[Java] Array(배열)_3 (배열 복사) (0) | 2021.09.03 |