메서드정의와 필요성

메서드란?
  • 현실의 객체가 하는 동작을 프로그래밍화
  • 어떤 작업을 수행하는 명령문의 집합
메서드를 작성하는 이유
  • 반복적으로 사용되는 코드의 중복 방지(DRY: Don’t Repeat Yourself!, WET: We Enjoy Typing or Write Everything Twice)
  • 코드의 양을 줄일 수 있고 유지 보수가 용이함

선언부

  • 리턴타입
    • 호출 결과 호출한 곳으로 반환되는 값의 타입으로 아무것도 리턴하지 않을 경우 void
    • 결과를 받을 때 묵시적 형 변환 적용
    • 리턴 타입은 하나만 적용 가능
  • 메서드 이름 : 메서드가 수행하는 작업을 쉽게 파악하도록 의미 있는 이름 사용
  • 파라미터 목록
    • 메서드 호출 시점에 넘겨줘야 하는 변수들로 넘겨줄 정보가 없을 경우 생략 가능
    • 파라미터 전달 시 묵시적 형변환 적용

Variable arguments

메서드 선언 시 몇 개의 인자가 들어올 지 예상할 수 없을 경우(또는 가변적)

  • 배열 타입을 선언할 수 있으나->베서드 호출 전 배열을 생성, 초기화 해야 하는 번거로움
  • …을 이용해 파라미터를 선언하면 호출 시 넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화
    public static void main(String[] args){
      VariableTest vt = new VariableTest();
      vt.variableArgs(1, 2, 3);
      vt.variableArgs(1, 2, 3, 4, 5);
      vt.variableArgs(1, 2);
    }
    public void variableArgs(int... params){
      int sum = 0;
      for(int i: params){
          sum += i;
      }
      System.out.println(sum);
    }
    

    ex) printf

구현부

구현부는 중괄호 내에서 처리해야하는 니용 즉 비즈니스 로직 작성
마지막에는 선언된 리턴 타입에 해당하는 값을 return 문장과 함께 반환해야 함

  • 값 반환 시에는 묵시적 형 변환 적용
  • 리턴 타입이 void여서 반환할 값이 없을 경우 return 문장 생략 가능
  • 메서드 수행 도중 return 문장을 만나거나 마지막 문장을 수행하는 경우 메서드는 종료
    • 조건문을 이용해서 return 할 경우 모든 조건에서 return 필요

메서드 호출

메서드를 호출할 때는 메서드의 선언부에 맞춰 호출해야 함

  • 메서드 이름 : 반드시 동일
  • 파라미터 : 선언된 파라미터의 개수는 반드시 동일, 타입은 promotion 적용 가능
    메서드 접근 : 멤버 변수와 마찬가지로 static 또는 non static 상태를 구분해서 호출
    비고 static member non static member(instance member)
    소속 클래스 객체
    접근 방법 같은 클래스 바로 호출 바로 호출
    다른 클래스 클래스_이름.멤버_이름 객체_이름.멤버_이름
  • 가장 중요한 것은 호출하려는 멤버가 메모리에 있는가?
    • 메모리에 있으면 호출 가능
    • 메모리에 없으면 호출 불가 - 먼저 메모리에 로딩 후 사용해야 함

      class 멤버와 instance 멤버간의 참조와 호출
      가장 중요한 것은 메모리에 있는가?
  • 메모리에 있으면 호출 가능
  • 메모리에 없으면 호출 불가 static member -> 언제나 메모리에 있음
  • 클래스 로딩 시 자동 등록
    instance member -> 객체 생성 전에는 메모리에 없음
  • 객체 생성 시 모든 일반 멤버들은 메모리에 생성
  • 객체 즉 레퍼런스를 통해서 접근

메서드 호출 스택

스택(stack)

  • First in Last out 구조 메서드 호출 스택
  • 각각의 메서드 호출 시 마다 메서드 동작을 위한 메모리 상자를 하나씩 할당
    • 상자 내부에 메서드를 위한 파라미터 변수 등 로컬 변수 구성
  • A 메서드에서 새로운 메서드 B 호출 시 B 실행을 위한 메모리 상자를 쌓음
    • 언제나 맨 위에 있는 메모리 상자(B)만 활성화
    • 이때 A 메서드는 동작이 끝나지 않고 잠시 정지된 상태
    • B가 리턴하게 되면 B를 위한 상자가 제거되며 메모리 반납
    • 비로서 A가 최상위가 돼서 다시 동작 재게

기본형 변수와 참조형 변수

  • 메서드 호출 시 파라미터로 입력된 값을 복사해서 전달
  • Java는 call by value!! Value의 정체는?

메서드 오버로딩

overloading: 동일한 기능을 수행하는 메서드의 추가 작성

  • 일반적으로 메서드 이름은 기능별로 의미 있게 정함
  • 동일한 기능을 여러 형태로 정의해야 한다면?

메서드 오버로딩의 장점

  • 기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능

메서드 오버로딩 방법

메서드 이름은 동일
파라미터의 개수 또는 순서, 타입이 달라야 할 것

  • 파라미터가 같은면 중복 선언 오류 리턴 타입은 의미 없음