자바/자바 입문 공부일지

자바 기초 공부 일지 15. 메소드 오버로딩, this 참조 변수

Tomitom 2022. 10. 27. 15:23
반응형

 

● 메소드 오버로딩이란 같은 이름의 메소드를 중복으로 만들 때를 의미합니다. 

자바에서 한 클래스에 같은 이름의 메소드를 두 개 이상 받을 수 없지만, 

매개변수의 개수 혹은 타입을 다르게 하면 같은 이름을 사용할 수 있습니다. 

 

메소드 오버로딩은 

1. 메소드의 이름이 같을 것 

2. 메소드의 매개변수 개수 또는 타입이 다를 것 

 

두 가지 조건이 만족되어야 합니다. 

 

메소드의 매개 변수가 여러 가지일 때 매개변수 정보가 다른 메소드가 있을 때에는 컴파일이 판단을 해서 오버로딩을 합니다. 

 

만약 int 정수 하나가 들어가는 메소드a와 int 정수, double 실수가 하나씩 들어가는 메소드b가 있을 때

3, 3.15 의 값을 매개변수로 넣는다면, 메소드 b를 출력합니다. 

 

정수와 문자열이 있을 경우에 어떤 메소드를 오버로딩할지에 대한 것을 컴파일이 판단하는 것입니다. 

아래의 예제를 확인해볼게요. 

일반 메소드의 오버로딩의 예입니다. 

package day14;


class Coffee{
	void drinking() {
		System.out.println("커피를 마신다.");
	}
	void drinking(int n) {
		System.out.println("커피를 " + n+"잔 마신다.");
	}
}

public class Overloading {

	public static void main(String[] args) {
		Coffee c = new Coffee();
		c.drinking();
		
		// 전달된 인수를 보고 컴파일이 판단을 해서 실행함.
        // int 가 들어가지 않으므로 문자열만 존재하는 메소드를 실행함.
		// 메소드 오버로딩
	}
}

 

메소드 오버로딩은 형 변환이 가능한 것 중에서 가까운 것을 호출합니다. 

생성자 또한 오버로딩이 가능합니다. 

생성자의  오버로딩을 통해서 생성되는 인스턴스의 유형을 구분할 수 있습니다. 

상기 예제를 수정해서 생성자 오버로딩도 작성해볼게요. 

 

package day14;


class Coffee{
	Coffee(){
		System.out.println("아이스 아메리카노 한 잔!");
	}
	Coffee(String menu){
		System.out.println(menu + " 한 잔!");
	}
	
	void drinking() {
		System.out.println("커피를 마신다.");
	}
	void drinking(int n) {
		System.out.println("커피를 "+ n + "모금 마신다.");
	}
}

public class Overloading {

	public static void main(String[] args) {
		Coffee c = new Coffee("카페라떼");
		c.drinking(3);

		// 전달된 인수를 보고 컴파일이 판단을 해서 실행함.
		// 메소드 오버로딩 
	}
}

 

 

 

키워드 this : 파이썬의 self 와 유사한 역할 입니다. 

인스턴스 자신을 뜻하는 용어이자 클래스 명을 대신하는 역할입니다. 

예를 들어서 확인해볼게요. 

 

package day14;



class Tiger{
	String name; 
	
	Tiger(){
		this("호돌이"); // 인자를 전달한느 생성자를 재활용. 생성자를 대신할 때엔 클래스 명을 대신한다. 
        // (= Tiger)
	}
	
	Tiger(String n){
		name = n;  // this.name = n; // 이 객체가 가지고 있는 name. 파이썬의 self 의 역할  
	}
		
	
}
public class Tiger {

	public static void main(String[] args) {
		
		Tiger T = new Tiger();
	}

}
package day14;



class Tiger{
    String name;
   
    Tiger(){
        this("호돌이"); // 인자를 전달한느 생성자를 재활용. 생성자를 대신할 때엔 클래스 명을 대신한다.
        // (= Tiger)
    }
   
    Tiger(String n){
        name = n;  // this.name = n; // 이 객체가 가지고 있는 name. 파이썬의 self 의 역할  
    }
       
   
}
public class Tiger {

    public static void main(String[] args) {
       
        Tiger T = new Tiger();
    }

}

● this 참조변수 

매개변수의 이름과 인스턴스 변수의 이름이 같을 경우 인스턴스 변수의 이름이 같을 경우 

인스턴스 변수 앞에 this 키워드를 붙여 구분합니다. 

this() 메소드는 생성자 코드블럭 내부에서만 사용할 수 있고, 자기 자신을 호출할 때 사용합니다. 

파이썬의 self와 같은 역할입니다. 

 



class SimpleBox {      
    int data;       // SimpleBox 클래스에 정수 data를 받는다. 
    
    SimpleBox(int data) {       //SimpleBox 클래스에 정수를 입력하면 
        this.data = data;       // 그 정수의 참조 변수는 자기 자신이다. 
    }
    
    void setData(int data) {       
        this.data = data;
    }

    int getData() {
        return this.data;
    }
}

class ThisInst {
    public static void main(String[] args) {
        SimpleBox box = new SimpleBox(99);     // SimpleBox에 99의 정수를 넣은 box 인스턴스를 생성
        System.out.println(box.getData());      //정수의 참조변수는 그 자신이므로 99 출력 
        
        box.setData(77);
        System.out.println(box.getData());
    }
}

 

 

 

반응형