본문 바로가기

BackEnd/Java

0919 JAVA - constructor_overloading 생성자 오버로딩

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