[JAVA]메서드(Method)란?

@욕심쟁이

·

2020. 8. 11. 12:46

반응형

1. 메서드란?

 - 객체의 동작(기능)을 담당하는 요소

 - 반드시 호출되어야만 사용가능

   (특정메서드를 호출하는 메서드 : Caller 메서드)

   (호출당해서 작업을 수행하는 메서드 : Worker 메서드)

 - 메서드 구현부(바디)내에서 작업을 수행하는 도중 호출한 곳으로 되돌아가려면 return문을 사용

   (단, 리턴타입에 따라 return문 뒤에 데이터를 명시할 수도 있고 return문 자체를 생략할수도 있음)

 - 매개변수는 1개 이상의 변수를 선언할 수 있지만 리턴값은 1개만 리턴가능(동시에 2개이상 리턴 불가)

 - 리턴값이 없는 메소드는 리턴타입에 void를 사용

 - 매개변수 메소드가 실행할 떄 필요한 데이터를 외부로 받기위해 사용

 

2. 메서드 정의 기본 문법

메서드명([매개변수]);
[제어자]리턴타입 메서드명([매개변수선언]....){

                      //메서드가 호출되면 실행될 코드들....
                      [return[값]];

}

→ 1) 제어자 :  생략이 가능하며, 차후에 배움

    2) 리턴타입 : 메서드 실행 후 리턴되는 결과값의 데이터타입

                 (리턴값이 없을 때 특수한 데이터타입 void를 사용)

    3) 메서드명 : 호풀할 떄 사용할 이름을 지정. 식별자 작성규칙 적용

    4) 매개변수 : 메서드 호출시 전달할 데이터를 저장할 변수 선언

                     (메소드가 실행할 떄 필요한 데이터를 외부로 받기위해 사용)

                     → 위의 요소가 포함되는 부분을 메서드헤더(선언부)라고 함

                     → 매개변수(Parameter, 파라미터)라고 하며

                         매개변수에 전달할 데이터 전달인자(Argument, 아규먼트) 라고함 

메서드가 호출되면 실행될 코드들이 기술되는부분이며 메서드 바디(구현부)라고함

 

3. 메서드 형태에 따른 분류(정의)

 1) 매개변수도 없고, 리턴값도 없는 메서드

public class Test {

	public static void main(String[] args) {
		
		System.out.println("출력1");
        
		//pr1메세드는 매개변수가 없으므로
		//메서드 호출시 소괄호 내부에 아무 데이터도 전달하지 못함
		
        pr1();
		System.out.println("출력3");
        
		//String result = pr1(); // 리턴타입이 void이므로 저장불가 에러!
        
        
	}//main()메서드 끝
	
    //1) 매개변수도 없고, 리턴값도 없는 메서드
	//리턴값이 없으므로, 리턴타입 부분에 특수 자료형인 void를 명시
	//매개변수가 없으므로 메서드 선언부 소괄호() 안을 비워둠
	public static void pr1() {
		System.out.println("출력2");
        
        //리턴 타입이 void인 메서드에는 return문을 사용은 가능하나
        //return문 뒤에 아무런 데이터도 지정하지 못함
        return;// 현재 메서드 수행을 종료하고 돌아가라는 의미(생략가능)
	}
    
    /*
    <출력결과>
    출력1
    출력2
    출력3
    */

}

 2) 매개변수는 없고, 리턴값만있는 메서드

public class Ex {

	public static void main(String[] args) {
		//2)매개변수는 없고, 리턴값만있는 메서드 호출
		//=> 메서드 호출시 소괄호 내부에 아무 데이터도 전달하지 못함
        //리턴값이 있으므로 변수에 리턴값을 저장하거나 
		// 출력문등에 바로 사용할 수도 있음
		System.out.println("출력1");
		pr2();
		String result = pr2(); //pr2(); 한번더 호출
		System.out.println("출력 리턴값 : " + result); //물
		System.out.println("출력 리턴값 : " +pr2());//물 pr2(); 메서드로 호출
	}//main()메서드 끝
		
	//2)매개변수는 없고, 리턴값만있는 메서드 호출
	//리턴값이 있으므로, 리턴타입 부분에 특수 자료형을 명시
	//매개변수가 없으므로 메서드 선언부 소괄호() 안을 비워둠
	public static String pr2() {
		System.out.println("출력2");
		String water = "물";
		System.out.println("출력3");
		
		// 리턴값이 있으므로 메서드 작업 종료부분에 return을 명시하고
		//return문 뒤에 리턴할 데이터(변수 또는 리터럴)를 명시
		
        return water;// 변수 지정 또는 

//		return "물"; //리터럴 지정가능
//		=>return할 데이터 타입이 String이므로 리턴타입에 String 명시
		
        
        
        
        /*
        <출력결과>
        출력1
		출력2
        출력3
        출력2
        출력3
        물
        출력2
        출력3
        물
        
        */
	}

}//Ex클래스 끝

 3) 매개변수만 있고, 리턴값은 없는 메서드

public class Ex {

	public static void main(String[] args) {
		
          //3) 매개변수만 있고, 리턴값은 없는 메서드
          System.out.println("보내줄 값 200");
          //-> 매개변수(파라미터)가 있는 매서드에 전달할 값을 전달인자
          //(전달할 데티터는 변수 또는 리터럴)
          pr3(200);// 메서드 호출시 정수 200을전달
          int num = 200;
          pr3(num);
          //pr3();// 오류발생! 매개변수 타입 및 갯수와 일치해야함

		
	}//main()메서드 끝
	
	//3) 매개변수만 있고, 리턴값은 없는 메서드
	//=> 리턴할 값이 없으므로 리턴타입에 void
	//=> 메서드 호출시 정수 1개를 전달하므로 정수를 저장할 매개 변수 선언
	public static void pr3(int num) {
		//=> caller로 부터 전달받은 정수 데이터를 매개변수 num에 저장
		//(매서드 내에서 int num = X; 형태의 문장과 동일하게 사용됨)
		System.out.println("받은값 " + num);
		num -=200;
		System.out.println("받은값을 사용");
		System.out.println("남은값 " + num );
		//리턴타입이 void이므로 리턴할 데이터가 없음
		// return; 형태로 명시하거나 생략가능
		
	}
	
/*
<출력결과>
보내줄 값 200
받은값  200
받은값을 사용
남은값 0
보내줄 값 200
받은값  200
받은값을 사용
남은값 0
*/	

}//Ex클래스 끝



 4) 매개변수도 있고, 리턴값도 있는 메서드

public class Ex {

	public static void main(String[] args) {
		//4) 매개변수도 있고, 리턴값도 있는 메서드
		System.out.println("메서드호출시 넘길값");
		//pr4메서드 호출시 매개변수에 전달할 데이터가 필요!
		String st = pr4(200);
		//메서드 작업 종료후 무자열이 리턴되므로 변수 snack에 저장
		System.out.println("메서드에서 온값 : " + st);
		

		
	}//main()메서드 끝
	
	//4) 매개변수도 있고, 리턴값도 있는 메서드 정의
	//=> return값이 있으므로, 리턴타입 부분에 리턴할 데이터 타입 명시
	//=> 매개변수가 있으므로 소괄호() 안에 전달받은 데이터 저장변수 선언
	public static String pr4(int i) {
		System.out.println("호출시넘겨받은값" +i);
		i -= 200;
		System.out.println("호출받고 뺀값" +i);
		//리턴타입이 String 이므로 String 타입 데이터가 리턴되어야함
		return "Hello";
	}

/*
<출력결과>
메서드호출시 넘길값
호출시넘겨받은값 : 200
호출받고 뺀값 : 0
메서드에서 온값 : Hello
*/

}//Ex클래스 끝



5) 매개변수가 2개 이상인 메서드

public class Ex {

	public static void main(String[] args) {
		
		//5) 매개변수가 2개 이상인 메서드
		//=> 3번 또는 4번유형 메서드에서 전달할 데이터가 2개이상인 경우
		// => 각 데이터를 콤마(,)로 구분하여 전달
		System.out.println("매개변수 1에서 1-1로 바꾸기");
		String str = pr5("매개변수1", 1000);
		System.out.println("메서드에서 준것 : " + str);
		
	}//main()메서드 끝
	

	//5) 매개변수가 2개 이상인 메서드
	//매개변수가 여러개일때 해당 갯수와 타입만큼 변수선언필요
	// 주의사항! 전달된 데이터의 순서대로 선언해야함!
	public static String pr5(String str, int num) {
		//매개변수1과 1000을 전달했으므로 String, int 순으로 변수선언 필요
		System.out.println("매개변수1 = "+ str);
		System.out.println("매개변수2 = "+ num);
		num -=1000;
		str = "매개변수1-1";
		return str; 
		
	}
	/*
    <출력결과>
    매개변수 1에서 1-1로 바꾸기
    매개변수1 = 매개변수1매개변수2 = 1000
	메서드에서 준것 : 매개변수1-1
    */


}//Ex클래스 끝

 

