오늘보다 더 나은 내일의 나에게_

Java 메소드(Method) 본문

JAVA

Java 메소드(Method)

chan_96 2022. 1. 13. 06:16
728x90

메소드(Method)

:어떤 작업을 수행하기 위한 명령문의 집합
=> 해당 작업이 필요할 때마다 호출해서 사용

-매개변수(재료)
-반환 값(받은 결과)

=> 매개변수와 반환 값은 필수는 아님!

메서드의 구조

public static int addNumber(int num1, int num2){
	int result = num1 + num2;
    return result;
}
//public 접근제한자 / int 반환타입/  addNumber 메소드이름 / (int num1, int num2) 매개변수


접근 제한자
 => 접근할 수 있는 범위를 지정
: public, protected, default, private

public 모든 접근 허용
protected 같은 패키지에 있는 객체 상속관계에 있는 객체만 허용
default 같은 패키지에 있는 객체만 허용 (작성하지 않았을 때 기본값)
private 현재 객체 내에서만 허용


정적(static) => 정적 멤버(정적 변수, 정적 메소드) 선언 시 사용
: 클래스에 고정된 멤버, 클래스 로딩이 끝나는 즉시 바로 사용 가능

메모리 구조

Static area static이 붙은 데이터, 전역변수를 저장하는 영역
프로그램의 시작부터 종료가 될 때까지 메모리에 남아있음(어디서든 바로 사용 가능)
Heap area 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등을 저장하는 영역
참조값은 stack 영역에 저장
Stack area 기본자료형(Primitive Type)의 데이터에 해당하는 지역변수를 저장하는 영역
메소드가 호출될 때 메모리에 할당되며 종료되면 해제


반환 타입
: 메소드 실행 후 반환되는 값의 타입 지정
: 반환할 값이 없는 경우에는 void를 작성

메소드이름
: 메소드 호출 시 사용할 이름 지정
: 기능이 무엇인지 예상할 수 있는 이름 작성

매개변수
: 메소드 실행 시 필요한 인자 작성
: 필요한 개수만큼, 필요한 인자의 타입을 맞춰서 작성

반환 값
: 메소드 실행 후 반환해줄 값 작성, 반환하지 않을 경우에는 작성하지 않음
: return 키워드와 같이 작성


더보기
//non-static 메서드 : 참조값을 알아야 호출할 수 있는 메서드
//랜덤 도구(객체, 인스턴스) 생성 - new 키워드 사용
Random rd = new Random();
//random 힙 영역 , rd 스태틱영역

//생성한 도구의 참조값을 알고 있어야지만 사용가능
rd.nextInt();


//Math 클래스의 abs 메서드 사용
//abs : static 메서드
//new 키워드 x -> 객체, 인스턴스 생성 x -> 바로 사용가능
Math.abs(2);​

 


매개변수 O, 반환 값 O

매개변수 : 필요한 개수만큼 작성, 자료형 맞춰주는 것이 중요
반환 값 : return 키워드(필수)와 같이 작성

public static int addNumber(int num1, int num2){
	int result = num1 + num2;
    return result;
}


매개변수 O, 반환 값 X

반환 타입 : 반환 값이 없으면 void

public static void addNumber(int num1, int num2){
	int result = num1 + num2;
    System.out.println("연산결과 : " + result);
}


매개변수 X , 반환 값 X

public static void print(){
    System.out.println("프로그램이 종료되었습니다.");
}

메서드 호출

public static void main(String[] args) {
	addNumber(1, 2);
}
public static int addNumber(int num1, int num2){
	int result = num1 + num2;
    return result;
}
addNumber(1, 2)에서 1이 int num1에 대입, 2가 int num2에 대입
num1 = 1, num2 = 2
addNumber의 return 값으로 3이 출력

public static void main(String[] args) {
	int a = 1;
    int b = 2;
    
    addNumber(a, b);
}
public static int addNumber(int num1, int num2){
	int result = num1 + num2;
    return result;
}
addNumber(a, b)에 a=1, b= 2가 대입
num1 = 1, num2 = 2
addNumber의 return 값으로 3이 출력

