[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 |