티스토리 뷰
📍 기본 생성자
– 클래스를 사용하여 인스턴스를 생성할 때 호출되는 메서드의 형태.
→ new 키워드 뒤에 생성자 호출 코드가 기술됨. ex ) Animal ani = new Animal();
– 인스턴스 변수를 초기화하는 용도 또는 인스턴스 생성 시 초기에 수행할 작업을 기술하는 용도.
– 접근제한자가 클래스와 같으며, 매개변수가 없고, 주괄호 블록{ }내에 수행할 코드가 없음.
– 메서드와 형태가 유사하나 차이점 두 가지 존재함.
1 ) 선언부에 리턴타입이 없음.
→ 리턴타입이 없다기 보다 정확하게는 리턴타입 자체를 기술하지 않음, 아예 존재하지 않음.)
2 ) 생성자 이름이 클래스 이름과 동일.
– 개발자가 클래스 정의 시 생성자를 하나도 정의하지 않으면, 컴파일러에 의해 자동으로 기본(Default) 생성자가 생성됨.
– 생성자를 별도로 호출할 수 없으며, 반드시 new 키워드 뒤에만 지정 가능.
▸ 생성자 정의
[접근제한자] 클래스명 ( [매개변수 선언..] ) {
생성자 호출 시점(인스턴스 생성 시점)에 수행할 작업 기술
→ 인스턴스 변수 초기화 등
}
EX1 )
• 기본 생성자 (Default Constructor)
class Person{
// 멤버변수
String name;
int age;
// 기본 생성자
// public Person() {}
}
– main클래스 밑에 Person 클래스를 생성함.
– 클래스 정의 시 개발자가 별도의 생성자를 하나도 정의하지 않을 경우,
자바 컴파일러에 의해 기본 생성자가 자동으로 생성됨.
→ 기본 생성자는 접근제한자가 클래스와 같고, 리턴타입이 없으며, 이름은 클래스이름과 같음.
또한, 매개변수가 없으며 주괄호 블록{ }내에 수행할 코드가 없음.
• 기본 생성자에 수행할 작업 추가
class Person{
// 멤버변수
String name;
int age;
public Person() {
System.out.println("생성자 person() 호출");
name = "홍길동";
age = 20;
}
}
– 생성자의 기본 역할은, 주로 인스턴스 변수 초기화.
→ 객체(인스턴스) 생성 시 기본적으로 가져야하는 값을 설정하는 역할.
→ 기본 생성자 내에서 멤버변수에 특정 값을 지정하여, 객체 생성 시 해당 데이터를 가진 채로 사용 가능하도록 함.
즉, 객체가 기본적으로 가져야할 공통적인 값을 설정.
– 인스턴스 변수 name에 "홍길동", age에 20의 데이터를 저장해둠.
• main 메서드에서 실행
// 인스턴스 생성
Person p = new Person();
System.out.println("이름 : " + p.name);
System.out.println("나이 : " + p.age);
– new 키워드에 의해 인스턴스가 생성될 때, Person() 형태의 생성자를 자동으로 호출하게 됨.
– 생성자를 정의할 때, 변수 name과 age에 미리 값을 세팅해두었으므로 해당 값이 출력됨.
– 주의! p.Person(); 메서드 형태니까 생성자를 별도로 호출할 수 있느냐? 할 수 없음!
✓ 실행 결과
이름 : 홍길동
나이 : 20
// 새로운 인스턴스 생성
Person p2 = new Person();
p2.name = "이순신";
p2.age = 44;
System.out.println("이름 : " + p2.name);
System.out.println("나이 : " + p2.age);
– 새로운 인스턴스를 만들어 새로운 값을 넣어줬으므로 새로운 값이 출력됨.
✓ 실행 결과
이름 : 이순신
나이 : 44
EX2 ) 은행계좌(Account) 만들기
class Account {
// 멤버변수
String accountNo;
String ownerName;
int balance;
// 기본 생성자 생성
public Account(){
// 멤버변수에 데이터 저장
accountNo = "111-1111-111";
ownerName = "홍길동";
balance = 0;
// 메서드 호출
showAccountInfo();
}
// 메서드 정의
public void showAccountInfo() {
System.out.println("계좌번호 : " + accountNo);
System.out.println("예금주명 : " + ownerName);
System.out.println("현재잔고 : " + balance);
}
}
– main클래스 밑에 Account 클래스 생성함.
– 기본 생성자에 인스턴스 생성 시 기본값으로 가져야 할 데이터를 멤버변수에 저장함.
– 인스턴스 생성 시 초기화 후 바로 계좌정보를 출력하고 싶으므로 해당 메서드를 호출함.
→ 해당 메서드는 클래스의 멤버이므로 바로 밑에 정의해둠.
Account acc = new Account();
– 기본 생성자안에 인스턴스 생성 시 기본값으로 가져야 할 멤버변수 데이터와 메서드 호출을 담아놨으므로
인스턴스만 생성해서 프로그램을 실행해도 멤버변수 데이터와 메서드가 작동함.
✓ 실행 결과
계좌번호 : 111-1111-111
예금주명 : 홍길동
현재잔고 : 0
📍 파라미터 생성자
– 생성자 호출 시점에서 전달해야 할 데이터가 있을 경우, 파라미터(매개변수)를 선언할 수 있음. (= 메서드와 동일)
– 전달받은 데이터는 인스턴스 변수를 초기화하는 용도로 사용.
– 즉, 객체마다 다른 데이터를 가진 채로 인스턴스를 생성하기 위한 용도.
– 파라미터 생성자 자동 생성 단축키 : Alt + Shift + s → o
→ 단, 멤버변수가 하나도 없을 경우 자동 생성창 실행되지 않음.
▸ 파라미터 생성자 정의
[접근제한자] 클래스명 (매개변수 선언...) {
인스턴스변수명 = 데이터;
}
– 생성자 호출 시점에 파라미터에 데이터를 전달하여, 인스턴스 내의 인스턴스 변수를 초기화 함.
EX )
• 클래스 생성하기
class Person{
String nation;
String name;
int age;
// 파라미터 생성자 정의
public Person(String newName, int newAge) {
// 전달받은 파라미터 값을 인스턴스 변수에 저장
name = newName;
age = newAge;
nation = "대한민국";
}
// 메서드 정의
public void showPerosnInfo() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("국가 : " + nation);
}
}
– main 클래스 밑에 Person 클래스 생성 후, 멤버변수 정의 & 생성자 정의 & 메서드 정의함.
– 국가명(nation)은 무조건 "대한민국"으로 고정하고 싶으므로,
별도로 파라미터값을 전달받지 않고 생성자 내에서 "대한민국"으로 초기화함.
• 인스턴스 생성하기
Person p = new Person("홍길동", 20);
p.showPerosnInfo();
Person p2 = new Person("이순신", 44);
p2.showPerosnInfo();
– 인스턴스 생성과 동시에 생성자의 파라미터로 데이터를 전달 받고, 메서드의 호출로 인해 해당 데이터를 출력함.
– 파라미터 생성자를 정의할 때, name과 age만 전달받고 nation은 "대한민국"으로 미리 초기화해둠.
✓ 실행 결과
이름 : 홍길동
나이 : 20
국가 : 대한민국
-------------
이름 : 이순신
나이 : 44
국가 : 대한민국
⚠️주의⚠️
Person p3 = new Person();
– 에러 발생! The constructor Person() is undefined
– 파라미터 생성자를 하나라도 정의할 경우, 컴파일러에 의해 기본 생성자가 자동으로 생성되지 않음.
→ 기본 생성자를 호출할 수 없게 됨.
– 이미 여러 기능으로 정의한 생성자는 꼭 정의된 대로 사용해야하는 '강제성'이 있음.
그래서 나중에 다른 기능으로 변수나 메서드를 추가하고 싶을 때는 기본 생성자가 필요함.
→ 해결책 : 기본 생성자를 따로 정의하기
'JAVA' 카테고리의 다른 글
가변 인자 (Java Varargs) (0) | 2023.03.12 |
---|---|
오버로딩 (메서드 오버로딩 / 생성자 오버로딩 / 문제점 & 해결책) (0) | 2023.03.12 |
배열 (특징 / 선언 & 생성 & 초기화 & 접근 / 연산 누적 / 2차원 배열) (0) | 2023.03.04 |
접근 제한자(public & private) / getter & setter 메서드 (0) | 2023.02.28 |
메서드 (method) — 형태에 따른 정의 & 호출 (0) | 2023.02.22 |
- Total
- Today
- Yesterday
- Object
- 로컬저장소
- 다형성
- 출력문
- github
- jsp
- 매개변수
- DB
- 주석문
- 문자형
- null
- 원격저장소
- 제어문
- model2
- 논리형
- Java
- 숫자형
- 단일행함수
- javascript
- 인자
- JSTL
- 데이터타입
- 오버라이딩
- 업캐스팅
- Dao
- 내장객체
- gitbash
- mysql
- Method
- Git
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |