생성자(constructor)
- 클래스를 사용하여 인스턴스를 생성할 때 호출되는 메서드 형태 => new 키워드 뒤에 생성자 호출 코드가 기술됨
- 주로 인스턴스 변수를 초기화하는 용도 또는 인스턴스 생성 시 초기에 수행할 작업을 기술하는 용도
- 메서드 형태와 유사하나 차이점 두 가지 존재
- 선언부에 리턴타입이 없음 (리턴값이 없는 것이 아니라 리턴타입 자체를 기술하지 않음)
- 생성자 이름 = 클래스 이름
- 개발자가 클래스 정의 시 생성자를 하나도 정의하지 않으면 컴파일러에 의해 자동으로 기본(Default) 생성자가 생성됨
- 메서드와 유사한 형태이므로 파라미터가 있을수도 있고, 없을수도 있다.
- 생성자를 별도로 호출할 수 없으며, 반드시 new 키워드 뒤에만 지정할 수 있음
생성자 정의 기본 문법
[접근제한자] 클래스명([매개변수 선언..]) {
// 생성자 호출 시점(인스턴스 생성 시점)에 수행할 작업을 기술
// => 인스턴스 변수 초기화 등
}
인스턴스 생성 기본 문법
클래스명 참조변수명 = new 생성자명([데이터..]);
System.out.println("Person 인스턴스 생성 전!");
Person p = new Person(); // Person 인스턴스 생성
// => new 키워드에 의해 인스턴스가 생성될 때
// Person() 형태의 생성자를 자동으로 호출하게 된다!
// p.Person(); // 주의! 생성가를 별도 호출 할 수 없음!
// => The method Person() is undefined for the type Person
System.out.println("Person 인스턴스 생성 후!");
p.name = "땅콩이";
p.age = 20;
System.out.println("이름 : "+ p.name);
System.out.println("나이 : "+ p.age);
}
} // Ex 클래스 끝
class Person{
String name;
int age;
// 클래스 정의 시 개발자가 별도의 생성자를 정의하지 않으면
// 자바 컴파일러 의해 기본 생성자가 자동으로 생성됨
// => 기본 생성자는 접근제한자가 클래스와 같고,
// 리턴타입이 없으며, 이름이 클래스 이름과 같다.
// 또한, 매개변수가 없으며 중괄호 블록 { } 내에 수행할 코드가 없다.
// public Person() { // 기본 생성자(Default constructor)
public Person() {
// 기본 생성자 내에서 생성자 호출 확인을 위한 출력문 작성
System.out.println("생성자 Person() 호출됨!");
}
}
Person p2 = new Person();
p2.name = "따옹이";
p2.age = 22;
System.out.println("이름 : "+ p2.name);
System.out.println("나이 : "+ p2.age);
}
} // Ex 클래스 끝
public Person() {
System.out.println("생성자 Person() 호출됨!");
// 인스턴스 변수(멤버변수) name에 "땅콩이" 저장, age에 20 저장
name = "땅콩이";
age = 20; // 생성자 초기화할때, 멤버변수 미리 정함
}
}
package constructor;
public class Ex {
public static void main(String[] args) {
/*
* 생성자(constructor)
* - 클래스를 사용하여 인스턴스를 생성할 때 호출되는 메서드 형태
* => new 키워드 뒤에 생성자 호출 코드가 기술됨
* - 주로 인스턴스 변수를 초기화하는 용도 또는
* 인스턴스ㅡ 생성 시 초기에 수행할 작업을 기술하는 용도
* - 메서드 형태와 유사하나 차이점 두 가지 존재
* 1) 선언부에 리턴타입이 없음
* (리턴값이 없는 것이 아니라 리턴타입 자체를 기술하지 않음)
* 2) 생성자 이름 = 클래스 이름
* - 개발자가 클래스 정의 시 생성자를 하나도 정의하지 않으면
* 컴파일러에 의해 자동으로 기본(Default) 생성자가 생성됨
* - 메서드와 유사한 형태이므로 파라미터가 있을수도 있고, 없을수도 있다.
* - 생성자를 별도로 호출할 수 없으며, 반드시 new 키워드 뒤에만 지정할 수 있음
*
* < 생성자 정의 기본 문법 >
* [접근제한자] 클래스명([매개변수 선언..]) {
* // 생성자 호출 시점(인스턴스 생성 시점)에 수행할 작업을 기술
* // => 인스턴스 변수 초기화 등
* }
*
* < 인스턴스 생성 기본 문법 >
* 클래스명 참조변수명 = new 생성자명([데이터..]);
*/
System.out.println("Person 인스턴스 생성 전!");
Person p = new Person(); // Person 인스턴스 생성
// => new 키워드에 의해 인스턴스가 생성될 때
// Person() 형태의 생성자를 자동으로 호출하게 된다!
// p.Person(); // 주의! 생성가를 별도 호출 할 수 없음!
// => The method Person() is undefined for the type Person
System.out.println("Person 인스턴스 생성 후!");
p.name = "땅콩이";
p.age = 20;
System.out.println("이름 : "+ p.name);
System.out.println("나이 : "+ p.age);
System.out.println("----------");
Person p2 = new Person();
p2.name = "따옹이";
p2.age = 22;
System.out.println("이름 : "+ p2.name);
System.out.println("나이 : "+ p2.age);
}
} // Ex 클래스 끝
class Person{
String name;
int age;
// 클래스 정의 시 개발자가 별도의 생성자를 정의하지 않으면
// 자바 컴파일러 의해 기본 생성자가 자동으로 생성됨
// => 기본 생성자는 접근제한자가 클래스와 같고,
// 리턴타입이 없으며, 이름이 클래스 이름과 같다.
// 또한, 매개변수가 없으며 중괄호 블록 { } 내에 수행할 코드가 없다.
// public Person() { // 기본 생성자(Default constructor)
// public Person() {
// // 기본 생성자 내에서 생성자 호출 확인을 위한 출력문 작성
// System.out.println("생성자 Person() 호출됨!");
public Person() {
System.out.println("생성자 Person() 호출됨!");
// 인스턴스 변수(멤버변수) name에 "땅콩이" 저장, age에 20 저장
name = "땅콩이";
age = 20; // 생성자 초기화할때, 멤버변수 미리 정함
}
}
은행좌 클래스 만들기
package constructor;
public class Test {
public static void main(String[] args) {
// Account 인스턴스 생성
Account acc = new Account();
// System.out.println("계좌번호 : " + acc.accountNo);
// System.out.println("예금주명 : " + acc.ownerName);
// System.out.println("현재잔고 : " + acc.balance);
acc.showAccountInfo();
}
}
/*
* Account 클래스
* - accountNo, ownerName, balance
* - showAccountInfo() 메서드
* - 인스턴스 생성 시
* "Account() 생성자 호출됨!" 출력
* accountNo 에 "111-1111-111", ownerName 에 "홍길동", balance 에 10000
* 초기값으로 설정
*/
class Account {
// 멤버변수 선언
String accountNo;
String ownerName;
int balance;
// public Account() {} // 기본 생성자
// 생성자 정의
public Account() {
System.out.println("Account() 생성자 호출됨!");
// 인스턴스 생성 시 기본값으로 가져야할 데이터를 멤버변수 저장
accountNo = "111-1111-111";
ownerName = "홍길동";
balance = 10000;
}
// 메서드 정의
// 계좌 정보를 출력하는 showAccountInfo() 메서드 정의
public void showAccountInfo() {
System.out.println("계좌번호 : " + accountNo);
System.out.println("예금주명 : " + ownerName);
System.out.println("현재잔고 : " + balance);
}
}
package constructor;
public class Ex2 {
public static void main(String[] args) {
/*
* 파라미터 생성자 (소괄호 안에 데이터값을 줌)
* - 생성자 호출 시점에서 전달해야할 데이터가 있을 경우
* 생성자 파라미터(매개변수)를 선언할 수 있음(= 메서드와 동일)
* - 전달받은 데이터는 인스턴스 변수를 초기화하는 용도로 사용
* - 즉, 객체마다 다른 데이터를 가진 채로 인스턴스를 생성하기 위해 사용
*
* < 파라미터 생성자 정의 기본 문법 >
* [접근제한자] 클래스명(매개변수 선언..) {
* // 생성자 호출 시점에 파라미터를 데이터에 전달하여
* // 인스턴스 내의 인스턴스 변수 (멤버변수)를 초기화함
* 인스턴스변수명(멤버변수명) = 매게변수명(데이터)
* }
*
*/
// Person2 인스턴스(p) 생성
Person2 p = new Person2("땅콩이",20);
// 오류발생! 파라미터 생성자를 하나라도 정의할 경우
// 컴파일러에 의해 기본생성자가 자동으로 생성되지 않기 때문에
// 기본 생성자를 호출할 수 없게 된다.
// => 해결책 : 기본 생성자를 직접 정의하던지,
// Person2(Stringm, int) 파라미터 생성자로 인스턴스 생성!
p.showPersonInfo();
}
}
class Person2 {
// 멤버변수 선언(=인스턴스 변수, 필드)
String nation;
String name;
int age;
// 생성자를 정의하지 않으면 기본 생성자가 자동으로 생성됨
// public Person2() { } // 기본 생성자
public Person2(String newName, int newAge) { // 데이터타입으로 구분함
System.out.println("Person2(String, int) 생성자 호출됨!");
// 전달받은 파라미터값을 인스턴스 변수에 저장
name = newName;
age = newAge;
}
public void showPersonInfo() {
System.out.println("이름 : "+ name);
System.out.println("나이 : "+age);
System.out.println("국가 : "+nation);
}
}
국가는 안적었기 때문에 null값을 가짐
만약, 국가명은 무조건 "대한민국"으로 고정하고 싶을 경우 별도로 파라미터값을 전달받지 않고 생성자 내에서 " 대한민국"으로 초기화
nation="대한민국";
package constructor;
public class Ex2 {
public static void main(String[] args) {
/*
* 파라미터 생성자
* - 생성자 호출 시점에서 전달해야할 데이터가 있을 경우
* 생성자 파라미터(매개변수) 를 선언할 수 있음(= 메서드와 동일)
* - 전달받은 데이터는 인스턴스 변수를 초기화하는 용도로 사용
* - 즉, 객체마다 다른 데이터를 가진 채로 인스턴스를 생성하기 위해 사용
*
* < 파라미터 생성자 정의 기본 문법 >
* [접근제한자] 클래스명(매개변수선언...) {
* // 생성자 호출 시점에 파라미터에 데이터를 전달하여
* // 인스턴스 내의 인스턴스 변수(멤버변수)를 초기화함
* 인스턴스변수명(멤버변수명) = 매개변수명(데이터)
* }
* => 파라미터 생성자 자동 단축키 : Alt + Shift + S -> O
*/
// Person2 인스턴스(p) 생성
// Person2 p = new Person2();
// => 오류 발생! The constructor Person2() is undefined
// => 파라미터 생성자를 하나라도 정의할 경우
// 컴파일러에 의해 기본 생성자가 자동으로 생성되지 않기 때문에
// 기본 생성자를 호출할 수 없게 된다!
// => 해결책 : 기본 생성자를 직접 정의하던지
// Person2(String, int) 파라미터 생성자로 인스턴스 생성!
Person2 p = new Person2("땅콩이", 20);
p.showPersonInfo();
Person2 p2 = new Person2("따옹이", 14);
p2.showPersonInfo();
Person2 p3 = new Person2("한국", "땅캥이", 30);
p3.showPersonInfo();
}
}
class Person2 {
// 멤버변수 선언(= 인스턴스 변수, 필드)
String nation;
String name;
int age;
// 생성자를 정의하지 않으면 기본 생성자가 자동으로 생성됨
// public Person2() { } // 기본 생성자
public Person2(String newName, int newAge) {
System.out.println("Person2(String, int) 생성자 호출됨!");
// 전달받은 파라미터값을 인스턴스 변수에 저장
name = newName;
age = newAge;
// 만약, 국가명(nation)은 무조건 "대한민국"으로 고정하고 싶을 경우
// 별도로 파라미터값을 전달받지 않고 생성자 내에서 "대한민국"으로 초기화
nation = "대한민국";
}
// 파라미터 생성자 자동 단축키 : Alt + Shift + S -> O
public Person2(String nation, String name, int age) {
super();
this.nation = nation;
this.name = name;
this.age = age;
}
public void showPersonInfo() {
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("국가 : " + nation);
}
}
Account2 클래스
package constructor;
public class Test2 {
public static void main(String[] args) {
Account2 acc1 = new Account2("111-1111-111", "땅콩이", 10000);
acc1.showAccountInfo();
// 계좌번호를 전달받는 생성자 출력
Account2 acc2 = new Account2("999-9999-999", "땅캥", 10000);
acc2.showAccountInfo();
// 계좌번호, 예금주명을 전달받는 생성자 출력
Account2 acc3 = new Account2("999-9999-999", "따옹");
acc3.showAccountInfo();
// 계좌번호, 예금주명을 전달받는 생성자 출력
Account2 acc4 = new Account2("999-9999-999", "땅쓰", 10000);
acc4.showAccountInfo();
}
}
/*
* Account2 클래스
* - accountNo, ownerName, balance
* - showAccountInfo() 메서드
* - 인스턴스 생성 시
* "Account() 생성자 호출됨!" 출력
* accountNo 에 "111-1111-111", ownerName 에 "홍길동", balance 에 10000
* 초기값으로 설정
*/
class Account2 {
String accountNo;
String ownerName;
int balance;
//계좌번호를 파라미터로 전달받고, 홍길동, 현재잔고는 0으로 초기화하는 생성자
public Account2(String accountNo) {
this.accountNo = accountNo;
balance = 0;
}
//계좌번호, 예금주명을 파라미터로 전달받고,현재잔고는 0으로 초기화하는 생성자
public Account2(String accountNo, String ownerName) {
this.accountNo = accountNo;
this.ownerName = ownerName;
}
public Account2(String AccountNo, String OwnerName, int Balance) {
this.accountNo = AccountNo;
this.ownerName = OwnerName;
this.balance = Balance;
}
public void showAccountInfo() {
System.out.println("-------------------------");
System.out.println("계좌번호 : " + accountNo);
System.out.println("예금주명 : " + ownerName);
System.out.println("현재잔고 : " + balance);
}
}
생성자 오버로딩.package
- 메서드 오버로딩과 동일
- 생성자 호출 시 다양한 형태의 파라미터를 전달하여 객체를 다양하게 초기화하는 목적
package constructor_overloading;
public class Ex {
public static void main(String[] args) {
/*
* 생성자 오버로딩
* - 메서드 오버로딩과 동일
* - 생성자 호출 시 다양한 형태의 파라미터를 전달하여
* 객체를 다양하게 초기화하는 목적
*
*/
Person p = new Person("한국", "땅콩이","123456-7654321");
p.showPersonInfo();
// 문자열 2개만 전달할 경우 이름, 주민번호만 초기화하고
// 국가는 "대한민국"으로 초기화하는 생성자 호출
Person p2 = new Person("땅콩","123456-7654321");
p2.showPersonInfo();
// 파라미터 생성자를 하나라도 정의할 경우
// 컴파일러에 의해 기본 생성자가 자동으로 생성되지 않음
// 따라서, 기본 생성자를 호출해야 하는 경우 직접 기본 생성자 정의!
Person p3 = new Person(); // 결과가 null로 나옴
p3.showPersonInfo();
}
}
class Person {
String nation;
String name;
String jumin;
// 기본생성자
public Person() {
System.out.println("Person() 생성자 호출됨!");
}
// 국가는 자동으로 "대한민국"으로 초기화하고
// 파라미터는 2개(name, jumin)를 전달받아 초기화하는 생성자 정의
public Person(String newName, String newJumin) {
System.out.println("Person(String,String) 생성자 호출됨! ");
nation = "대한민국";
name = newName;
jumin = newJumin;
}
// 파라미터 3개(nation, name, jumin)를 전달받아 초기화하는 생성자 정의
public Person(String newNation, String newName, String newJumin) {
System.out.println("Person(String,String,String) 생성자 호출됨! ");
nation = newNation;
name = newName;
jumin = newJumin;
}
//국가명, 이름, 주민번호 출력하는 showPersonInfo() 메서드 정의
public void showPersonInfo() {
System.out.println("국가 : " + nation);
System.out.println("이름 : " + name);
System.out.println("주민번호 : " + jumin);
}
}
날짜를 관리하는 MyDate 클래스 정의
package constructor_overloading;
public class Test {
public static void main(String[] args) {
MyDate md = new MyDate(1999);
md.MyDateInfo();
MyDate md2 = new MyDate(1999,1);
md2.MyDateInfo();
MyDate md3 = new MyDate(1999,1,1);
md3.MyDateInfo();
}
}
/*
* 날짜를 관리하는 MyDate 클래스 정의
* - 멤버변수 : 연도(year, 정수), 월(month, 정수), 일(day, 정수)
* - 생성자
* 1 ) 기본 생성자 : 1999년 1월 1일로 초기화
* 2 ) 파라미터 생성자
* 2-1. 연도(year)를 전달받아 초기화하고, 1월 1일로 초기화
* 2-2. 연도(year),월(month)를 전달받아 초기화하고, 1일로 초기화
* 2-3. 연도(year),월(month),일(day) 를 전달받아 초기화
*/
class MyDate {
int year;
int month;
int day;
public MyDate() {
System.out.println("MyDate() 생성자 호출됨!");
year = 1999;
month = 1;
day = 1;
}
public MyDate(int newYear) {
System.out.println("MyDate(int) 생성자 호출됨");
year = newYear;
month = 1;
day = 1;
}
public MyDate(int newYear, int newMonth) {
System.out.println("MyDate(int, int) 생성자 호출됨");
year = newYear;
month = newMonth;
day = 1;
}
public MyDate(int newYear, int newMonth, int newDay) {
System.out.println("MyDate(int, int, int) 생성자 호출됨");
year = newYear;
month = newMonth;
day = newDay;
}
public void MyDateInfo() {
System.out.print(year+"년 ");
System.out.print(month+"월 ");
System.out.println(day+"일");
System.out.println("--------------------------------------");
}
}
'JAVA' 카테고리의 다른 글
[JAVA] 배열(array) (2) (0) | 2023.09.11 |
---|---|
[JAVA] 배열(array) (0) | 2023.09.11 |
[JAVA] 메서드 오버로딩을 사용하여 계산기 클래스 만들기 (0) | 2023.09.11 |
[JAVA] 접근제한자 (0) | 2023.09.11 |
[JAVA] 객체지향 프로그래밍 이해하고 입출금기능 있는 은행잔고 클래스 만들기 (0) | 2023.09.11 |