4. 클래스의 메서드(Method)

- 클래스 내에서 객체의 동작을 정의하는것

- 기본적으로 메서드 호출되어야만 사용가능

=> 호출하는 메서드 : Caller, 호출당하는 메서드 : worker

- 주로, 인스턴스 변수의 데이터를 저장하ㄷ거나 꺼내서 사용하는 목적

- 클래스 내의 메서드 구현부에서 클래스의 인스턴스 변수를 사요하면 인스턴스마다 변수 내의 데이터는 달라지지만

   메서드는 동일하므로 코드는 같고, 사용되는 데이터가 달라짐

 

< 메서드 정의 기본 문법 >

[제한자] 리턴타입 메서드명([매개변수선언...]) {
		// 메서드가 호출되면 수행할 코드들...
}
public class Ex {
	public static void main(String[] args) {

		Animal a1 =  new Animal();
		//anumal인스턴스 a1 변수 초기화 
		a1.name = "멍멍이";
		a1.age = 2;
		//anumal인스턴스 a1 인스턴스변수값
		//System.out.println("이름 : "+ a1.name +", 나이 : "+ a1.age);
		
		//Animl인스턴스 a1의 print()메서드 호출
		a1.print();
		
		//anumal인스턴스 a1 cry()메서드호출
		a1.cry();
		
		Animal a2 =  new Animal();
		a2.name = "야옹이";
		a2.age = 3;
		
//		System.out.println("이름 : "+ a2.name +", 나이 : "+ a2.age);
		a1.print();
		a2.cry();
 	}
}

//Animal클래스 정의
//멤버변수 : 이름(name), 나이(age)
class Animal{
	//멤버변수 선언
	String name;
	int age;
	
	//"동물울음소리!" 를 출력하는 메서드 cry()정의
	//=> 매개변수도 없고, 리턴값도 없는 메서드
	
	public void cry(){
		System.out.println("동물울음소리!");
	} 
	
	//인스턴스변수name과 age의 데이터를 출력하는 메서드 prin()정의
	public void print() {
		//클래스 내의 메서드에서는 멤버변수(인스턴스변수)에 자유롭게 접근 가능
		//=> 단순히 변수명만으로 접
		System.out.println("이름: " + name + "나이" + age);
		
	}
} 

/*
<출력결과>
이름: 멍멍이나이2
동물울음소리!
이름: 멍멍이나이2
동물울음소리!
*/

예시1)

public class Ex {
	public static void main(String[] args) {
		
		Calculator myCalc = new Calculator();//Calculator 인스턴스 생성
		
		myCalc.powerOn();
		
		int result1 = myCalc.plus(5, 6); //plus()메서드를 호출하여 2개의 정수 5.6전달 후 덧셈결과를 리턴받아 result1에 저장 후 출력
		System.out.println("result : "+ result1); //11
		
		byte x = 10;
		byte y = 4;
		// divide()메서드를 호출하여 2개의 정수 10,4전달후 
		double result2 =myCalc.divide(x, y);// 리터럴 대신 변수전달 가능
		System.out.println("result : "+result2);
		myCalc.powerOff();
		myCalc.powerOff();
		
		System.out.println("현재전원상태 : " + myCalc.isPowerOn);
		myCalc.changePower();
		System.out.println("현재전원상태 : " + myCalc.isPowerOn);
		
		
	}
}

class Calculator{
	//전원 on/off상태를 저장할 변수 isPowerOn 선언 => boolean타입으로 선언
	
	boolean isPowerOn; // 기본값 false
		
	public void changePower() {
		isPowerOn = !isPowerOn;  //on/off를 한줄로 사용가능
	}
	
	
	public void powerOn() {
		if(!isPowerOn) {//isPowerOn이 false와 동일한 조건식
			System.out.println("전원을 켭니다.");
			isPowerOn = true;
		}else {
			System.out.println("이미 전원이 켜져있습니다.");
			
		}
	}
	
	public void powerOff() {
		if(isPowerOn) { //isPowerOn이 true와 동일한 조건식
			System.out.println("전원을 끕니다.");
			isPowerOn = false;
		}else {
			System.out.println("이미 전원이 꺼져있습니다.");
		}
	}
	
	
	
	public int plus(int x, int y) {
		int result = x + y; //전달받은 2개의 정수x,y의 합을 result에 저장 후 리턴
		return result;
	}
	
