Java공부(코딩)

코딩초보의 Java(자바) 공부 5일차 { 메서드(Method) }

동곤일상 2024. 12. 11. 00:08
반응형
오늘은 가장 기본이 되는
메서드에 대해서 알아보겠습니다.

 


목차

1)메서드

 1-1)메서드사용예시

 1-2)메서드선언

 1-3)메서드호출 , 용어정리

 1-4)반환타입,매개변수 없는 사용 예

 1-5) 반환타입

 1-6)메서드호출과 값 전달

 1-7) 메서드 오버로딩

 1-8) 예제1

 1-9) 예제 (심화)

 

 

 

 

 


1) 메서드란?

자바에서는 함수를 메서드(Method)라고 한다.

더하기 등의 같은 코드가 반복되는 구간을 함수로 정의해 두고

간편하게 써보자.

 


1-1) 메서드 사용 예시

(변경 전)

이와 같은 덧셈을 함수로 만들어보자 (같은코드가 여러번 반복되는 문제)

 

(변경 후)

add메서드를 만들어 a, b를 인자로 받고 연산 결과를 int타입으로 반환

 

너무 수학적으로 생각하진 말고

단순히 무언가를 불러서 사용한다고 생각하자.


1-2) 메서드 선언

private static int add(int a, intb)

제어자 반환타입 메서드이름(매개변수 목록)

{메서드 본문}

이에 대해 설명해 볼게요

 

1)private :

접근제어자로써

다른클래스에서 사용불가능하단 의미

 

2)static :

객체를 생성하지않고

사용하는 정적메서드라는 의미

 

3)int add(inta, intb)

int :

반환타입 지정

void(반환값x) , String , double 등 존재

 

add :

메서드이름

 

(int a , int b):

메서드 호출 시 전달받는 인자

 

return :

실행결과 반환

(void타입이 아니라면 필수)


1-3)메서드 호출과 용어정리

메서드를 호출할 때는 다음과 같이 메서드에 넘기는 값과

매개변수(파라미터) 타입이 맞아야 한다.

물론 넘기는 값과

매개변수(파라미터) 순서와 갯수도 맞아야 한다.

