2024.01.15 학습내용 복습
1. 메서드(메소드)(method) 란?
- 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
- 객체의 행위를 표현하기 위한것
- 기능을 수행하기 위해 클래스 안에서 정의 되는 것
메서드는 수학에서 함수와 유사한 것이라고 생각하면 된다.
예를 들어, 수학에서의 함수는 y = 3x + 1 이라는 식이 있다면 x = 1 를 입력하면 y =7 라는 결과를 얻을 수 있다.
JAVA에서 메서드는 어떤 값을 입력하면 이 값으로 작업을 수행해서, 결과를 반환하는 것이다.
예를 들어 제곱근을 구하는 메서드 Math.sqrt( ) 는 4.0을 입력하면 2.0을 결과로 반환한다.
JAVA의 메서드에서 입력값을 매개변수 (parameter), 출력값 또는 결과값을 반환값(return)이라고 한다.
수학에서의 함수(function) | JAVA의 메서드(method) |
입력값 x | 매개변수(parameter) |
결과값 y | 반환값(return) |
그렇다면 JAVA의 메서드는 함수와 똑같은 매커니즘이라고 이해하면 될까?
그렇다면 대한민국 교육과정을 차곡차곡 밟아온 사람에게 조금더 수월하겠지만, 안타깝게도 JAVA에서의 메서드는 조금 다르다.
수학에서의 함수는 반드시 입력값(x)이 있어야 결과값 (y) 가 존재하지만, JAVA의 메서드에서는 입력값(매개변수) 또는 출력값(결과값, 반환값)이 없을 수도 있으며, .심지어 입력값과 출력값이 모두 없을 수도 있다.
메서드를 사용하면 아래와 같이 총 4가지 상황이 있을 수 있다.
매개변수(parameter) | 반환값(return) | |
1 | O | O |
2 | O | X |
3 | X | O |
4 | X | X |
case1) 매개변수o 반환값o 경우
public static void main(String[] args) {
System.out.println(sum(5, 10));
System.out.println(sum(3, 4));
System.out.println(sum(11, 7));
System.out.println(sum(8, 14));
}
public static int sum(int a, int b) {
int result = a + b + 2;
return result;
}
}
case2) 매개변수o 반환값x 경우
public static void main(String[] args) {
sumPrint(4, 7);
}
private static void sumPrint(int a, int b) {
int result = a + b;
System.out.println(result);
}
}
- 같은 클래스 내에서 접근하기때문에 private도 가능
- return값 없을거니까 void 키워드
- void 자리에 int 썼을때에는 {}안에 아무것도 없으면 에러났음 but return값 없으니 에러 안남
- void 쓰고 return 쓰면 에러남(return값 없다고 했는데 썼으니까!!)
case3) 매개변수x 반환값o 경우
public static void main(String[] args) {
getName();
System.out.println(getName());
}
public static String getName() {
return "홍길동";
}
case4) 매개변수x 반환값x 경우
public static void main(String[] args) {
todayWeather();
}
public static void todayWeather() {
System.out.println("오늘의 날씨는 맑음");
}
JAVA에 입문한 사람이라면 익숙하게 사용해온 'System.out.println()' 이라는 출력문구도 사실은 메서드의 일종이다.
소괄호() 안에 입력한 데이터를 출력하는 기능을 수행하는 메서드인 것이다.
하지만 우리는 'System.out.println()'에 넣을 값(입력값)과 반환되는 결과(출력값)만 알면 될 뿐, 이 메서드가 어떤 과정을 거쳐 결과를 만들어내는지는 전혀 몰라도 된다는 점에서 메서드를 내부가 보이지 않는 '블랙박스(black box)'라고도 한다.
2.메서드를 사용하는 이유 (메서드의 필요성, 장점)
1) 높은 재사용성(reusability)
한 번 만들어놓은 메서드는 몇 번이고 호출할 수 있으며, 다른 프로그램에서도 사용이 가능하다.
2) 중복된 코드의 제거
반복되는 문장들 대신 메서드를 호출하는 한 문장으로 대체하면, 전체 소스 코드의 길이가 짧아지는 것은 물론, 변경사항이 발생했을 때 수정해야할 코드의 양이 줄어들어 오류가 발생할 가능성도 줄어든다.
보다 효율적이고 직관적인 코드를 만들 수 있다.
예를들어보자. 아래 4줄의 코드는 단순히 덧셈을 4번 반복한 출력문이다.
만약 기존의 출력문에 2씩 다 더하는 것으로 수정을 한다고 가정해보자.
지금은 4줄이지만 만약 100줄의 코드를 작성해야한다면? 생각만 해도 번거로운 일이 될 것이다.
System.out.println(5 + 10);
System.out.println(3 + 4);
System.out.println(11 + 7);
System.out.println(8 + 14);
System.out.println(5 + 10 + 2);
System.out.println(3 + 4 + 2);
System.out.println(11 + 7 + 2);
System.out.println(8 + 14 + 2);
위의 코드를 메서드를 사용하면 간단하게 바꿀 수 있다.
public static void main(String[] args) {
System.out.println(sum(5, 10));
System.out.println(sum(3, 4));
System.out.println(sum(11, 7));
System.out.println(sum(8, 14));
}
public static int sum(int a, int b) {
int result = a + b + 2;
return result;
}
3) 프로그램의 구조화
큰 규모의 프로그램을 만들 때 실행하는 문장들을 작업단위로 나눠 여러 개의 메서드에 담아 프로그램의 구조를 단순화시키면, 나중에 프로그램에 문제가 발생해도 해당 부분을 쉽게 찾아서 해결할 수 있다.
3. 메서드의 기본 구조
메서드의 기본구조는 다음과 같다.
반환타입 메서드이름 (타입 변수명, 타입 변수명, ...) {
}
노란색으로 표시한 부분은 메서드의 선언부, 보라색으로 표시한 { } 내부의 부분은 메서드 호출시 수행될 메서드의 구현부이다.
조금 더 보기 쉽게 예시를 통해 알아보자.
public int sum(int a, int b) {
int result = a + b;
return result;
1) public -> 접근제한자
이 메서드에 접근가능한 범위를 나타낸다.
public, private, default 등이 있다.
2) int -> 반환타입(리턴타입)
예시에서는 메서드의 결과값(반환값)의 데이터 타입이 정수형(int)이라는 뜻이다.
※ 리턴값이 없는 경우 void 키워드를 사용한다.
3) sum() -> 메서드의 이름
만들고자 하는 메서드의 이름을 작성하면된다. 메서드는 특정 기능을 수행하기 때문에 보통 동사를 많이 사용한다.
메서드는 항상 메서드이름 다음에 소괄호()가 붙는다.
4) int a, int b ->매개변수 선언
매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 것이다.
필요한 값의 개수만큼 변수를 선언하며, 각 변수간의 구분은 쉼표(,)를 사용한다.
일반적인 변수선언과 달리, 두 변수의 타입이 같아도 변수의 타입을 생략할 수 없다는 점을 주의하자.
5) { } -> 메서드의 구현부
메서드 이름 다음에 오는 중괄호 { } 내부 부분은 메서드의 구현부로, 메서드를 호출하면 수행될 문장들을 나열하면 된다.
6) return 키워드 -> 반환값
메서드의 반환타입이 void가 아니라면 메서드의 구현부 { } 안에 반드시 'return 반환값' 의 형태로 작성하여 포함해야 한다.
이 문장은, 작업을 수행한 결과인 반환값을 호출한 메서드로 전달한다. 이 값은 메서드의 반환타입과 일치하거나, 적어도 자동 형변환이 가능한 것이어야 한다.
또한 return문은 단 하나의 값만 반환할 수 있다. 메서드로의 입력(매개변수)는 여러개 일 수 있어도 출력(반환값)은 최대 하나만 허용한다.
4. 메서드의 선언과 호출
메서드를 정의해도 호출해야만 메서드의 구현부 { } 내의 문장들이 수행된다.
메서드는 아래와 같이 실행한다.
메서드이름(값1, 값2, ...) //메서드 호출 방법
메서드호출 시 괄호 () 안에 지정해준 값들을 '인자(argument)' 또는 '인수'라고한다.
인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.
또한 인자는 메서드가 호출되면서 매개변수에 대입되기 때문에, 인자의 타입은 매개변수의 타입과 일치하거나, 적어도 자동 형변환이 가능한 것이어야 한다.
5. 메서드의 실행흐름
case1에 있는 예시를 통해 실행흐름을 알아보자.
1) 먼저 호출 시 지정한 8과 14가 메서드 sum의 매개변수 a,b에 각각 복사(대입)된다.
2) 메서드 sum의 괄호 {} 안에 있는 문장들이 순서대로 수행된다.
예시에서는 정수형 변수 result를 선언하고, 8+14+2를 수행한 결과인 24를 변수에 담는다(대입연산자를 통해 저장).
3) { } 안에서 수행된 값 result를 호출된 sum(8, 14)에 반환한다.
예시에서는 return 값을 출력하라고 했으니 콘솔창에 24가 출력된다.
기본적으로 코드는 위에서 아래, 왼쪽에서 오른쪽으로 실행된다.
하지만 메서드가 호출되면 지금까지 위에서 아래로 순차적으로 실행중이던 메서드는 실행을 잠시 멈추고, 호출된 메서드의 문장들이 실행된다.
호출된 메서드의 작업이 모두 끝나면 다시 호출한 메서드로 돌아와 이후의 문장들을 수행한다.
'JAVA' 카테고리의 다른 글
[Java] 환경설정(1) : 내가 보려고 쓰는 JDK1.8 설치 + Java 환경변수 설정 + Eclipse 2018-09 설치 + Maven/Tomcat/SVN 설치 (2) | 2024.09.05 |
---|---|
[JAVA] 메서드 오버로딩 (0) | 2024.01.16 |