메소드 사용하는 이유

: 소스 코드의 가독성이 좋아진다
=> 특정 작업이 필요한 때마다 해당 코드를 작성하면 코드가 굉장히 길어짐 -> 다른 사람이 내 코드를 보기 힘들어짐

: 소스 코드의 재사용성이 좋아진다
=> 특정 코드가 여러 번 사용될 경우 해당 코드를 메소드로 정의해두고 필요할 때마다 호출해서 사용할 수 있음

예제 1 키보드로 입력받은 두 개의 정수를 인자(매개변수)로 넘겨받아 첫 번째 수에서 두 번째 수를 뺀 수를 출력하는 메소드 getMinusVal()을 작성
더보기
package 메서드;

import java.util.Scanner;

public class Ex01_예제 {
	
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 수 : ");
		int num1 = sc.nextInt();
		System.out.print("두번째 수 : ");
		int num2 = sc.nextInt();
		
		getMinusVal(num1, num2);
		
	}
	
	//접근제한자 정적(static) 반환타입 메서드이름(){}
	private static void getMinusVal(int a, int b) {
		System.out.println("결과 : " + (a-b));
	}
}

예제 2 키보드로 입력받은 두 개의 정수를 인자(매개변수)로 넘겨받아 첫 번째 수에서 두 번째 수를 뺀 수의 절댓값을 반환하는 메소드 getAbsoluteVal()을 작성한 후 다음과 같이 출력
더보기
package 메서드;

import java.util.Scanner;

public class Ex01_예제2 {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		System.out.print("첫번째 수 : ");
		int num1 = sc.nextInt();
		System.out.print("두번째 수 : ");
		int num2 = sc.nextInt();
		
		int result = getAbsoluteVal(num1, num2);
		System.out.println("결과 = " + result);
	}
	
	//매개변수 : 두개의 정수(int - 2) 
	//반환값 : 정수
	public static int getAbsoluteVal(int a, int b) {
		// 삼항 연산자 사용
		// int result = a >= b ? a - b : (a - b) * -1; 
		int result = Math.abs(a - b);
		return result;
	}
}

예제 3 배열에 저장된 데이터를 출력. 메소드 arrayToString()을 작성
int[] arr = {1,3,7,2,8,9};

더보기
package 메서드;

public class Ex02_예제3 {
	public static void main(String[] args) {
		int[] arr = {1,3,7,2,8,9};
		
		arrayToString(arr);
	}

	public static void arrayToString(int[] a) {
		for(int i: a) {
			System.out.print(i + " ");
		}
		/*
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
		*/
	}
}

예제 4 크기가 5인 랜덤값(1~20사이 정수)으로 초기화한 배열을 반환하는 메소드 getArr()과 배열에 저장된 숫자 중 중복되는 숫자가 있는지 체크하여 있으면 true 없으면 flase를 반환 하는 메소드 isDuplicate()를 작성한 후 getArr()로 배열을 생성하고 isDuplicate()로 중복 값이 있는지 확인
더보기
package 메서드;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Ex03_예제4 {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		System.out.print("배열의 길이 : ");
		int len = sc.nextInt();
		
		int[] arr = getArr(len);
		
		//toString형식 출력하면 [ ] 안에 출력
		System.out.println(Arrays.toString(arr));
		
		boolean sw = isDuplicate(arr);
		System.out.println("결과 : " + sw);
	}
	
	private static int[] getArr(int len) {
		Random rd = new Random();
		//사용자가 입력한 길이만큼의 배열 생성
		int[] arr = new int[len];
		
		for (int i = 0; i < arr.length; i++) {
			arr[i] = rd.nextInt(20)+1;
		}
		
		return arr;
	} // end of getArr
	
	private static boolean isDuplicate(int[] arr) {
		// boolean sw = false;
		
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = i + 1;j < arr.length; j++) {
				if(arr[i] == arr[j]) {
					return true;
					//return 키워드는 만나게되면 
					//해당 값을 반환하고 메소드를 종료
				}
			}	
		}
		return false;
	}// end of isDuplicate
} // end of class

