1 메서드란
메서드는 멤버 함수 (member function)라고도 불리며, 객체 지향 프로그래밍에서 객체와 관련된 함수로 데이터와 멤버 변수에 대한 접근 권한을 갖는다. 메서드는 클래스 기반 언어에서는 클래스 내부에 정의되며, 프로그램이 실행되고 있을 대 클래스에서 생성된 인스턴스와 관련된 동작을 정의한다.
특정한 작업이나 논리를 구성하는 코드를 괄호로 묶어 놓은 것이다. 메서드는 입력 값을 받아서 내부에서 처리하여 결과를 출력 또는 반환하는 역할을 한다.
메서드는 한 번 정해놓으면 언제든지 호출할 수있고 다른 프로그램에서도 사용한다. 이러한 재사용성은 프로그래머에세 상당히 효율적이고 또 코드의 중복을 피할 수 있게 도와준다. 메서드는 실제 현실에서 누군가에게 하는 '함축적인 지시'와 비슷하다.
2 메서드의 사용
반환타입 메서드명 (타입 변수명, 타입 변수명) {
// 메서드 내부의 동작
return값;
}
① 반환타입은 메서드의 반환값의 타입을 정해주는 것이다. 메서드는 내부의 논리를 통해 처리된 값을 반환하는데 이 반환하는 값의 타입을 미리 정해주는 것이다. 예를 들어 두개의 정수를 입력받아서 두 수의 합을 int형 정수로 반환한다면 반환타입은 int가 될 것이다. 만약 반환하는 값이 없으면 반환타입은 void로 지정한다.
② 메서드명을 자유롭게 지을 수 있으며 소문자로 시작하는 것이 일반적이다. 명사가 여러개 이어진 경우라면 뒤에 오는 명사의 첫 글자를 대문자로 하여 구분한다. 메서드의 이름을 지을 때는 의미가 있는 이름을 사용하는 것이 좋다.
③ 타입과 변수명으로 이루어진 매개변수는 파라미터(Parameter)라고도 불린다. 메서드명 뒤의 괄호 안에 위치하며 메서드에서 입력받을 변수의 개수만큼 선언한다.
④ return문은 메서드 내부의 결과 값을 반환하는 역할을 한다. 반환타입이 void인 경우를 제외하고 반드시 메서드 내부에 return문이 포함되어 있어야 한다. 여러 값을 받을 수 있는 매개변수와는 달리 반환할 수 있는 값은 하나이다.
다음은 사각형의 넓이를 구하는 프로그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package java_practice;
import java.util.Scanner;
public class Method_Multi {
static int mul(int a, int b) { // static이므로 같은 클래스 내에 있어야 함.
int area = a*b;
return area;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("사각형의 가로길이 입력 : ");
int hor = sc.nextInt(); // 20
System.out.println("사각형의 세로길이 입력 : ");
int ver = sc.nextInt(); // 30
System.out.println("넓이 : " + mul(hor , ver)); // 600
}
}
|
cs |
mul 메서드는 static으로 클래스소속이다. 따라서 인스턴스 생성없이도 사용이 가능하다.
main에서 hor와 ver로 입력받은 int 값을 mul메서드의 (매개변수)파라미터에 각각 들어가 메서드 내로 값을 받고 변수 area에 입력되어, area가 return된다.
따라서 가로 20, 세로 30 넓이 600이 출력된다.
3 클래스 메서드와 인스턴스 메서드
메서드도 클래스 메서드와 인스턴스 메서드로 구분한다. 메서드 앞에 static이 붙으면 클래스 메서드, 그렇지 않으면 인스턴스 메서드이다.
class cars {
void boolean powerOn(){
}
static void boolean wiperOn(){
}
}
클래스 메서드는 객체를 생성하지 않아도 호출이 가능하지만 인스턴스 메서드는 객체를 생성해야만 호출한다. 이는 틀래스 메서드는 클래스가 메모리상에 올라갈 때 생성되지만 인스턴스는 객체가 생성되야지만 메모리상에 실제로 존재하기 때문이다.
EX 예제 1.
다음은 인스턴스 메서드를 이용한 삼각형과 사각형넓이를 구하는 프로그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package java_practice;
class Area{
static void mnual() {
System.out.println("현재 사용가능한 함수 목록");
System.out.println("triangle : 삼각형 넓이");
System.out.println("rectangle : 사각형 넓이");
System.out.println("입니다.");
}
double triangle(int a, int b) {
return a*b/2.0;
}
int rectangle(int a, int b) {
return a*b;
}
}
public class Class_MethodArea {
public static void main(String[] args) {
Area.mnual();
// Area.triangle(3,5); // 에러발생! change 'triangle()' to 'static'
// Area.rectangle(3,4); // 에러발생! change 'rectangle()' to 'static'
Area cal = new Area(); // 인스턴스 생성(참조변수 cal)
double tri = cal.triangle(3, 5); // 인스턴스 메서드 호출 가능
int rec = cal.rectangle(3, 4); // 인스턴스 메서드 호출 가능
System.out.printf("삼각형 넓이 : %.1f \n사각형 넓이 : %d", tri , rec);
}
}
|
cs |
출력 결과
현재 사용가능한 함수 목록
triangle : 삼각형 넓이
rectangle : 사각형 넓이
입니다.
삼각형 넓이 : 7.5
사각형 넓이 : 12
클래스를 살펴보면 줄4의 manual 메서드는 클래스 메서드이고, 줄11과 14의 메서드는 인스턴스 메서드이다. 그러므로 인스턴스 생성 전에는 줄22의 클래스 메서드에서만 호출이 가능하고 줄26에서 인스턴스를 생성한 후에는 참조변수 cal을 통해서 모두 다 호출 가능하다.
EX 예제 2.
사각형 가로세로 길이와 넓이를 메서드로 호출하는 프로그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
package java_practice;
class Rectangle{
int width, height; // 줄 7,8의 w와 h값이 저장됨.
void setOperands(int w, int h) { // return 없으므로 void, 인스턴스에서 w와 h값을 받아옴
width = w; // w값이 width에 저장
height = h; // h값이 height에 저장
}
void showWidth() {
System.out.println("가로 : " + width); // 줄4의 width값을 불러옴
}
void showHeight() {
System.out.println("세로 : " + height); // 줄4의 height값을 불러옴
}
void showArea() {
System.out.println("넓이 : " + width*height); // 줄4의 width,height값을 불러옴
}
}
public class Class_MethodRec {
public static void main(String[] args) {
// Rectangle.setOperands(20, 30); // 오류! Change 'setOperands()' to 'static
// Rectangle.showWidth(); // 오류! Change 'showWidth()' to 'static
// Rectangle.showHeight(); // 오류! Change 'showHeight()' to 'static
// Rectangle.showArea(); // 오류! Change 'showArea()' to 'static
Rectangle r1 = new Rectangle(); // 인스턴스 생성(참조변수 r1)
r1.setOperands(20, 30); // w에 20, h에 30입력
r1.showWidth();
r1.showHeight();
r1.showArea();
}
}
|
cs |
class Rectangle 내의 메서드와 변수는 모두 인스턴스 메서드, 인스턴스 변수이다.
따라서 줄25~28까지의 코드들은 오류가 발생하게 된다. 이는 인스턴스를 새로 생성하지 않고 메서드를 호출했기 때문이다. 따라서 오류 참조에 Rectangle 클래스 내의 메서드를 static으로 전환하라는 메세지가 뜬다.
선언해준 값이 여러 인스턴스에서 고정일 경우 static처리 해줘도 되지만 static으로 전환할 경우 인스턴스를 새로 생성하여 출력해줘도 클래스에 입력된 값을 참조하기 때문에 마지막에 입력해준 값으로만 출력된다.
따라서 인스턴스를 생성해준 후 메서드를 호출해주는 편이 용이하다.
EX 예제 3.
복수의 리턴
메소드는 여러 개의 입력 값을 가질 수 있다. 그렇다면 여러 개의 값을 출력하고 싶다면 어떻게 해야 할까. 자바는 문법적으로 그런 기능을 제공하지 않는다. 하나의 변수에 여러개의 값을 담아서 출력하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package java_practice;
class Students{
static String getMember1() {
return "철수";
}
static String getMember2() {
return "영희";
}
static String getMember3() {
return "민수";
}
}
public class Method_Return {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Students.getMember1());
System.out.println(Students.getMember2());
System.out.println(Students.getMember3());
}
}
|
cs |
메소드는 하나의 값만 반환할 수 있기 때문에 여러 값을 출력하기 위해 위와 같이 같은 코드를 세번이나 반복하였다. 하지만 아래 코드를 보면 반환할 여러개의 값을 하나의 변수에 담아 출력하였다. 하나의 변수에 배열로 값을 저장하여 반환하고 있다. 이렇게 배열이 담긴 변수를 이용해서 여러개의 데이터를 처리할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
package java_practice;
import java.util.Arrays;
class Students{
static String[] getMember() {
String[] name = {"철수","영희","민수"};
return name;
}
}
public class Method_Returns {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Arrays.toString(Students.getMember()));
}
}
|
cs |
'Java > Java 기초문법' 카테고리의 다른 글
[JAVA 기초] 자바 오버로딩, 생성자 (0) | 2021.03.10 |
---|---|
[JAVA 기초] 자바 클래스 멤버와 인스턴스 멤버 (0) | 2021.03.09 |
[JAVA 기초] 자바 객체지향언어 - 클래스,인스턴스와 객체 (0) | 2021.03.09 |
[JAVA 기초] 난수생성 (Math.random와 Random 클래스) (0) | 2021.03.08 |
[JAVA 기초] 자바 Swing 클래스와 JOptionPane (0) | 2021.03.07 |
댓글