728x90
반응형
목차
constructor_overloading
생성자 오버로딩
메서드 오버로딩과 동일
생성자 호출 시 다양한 형태의 파라미터를 전달하여 객체를 다양하게 초기화 하는 목적
문제
문자열 2개만 전달할 경우 이름, 주민번호만 초기화하고
국가는 "대한민국"으로 초기화하는 생성자 호출
Person p = new Person("한국","홍길동","031010-1234567");
p.showPersonInfo();
Person p2= new Person("홍길동", "0301010-1234567");
p2.showPersonInfo();
파라미터 생성자를 하나라도 정의할 경우
컴파일러에 의해 기본 생성자가 자동으로 생성되지 않는다
따라서, 기본 생성자를 호출해야 하는 경우 직접 기본 생성자를 정의!
Person p3 = new Person();
}
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);
}
}
}
메서드 오버로딩 시 문제점
- 동일한 작업을 수행하는 코드들의 중복이 발생
=> 만약, 특정 메서드의 코드를 수정해야 할 경우
동일한 코드를 여러번 수정해야하는 번거로움이 발생할 수 있음
=> 코드의 유지보수성이 나쁘다!
[해결책]
- 오버로딩 된 메서드에서 또 다른 오버로딩 된 메서드를 호출하여
중복되는 작업을 대신 처리하도록 할 수 있다
메서드 호출 시 자신의 전달받은 파라미터를 다시 전달
이처럼 클래스 내의 다른 메서드를 호출하여 사용 =코드의 재사용
문제
최대 3명까지의 초대 인원에 대한 이름을 입력받아 출력하는 print() 메서드 정의
단, 입력되지 않은 이름은 "없음"으로 출력
ex) print ("홍길동","이순신","강감찬")형태로 호출 시
초대 멤버 : 홍길동 이순신 강감찬 출력
ex) print ("홍길동", "이순신") 형태로 출력 시
초대 멤버 : 홍길동, 이순신, 없음 출력
ex) print ("홍길동") 출력 시
초대 멤버 : 홍길동 없음 출력
PrintClass pc = new PrintClass();
pc.print();
System.out.println("------------------------");
pc.print("홍길동");
System.out.println("------------------------");
pc.print("홍길동", "이순신");
System.out.println("------------------------");
pc.print("홍길동", "이순신", "강감찬");
}
}
class PrintClass {
public void print() {
System.out.println("print() 메서드 호출 됨! ");
//System.out.println("초대 멤버 : 없음 없음 없음");
//print(String,String,String) 메서드를 호출하여
// 없음, 없음, 없음 문자열을 대신 출력
print("없음", "없음", "없음");
}
public void print(String name1) {
System.out.println("print(String) 메서드 호출 됨!");
System.out.println("초대 멤버 :" + name1 + "없음 없음");
//print(String,String,Stirng) 메서드를 호출하여
//전달받은 이름(name1), 전달받은 이름(name2), 없음 문자열을 대신 출력
print(name1, "없음", "없음");
}
public void print(String name1, String name2) {
System.out.println("print(String,String) 메서드 호출 됨!");
System.out.println("초대 멤버 : " + name1 + " " + name2 + "없음");
//print(String, String, String) 메서드를 호출하여
//전달받은 이름(name1), 전달받은 이름(name2), 없음 문자열을 대신 출력
print(name1, name2, "없음");
}
public void print(String name1, String name2, String name3) {
System.out.println("print(String,String,String) 메서드 호출 됨!");
System.out.println("초대 멤버 :" + name1 + name2 + name3 + "없음");
//주의! 모든 파라미터를 전달받는 마지막 메서드는
//자기 자신을 호출하지 않고 반드시 직접 작업을 수행해야 한다!
print(name1, name2, name3); //재귀 호출(오류 발생!)
}
}
날짜를 관리하는 MyDate클래스 정의
-멤버 변수 : 연도(year, 정수), 월(month, 정수), 일(day, 정수)
-생성자
1) 기본 생성자 : 1999년 1월 1일로 초기화
2) 파라미터 생성자
2-1. 연도(year)을 전달받아 초기화 하고 1월 1일로 초기화 1개
2-2. 연도(year), 월(month)을 전달받아 초기화하고, 1일로 초기화 2개
2-3. 연도(year), 월(month), 일(day)을 전달 받아 초기화 3개
생성자 자동 단축키 : alt + shift + s -> 0
Mydate md = new Mydate();
System.out.println(md.year+"/"+md.month+"/"+md.day);
Mydate md2 = new Mydate(2022);
System.out.println(md2.year+"/"+md2.month+"/"+md2.day);
Mydate md3 = new Mydate(2022,9,19);
System.out.println(md3.year+"/"+md3.month+"/"+md3.day);
Mydate md4 = new Mydate(2022,9,19);
System.out.println(md4.year+"/"+md4.month+"/"+md4.day);
}
}
class Mydate{
int year;
int month;
int day;
public Mydate() {
System.out.println("Mydate 생성자 호출 됨!");
year = 1999;
month = 1;
day = 1;
}
//2-1. 연도(year)을 전달받아 초기화 하고 1월 1일로 초기화
public Mydate(int newYear) {
System.out.println("Mydate 생성자 호출 됨!");
year = newYear;
month = 1;
day = 1;
}
//2-2. 연도(year), 월(month)을 전달받아 초기화하고, 1일로 초기화
public Mydate(int newYear, int newMonth) {
System.out.println("Mydate 생성자 호출 됨!");
year = newYear;
month = newMonth;
day = 1;
}
//2-3. 연도(year), 월(month), 일(day)을 전달 받아 초기화
public Mydate(int newYear, int newMonth, int newDay) {
System.out.println("Mydate 생성자 호출 됨!");
year = newYear;
month = newMonth;
day = newDay;
}
public void showDateInfo() {
System.out.println("연도 : " + year);
System.out.println("월 : " + month);
System.out.println("일 : " + day);
}
}
public static void main(String[] args) {
Account ac = new Account();
ac.showAccountInfo();
System.out.println("-------------------------");
//계좌번호를 전달받는 생성자 호출
Account ac2 = new Account("999-9999-999");
ac2.showAccountInfo();
System.out.println("-------------------------");
//계좌번호, 예금주명을 전달받는 생성자 호출
Account ac3 = new Account("999-9999-999", "이순신");
ac3.showAccountInfo();
System.out.println("-------------------------");
Account ac4 = new Account("999-9999-999", "이순신", 10000);
}
}
class Account{
String accountNo;
String ownerName;
int balance;
//기본 생성자 (111-1111-111, 홍길동, 0원)
public Account() {
accountNo = "111-1111-111";
ownerName = "홍길동";
balance = 0;
}
//계좌번호를 파라미터로 전달받고, 홍길동, 현재 잔고를 0으로 초기화하는 생성자
public Account(String accountNo) {
this.accountNo = accountNo;
ownerName = "홍길동";
balance = 0;
}
//계좌번호, 예금주명을 파라미터로 전달받고, 현재잔고를 0으로 초기화하는 생성자
public Account(String accountNo, String ownerName) {
balance = 0;
}
//계좌번호, 예금주명, 현재잔고를 파라미터로 전달받는 생성자
public Account(String accountNo, String ownerName, int balance) {
super();
this.accountNo = accountNo;
this.ownerName = ownerName;
this.balance = balance;
}
//showAccountInfo()정의
public void showAccountInfo() {
System.out.println("계좌번호:" + accountNo);
System.out.println("예끔주명:" + ownerName);
System.out.println("잔고:" + balance);
}
728x90
반응형
'BackEnd > Java' 카테고리의 다른 글
0919 JAVA - 배열 (Array) - 2 (0) | 2022.09.19 |
---|---|
0919 JAVA - 배열 (Array) - 1 (1) | 2022.09.19 |
0908 JAVA - Constructor (1) | 2022.09.10 |
0907 JAVA - 접근제한자, Getter / Setter (2) | 2022.09.07 |
0907 JAVA - class 정의 (0) | 2022.09.07 |