Welcome to Wesley & Harry's Traveling & Programming

IT Program/Java Basic

자바(java) 메서드(method) 특징 및 예제 이해

Wesley & Harry 2022. 3. 7. 19:27
반응형

이번 포스팅에선 메서드(method)에 대해 알아보도록 하겠습니다.

 

메서드(method)(메소드)

메서드는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것입니다.

 

메서드를 사용하는 이유에 대해 알아보도록 하겠습니다.

메서드 사용이유

  1. 높은 재사용성
  2. 중복된 코드의 제거
  3. 프로그램의 구조화

1. 높은 재사용성

우리는 지금까지 Math.random(), println()과 같은 java API에서 제공하는 메서드들을 거리낌없이 사용해왔습니다.

이처럼 만들어져있는 메서드는 어디에서든 몇번이든 호출이 가능하다는 것을 몸으로 느꼈습니다.

 

2. 중복된 코드의 제거

프로그램을 작성하게 되면 같은 내용의 문장이 여러곳에서 반복해서 나타나곤 합니다.

반복되는 부분을 반복문을 돌리기도 하지만, 반복되는 문장을 묶어서 하나의 메소드로 작성하게 되면 한문장으로 바꿀수 있게됩니다. 수정사항이 발생했을 때도 반복되는 부분을 전부다 고치는 것이 아닌, 메서드부분을 고침으로써 빼먹을 위험과 오류발생의 위험이 줄어들게 됩니다.

예시를 들어보겠습니다.

 

package wesley.java.practice.basic;

public class overlap {
	public static void main(String[] args) {
		int[] wesleyArr = new int[5];
		for (int i = 0; i < wesleyArr.length; i++) {
			wesleyArr[i] = (int) (Math.random()*20);
		}
		printArr(wesleyArr);
		
		int[] wesleyArr2 = {1,2,3,4,5};
		printArr(wesleyArr2);
	}
	
	static void printArr(int[] ArrayResultValue) {
		for (int i = 0; i < ArrayResultValue.length; i++) {
			System.out.printf("%d\t", ArrayResultValue[i]);
		}
		System.out.println();
	}
}

printArr 메소드를 통해 랜덤으로 구성된 배열을 for문을 쓰는 수고를 더 하지 않고 출력하는 코드입니다.

코드를 보시면 wesleyArr는 5칸짜리 배열로써 math.random 메서드를 통해 랜덤의 값이 들어가는 것임을 예측할 수 있습니다.

prinArr(wesleyArr);을 하게되면 wesleyArr[] 배열은 int[] ArrayResultValue값에 들어가게 됩니다.

그다음 출력을 위한 for문과 System.out.println을 실행한후 다시 돌아옵니다.

다음 비교를 위해 int[] wesleyArr2 = {1,2,3,4,5};배열을 선언해 준뒤

printArr(wesleyArr2);를 실행해줍니다.

똑같이 wesleyArr2의 배열이 ArrayResultValue에 값이 들어가고 출력을 해주게 됩니다.

해당 코드가 우리의 생각과 같은지 결과값을 통해 알아봅니다.

여기서 궁금증이 생길 수 있습니다. 저렇게 숫자만 띄워놓으면 무슨소용일까 무슨 배열인지 이름도 같이 써져있으면 좋지 않을까 하는 궁금증 말입니다. 메서드에는 두개의 값이 들어갈수는 없을까?

정답은 있습니다.

위의 코드를 이용해 코드를 바꿔보겠습니다.

 

package wesley.java.practice.basic;

public class overlap {
	public static void main(String[] args) {
		int[] wesleyArr = new int[5];
		for (int i = 0; i < wesleyArr.length; i++) {
			wesleyArr[i] = (int) (Math.random()*20);
		}
		String Name = "wesleyArr의 배열";
		printArr(wesleyArr,Name);
		
		int[] wesleyArr2 = {1,2,3,4,5};
		String Name2 = "wesleyArr2의 배열";
		printArr(wesleyArr2,Name2);
	}
	
	static void printArr(int[] ArrayResultValue,String ArrayName) {
		System.out.println(ArrayName);
		for (int i = 0; i < ArrayResultValue.length; i++) {
			System.out.printf("%d\t", ArrayResultValue[i]);
		}
		System.out.println();
	}
}

해당 코드에서 바뀐점은

String Name = ""; 와

printArr(wesleyArr,Name);

printArr(wesleyArr2,Name2);

그리고 메서드 부분의 String ArrayName이 추가된것을 알 수 있습니다.

간단하게 설명하면 Name에 "wesleyArr의 배열" 이라는 문자열을 넣어줍니다.

printArr(wesleyArr,Name)을 쓰면

welseyArr의 인자가 ArrayResultValue의 값으로 들어가고

Name의 인자가 ArrayName의 값으로 들어간다고 생각하면 편하겠습니다.

 

아래 printArr(wesleyArr2, Name2) 또한 마찬가지입니다.

wesleyArr2의 인자가 ArrayResultValue의 값으로 들어가고

Name2의 인자가 ArrayName의 값으로 들어간다 생각하면 됩니다.

결과값을 확인해 보겠습니다.

잘 작동하는것을 확인할 수 있습니다.

 

3. 프로그램의 구조화

지금까지는 main 메서드 안에 모든 문장을 넣는 식으로 프로그램을 작성해왔습니다.

작은 프로그램을 작성할 때는 별 문제가 없겠지만 양이 많아질수록 너무 길어지는일이 발생한다.

큰 규모의 프로그램에서는 문장들을 여러개의 메서드에 담아 프로그램의 구조를 단순화 시키는 작업이 필요하다.

코드를 통해 알아보겠다.

