ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20221104 TIL 메서드 시그니처를 고려하자!
    TIL 2022. 11. 4. 13:53


    최근에 컬렉션 프레임워크들의 메서드들을 많이 살펴봤었는데,
    오늘 코딩 문제를 풀다가 불현듯 이게 내가 예상한대로 되나? 싶은 생각이 들었던 메서드가 있었다.
    그것은 바로바로 List의 remove메서드이다.

    List는 remove로 어떤 인덱스에 해당하는 값을 없앨 수도 있고,
    혹은 일치하는 값을 없앨 수도 있다.
    그런데 이번 코딩 문제는 List에 Integer값들이 들어있었기 때문에
    내가 인덱스 1에 해당하는 값을 지우고 싶어서 list.remove(1)을 했을 때 만약 값이 1인 요소를 지우면 어떡하지라는 생각이 불현듯 들었다.

    이 불안함은 메서드 시그니처로 해결할 수 있었다.

    https://pbs.twimg.com/media/Dq7DSJfV4AIguTs.jpg

    자바는 메서드 시그니처로 각 메서드를 구분한다.
    그리고 자바의 메서드 시그니처는 메서드 이름과 파라미터 타입들로 구성된다.

    https://docs.oracle.com/javase/8/docs/api/java/util/List.html

    List의 remove메서드의 시그니처를 살펴보면,
    인덱스를 기준으로 없앨 때는 파라미터 타입이 int이고,
    일치하는 값을 기준으로 없앨 때는 파라미터 타입이 Object인 것을 알 수 있다.

    따라서 Integer타입이 아닌 그냥 숫자를 넣으면 인덱스를 기준으로 삭제를 하게 되고,
    Wrapper Class를 이용해서 Integer.valueOf(숫자), new Integer(숫자) 값을 인자로 넣게되면 일치하는 첫 값을 삭제하게 된다.

    메서드를 살펴볼 때 메서드 시그니처도 잘 살펴보도록 하자!

    그리고 또 한 가지 유의할 점은 메서드 시그니처에는 메서드 이름과 파라미터 타입들만 포함된다는 점이다.
    그래서 만약 내가 메서드들을 구현할 때 메서드 오버로딩을 하려면 파라미터 타입들이 바뀌어야 한다.
    반환타입이나 파라미터 이름은 메서드 시그니처에 포함되지 않기 때문에
    반환타입이나 파라미터 이름, 접근 제어자등 만 바꾼 또 다른 메서드를 정의하면 method is already defined in class 에러가 발생한다.

    메서드 시그니처는 메서드 이름과 파라미터 타입들로 구성되고, 메서드 시그니처로 각 메서드가 구분된다는 사실을 꼭 인지하자!

    댓글

Designed by Tistory.