	public double divide(int x, int y) {
		//전달반은 2개의 정수 xy의 나눗셈 결과를 result에 저장후 리턴
		//=> 단, 소수정까지 계산을 위해 전달받은 정수를 double타입으로 변환
//		double result = (double)x / (double)y; //int/int = int이므로 정수만계산 
		double result = (double)x / y; //두 피연산자 중 최소 하나의 피연산자는 double타입 변환 필수!
		//2.5
		return result;
	}

}

/*
<출력결과>
전원을 켭니다.
result : 11
result : 2.5
전원을 끕니다.
이미 전원이 꺼져있습니다.
현재전원상태 : false
현재전원상태 : true
*/

예시2)

public class Test {

	public static void main(String[] args) {
		
		
		Account acc1 = new Account();
		acc1.accountNo="111-1111-1111";
		acc1.ownerNamem="홍길동";
		acc1.balance = 100000;
		
		System.out.println("계좌번호 : " + acc1.accountNo);
		System.out.println("예금주명 : " + acc1.ownerNamem);
		System.out.println("현재잔고 : " + acc1.balance + "원");
		
		acc1.deposit(50000);
		
		System.out.println("=====================");
		
		int wi1 = acc1.withdraw(5000);
		System.out.println("출금된 금액 : " + wi1+ "원");

		System.out.println("=====================");
		
		int wi2 = acc1.withdraw(5000000);
		System.out.println("출금된 금액 : " + wi2+ "원");

		System.out.println("=========================================");
		
		
		Account acc2 = new Account();
		acc2.accountNo ="123-1234-1234";
		acc2.ownerNamem ="이순신";
		acc2.balance = 150000000;
		
		acc2.deposit(50000);
		System.out.println("=====================");
		
		int wi3 = acc2.withdraw(15550);
		System.out.println("출금된 금액 : " + wi3 + "원");
		System.out.println("계좌번호 : " + acc2.accountNo);
		System.out.println("예금주명 : " + acc2.ownerNamem);
		System.out.println("현재잔고 : " + acc2.balance + "원");
		
	}

}

/*
 * 은행계좌(Account)클래스 정의
 * 멤버변수
 * 1) 계좌번호(accountNo, 문자열) ex) "111-1111-1111"
 * 2)예금주명(ownerNamem, 문자열) ex)"홍길동
 * 3)현재잔고(balanece, 정수)  ex) 100000
 * 
 */

class Account{
	String accountNo;
	String ownerNamem;
	int balance;
	
	/*메서드 정의
	 * 1) 입금(deposit)
	 *  - 매개변수 1개(정수형 amount)
	 *  - 리턴값 없음
	 *  - 입금할 금액(amount)를 전달받아 현재 잔고(balance)에 누적 후 출력
	 *  
	 * 2) 출금(withdraw)
	 * - 매개변수 1개(정수형 amount - 출금할 금액)
	 * - 리턴값 있음(int - 출금된금액)
	 * - 출금할 금액(amount)를 전달받아 현재 잔고(balance)와 비교
	 * => 만약, 현재잔고보다 출금할 금액이 클경우 출금 불가능 하므로 
	 *    "출금불가! (잔액부족)" 출력
	 *    "출금할 금액 : XXX원, 현재잔고: XXX원" 출력 후 메서드 종료
	 *    =>아니면(현재잔고보다 출금할 금액이 크지않을 경우) 출금 가능하므로 
	 *      출금할 금액만큼 현재잔고(balance)에서 차감한후
	 *      출금할 금액만큼 리턴
	 * */
		
	//입금 메서드
	public void deposit(int amount) {
		balance += amount;
		System.out.println("입금된 금액 : " + amount + "원");
		System.out.println("현재잔고 : " + balance + "원");
	}
	
	public int withdraw(int amount) {
		if(balance < amount) {
			System.out.println("출금불가! (잔액부족)");
			System.out.println("출금할 금액 : " + amount +"원, "+ "현재 잔고 : " + balance +"원");
			amount = 0;
//			return 0; //amount = 0;으로 만들어서 return 해주거나 return값을 0으로 주거나
		}else {
			balance -= amount;
			System.out.println("출금할 금액 : " + amount +"원, "+ "현재 잔고 : " + balance +"원");
//			return amount;
		}
			return amount;
	}
}
/*
<출력결과>
계좌번호 : 111-1111-1111
예금주명 : 홍길동
현재잔고 : 100000원
입금된 금액 : 50000원
현재잔고 : 150000원
=====================
출금할 금액 : 5000원, 현재 잔고 : 145000원
출금된 금액 : 5000원
=====================
출금불가! (잔액부족)
출금할 금액 : 5000000원, 현재 잔고 : 145000원
출금된 금액 : 0원
=========================================
입금된 금액 : 50000원
현재잔고 : 150050000원
=====================
출금할 금액 : 15550원, 현재 잔고 : 150034450원
출금된 금액 : 15550원
계좌번호 : 123-1234-1234
예금주명 : 이순신
현재잔고 : 150034450원


*/