예제 5 2개의 양수를 받아 2개의 숫자 중 더 큰 수를 반환하는 메소드 largerNumber() 만들기(두 숫자가 같다면 0을 반환)
더보기
package 메서드;

import java.util.Scanner;

public class Ex04_예제5 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 정수입력 : ");
		int num1 = sc.nextInt();
		System.out.print("두번째 정수입력 : ");
		int num2 = sc.nextInt();
		
		int result = largerNumber(num1, num2);
		System.out.println("더 큰수는? >> " + result);
		
	}
	
	public static int largerNumber(int num1, int num2) {
		return num1 > num2 ? num1 : num2;
	}
	
}

예제 5 num2가 num1의 약수인지 확인하여 true 또는 false를 반환하는 isDivisor() 메소드를 구현
int num1 = 10;
int num2 = 2;
더보기
package 메서드;

public class Ex06_예제6 {
	public static void main(String[] args) {
		
		int num1 = 10;
		int num2 = 2;
		
		// is메서드 -> 반환하는 타입이 boolean
		boolean result = isDivisor(num1, num2);
		System.out.println(result);
		
	}
	public static boolean isDivisor(int num1, int num2) {
		boolean result = false;
		//만약, 다음의 조건을 만족한다면
		//num1을 num2로 나눴을 때 나누어 떨어지니?
		//num2가 num1의 약수니?
		//num1이 num2의 배수니?
		
		if(num1 % num2 == 0) {
			result = true;
		}
		return result;
	}

}

예제 6 약수를 구하는 getDivision을 구현
더보기
package 메서드;

