메소드
어떤 특정 작업을 수행하기 위한 명령문의 집합
객체때 더 자세히 배우니 호출 흐름에 대해 이해하는 것이 오늘의 목표
App1에서 다뤘던 것과 비슷해보이지만
App2에서는 메소드에서 호출해보는 것
전달인자(argument)와 매개변수(parameter)를 이용한 메소드 호출
지금까지 우리가 배워온 변수는 지역변수에 해당한다.
1. 지역변수 2. 매개변수 3. 전역변수(필드) 4. 클래스(static)변수
이렇게 있지만 앞으로 차차 배우게 될 것
지역변수는 선언한 메소드 블럭 내부에서만 사용이 가능하다. 이것을 지역변수의 스코프라고 한다.
다른 메소드간 서로 공유해야 하는 값이 존재하는 경우 메소드 호출 시 사용하는 괄호를 이용해서 값을 전달할 수 있다.
이 때 전달하는 값을 전달인자(argumetn)라고 부르고, 메소드 선언부 괄호 안에 전달 받기위해 변수를 매개변수(parameter)라고 부른다.
public static void main(String[] args) {
App3 app3 = new App3();
app3.testMethod(20);
int age = 20;
app3.testMethod(age);
byte byteAge = 10;
app3.testMethod(byteAge);
long longAge = 80;
//app3. testMethod(longAge);
app3. testMethod((int)longAge); //강제 형변환을 이용하여 자료형을 맞춘 후 호출할 수 있다.(데이터손실 위험)
//연산결과를 이용해서 값 전달할 수 있다.
app3.testMethod(age + 3);
}
public void testMethod(int age) {
//int age = 10; //매개변수에서 선언된 변수명과 같은 지역변수를 선언할 수 없다.
System.out.println("당신의 나이는 " + age + "세 입니다.");
}
여러 개의 전달 인자를 이용한 메소드 호출 테스트
매개변수도 일종의 지역변수로 분류된다.
매개변수 역시 final 키워드를 사용할 수 있다.
지역변수에 final 키워드를 붙여 상수를 만드는 것과 동일하다.
final 매개변수는 상수 네이밍 규칙을 선택적으로 따르는 경향이 있다. (써도되고 안써도됨)
public static void main(String[] args) {
App4 app4 = new App4();
app4.testMethod("김모씨", 30, '여');
app4.testMethod("이모씨", 35, '남');
//메소드 주석도 달아주자. 호출구문에 마우스를 올리면 메소드에 대한 설명을 볼 수 있다.
}
/**
* <pre>
* 이름과 나이와 성별을 전달받아 한 번에 출력해주는 기능을 제공합니다.
* @param name 출력할 이름을 전달해주세요.
* @param age 출력할 나이를 전달해주세요.
* @param gender 출력할 성별을 전달해주세요. 성별은 변경되지 않을 것을 보장합니다.
*/
//상단 주석을 달아줌으로 인해 testMethod에 커서를 갖다대면 주석이 뜬다.
public void testMethod(String name, int age, final char gender) {
System.out.println("당신의 이름은 " + name + "이고, 나이는 " + age + "세 이며, 성별은 " + gender + "입니다.");
}
return
return은 현재 메소드를 강제 종료하고 호출한 구문으로 다시 돌아가는 명령어이다.
모든 메소드의 내부에는 return;이 존재함 / 가장 마지막에 작성해야 한다.
-메소드리턴 테스트
public static void main(String[] args) {
//메소드 리턴 테스트
System.out.println("main() 메소드 시작함...");
Application5 app5 = new Application5(); //객체생성
app5.testMethod();
System.out.println("main() 메소드 종료됨...");
}
public void testMethod() {
System.out.println("testMethod() 동작 확인...");
위에서 볼 수 있듯이 void 메소드가 들어가 있기 때문에 return이 없어도 무리없이 호출이 된다.
(void 에서는 알아서 컴파일러가 return을 만들어줌)
-메소드리턴값 테스트
복귀할 때 그냥 복귀할 수도 있지만, 값을 가지고 복귀할 수도 있다.
이때 가지고 가는 값을 "리턴값"이라고 한다.
리턴값을 반환받기 위해서는 메소드 선언부에 리턴 타입을 명시해줘야 한다.
public static void main(String[] args) {
Application6 app6 = new Application6();
app6.testMethod();
String returnTest = app6.testMethod();
System.out.println(returnTest);
System.out.println(app6.testMethod());
호출한 후에 app6.testMethod(); 를 입력하면 아무것도 출력이 되지 않는다.
String 변수를 선언해서 출력하는 방법과, 바로 System.out.println을 써서 출력하는 방법 두 가지가 있다.
-매개변수와 리턴값으로 간단한 계산기 만들기
public int plusTwoNumbers(int first, int second) {
return first + second;
}
public int minusTwoNumbers(int first, int second) {
return first - second;
}
public int multipleTwoNumbers(int first, int second) {
return first * second;
}
public int divideTowNumbers(int first, int second) {
return first / second;
}
먼저 메인메소드 안에서가 아닌, 바깥에서 메소드선언을 먼저 해 준다.
public static void main(String[] args) {
int firstNum = 20;
int secondNum = 10;
Application7 app7 = new Application7();
System.out.println("두 수를 더한 결과 : " + app7.plusTwoNumbers(firstNum, secondNum));
System.out.println("두 수를 뺀 결과 : " + app7.minusTwoNumbers(firstNum, secondNum));
System.out.println("두 수를 곱한 결과 : " + app7.multipleTwoNumbers(firstNum, secondNum));
System.out.println("두 수를 나눈 결과 : " + app7.divideTowNumbers(firstNum, secondNum));
이후 메인 메소드에서 바깥에서 적어준 메소드를 호출해서 값을 입력해서 사칙연산 수행
static 메소드
메인 메소드에는 public과 void사이에 static이라는 키워드가 있다.
static 메소드를 호출하는 방법이 기존과는 조금 다르다.
클래스명.메소드명();
기존에는
클래스명 클래스이름 = new 클래스명();
클래스이름.메소드명(); 이렇게 해줬다면 중간부분이 생략된 거나 마찬가지다. (나의 생각..)
public static void main(String[] args) {
System.out.println("10과 20의 합 : " + Application8.SumTwoNumbers(10, 20));
System.out.println("20과 30의 합 : " + SumTwoNumbers(20, 30));
}
public static int SumTwoNumbers(int first, int second) {
return first + second;
}
"10과 20의 합" 출력에서 호출을 해줬기 때문에
두 번째 "20과 30의 합"에서는 클래스명은 생략이 가능하다. (같은 클래스 내일 경우!)
-다른 클래스에서 작성한 메소드 호출
동일한 패키지에 있는 다른 클래스에서 메소드를 호출하는 방법이다.
public class Calculator {
public int minNumberOf(int first, int second) {
return first > second ? second : first;
}
public static int maxNumberOf(int first, int second) {
return first > second ? first : second;
}
}
Calculator라는 클래스에서 최소값, 최대값을 구하는 메소드를 선언했다.
비교연산자를 사용해서 삼항연산자 생성함.
메인메소드(출력해야하는 클래스)로 와서 non-static과 static이 있는 메소드 둘다 호출해준다.
public static void main(String[] args) {
int first = 100;
int second = 50;
//non-static 호출
Calculator calc = new Calculator();
int min = calc.minNumberOf(first, second);
System.out.println("두 수 중 최소값은 : " + min);
//static 호출
int max = Calculator.maxNumberOf(first, second);
System.out.println("두 수 중 최대값은 : " + max);
}
위에서 배웠듯이 static은 클래스명.메소드명(); 이렇게 출력가능하다.
'TIL > Java' 카테고리의 다른 글
[Java] if조건식, Switch (0) | 2021.12.23 |
---|---|
[Java] API, Math, Scanner (0) | 2021.12.23 |
[Java] 연산자(Operator) (0) | 2021.12.20 |
[Java] 변수 규칙, 상수(Constant), 오버플로우, 언더플로우, 데이터 형변환(Type Casting) (0) | 2021.12.20 |
[Java] 변수(Variable), 자료형(Type) (0) | 2021.12.20 |