[Java] 매소드 시그니처

Jerry·2021년 8월 14일
0

language & framework study

목록 보기
10/28

매소드 시그니처란?

  • 매소드 정의.

  • 자바 컴파일러가 매소드를 구별할 수 있는 기준

  • 매소드 시그니처가 같은 경우, 중복된 매소드 정의로 판단하여 컴파일 오류가 발생

매소드 시그니처 요소

  • 매소드 이름
  • 파라미터 정의(갯수, 순서, 타입)

리턴타입은 왜 매소드 시그니처에 포함되지 않을까?

만약 리턴 타입만 다른 두 매소드가 존재할수 있도록 매소드 시그니처 요소에 리턴타입이 포함된다면,
컴파일러는 어떤 매소드를 호출해야 하는지 판단할 수 없게 됩니다.

이 때문에, 자바 컴파일러가 매소드를 특정할 수 있도록 리턴 타입을 매소드 시그니처에 포함하지 않은 것으로 생각됩니다.

System.out.println(testSignature("test"))
//println() 매소드는 overloading으로 다양한 타입을 파라미터로 받을 수 있음 public int testSignature(String str){
  int tNumber=1;
  return tNumber;
}
public String testSignature(String str){
  return str;
}

오버라이딩과 매소드 시그니처

오버라이딩은 상위클래스나 인터페이스에서 정의한 매소드와 다음의 요소가 일치해야 성립합니다.

1) 매소드 시그니처
2) 리턴타입 (상위클래스에 정의된 리턴타입과 동일하거나 하위 타입)

이러한 제약은 자바의 다형성, 느슨한 결합과 관련이 있습니다.

예를들어,

public class Car{	

	public String getName(String name){
    	return name;
    }
}

public class Sedan extends Car{

	@override
	public String getName(String name){
    	return name+": sedan";
    }
}

public class Suv extends Car{

	@override
	public String getName(String name){
    	return name+": suv";
    }
}
...

ArrayList<Car> cars=new ArrayList<>();
Car mainCar=new Car();
Car secondCar=new Sedan();
Car thirdCar=new Suv();

cars.add(mainCar);
cars.add(secondCar);
cars.add(thirdCar);

for(Car car : cars){
	System.out.println(car.getName("jerry"));
}

위 예시에서 Sedan, Suv는 Car을 상속받아 getName 매소드를 재정의했습니다.
세 클래스에서 정의한 getName 매소드가 매소드 시그니처와 리턴타입까지 같으므로
참조하는 쪽에서는 각 객체별 세부구현에 대해 신경쓰지 않아도 되고 동일하게 취급하여 다룰수 있습니다.

하위 클래스에서 매소드 재정의시 리턴타입이 달라지는 것이 허용된다면,
객체를 참조하는 쪽에서는 객체를 추상화해서 다를 수 없고 각각의 세부 객체 타입을 확인하고(instance of) 분기처리하여 그에 맞춘 프로그래밍이 되어야 하기 때문에 각 객체간 결합이 강해지고 변화에도 유연함이 떨어지게 됩니다.

profile
제리하이웨이

0개의 댓글