develop/Java

코드의 재사용

마스카포네치즈 2021. 2. 18. 00:08

코드의 재사용

 

메서드 오버로딩= 하나의 메서드로 서로 다른 파라미터를 전달 받아 비슷한 작업들을 수행하는 것.

앞서 우리가 아는 메서드 오버로딩

 

class WalkTest{ 
	public void walk(){ //1번 메서드
    	System.out.println("100cm 이동");
    }

	public void walk(int distance){ //2번 메서드
    	System.out.println(distance + "이동");
	}
    
	public void walk(int distance, String unit){ //3번 메서드
    	switch(unit){
        case "cm" :
         break;
        case "m" :
         distance *= 100;
         break;
        case "inch" :
         distance *= 2.5;
         break;
        default : 
         System.out.println("단위 입력 오류!");
         break;
	  }
      System.out.println(distance+"cm 이동");
    }
}

walk 라는 메서드를 여러개 생성해서 각자 다른 파라미터를 전달한다. 

이 때 코드의 중복이 발생하게 되는데 당장은 코드가 복잡하지 않아서 불편함이 없지만

나중에 굉장히 불편해진다.. 그걸 방지하기 위해 코드의 재사용을 통해 코드의 중복을 제거해야함.🤭

 

메서드를 살펴보면 3번 메서드가 가장 복잡하고 파라미터를 가장 많이 전달받는 것을 볼 수 있다 

그래서 3번 메서드에 코드를 다 몰아준다고 생각하면 됨.

 

중복 코드 제거를 통해 하나의 메서드에서만 작업을 수행하도록 하고,

나머지 메서드는 해당 작업 수행 메서드를 호출해

필요한 데이터를 전달하도록 한다.

 

 

 

class WalkTestGood{
	public void walk(){
    	walk(100,"cm");
    }

	public void walk(int distance){
    	walk(distance,"cm");
    }
    
    public void walk(int distance,String unit){
		switch(unit) {
		case"cm" :
			break;
		case"m" : 
			distance *= 100;
			break;
		case"inch" : 
			distance *= 2.5;
			default :
				System.out.println("단위 입력 오류!");
				distance = 0;
			}
            
            System.out.println(distance+ "cm 이동");
		}
    }






}

중복 코드가 제거되어 훨씬 깔끔한(?) 모습

 

마지막 코드는 작업을 수행해야 하기 때문에 상태를 유지해야 함!

 

 

생성자 오버로딩에서 코드 중복

 

생성자는 멤버변수를 초기화하는게 주역할이다. 

생성자 오버로딩을 통해 멤버변수를 다양한 값으로 초기화 할 수 있다. 

그런데 생성자 오버로딩시 코드의 중복이 일어날 수 있기 때문에 

하나의 생성자에서 초기화 코드를 모두 작성하고 나머자 생성자는 초기화 작업을 수행하는 생성자를 호출해

초기화 값만 전달해 대신 초기화를 수행하도록 해야함!

(메서드 오버로딩과 동일함)

 

생성자 호출은 인스턴스 생성시 new 연산자 뒤에만 올 수 있어서

생성자 내의 ㄷㅏ른 생성자 이름을 지정해 호출할 수 없다

=> 생성자 this() 사용하기

-생성자 내에서 자신의 클래스 내 다른 생성자를 호출하는 용도

-호출할 생성자의 파라미터에 맞는 데이터 전달하기

-생성자 this()는 생성자 내에서 첫번째로 실행

-주석 제외 첫번째로 들어가야 함

 

class Mydate{
	int year;
    int month;
    int day;

	
    public Mydate(){
    	this(2000,1,1); //생성자 this() 실행 반드시 생성자 내에서 가장 먼저 실행되야 함
    }
    
    public Mydate(int year){
    	this(year,1,1);
    }

	public Mydate(int year,int month){
    	this(year,month,1);
    }

	public Mydate(int year, int month, int day){
    	this.year = year;
        this.month = month;
        this.day = day;
    }
    
    public void print(){
    	Sysyem.out.println("%년 %월 $일",year,month,day);
    }
}