[Java] 메서드(method)

메서드 
 
▪ 명명법 : 카멜 케이스
▪ 메서드(Method)는 클래스 내에 소속되어있으며 실행(호출,call) 가능한 멤버 중 하나이다.
▪ 구조

[접근 제한자] [synchronized]? [static|abstract]? [final]? [반환 타입|void] [메서드 이름]([매개 변수 구조,...]?) [throws [가능 예외,...]]? {[구현부]}
  
▫ [접근 제한자] : 해당 메서드에 접근할 수 있는 대상을 제한한다. '[공통] Java' 파일 참고.
▫ `synchronized` : 해당 메서드에 한 번에 하나의 스레드가 가진 실행점만 존재할 수 있다는 의미. (과장한테 배우기)
▫ `static` : 해당 메서드가 정적임. 비정적 메서드의 경우 해당 키워드 생략. 정적이면서 추상적일 수 없음.
▫ `abstract` : 해당 메서드가 추상적임. 비추상적 메서드의 경우 해당 키워드 생략. 추상적인 메서드의 경우 구현부({, })가 없음. 추상적이면서 정적이거나 최종적일 수 없음.
▫ `final` : 해당 메서드가 최종적임. 최종적이지 않은 메서드의 경우 해당 키워드 생략. 최종적인 메서드의 경우 재정의(Overriding)할 수 없음. 최종적이면서 추상적일 수 없음.
▫ `throws ...` : 해당 메서드가 후술하는 한 개 이상의 예외를 던질 가능성이 있음을 알리며 해당 메서드를 호출하는 컨텍스트에서는 해당 예외(들)에 대해 대비가 되어 있어야 함. 
▫ 가령, `try-catch`로 감싸거나, 호출부 컨텍스트 자체가 다시 `throws` 해야 함.


[접근제한자][정적(static) |추상적 (abstract)]?[final]?[반환타입|void][메서드이름]([매개변수 구조,...]?){
[구현부]}

public static void main(String[] args){
}

▫ 위 main 메서드의 접근제한자는 public이다.
▫ 위 main 메서드는 synchronized 이지 않다.
▫ 위 main 메서드는 static이다.
▫ 위 main 메서드는 fianl 이지 않다. 
▫ 위 main 메서드의 반환타입은 없(void)다.
▫ 위 main 메서드의 이름은 당연히 main이다.
▫ 위 main 메서드의 매개 변수는 String[] 타입 한 개 이다.
▪ 호출(Call): 메서드를 실행하는 것을 '메서드를 호출한다.'라고 한다.
▫ 메서드를 호출하기 위해 해당 메서드가 멤버로 존재하는 형(타입)이나 객체에 멤버 연산자로 접근하여 메서드 이름을 적은 뒤 괄호를 열어 전달 인자(Argument)를 기입, 괄호를 닫으면 메서드를 호출하는 것이다.
▫ 단, 동일한 스코프({,}) 내 존재하는 메서드를 호출하는 경우 멤버 연산자 및 이의 좌항(들)을 생략할 수 있다.

[형이나 객체].[메서드이름]([전달인자,...]?);

System.out.println("Hello World!");

▫ 위 예에서 System의 멤버인 out의 멤버인 메서드 println을 호출한 것이며 전달 인자로는 문자열 한 개를 전달한 것이다.
▫ 전달할 전달 인자가 없다하더라도 괄호를 생략하여서는 안되며 단순히 괄호를 ㅕㄹ고 닫음으ㅗㄹ 메서드를 호출할 수 있다.
▫ 메서드가 요구하는 매개변수(Parameter)의 구조와 전달인자(Argument) 가 일치해야만 메서드를 호출할 수 있다.
▫ 메서드의 반환타입이 있는 경우(void가 아닌경우) 모든 경우에 반드시 return 키워드를 이용하여 값을 반환해주어야 한다. >> 반복문 주의 ! 예외처리 반드시 해야함
▫ 메서드의 반환 타입이 없는 경우  return 키워드 뒤에 값이 올 수는 없지만 사용할 수는 있고, return시, 해당 메서드의 실행을 즉시 종료한다.

▪ 오버로딩(Overloading) : 오버로딩은 '과적'이라는 의미로, 이름이 같은 메서드의 매개변수 구조를 달리하여 두개이상 선언하는 것을 의미한다.
  오버로딩된 메서드 호출시, 호출부의 전달인자가 매개변수의 구조와 가장 잘맞아 떨어지는 메서드를 호출하게된다.(특히 상속관계에 이쓴ㄴ 서로 다른 두 매개변수의 경우)
▪ 재정의(Overriding) : 부모가 가진 메서드를 다시 만드는 것으로, 그 기능이나 목적을 달리하고자 할 때 사용한다. `@Override` 어노테이션(Annotation)을 메서드 앞에 적어주는 것이 좋다.
▪ 추상 메서드(Abstract Method) : 추상 메서드는 구현부를 가지지 않는 메서드이다. 추상 메서드를 한 개 이상 가지는 클래스는 반드시 추상 클래스(Abstract Class)여야 하며, 이를 상속받는 추상적이지 않은 클래스는 
추상클래스가 가지는 추상 메서드를 재정의하여 구현부를 반드시 구현해야한다.
        ▪ 가변인자(Variable Argument) : 그 개수가 정해지지 않은 어떠한 타입에 대한 매개변수이다. 매개변수 구조상 하나만, 마지막에 사용할 수 있다. 메서드 구현부에서의 취급은 일반 배열과 동일하다. 가령, `int...`는 `int[]`과 동일하게 대우한다. 단, 전달인자를 하나도 전달하지 않아도 호출이 되며, 길이가 0인 배열로 취급됨으로 이에 유의한다.
   public static int sum(int... nums) {
       int sum = 0;
       for (int num : nums) {
           sum += num;
       }
       return sum;
   }