우리는 위에서 봤듯이 메서드를 통해 print 해보는 과정을 가졌다.

print가 여러번 작동하듯이 해당 배열의 index값을 바꾸는 것을 메서드를 작성한후 여러번 바꿔보도록 하겠다.

아래 코드를 보자.

package wesley.java.practice.basic;


public class overlap {
	public static void main(String[] args) {
		int[] wesleyArr = new int[5];
		for (int i = 0; i < wesleyArr.length; i++) {
			wesleyArr[i] = (int) (Math.random()*20);
		}
		String Name = "wesleyArr의 배열";
		printArr(wesleyArr,Name);
		
		int[] wesleyArr2 = {1,2,3,4,5};
		String Name2 = "wesleyArr2의 배열";
		printArr(wesleyArr2,Name2);
		change(wesleyArr2, 1, 5);
		printArr(wesleyArr2, Name2);
		change(wesleyArr2, 0, 15);
		printArr(wesleyArr2, Name2);
		change(wesleyArr2, 4, 142);
		printArr(wesleyArr2, Name2);
	}
	static void printArr(int[] ArrayResultValue,String ArrayName) {
		System.out.println(ArrayName);
		for (int i = 0; i < ArrayResultValue.length; i++) {
			System.out.printf("%d\t", ArrayResultValue[i]);
		}
		System.out.println();
	}
	static void change(int[] Array, int changeindex, int changeValue) {
		Array[changeindex] = changeValue;
	}
}

추가된 메서드의 형태는 아래와 같다.

static void change(int[] Array, int changeindex, int changeValue) {
Array[changeindex] = changeValue;}

 

메서드의 사용 예시 한줄을 살펴보겠다.

change(wesleyArr2, 1, 5);

welseyArr2라는 이름을 가진 배열이 Array라는 값에 들어가고

1은 changeindex, 5는 changeValue에 들어가게 되는것이다.

해당 값을 가지고

Array[changeindex] = changeValue; 를 통해

1번 인덱스에 5의 값을 넣어주는 행위를 하는 메서드를 만들었다. 

해당 메서드를 만들게 되면 해당 배열의 값을 내 마음대로 간단하게 조작을 할 수가 있다.

해당 코드가 잘 돌아가는지 확인해보도록 하자.

우리의 생각대로 잘 돌아가는것을 확인할 수 있다. 하지만 우리가 간과한부분이 있다.

change(wesleyArr2, 7, 12);
printArr(wesleyArr2, Name2);

7인덱스를 바꿔보면 어떻게될까 역시나 오류가 뜬다.

 java.lang.ArrayIndexOutOfBoundsException

 

많이 보앗던 오류이다. 우리는 이 상황을 없애주기 위해 아래 메서드에 if문을 넣어줄 예정이다.

어떻게 넣어야 오류가 나지 않을까?

아래 코드를 확인해보자.

package wesley.java.practice.basic;


public class overlap {
	public static void main(String[] args) {
		int[] wesleyArr = new int[5];
		for (int i = 0; i < wesleyArr.length; i++) {
			wesleyArr[i] = (int) (Math.random()*20);
		}
		String Name = "wesleyArr의 배열";
		printArr(wesleyArr,Name);
		
		int[] wesleyArr2 = {1,2,3,4,5};
		String Name2 = "wesleyArr2의 배열";
		printArr(wesleyArr2,Name2);
		change(wesleyArr2, 1, 5);
		printArr(wesleyArr2, Name2);
		change(wesleyArr2, 0, 15);
		printArr(wesleyArr2, Name2);
		change(wesleyArr2, 4, 142);
		printArr(wesleyArr2, Name2);
		change(wesleyArr2, 7, 12);
		printArr(wesleyArr2, Name2);
	}
	static void printArr(int[] ArrayResultValue,String ArrayName) {
		System.out.println(ArrayName);
		for (int i = 0; i < ArrayResultValue.length; i++) {
			System.out.printf("%d\t", ArrayResultValue[i]);
		}
		System.out.println();
	}
	static void change(int[] Array, int changeindex, int changeValue) {
		if(changeindex<Array.length) {
			Array[changeindex] = changeValue;			
		}else {
			System.out.println("배열에 벗어나는 길이를 입력하였습니다. 배열의 값이 변하지 않습니다.");
		}
	}
}

change 메소드가

if(changeindex<Array.length) {
Array[changeindex] = changeValue;
}else {
System.out.println("배열에 벗어나는 길이를 입력하였습니다. 배열의 값이 변하지 않습니다.");
}

로 바뀐것을 알 수 잇다.

이렇듯 오류를 미리 처리하는 능력이 프로그래밍에선 중요하다 생각이 들기도한다.

우리는 Array.length가 이젠 무엇인지 알고있다.

wesleyArr2에서는 wseleyArr2.length 는 5이다.

5보다 입력한 changeindex가 작을때만 값을 바꿔주는것이다.

왜 작을때냐 ? 우리는 5칸짜리 배열은 0~4까지의 인덱스값을 가지고 있기 때문이다.

해당 if문만 적으면 오류는 뜨지 않지만 값이 바뀌지 않는 것을 알 수 있다.

값이 바뀌지 않는 것만 보고는 그 이유를 알기 힘들 수 있다.

그렇기 때문에 else문을 통해 그외의 changeindex가 벗어난 경우에 경고문을 출력해주도록 한다.

결과를 확인해보자.

마지막 구문 printArr(wesleyArr2,Name2);로 인해 값이 변하지 않았지만 경고문이 출력으로 인해 문제점을 알수있습니다.

오늘은 메서드에 대한 기본 개념과 특징을 알아보았습니다.

반응형