```

호출: call("donggon", 25)

메서드 정의: int call(String name, int age)

 

@ 인수와 매개변수의 타입이 맞아야함 @

인수 ( 인자)

매개변수(파라미터)
"donggon" ,
25 
String name, 
int age

메서드호출 시 인수를 넘기면

파라미터에 대입.

 

1-4) 반환타입,매개변수 없는 경우의 예

위에서 void타입은 return값을 반환하지 않는다했고,

매개변수는 굳이 선언하지않고 

선언부분을 비워두고 정의.

출력결과)

 


1-5) 반환 타입

반환타입이 있다면 

반드시 값을 반환해야 함..!!

다음과같은경우는 두개의 반환값이 있어야하는것이다

true or  false;

return 을 만나면 즉시 메서드를 종료하게 됨


 

1-6) 메서드호출과 값 전달 **

자바는 변수의값을 복사해서 대입한다는 것을 기억하자!!

 

int num1 = 5;

System.out.println("1. changeNumber 호출 전, num1: " + num1);

changeNumber(num1);

System.out.println("4. changeNumber 호출 후, num1: " + num1);

}

 

public static void changeNumber(int num2) {

System.out.println("2. changeNumber 변경 전, num2: " + num2);

num2 = num2 * 2;

System.out.println("3. changeNumber 변경 후, num2: " + num2);

}

 

위에 빨간글씨를 꼭 생각해서!!!

 출력이 어떻게 나올지 생각해보세요!!!!!!

 

 

 

 

 

 

 

@@정답@@ 

1. changeNumber 호출 전, num1: 5

2. changeNumber 변경 전, num2: 5

3. changeNumber 변경 후, num2: 10

4. changeNumber 호출 후, num1: 5        왜 num1이 바뀌지않았을까요??

 

위 코드에서 num1 을 복사해서 num2매개변수에 전달했을 뿐이에요.

num1에는 전혀 영향이 없습니다.

num1에도 영향을 주고싶다면 반환값을 받아 num1에 대입해야합니다!!!

(이게 무슨말인지 잘 모르시겠죠?? 코드로 보여드릴게요)


num1에 영향을 주는 코드

int num1 = 5;

System.out.println("1. changeNumber 호출 전, num1: " + num1);

num1 = changeNumber(num1); //변경3

System.out.println("4. changeNumber 호출 후, num1: " + num1);

}

 

public static int //변경2 changeNumber(int num2)

System.out.println("2. changeNumber 변경 전, num2: " + num2);

num2 = num2 * 2;  

System.out.println("3. changeNumber 변경 후, num2: " + num2);

return num2;  //변경1

}

 

1. changeNumber 호출 전, num1: 5

2. changeNumber 변경 전, num2: 5

3. changeNumber 변경 후, num2: 10

4. changeNumber 호출 후, num1: 10. // num1에도 영향이 있다.!

 

3가지의 변경포인트를 주석으로 달아놨어요.

 

1) int 반환타입을 가지는 메서드로 변경

2) 내부에서 return (num2*2); 을 해준 후

3) num1 에 반환된값을 (복사)대입을 해줍니다!!!

 


1-7)메서드 오버로딩

두수를 곱하는 메서드 , 3개의수를 곱하는 메서드

둘다 곱한다는 의미가 같으므로 sqrt로 만들고 싶다

이럴때 메서드명은 똑같지만 

매개변수만 다르게 선언 가능.

(오버로딩)

 

오버로딩규칙:

반환타입은 신경x

매개변수의 갯수,순서,타입이 

무조건 달라야 오버로딩 성립

 

코드로 보자...!!

public static void main(String[] args) {

int result1 = sqrt(1,4);

int result2 = sqrt(1,4,3);

System.out.println(result1);

System.out.println(result2);

 

}

private static int sqrt(int a , int b) { //(매개변수2개)

return a*b;

}

 

private static int sqrt(int a , int b,int c) { //메서드 오버라이딩 (매개변수가 3개)

return a*b*c;

}

 

이렇게 이름은같지만 매개변수가 다른 메서드를 생성할 수도 있어요!! 

매개변수가 아예 똑같은 경우는 컴파일오류!!

 

int add(int a , int b)double add(int a , int b)  

 

 반환타입이 달라도매개변수(갯수 순서)가 같으면컴파일오류가 발생합니다!!!

 

이거는 오버로딩이 성립하지 않아요!!!

 

 

 


1-8)  예제1

간단하게 메시지(String), 숫자(int)

매개변수로 받고. 메시지를 숫자만큼

반복해서출력해주는 메서드 만들자

tip) void 타입으로 반환값없이 출력만!

 

public static void main(String[] args) {

String a = "안녕!";

String b = "반복문!!";

message_for(a, 5);

message_for(b,3);

 

}

private static void message_for(String message,int a) {

for (int i = 0; i < a; i++) {

System.out.println(message);

}

// 이런 형식으로 void타입으로 (반환값없이) 출력문을 내보낼수가있다!!!!

}

 

출력결과 :

안녕!

안녕!

안녕!

안녕!

안녕!

반복문!!

반복문!!

반복문!!

 


1-9)예제 (심화)

 

입출금에 관한 메서드를 생성해Atm기기느낌으로 만들어보자

입출금 시 --> 입출금 금액과 잔액 출력

** 출금은 잔액 > 출금액 이여야만 할수있음  **

잔액확인 시 --> 현재잔액 표시

 

public static void main(String[] args) {

int balance = 0;

Scanner scan = new Scanner(System.in);

 

System.out.println("## ATM ##");

 

 

while(true) { //false 가될때까지 반복

System.out.println("1.입금 | 2.출금 | 3.잔액확인 | another key:종료 ");

 

System.out.print("입력한 키 : ");

int key = scan.nextInt();

 

if(key == 1 ) {   //1번을 누를 시

System.out.print("입금 금액 : ");

int money = scan.nextInt();  

balance = deposit(balance, money);

System.out.println("현재잔액 : "+balance);

 

}

else if(key == 2) { //2번을 누를 시

System.out.print("출금 금액 : ");

int money = scan.nextInt();

// 위에도money가 있지만 전역변수라 if문을 나가면 없애지는것임 (중복가능)

balance = withdraw(balance, money);

}

else if(key == 3) { //3번을 누를 시

System.out.println("현재잔액 : "+balance);

}

else {

//1 ,2 ,3 번이 아닌 다른키를 눌렀을 시

System.out.println("시스템종료 ");

break

}

}

 

//////////.     메서드 부분 !!!!!!!!!!!!!!

 

}

private static int withdraw(int balance, int money) { //출금메서드

if(money <= balance) {

System.out.println(money+"를 출금 ㅣ");

balance -= money;

return balance;

}

else {  

//가진돈보다 잔액이 적을경우 잔액부족 출력 후

잔액그대로 반환

 

System.out.println("잔액 부족 |")

System.out.println("잔액 : "+balance+" | 출금액 : "+money);

return balance;

}

 

 

}

private static int deposit(int balance , int money) {

System.out.print(money+"를 입금 | ");

balance += money;

return balance;

 

}