public class Ex06_예제6 {
	public static void main(String[] args) {
		
		int num1 = 10;
		int num2 = 2;
		
		// is메서드 -> 반환하는 타입이 boolean
		boolean result = isDivisor(num1, num2);
		System.out.println(result);
		
		// 출력하는 기능이 들어가있는 메서드를 만들자 -> void
		getDivisor(24);
		
		//getSumOfDivisor()메서드
		int num = 10;
		int result2 = getSumOfDivisor(num);
		//리턴타입 -> int
		System.out.println("약수의 합 : " + result2);
		
	}
	public static boolean isDivisor(int num1, int num2) {
		boolean result = false;
		//만약, 다음의 조건을 만족한다면
		//num1을 num2로 나눴을 때 나누어 떨어지니?
		//num2가 num1의 약수니?
		//num1이 num2의 배수니?
		
		if(num1 % num2 == 0) {
			result = true;
		}
		return result;
	}
	public static void getDivisor(int num) {
		String result = "";
		result += num + "의 약수 : ";
		
		for(int i = 1;i <= num;i++) {
			// i가 약수인지 아닌지
			// num%i==0 -> isDivisor
			if(isDivisor(num, i)) {
				result += i + " ";
			}
		}
		System.out.println(result);

예제 7 약수의 합을 구하여 반환하는 getSumOfDivisior()메서드를 구현

더보기
package 메서드;

public class Ex06_예제6 {
	public static void main(String[] args) {
		
		int num1 = 10;
		int num2 = 2;
		
		// is메서드 -> 반환하는 타입이 boolean
		boolean result = isDivisor(num1, num2);
		System.out.println(result);
		
		// 출력하는 기능이 들어가있는 메서드를 만들자 -> void
		getDivisor(24);
		
		//getSumOfDivisor()메서드
		int num = 10;
		int result2 = getSumOfDivisor(num);
		//리턴타입 -> int
		System.out.println(num + "약수의 합 : " + result2);
		
	}
	public static boolean isDivisor(int num1, int num2) {
		boolean result = false;
		//만약, 다음의 조건을 만족한다면
		//num1을 num2로 나눴을 때 나누어 떨어지니?
		//num2가 num1의 약수니?
		//num1이 num2의 배수니?
		
		if(num1 % num2 == 0) {
			result = true;
		}
		return result;
	}
	public static void getDivisor(int num) {
		String result = "";
		result += num + "의 약수 : ";
		//이 result에 24의 약수 (1,2,3,4,6,8,12,24)
		
		for(int i = 1;i <= num;i++) {
			// i가 약수인지 아닌지
			// num%i==0 -> isDivisor
			if(isDivisor(num,i)) {
				result += i + " ";
			}
		}
		System.out.println(result);
		
	}
	public static int getSumOfDivisor(int num){
		int result2 = 0;
		
		for(int i = 1;i <= num;i++){
			if(isDivisor(num, i)){
				result2 += i;
			}		
		}
		return result2; 
	}
}

예제 8 완전수를 출력하는 isPerfectNumber메서드를 출력
완전수 => 자기자신을 제외한 약수의 합이 자기자신과 같은것
더보기

 

package 메서드;

public class Ex06_예제6 {
	public static void main(String[] args) {
		
		int num1 = 10;
		int num2 = 2;
		
		// is메서드 -> 반환하는 타입이 boolean
		boolean result = isDivisor(num1, num2);
		System.out.println(result);
		
		// 출력하는 기능이 들어가있는 메서드를 만들자 -> void
		getDivisor(24);
		
		//getSumOfDivisor()메서드
		int num = 24;
		int result2 = getSumOfDivisor(num);
		//리턴타입 -> int
		System.out.println(num + "약수의 합 : " + result2);
		
		//isPerfectNumber
		// 완전수 => 자기자신을 제외한 약수들의 합이 자기자신과 같은 수
		// 6 -> 1+2+3+6 == 6 -> 완전수
		
		int num3 = 6;
		boolean result3 = isPerfectNumber(num3);
		System.out.println("완전수? >> "+result3);
		
	}
	public static boolean isDivisor(int num1, int num2) {
		boolean result = false;
		//만약, 다음의 조건을 만족한다면
		//num1을 num2로 나눴을 때 나누어 떨어지니?
		//num2가 num1의 약수니?
		//num1이 num2의 배수니?
		
		if(num1 % num2 == 0) {
			result = true;
		}
		return result;
	}
	public static void getDivisor(int num) {
		String result = "";
		result += num + "의 약수 : ";
		//이 result에 24의 약수 (1,2,3,4,6,8,12,24)
		
		for(int i = 1;i <= num;i++) {
			// i가 약수인지 아닌지
			// num%i==0 -> isDivisor
			if(isDivisor(num,i)) {
				result += i + " ";
			}
		}
		System.out.println(result);
		
	}
	public static int getSumOfDivisor(int num){

		int result2 = 0;
		
		for(int i = 1;i <= num;i++){
			if(isDivisor(num, i)){
				result2 += i;
			}		
		}
		return result2; 
	}
	public static boolean isPerfectNumber(int num3) {
		boolean result3 = false;
		//만약, num이 완전수라면 true를 리턴!
		//완전수란?
		//자기자신을 제외한 약수의 합이 자기자신과 같은것
		//완전수 여부를 판단하는 메서드를 만들어주세요
		
		if(getSumOfDivisor(num3)-num3 == num3) {
			return true;
		}
		return result3;
	}
}

예제 9 strartNumber~endNumber까지의 숫자 중 완전수를 출력하는 getPerfectNumber() 메소드를 구현
더보기
package 메서드;

public class Ex06_예제6 {
	public static void main(String[] args) {
		
		int num1 = 10;
		int num2 = 2;
		
		// is메서드 -> 반환하는 타입이 boolean
		boolean result = isDivisor(num1, num2);
		System.out.println(result);
		
		// 출력하는 기능이 들어가있는 메서드를 만들자 -> void
		getDivisor(24);
		
		//getSumOfDivisor()메서드
		int num = 24;
		int result2 = getSumOfDivisor(num);
		//리턴타입 -> int
		System.out.println(num + "약수의 합 : " + result2);
		
		//isPerfectNumber
		// 완전수 => 자기자신을 제외한 약수들의 합이 자기자신과 같은 수
		// 6 -> 1+2+3+6 == 6 -> 완전수
		
		int num3 = 8128;
		boolean result3 = isPerfectNumber(num3);
		System.out.println("완전수? >> " + result3);
		
		int startNumber = 2;
		int endNumber = 1000;
		//2~1000사이의 완전수를 구하자
		getPerfectNumber(startNumber, endNumber);
		
		
	}
	public static boolean isDivisor(int num1, int num2) {
		boolean result = false;
		//만약, 다음의 조건을 만족한다면
		//num1을 num2로 나눴을 때 나누어 떨어지니?
		//num2가 num1의 약수니?
		//num1이 num2의 배수니?
		
		if(num1 % num2 == 0) {
			result = true;
		}
		return result;
	}
	public static void getDivisor(int num) {
		String result = "";
		result += num + "의 약수 : ";
		//이 result에 24의 약수 (1,2,3,4,6,8,12,24)
		
		for(int i = 1;i <= num;i++) {
			// i가 약수인지 아닌지
			// num%i==0 -> isDivisor
			if(isDivisor(num,i)) {
				result += i + " ";
			}
		}
		System.out.println(result);
		
	}
	public static int getSumOfDivisor(int num){

		int result2 = 0;
		
		for(int i = 1;i <= num;i++){
			if(isDivisor(num, i)){
				result2 += i;
			}		
		}
		return result2; 
	}
	public static boolean isPerfectNumber(int num3) {
		boolean result3 = false;
		//만약, num이 완전수라면 true를 리턴!
		//완전수란?
		//자기자신을 제외한 약수의 합이 자기자신과 같은것
		//완전수 여부를 판단하는 메서드를 만들어주세요
		
		if(getSumOfDivisor(num3)-num3 == num3) {
			return true;
		}
		
		return result3;
	}
	public static void getPerfectNumber(int startNumber, int endNumber){
		String result = "";
		result += startNumber+"~"+endNumber+"까지의 완전 수 : ";
	
		for (int i = startNumber; i <= endNumber; i++) {
			if(isPerfectNumber(i)){
				result += i + " ";
			}
		}
		System.out.println(result);
	}
}//end of class

피보나치 수열(Fibonacci)

: 자연상에 존재하는 피보나치 수열

예제 피보나치 수열
몇번째 인지는 변수로 선언! 재귀함수이용하면 간단하게 작성가능!
더보기
package 메서드;

public class Ex07_Fibonacci {
	public static void main(String[] args) {

		int num4 = 10;
		int result4 = fibonacci(num4);
		System.out.println("피보나치 수열의 " + num4 + "번째 항은 " + result4);
	}
	
	public static int fibonacci(int num4) {
		if(num4 == 1) {
			return 1;
		}else if(num4 == 2) {
			return 1;			
		}else {
			return fibonacci(num4 - 2) + fibonacci(num4 - 1);
		}
		//else if사용하게된다면 else에대한 return이 꼭 있어야한다!!
		
	}
}

메소드 오버 로딩(Overloading)

같은 기능, 같은 이름의 메소드를 중복 정의하는 것
*매개변수의 개수나 타입이 달라야 함

메소드 오버 로딩의 조건

-메소드 이름이 같아야 함
-매개변수의 개수, 타입, 순서가 달라야 함
-매개변수는 같고 리턴 타입이 다른 경우는 오버 로딩이 아님
-오버로딩된 메소드는 매개 변수에 의해서만 구별될 수 있음
728x90

'JAVA' 카테고리의 다른 글

Java MVC Pattern  (0) 2022.01.13
Java 객체 배열  (0) 2022.01.13
Java OOP, 생성자  (0) 2022.01.13
Java 배열  (0) 2022.01.13
Java 반복문  (0) 2022.01.13
Comments