메서드정의와 필요성
메서드란?
- 현실의 객체가 하는 동작을 프로그래밍화
- 어떤 작업을 수행하는 명령문의 집합
메서드를 작성하는 이유
- 반복적으로 사용되는 코드의 중복 방지(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: 동일한 기능을 수행하는 메서드의 추가 작성
- 일반적으로 메서드 이름은 기능별로 의미 있게 정함
- 동일한 기능을 여러 형태로 정의해야 한다면?
메서드 오버로딩의 장점
- 기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능
메서드 오버로딩 방법
메서드 이름은 동일
파라미터의 개수 또는 순서, 타입이 달라야 할 것
- 파라미터가 같은면 중복 선언 오류
리턴 타입은 의미 없음