목차
- 메소드
1-1. 메소드 출력
1-2. 전달인자와 매개변수
1-3. 리턴값
1-4. static 메소드 - 패키지와 임포트
클래스와 객체에서 상세히 다룰 예정이나 메소드 정의, 흐름에 대해서만 우선 정리해 보기로 한다.
1. 메소드
- 수학에서의 함수(function) 의미와 비슷하다.
- 입력된 값 10이 전달되면 함수에 따라 연산해서 100이라는 결과 값을 반환한다. 함수에 의해 어떠한 연산이 치러질지 정해지듯 특정 작업을 수행하기 위한 명령문 집합을 메소드(method)라고 한다.
1-1. 메소드 출력
- ① 객체 생성 → ② 메소드 호출 → ③ 메소드 출력 순서로 진행된다.
❗ 클래스명 사용할이름 = new 클래스명();
❗ 사용할이름.메소드명();
- 메소드는 다른 메소드를 출력할 수 있고, input 값이 없을 수도 있다. 아래 예시는 메인 메소드에서 순서를 제어하고 있다.
package com.reminder.method;
public class Method02 {
public static void main(String[] args) {
/* main메소드에서 순서 제어하기 */
System.out.println("main() 시작...");
Method02 mthd = new Method02();
mthd.methodA();
mthd.methodB();
mthd.methodC();
System.out.println("main() 종료...");
}
public void methodA() {
System.out.println("methodA() 시작...");
System.out.println("methodA() 종료...");
}
public void methodB() {
System.out.println("methodB() 시작...");
System.out.println("methodB() 종료...");
}
public void methodC() {
System.out.println("methodC() 시작...");
System.out.println("methodC() 종료...");
}
}
❗ 메소드 호출에 Stack 자료 구조가 사용된다. Last In First Out!
✅ 메소드의 호출 흐름을 이해할 수 있다.
1-2. 전달인자(argument)와 매개변수(parameter)
- 전달인자(argument)란 메소드간에 공유해야 하는 값이 존재할 경우 호출 시 사용하는 괄호를 이용해 값을 전달하는데 여기서 전달하는 그 값을 뜻한다.
- 매개변수(parameter)란 메소드 선언부 괄호 안에 전달인자를 받기 위해 선언하는 변수이다. 아래 선언된 testMethod에서 (int year)가 바로 매개변수이다.
- testMethod 내부의 int year = 1995;는 매개변수 (int year)와 중복된 이름을 사용한 컴파일 에러의 예이다.
public void testMethod(int year) {
// int year = 1995;
System.out.println("당신의 출생년도는 " + year + "년입니다.");
}
1-2-1. 전달인자가 하나일 때
A. 전달인자를 통한 값 전달
- 선언된 매개변수가 int형 하나이기 때문에 String형 "2000", (1991, 1992, 1993) 여러 개의 정수값, 또는 빈 ()값을 호출하면 컴파일 에러가 발생한다.
public static void main(String[] args) {
Method03 mthd = new Method03();
mthd.testMethod(2000);
// mthd.testMethod("2000");
// mthd.testMethod(2000, 2001, 2002);
// mthd.testMethod();
}
당신의 출생년도는 2000년입니다.
B. 변수에 저장한 값 전달
- 필요 시 자동 형변환 또는 강제 형변환을 이용하여 값을 전달할 수 있다.
public static void main(String[] args) {
int year = 1999;
mthd.testMethod(year);
long longYear = 1998L;
mthd.testMethod((int)longYear);
}
당신의 출생년도는 1999년입니다.
당신의 출생년도는 1998년입니다.
C. 연산 결과를 이용한 값 전달
- 변수 year와 연산을 통해서도 원하는 값을 유도할 수 있다.
public static void main(String[] args) {
mthd.testMethod(year / 2 * 2);
}
당신의 출생년도는 1998년입니다.
1-2-2. 전달인자 여러 개일 때
- 선언한 매개변수의 순서에 따라 호출하여야 한다. 그렇지 않으면 컴파일 에러가 발생한다.
- 메인 메소드에 별도 변수를 만들어 값을 지정하고 호출할 수도 있다. 아래 예시 코드에서 String name, int year 등이 두 번 나올 수 있었던 이유는 각각 다른 메소드에 속해 있기 때문이다.
- 매개변수 역시 일종의 지역변수로 분류된다. 지역변수는 지역변수 스코프에 따라 선언된 메소드 블럭 내부에서만 사용이 가능하다.
- final 키워드를 붙여 상수 사용 가능하며, 상수 특징 따라 초기화 이후에 값 변경은 불가하다. 매개변수에서 상수 네이밍은 소문자든 대문자든 사용하는 편이다. 변수명을 필히 대문자로 작성하였던 상수 네이밍 규칙을 선택적으로 따르고 있는 것이다.
- 매개변수에서 사용 가능한 개수, 자료형의 제한은 없다.
package com.reminder.method;
public class Method04 {
public static void main(String[] args) {
Method04 mthd = new Method04();
mthd.testMethod("경제학", 1, 'A');
String name = "철학";
int year = 3;
final char grade = 'B';
mthd.testMethod(name, year, grade);
}
public void testMethod(String name, int year, final char grade) {
System.out.println("당신의 학과는 " + name + "과이고, 학년은 " + year + "학년이며, 학점은 " + grade + "입니다.");
}
}
당신의 학과는 경제학과이고, 학년은 1학년이며, 학점은 A입니다.
당신의 학과는 철학과이고, 학년은 3학년이며, 학점은 B입니다.
✅ 전달인자와 매개변수의 의미를 이해할 수 있다.
1-3. 리턴값
- 리턴(return)은 현재까지 진행한 메소드를 강제 종료하고 자신이 호출된 구문으로 복귀하도록 하는 명령어이다. 모든 메소드에 존재한다.
- 명령어 return은 메소드 가장 마지막에 작성되어야 하며, 만일 return 뒤로 출력문 등이 온다면 Unreachable code라는 컴파일 에러가 발생한다.
- void 메소드의 경우 return;을 작성하지 않아도 컴파일러가 자동으로 추가하고 읽는다. void란 아무런 반환 값도 가지지 않는다는 뜻이다.
- 반환 값이 없는 void의 경우가 아니라면, 즉, 반환 값이 있는 경우라면 return; 구문을 반드시 명시하여야 한다.
- 이처럼 return 명령을 통해 호출된 구문으로 돌아갈 때에 값을 가지고 복귀할 수가 있다. 이때 가져가는 값을 리턴값이라고 한다.
❗ return 3;
==메소드를 호출한 곳으로 3을 돌려보낸다.
- mthd.testMethod();는 void 메소드가 있을 때 사용하던 것으로, 여기서는 값은 불러왔으나 출력으로 이어지지 않는 예이다.
- 저장된 문자열 값을 출력하기 위해서는 A. 변수에 담아서 출력, B. 출력문에서 바로 출력이 가능하다.
package com.reminder.method;
public class Method05 {
public static void main(String[] args) {
Method05 mthd = new Method05();
// mthd.testMethod();
/* A. 변수에 담아 출력 */
String returnText = mthd.testMethod();
System.out.println(returnText);
/* B. 바로 출력 */
System.out.println(mthd.testMethod());
}
public String testMethod() {
return "Hello, hello!";
}
}
Hello, hello!
Hello, hello!
- 매개변수도 존재하고, 리턴값도 존재한다는 가정하에 만들어 볼 수 있는 사칙연산 계산기 코드이다.
- void 대신 int형을 선언하였으므로 return; 값을 명시해야 한다.
package com.reminder.method;
public class Method06 {
public static void main(String[] args) {
Method06 mthd = new Method06();
int i = 100;
int j = 200;
/* 덧셈 - 변수 이용*/
System.out.println(mthd.plusNumbers(i, j));
/* 뺄셈 - 변수 이용 */
System.out.println(mthd.minusNumbers(i, j));
/* 곱셈 - 출력문에서 별도 값 선언 */
System.out.println(mthd.multipleNumbers(2, 3));
/* 나눗셈 - 출력문에서 별도 값 선언 */
System.out.println(mthd.divideNumbers(10, 2));
}
public int plusNumbers(int first, int second) {
return first + second;
}
public int minusNumbers(int first, int second) {
return first - second;
}
public int multipleNumbers(int first, int second) {
return first * second;
}
public int divideNumbers(int first, int second) {
return first / second;
}
}
✅ return과 반환값의 의미를 이해할 수 있다.
1-4. static 메소드
- static 메소드를 호출할 때는 아래처럼 쓰인다.
❗ static 메소드 호출 방법
클래스명.메소드명();
- 같은 클래스 안에 있는 static 메소드를 불러올 때는 클래스명 생략 가능하다.
package com.reminder.method;
public class Method07 {
public static void main(String[] args) {
System.out.println("10과 20의 합 = " + Method07.sumNumbers(10, 20));
/* 동일한 클래스 안에 작성한 static 메소드는 클래스명 생략 가능 */
System.out.println("10과 20의 합 = " + sumNumbers(10, 20));
}
public static int sumNumbers(int first, int second) {
return first + second;
}
}
10과 20의 합 = 30
10과 20의 합 = 30
- Calculator.java 파일이 같은 패키지 안에 따로 생성된 상황이라고 가정하자. 각각 최소값, 최대값 구하는 int형 메소드 / static int형 메소드를 포함하고 있는 모습이다.
package com.reminder.method;
public class Calculator {
/**
* <pre>
* 매개변수로 전달 받은 두 수를 비교하여 더 작은 값을 가진 정수를 반환
* 값이 같은 경우에 대해서는 처리하지 않는다
* </pre>
* @param first 최소값 비교를 위한 첫 번째 정수
* @param second 최소값 비교를 위한 두 번째 정수
* @return 두 수 중 작은 값을 정수형으로 반환
* */
public int minNumberOf(int first, int second) {
return first > second ? second : first;
}
/**
* <pre>
* 매개변수로 전달 받은 두 수를 비교하여 더 큰 값을 가진 정수를 반환
* 값이 같은 경우에 대해서는 처리하지 않는다
* </pre>
* @param first 최대값 비교를 위한 첫 번째 정수
* @param second 최대값 비교를 위한 두 번째 정수
* @return 두 수 중 큰 값을 정수형으로 반환
* */
public static int maxNumberOf(int first, int second) {
return first > second ? first : second;
}
}
A. non-static 메소드 호출
- 속해 있는 클래스가 다르지만, 호출 및 출력 방법은 다름이 없다.
- 객체 선언한다. 클래스명 사용할이름 = new 클래스명();
- 호출한다. 사용할이름.메소드명();
Calculator calc = new Calculator();
int min = calc.minNumberOf(first, second);
System.out.println("두 수 중 최소값 = " + min);
B. static 메소드 호출
- 다른 클래스에 작성된 static 메소드 호출 시에는 클래스명.메소드명(); 형식을 엄수한다. 클래스명을 반드시 기술해야 하는 것이다.
- 같은 클래스 안의 메소드를 사용하는 경우가 아니기 때문에 maxNumberOf(first, second);는 오류이다.
- static 메소드를 non-static 메소드처럼 사용할이름.메소드명(); 형태로 출력할 순 있으나 사용 제한 대상이다. 시스템이 복잡해질수록 이런 에러를 찾기 힘들어진다.
int max = Calculator.maxNumberOf(first, second);
System.out.println("두 수 중 최대값 = " + max);
/* static 메소드를 non-static 메소드처럼 호출한 예
* 권장되지 않는다.
*/
int max2 = calc.maxNumberOf(first, second);
System.out.println("두 수 중 최대값 = " + max);
✅ non-static 메소드에 맞춰 호출할 수 있다.
✅ static 메소드에 맞춰 호출할 수 있다.
2. 패키지와 임포트
2-1. 패키지(package)
- 서로 관련 있는 클래스 또는 인터페이스 그룹을 말한다.
- 클래스명은 앞에 있는 패키지명까지 포함한 것이다. 아래 예시에서 클래스명은 com.reminder.method.Method08.java가 된다. 짧게 쓸 수 있는 이유는 동일한 패키지상이었기 때문이다.
package com.reminder.method;
public class Method08 { }
- 반대로 상이한 패키지에 속한 클래스를 사용하려는 경우에는 클래스명 앞에 패키지명을 명시해야 한다.
- 이 경우에도 non-static 또는 static에 따라 달리 적용한다.
package com.reminder.package_and_import;
public class Package01 {
public static void main(String[] args) {
com.reminder.method.Calculator calc = new com.reminder.method.Calculator();
/* non-static method */
int min = calc.minNumberOf(0, 10);
System.out.println("0과 10 중 최소값 = " + min);
/* static method */
int max = com.reminder.method.Calculator.maxNumberOf(0, 10);
System.out.println("0과 10 중 최대값 = " + max);
}
}
2-2. 임포트(impot)
- 다른 패키지에 속한 클래스를 사용하기 위해서는 클래스 풀네임을 부르거나 임포트를 선언하여 사용할 수 있다.
- 패키지명부터 클래스명에 이르는 긴 이름을 일일이 선언하기에 번거롭다. 이 경우 대신할 수 있는 것이 바로 import 사용이다. import를 사용하면 패키지명을 생략하고 쓸 수 있다.
- import는 어떤 패키지에 있는 클래스를 사용할 것인지 미리 선언하는 효과를 가진다.
❗ import.com. ... *;
*는 '모든'이라는 뜻을 가진다.
- 허용되지 않는 클래스명을 입력하면 컴파일 에러가 발생하는데, 이 상태에서 단축키 ctrl + shift + o 버튼을 누르면 필요한 import 구문이 상단의 package와 class 구문 사이에 출력되는 것을 볼 수 있다.
package com.reminder.package_and_import;
import com.reminder.method.Calculator;
public class Import01 {
❗ 단축키 ctrl + shift + o
필요한 import문을 불러오는 단축키이다.
package com.reminder.package_and_import;
import com.reminder.method.Calculator;
public class Import01 {
public static void main(String[] args) {
Calculator calc = new Calculator();
int min = calc.minNumberOf(10, 20);
System.out.println("10과 20 중 최소값 = " + min);
int max = Calculator.maxNumberOf(10, 20);
System.out.println("10과 20 중 최대값 = " + max);
}
}
10과 20 중 최소값 = 10
10과 20 중 최대값 = 20
✅ 패키지의 의미를 이해할 수 있다.
✅ import의 의미를 이해할 수 있다.
'Java' 카테고리의 다른 글
메소드 수업 practice (0) | 2021.12.23 |
---|---|
변수 수업 practice (0) | 2021.12.23 |
[JAVA] 2. 연산자 (0) | 2021.12.21 |
[JAVA] 1-2. 변수 명명 규칙, 상수, 오버플로우, 형변환 (0) | 2021.12.20 |
[자바의 정석] Ch 2. 변수 예제 응용 학습 (0) | 2021.12.19 |