JAVA
자바 기초 : 메소드
- -
핵심개념
- 메소드 : 객체의 동작에 해당하는 {} 블록
- 메소드의 구성 : 메소드는 선언부와 실행블록으로 구성
- 메소드 선언부(=메소드 시그니터)
-리턴타입 : 메소드가 리턴하는 결과의 타입을 표시
-메소드 이름 : 메소드의 기능이 드러나도록 식별자 규칙에 맞게 이름을 지음
-매개변수 선언 : 메소드 실행할 때 필요한 데이터를 받기위한 변수 선언 - 메소드 실행 블록 : 실행할 코드를 작성
- 리턴타입 : 메소드를 실행한 후 결과값의 타입. 리턴값은 없을 수도 있으나 없는 경우 리턴타입의 선언부에 void를 명시해야한다.
ex) powerOn()메소드 -> 리턴값 없음.
void powerOn() {...} ->호출-> powerOn();
ex) divide()메소드 -> 나눗셈의 결과 리턴필요
double divide(int x, int y) {...} ->호출-> double result = devide(10, 20)
*만약 result변수를 int 타입으로 선언 시 double값을 저장할 수 없게되므로 컴파일 에러가 발생 - 메소드 이름 : 자바 식별자 규칙에 맞게 작성.but 주의해야할 점이 존재.
1. 숫자로 시작x, $와_제외 특수문자 사용x
2. 관례적으로 메소드 이름은 소문자
3. 서로 다른 단어가 혼합된 이름일 경우 뒤에오는 단어의 첫글자는 대문자 - 매개 변수 선언 : 메소드 실행에 필요한 데이터를 외부에서 받아 저장할 목적으로 사용. 메소드에 따라 필요 유무가 결정 됨.
ex) powerOn() 메소드 -> 매개변수 필요x
ex) divide() 메소드 -> 매개변수(나눗셈할 두 수) 필요
public class Calculator { //메소드 선언
//메소드 void powerOn() { System.out.println("전원을 켭니다."); } int plus(int x, int y) { int result = x + y; return result; } double divide(int x, int y) { double result = (double)x/y; return result; } void powerOff() { System.out.println("전원을 끕니다."); } } ------------------------------------------------------------------------------------------------------ public class CalculatorEx {
public static void main(String[] args) { //메소드 호출 Calculator myCal = new Calculator(); myCal.powerOn(); int result1 = myCal.plus(5,6); System.out.println("result1 : " + result1); byte x = 10; //매개값의 타입과 매개변수의 타입이 달라도 byte는 int로 자동타입변환이 되어 컴파일에러x byte y = 4; double result2 = myCal.divide(x, y); System.out.println("result2 : " + result2); myCal.powerOff(); } } 전원을 켭니다.
result1 : 11 result2 : 2.5 전원을 끕니다. |
- 매개 변수의 개수를 모를 경우 : 대개 매개 변수의 개수가 정해져있지만, 여러개의 수를 모두 합산하는것과 같은 경우 등과 같이 매개 변수의 개수를 모르는 경우도 존재한다. 이럴때는 매개 변수를 배열 타입으로 선언하거나 배열을 생성하지 않고 값의 목록만 넘겨주는 방식으로 해결을 할 수 있다.
1. 매개변수를 배열 타입으로 선언
int sum1(int[] values) { ... } //메소드 선언
->메소드 호출 시 배열을 넘겨준다. 배열의 항목 수는 호출할 떄 결정
//메소드 호출
int[] values = {1, 2, 3}
int result1 = sum(values) //배열형 변수를 매개변수로 사용
int result2 = sum(new int[] {1,2,3,4,5}) //직접 배열을 생성하여 매개변수로 사용
2. 배열을 생성하지 않고 값의 목록만 넘겨주는 방식
int sum2(int ... values) {...} //메소드 선언
->매개변수를 ...을 사용해서 선언하게 되면 메소드 호출 시 넘겨준 값에 따라 자동으로 배열이 생성됨
//메소드 호출
int result3 = sum2(1,2,3);
int resulr4 = sum2(1,2,3,4,5);
->...로 선언된 매개변수는 메소드 호출 시 위처럼 쉼표로 나열하거나 아래처럼 직접 배열을 매개값으로 사용해도 됨
int[] values = {1,2,3};
int result1 = sum2(values);
int result2 = sum2(new int[] {1,2,3,4,5})
public class Computer { //매개변수의 개수를 모를 경우 int sum1(int[] values) { int sum=0; for(int i=0; i<values.length;i++) { sum += values[i]; } return sum; } int sum2(int ... values) { int sum=0; for(int i=0; i<values.length; i++) { sum += values[i]; } return sum; } } --------------------------------------------------------------------------------- public class ComputerEx {
public static void main(String[] args) { Computer myCom = new Computer(); //객체생성 int[] values1 = {1,2,3}; int result1 = myCom.sum1(values1); System.out.println("result1 : " + result1); int result2 = myCom.sum1(new int[] {1,2,3,4,5}); System.out.println("result2 : " + result2); int result3 = myCom.sum2(1,2,3); System.out.println("result3 : " + result3); int result4 = myCom.sum2(1,2,3,4,5); System.out.println("result4 : " + result4); } } 실행결과 : result1 : 6
result2 : 15 result3 : 6 result4 : 15 |
- 리턴문 : 리턴값이 있는 메소드는 반드시 리턴문을 이용해서 리턴값을 지정해야한다. 없으면 컴파일 에러 발생. 이때 리턴문의 리턴값은 리턴 타입이거나 리턴타입으로 변환될 수 있어야 한다.
ex) int plus(int x, int y)
byte result = (byte)(x+y); // byte, short타입은 int로 자동타입 변환되어 리턴됨.
return result;
만약 메소드에 리턴값이 없다면 리턴타입으로 void를 사용해야한다. void 선언된 메소드에서의 return문의 역할은 메소드를 강제로 종료하는 역할이며, 리턴문을 생략할 수도 있다.
public class Car {
//필드 int gas; //생성자 //메소드 void setGas(int gas) { //리턴값이 없는 메소드. 매개값을 받아 gas필드값을 변경 this.gas = gas; } boolean isLeftGas() { //리턴값이 boolean인 메소드. gas필드값이 0이면 false, 0이 아니면 true if(gas==0) { System.out.println("gas가 없습니다."); return false; } System.out.println("gas가 있습니다."); return true; } void run() { while(true) { //gas값이 0보다 클 경우 계속해서 while문 실행 if(gas>0) { System.out.println("달립니다.(gas잔량 : " + gas + ")"); gas -=1; //while문이 한 번 루핑할때마다 gas 1씩 감소 }else { System.out.println("멈춥니다.(gas잔량 : " + gas + ")"); return; //run()메소드 강제 종료 } } } } --------------------------------------------------------------------------------------------------- public class CarEx {
public static void main(String[] args) { Car myCar = new Car(); //Car객체 생성 myCar.setGas(5); //Car의 setGas메소드 호출, gas필드 5로 변경 boolean gasState = myCar.isLeftGas(); //Car의 isLeftGas()메소드 호출. 리턴값을 gasState변수에 저장 if(gasState) { //변수값이 true일 경우(0이 아닐 경우) run()메소드 호출 System.out.println("출발합니다."); myCar.run(); } if(myCar.isLeftGas()){//Car의 isLeft메소드 호출 System.out.println("gas를 주입할 필요가 없습니다."); }else { System.out.println("gas를 주입하세요."); } } } gas가 있습니다.
출발합니다. 달립니다.(gas잔량 : 5) 달립니다.(gas잔량 : 4) 달립니다.(gas잔량 : 3) 달립니다.(gas잔량 : 2) 달립니다.(gas잔량 : 1) 멈춥니다.(gas잔량 : 0) gas가 없습니다. gas를 주입하세요. |
- 메소드 호출 : 메소드는 클래스의 내부 또는 외부의 호출에 의해 실행된다.
클래스 내부의 다른 메소드에서 호출할 경우 메소드 이름으로 호출하면된다.
ex)메소드의 리턴값이 없거나(void) 있어도 받고싶지 않은 경우
-> 메소드(매개값,...);
ex)리턴값이 있는 메소드를 호출하고 리턴값을 받고싶은 경우
-> 타입 변수 = 메소드(매개값,...);
public class Calculator { //필드 //생성자 //메소드 int plus(int x, int y) { int result = x + y;
return result; } double avg(int x, int y) { double sum = plus(x,y); //2. plus()메소드 실행, 리턴값 sum변수에 저장 -> 타입 변수 = 메소드(매개값,...) double result = sum/2; //3. 실행 return result; //4. execute()메소드로 리턴값을 줌. } void execute() { double result = avg(7,10); //1. avg()메소드 실행 -> int는 double타입으로 자동변환 / 5. avg()메소드의 리턴값을 받아 println메소드 호출 시 매개값으로 넘겨줌. println("실행결과 : " + result); //7. execute()메소드 종료 } void println(String message) { //6. 매개갮으로 받은 문자열을 콘솔로 출력 System.out.println(message); } } ----------------------------------------------------------------------------------------------------------------------- public class CarEx {
public static void main(String[] args) { Calculator myCalc = new Calculator(); myCalc.execute(); } } 실행결과 : 8.5
|
클래스 외부에서 호출하는 경우 우선 클래스로부터 객체를 생성한 뒤 참조변수를 이용해서 메소드를 호출해야한다. 객체가 생성된 이후에는 참조변수와 함께 .을 이용해 메소드를 호출한다.
ex)클래스 참조변수 = new 클래스(매매값,...);
ex)참조변수.메소드(매개값,...); //리턴값이 없거나 있음에도 받지않는 경우
타입 변수 = 참조변수.메소드(매개값,...); //리턴값이 있고, 리턴값을 받을 경우
public class Car {
//필드 int speed; //생성자 //메소드 int getSpeed() { return speed; } void keyTurnOn() { System.out.println("키를 돌립니다."); } void run() { for(int i=10; i<50; i+=10) { speed = i; System.out.println("달립니다.(시속 : " + speed + "}"); } } } ----------------------------------------------------------------------------------------------- public class CarEx {
public static void main(String[] args) { Car myCar = new Car(); //객체생성 -> 클래스 참조변수 = new 클래스(매개값,...); myCar.keyTurnOn(); //메소드 호출(리턴값x) -> 참조변수.메소드(매개값,...); myCar.run(); int speed = myCar.getSpeed(); //메소드 호출(리턴값o) -> 타입 변수 = 참조변수.메소드(매개값,...); System.out.println("현재속도 : " + speed + "km/h"); } } 실행결과 :
키를 돌립니다. 달립니다.(시속 : 10} 달립니다.(시속 : 20} 달립니다.(시속 : 30} 달립니다.(시속 : 40} 현재속도 : 40km/h |
- 메소드 오버로딩 : 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것을 말한다. 매개값을 다양하게 받아 처리할 수 있도록 하기 위해 사용되며, 메소드 오버로딩을 하기 위해서는 매개변수의 타입, 개수, 순서 중 하나가 달라야 한다는 점이다. 만약 타입, 개수, 순서가 같고 매개 변수의 이름만 다르면 오버로딩이라고 할 수 없다. 또한 리턴 타입만 다르고 매개변수가 같은 경우도 오버로딩이 아닌데, 오버로딩 된 메소드를 호출하는 경우 JVM은 매개값의 타입, 개수, 순서를 보고 메소드를 선택하기 때문에 리턴타입은 메소드를 선택할 때 어떠한 도움도 주지 못하기 때문이다.
ex)int divide(int x, int y){...}
double divide(int a, int b){...} ->오버로딩이 아님. 컴파일에러 발생
public class Calculator {
//필드 //생성자 //메소드 //정사각형의 넓이 double areaRectangle(double width) { return width*width; } //직사각형의 넓이 double areaRectangle(double width, double height) { return width*height; }// ->메소드 오버로딩을 통해 매개값이 1개이면 정사각형 넓이, 2개이면 직사각형의 넓이를 계산하여 리턴 } ------------------------------------------------------------------------------------------------------------ public class CalculatorEx {
public static void main(String[] args) { Calculator myCalc = new Calculator(); //객체 생성 double result1 = myCalc.areaRectangle(10); //정사각형의 넓이 구하기 double result2 = myCalc.areaRectangle(10,20); //직사각형의 넓이 구하기 //결과 출력 System.out.println("정사각형의 넓이 = " + result1); System.out.println("직사각형의 넓이 = " + result2); } } 정사각형의 넓이 = 100.0
직사각형의 넓이 = 200.0 |
'JAVA' 카테고리의 다른 글
자바 기초 : 패키지와 접근 제한자 (0) | 2023.03.08 |
---|---|
자바 기초 : 인스턴스 멤버와 정적 멤버 (0) | 2023.03.07 |
자바 기초 : 생성자 (0) | 2023.03.03 |
자바 기초 : 필드 (0) | 2023.03.02 |
자바 기초 : 객체 지향 프로그래밍 (0) | 2023.03.02 |
Contents
소중한 공감 감사합니다