객체지향언어 3탄으로 오버로딩, this, 클래스매서드애 대해서 알아보겠습니다.

 

● 오버로딩이란?

: 동일한 이름의 메소드를 둘 이상 동시에 정의하는 것을 의미합니다.

 

오버로딩을 가능하게 하는 2가지 조건

 

1) 입렵의 매개변수의 자료형이 서로 다르게 정의 되어 있을 때 허용합니다.

2) 자료형이 같아도 개수가 다를때 사용가능합니다.

-  2가지중 어느 한가지라도 충족한다면 오버로딩 할 수 있습니다.

class Adder{
public int add(int n1, int n2){  
return n1+n2;
}
public int add(int n1, int n2, int n3){ -- 자료형은 같지만 개수가 달라서 가능
return n1+n2+n3;
}
public double add(double n1, double n2){ -- 자료형이 달라서 가능                      
}   
public double add(int n1, double n2){ -- 자료형이 달라서 가능       
return n1+n2;                                          
}		                                                            
public double add(double n1, int n2){ -- 자료형이 달라서 가능      
return n1+n2;                                    
}

 

- 메소드  오버로딩 성공과 실패

// 메소드 오버로딩이 성공한 사례

class MethodOverloading {
	public int getSum(int i, int j) {
		return i + j;
	}
	public int getSum(int i, int j, int k) {
		return i + j + k;
	}
}

// 메소드 오버로딩이 실패한 사례

class MethodOverloadingFail { 
	public int getSum(int i, int j) {
		return i + j;
	}
	public double getSum(int i, int j) {
		return (double)(i + j);
	}
}

-두 개의 getSum() 메소드는 매개변수의 개수, 타입이 모두 같기 때문에 메소드 오버로딩 실패

 

 

주의 사항 1>

형변환의 규칙까지 적용해야만 메소드가 구분되는 애매한 상황은 만들지 않아야 합니다.

class MethodOverload {     
void  isYourFunc( int n ) { … }
void  isYourFunc( int  n1, int  n2 ) {…} 
void  isYourFunc( int  n1, double  n2 ) {…}     
} 
MethodOverload inst = new MethodOverload();     
inst.isYourFunc(10,  ‘a’); 
문자 'a'는 int형으로도, double형으로도 변환이 가능합니다.  
 

형변환 규칙을 적용하되 가장 가까운 위치의 자료형으로 변환이 이루어집니다.

따라서 isYourFunc(int n1, int n2)가 호출합니다.

 

주의 사항 2>

반 환형이 다른 것은 메소드 오버로딩이 성립 안됩니다.

반환형이 다르지만 자료형이 같으면 error입니다. 반환형은 결과를 가지고 수행하는 것이지 호출 시에는 정보가 없기 때문에 method overloading 을 하는 것과 관련이 없습니다.

 

※ 생성자 오버로딩

class person {  
	private String name; // 이름
	private int milID; // 군번
	
	person(String name, int mID){
		this.name = name;   
		this.milID =mID;     
	}                      
	
	person(String name){
		this.name = name;  
		this.milID =0; 
	}

생성자 overloading = 1) 매개 변수의 갯수가 다르던지 2)자료형이 달르면 수행 가능 합니다.

- 생성자의 오버로딩은 하나의 클래스를 기반으로 다양한 형태의 인스턴스 생성을 가능하게 합니다.

 

 

 

● This

: this를 이용하면 생성자 내에서 다른 생성자를 호출할 수 있습니다. 또한 생성자의 추가 정의에 대한 편의를 제공하며 생성자마다 중복되는 초기화 과정의 중복을 피할 수 있습니다.
생성자 안에서 field 값으로 접근하고자 할때는 - this.field 이름 = this 정확히 어떤 것인지 지정해주는 명령어입니다.

 

 

* this의 필요성

- 객체의 멤버 변수와 메소드 변수의 이름이 같은 경우

- 다른 메소드 호출 시 객체 자신의 레퍼런스를 전달할

- 메소드가 객체 자신의 레퍼런스를 반환할 때

 

new 와 this

lass person {  
	private String name; // 이름
	private int milID; // 군번
	
	person(String name, int mID){
		this.name = name;  
		this.milID =mID;    
	}                      
	person(String name){
		this.name = name;  
		this.milID =0; 
	}
	public void showInfo() {
		System.out.println("이름 : " + name);
		
		if (milID!=0){
			System.out.println("군번 : " + milID);	
		}
	}
}


new 실행! 

 

1. person 이라는 자료형을 찾고, 메모리 크기만큼을 계산해서 할당합니다.(name, milid, 생성자, showinfo)

 

1-1. this 라는 key word 를 생성하는데  =this 라는 방을 new 하는 순간 할당되게 됩니다.

      this에는 시작 주소값이 저장되어 있다.
2. 생성자 호출하여 구현합니다
3. 시작 값을 반환해줍니다. = this 값을 return 해주고 있는 것입니다. (참소변수) = 시작 주소값으로 갑니다. 
그때마다 할당 되는 메모리의 주소값입니다. new 할 때마다 할당 되는 주소값을 가지게 되므로 항상 다릅니다.

 

- 같아 보여도 this의 값은 다릅니다.(같은 keyword 라고해서 오해하지 말자)
- this 라는 키워드는 정의되고 있는 자료형 안에서만 사용가능하므로 외부에서는 사용이 불가합니다.
- this 를 넣어주므로서 매개변수와 필드의 이름을 동일하게 할 수 있습니다.

 

this 의 실패

public Book() {
	System.out.println("생성자가 호출되었음");
	this(null, null, 0); // 생성자의 첫 번째 문장이 아니기 때문에 컴파일 오류
}

 

 

● 클래스매서드

: static 메소드(클래스 메소드) - 기본적인 특성과 접근 방법은 static 변수와 동일합니다.

class NumberPrinter {  
    public static void showInt(int n) { System.out.println(n); } 
    public static void showDouble(double n) { System.out.println(n); } 
 } 
  
class ClassMethod {
    public static void main(String[] args) {
        NumberPrinter.showInt(20);   // 클래스의 이름을 통한 호출 
  
        NumberPrinter np = new NumberPrinter(); 
        np.showDouble(3.15);         // 인스턴스의 이름을 통한 호출 
    } 
 } 

 class 의 이름으로  static이 선언된 변수에 접근할 수 있도록 합니다.

 class로 가서 static 을 보고 할당 받은 메모리가 있기 때문에 가능합니다.

 

 

 

+ Recent posts