예시3)

public class Test2 {
	public static void main(String[] args) {
		
		Car c1 = new Car();
		c1.carName = "g80";
		c1.companyName="genesis";
		c1.cc = 2400;
		c1.maxSpeed = 300;
		
		System.out.println("차종 : " + c1.carName);
		System.out.println("제조사 : " + c1.companyName);
		System.out.println("배기량 : " + c1.cc);
		System.out.println("현재속력 : " + c1.speed + "km/h" + "최대속력 : " + c1.maxSpeed + "km/h");
		
		c1.speedUp(150);
		c1.speedDown(20);
		
		System.out.println("======================");
		
		Car c2 = new Car();
		c2.carName = "sonata";
		c2.companyName="hyundai";
		c2.cc = 2000;
		c2.maxSpeed = 200;
		System.out.println("차종 : " + c2.carName);
		System.out.println("제조사 : " + c2.companyName);
		System.out.println("배기량 : " + c2.cc);
		System.out.println("현재속력 : " + c2.speed + "km/h" + "최대속력 : " + c2.maxSpeed + "km/h");
		System.out.println("======================");
		c2.speedUp(50);
		c2.speedUp(100);
		c2.speedUp(100);
		System.out.println("======================");
		c2.speedDown(50);
		c2.speedDown(250);
		
		
	}
}

class Car{
	
	String carName;
	String companyName;
	int cc;
	int maxSpeed;
	int speed;
	
	public void speedUp(int s) {
		speed += s;
		if(maxSpeed < speed) {
			speed = maxSpeed;
			System.out.println( "최대속력 도달!");
		}
		System.out.println("현재속력 : "+speed+"km/h");
	}
	
	
	public void speedDown(int s) {
		speed -= s;
		if(speed < 0) {
			System.out.println("차량정지");
			speed=0;
		}
		System.out.println("현재속력 : "+speed+"km/h");
					
		
	}
	
	
}


/*
 * 자동차(Car)클래스 정의
 * - 자동차 차종(carName, String)
 * - 자동차 브랜드 (companyName , String)
 * - 자동차배기량(cc, int)
 * - 최대속력(maxSpeed, int), 현재속력(speed, int)
 * 
 * 
 * 매서드
 * 1) 속력증가 speedUp()
 * - 증가시킬 속력(s)을 전달 받아 현재 속력(speed)에 누적 후 
 * "현재속력 : xxx km/h"출력
 * 단, 현재속력이 최대속력(maxSpeed)보다 클경우 
 * 현재속력을 최대 속력으로 변경 후 "최대속력 도달!" 출력
 * - 매개변수 1개(증가시킬 속력 s), 리턴값 없음
 * 
 *  2)속력감소 speedDown()
 *  - 감소시킬 속력(s)을 전달받아 현재 속력(speed)에서 차감한 후
 *   "현재속력 : xxx km/h"출력
 *  단, 현재속력이 0보다 작을 경우 현재 속력을 0으로 변경후 "차량 정지!" 출력
 *  - 매개변수 1개(감소시킬 속력 s), 리턴값 없음
 * */
 
 /*
 <출력결과>

차종 : g80
제조사 : genesis
배기량 : 2400
현재속력 : 0km/h최대속력 : 300km/h
현재속력 : 150km/h
현재속력 : 130km/h
======================
차종 : sonata
제조사 : hyundai
배기량 : 2000
현재속력 : 0km/h최대속력 : 200km/h
======================
현재속력 : 50km/h
현재속력 : 150km/h
최대속력 도달!
현재속력 : 200km/h
======================
현재속력 : 150km/h
차량정지
현재속력 : 0km/h
 
 */
반응형

'IT > JAVA' 카테고리의 다른 글

[JAVA] 객체지향프로그래밍(OOP) 2  (0) 2020.08.12
[JAVA] 객체지향프로그래밍(OOP) 1  (0) 2020.08.12
[JAVA] 향상된 for문  (0) 2020.08.07
[JAVA] 다차원 배열  (0) 2020.08.07
[JAVA]삼항연산자(조건연산자)  (0) 2020.07.29