자바 프로그램은 클래스들의 모음 입니다(하나 이상의 클래스들로 구성)
클래스 : 데이터 선언들과 메소드 정의들로 이루어집니다.
메서드는 클래스의 주요 구성요소입니다.
메서드 : 특정 작업을 수행하는 자바문들의 모음입니다.
결국, 클래스란 메서드와 데이터 선언(변수) 등이 이루어진 것이라고 볼 수 있네요!
자바 프로그램은 이런 클래스들이 여러가지 모여서 저희가 인터넷에서 사용하는 프로그램을 만들어 낸다는 것이네요!!
표준 클래스 라이브러리에 있는 메서드
System.out.println : println 메서드를 호출
메서드 종류(2가지)
→ 특정 작업을 수행하고 결과 값을 반환하는 메서드
→ 특정 작업을 수행하고 결과 값을 반환하지 않는 메서드
String 클래스의 length 메서드 : 문자 길이를 반환합니다.
System.out 객체의 println 메서드 : 주어진 문자열을 출력하고 어떤 값도 반환하지 않습니다.
메서드의 정의
메서드는 값을 반환하느냐 반환하지 않느냐에 따라 다르게 정의됩니다.
모든 메서드는 클래스 내에 포함되고 메서드는 머리부와 몸체로 이루어집니다.
Public 반환유형 메서드이름(형식매개변수 목록) <- 머리부
{
문 1;
문 2;
...
문 n;
return<연산식>
}
Public double computerAverage(int number1, int number2, int number3)
{
return (number1 + number2 + number3) / 3.0;
} //반환값 O
Public void dutchPay(int totalAmount, int count)
{
int dutchpayAmount;
if(count == 0) {
System.out.println("사람들의 수가 0이다");
return;
} else {
dutchpayAmount = totalAmount / count;
System.out.println("일인당 부담 금액 : " + dutchpayAmount);
}
} //반환값 X, 호출만 하고 동작이 끝난다.
위는 dutchPay, computerAverage라는 함수들을 생성하고 값들만 입력하면 원하는 출력이 나올 수 있도록 합니다.
메서드를 사용하는 이유는 main 함수 내에 불필요한 코드의 반복을 없애기 위해 사용할 수 있습니다.
메서드를 잘 이용하면 코드가 엄청 간단해질 수 있겠어요!
메서드 작성
모든 메서드는 특정 작업을 수행한다.
한 메서드가 특정 작업을 어떻게 수행하는지는 보통 알고리즘에 의해 기술된다.
알고리즘은 특정 문제를 풀기 위한 과정을 단계별로 기술한 것이다.
알고리즘은 보통 의사코드(pseudocode)와 순서도(flowchart) 중 하나를 사용하여 기술한다.
의사코드는 한글 문장들과 자바문들을 혼합한 것이다.
의사코드는 자바 언어의 구문 규칙들을 그대로 따르지 않고 코드가 어떻게 수행될 지를 보여 주기에 충분한 구조를 제공한다. 전문 프로그래머들은 의사코드가 자바로 프로그래밍하는 것에 더 가깝기 때문에 의사 코드를 선호한다.
다만 의사코드는 복잡한 조건들을 다루거나 반복의 경우 초보자가 명확하게 기술하기가 쉽지 않다.
이런 경우 자주 사용되는 방법이 순서도이다. 순서도는 어떤 문제를 해결하는데 필요한 논리적인 단계들을 그림으로 표시한 것이다.
음,, 좀 어려운 말이긴 한데 코드를 잘 나타낼 수 있도록 의사코드나 순서도로 나타낼 수 있다는 말인거 같네요!
메서드 예제1
예제) 두 정수들을 넘겨 받아 그 중 작은 정수를 찾는 메서드를 작성
(1) 메서드의 이름 : findMin
(2) 두 정수에 대한 변수 이름 : number1, number2
(3) 두 정수에 대한 데이터 형 : int
메서드 내부에는 자동으로 입력이 되기때문에 따로 변수를 선언할 필요가 없습니다.
package java1212;
public class methodEx01 {
public static int findMin(int number1, int number2) {
int minimum;
if(number1 > number2) {
minimum = number2;
} else {
minimum = number1;
}
return minimum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(findMin(5,3)); // 3이 출력이 됩니다.
int minimum1;
minimum1 = findMin(20, 30);
System.out.println("두 개의 정수 중 작은 값은 : " + minimum1);
//두 개의 정수 중 작은 값은 : 20
}
}
메서드를 사용하는 이유는 이전에 사용했던 함수의 반복을 줄이기 위해서 사용합니다.
나중에는 메서드를 클래스로 바꿔서 호출하여 사용할 수 있습니다.
문제 1번) 더치페이
문제1) 총 금액 중 일인당 부담해야 할 금액을 계산하는 프로그램을 작성하시오.
(메서드 이용 : 메소드 부분에서 더치페이 값을 계산)
totalPay(총금액), count(인원수), dutchPay(더치페이 비용(반환값))
출력)
일인당 부담 금액 :
package java1212;
public class methodEx02 {
public static int dutch(int totalPay, int count) {
//int를 사용하면 return 값이 필요함, void를 사용하면 return 값이 별도로 필요없음.
int dutchPay = (int)Math.ceil((float)totalPay / count);
System.out.println("일인당 부담 금액 : " + dutchPay);
return dutchPay;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
dutch(53000, 3);
}
}
17666
위와 같이 함수를 이용하니 더치페이도 간단하게 되는데요! 이 코드를 이용하면 복잡한 계산 필요없이 친구들이랑 깔끔하게 더치페이 할 수 있겠어요ㅎㅎ
재귀 메서드
보통 메서드는 어떤 작업을 수행하기 위해 다른 메소드를 호출합니다. 그러나 메서드는 자기 자신을 호출할 수 있습니다.
이런 메서드는 재귀 메서드(recursive method)라고 부릅니다. 재귀(recursion)는 한 메서드가 어떤 작업을 수행하기 위해 자기 자신을 호출하는 프로그래밍 기법입니다.
예)
생일날 큰 선물 상자를 받았다고 가정해보자.
선물 상자를 열어보니 그 안에 테니스 라켓과 또 다른 상자가 있다. 두 번째 상자를 열어보니 그 안에 테니스 운동화와 또 다른 상자가 있다. 세 번째 상자를 열어보니 테니스 공이 들어있다.
정의
선물 상자는 선물이다.
혹은 선물 상자는 선물과 선물 상자이다.
숫자 목록은 숫자이다.
혹은 숫자 목록은 숫자, 쉼표(,)와 숫자 목록이다.
58
38, 93, 28, 49
재귀라는 말이 정말 어려운데요,,, 함수 안에 동일한 함수를 넣어 반복적으로 동일한 작업을 수행한다는 말이에요!
sum이라는 함수가 있으면 그 sum 함수 안에 동일한 함수를 집어 넣는 것이에요!
아래의 예시를 한 번 볼까요?
재귀함수 문제 예시) 1~100까지의 합을 구하는 메서드 프로그램 작성하라.(재귀 함수를 이용)
1~N까지의 합을 구하는 문제
1~100까지의 합은 1~99까지 정수들의 합에 100을 더한 것과 같다.
1~99까지의 합은 1~98까지 정수들의 합에 99를 더한 것과 같다.
1~N까지의 합은 1~(N-1)까지 정수들의 합에 N을 더한 것과 같다.
package java1212;
public class methodEx03_01 {
public static int allSum(int num) {
int sum = 0;
if(num > 0) {
sum = num + allSum(num-1);
}
System.out.println("합은 : " + sum);
return sum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
allSum(100);
}
}
package java1212;
public class methodEx03_02 {
public static int findSum(int N) {
int sum;
if(N == 1) {
sum = 1;
} else {
sum = findSum(N-1) + N;
}
return sum;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int number = 100;
System.out.println("1부터 " + number + "사이의 모든 정수들의 합은 "
+ findSum(number) + "이다.");
}
}
5050
위의 두가지 방법을 통해서 1~100까지의 숫자 합을 알 수 있었는데요, 위의 코드를 이해하기 위해서 코드를 한 번 풀어서 설명해 보겠습니다.
첫 번째 코드를 예시로 들겠습니다.(num = 100)
숫자가 0보다 클때, sum이라는 변수에 100 + allSum(99) 라는 값이 입력이 됩니다.
그럼 allSum(99)라는 값이 남는데 이것도 99 + allSum(98) 로 출력이 됩니다.
결국, sum = 100 + 99 + 98 + 97 + 96 + ... + 2 + 1 + allSum(0) 이렇게 코드가 풀어지게 되고 다른 반복문을 쓰지 않아도 원하는 결과가 출력이 됩니다.
오늘은 메서드를 이용해 보았는데요, 메서드의 변수 개수 지정 및 재귀메서드를 사용하는 것이 많이 어렵네요!
문제를 많이 풀어보면서 익혀가야겠어요!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 메서드, 재귀메서드를 이용한 심화 문제 풀이 (0) | 2022.12.13 |
---|---|
[java] 반복문(for, while, do~while) (0) | 2022.12.13 |
[java] 2022.12.09 연습 문제 풀이 (1) | 2022.12.13 |
[java] 다차원 배열 (1) | 2022.12.13 |
[java] 조건문(if, switch문) (0) | 2022.12.12 |