'메소드'에 해당되는 글 1건

  1. 2007.09.29 자바 메소드 3

1. 메소드의 정의 및 용법
: 동일한 내용의 코드가 여러차례 반복하여 쓰여질 경우, 그러한 코드를 하나의 이름으로 묶어서 관리할수 있도록 해주는 그룹이라고 정의할수 있겠다. 다음의 예제를 보자.
1//    public class Exam07_01 {
2//        public static void main(String[] args) {
3//           System.out.println("*****");
4//           System.out.println("연습삼아 쳐봤어요.");
5//           System.out.println("*****");
6//           System.out.println("*****");
7//           System.out.println("그만 할께요");
8//           System.out.println("*****");
9//        }
10//    }
위에서 3, 5, 6, 8번째 줄은 반복되는 코드들이다. 이러한 코드들이 간단한 줄일 경우에는 문제가 되지는 않으나, 만약 코드가 10줄, 100줄이 넘어갈 경우에는, 이러한 코드들을 일일이 다 쳐줄수는 없는 일이다.

그렇기 때문에 동일한 소스코드를 하나의 그룹으로 묶어서, 필요할 때마다 그 그룹을 불러오게 되는데, 그 그룹을 바로 메소드라고 할수가 있다.

메소드는 다음과 같은 형식으로 작성을 한다.
접근제한자 지정예약어 결과형리턴값 메소드명 (매개변수들) throws 예외클래스들 {
    내용정의부;
}
이렇게 풀어적어서 적어 놓으니까, 뭐라고 하는지 하나도 모르겠다. 다음과 같은 형식으로 바꿔서 설명하겠다.
1//    public static void view_star() {
2//        System.out.println('*****");
3//    }
1번째 라인에 있는 구문중 public 이라고 적혀 있다. 이것이 바로 접근 제한자라고 부르는데, 여기에는 private, protected, public, package 라는 제한자가 올수가 있다.

그다음에 오는 static 이라는 항목이 지정예약어라고 불리우는 예약어인데, 여기에는 static, final, abstract, synchronized 등이 온다.

이제 다음에 나오는 것이 void 인데, 이게 바로 결과형 리턴값이며, void 는 일반적으로 아무것도 돌려줄 값이 없는 경우에 사용되는 값인데, 메소드에서 어떠한 동작을 수핸한 후에, 되돌려줄 값이 있을 경우, 그 값의 형태를 알려주는 부분이다.

view_star 는 당연히 메소드 명이며, 지금 1번째 라인의 () 안에는 아무것도 없지만, 매개변수들이 들어가는 경우가 생길수가 있다.

그리고 마지막 throws 예외클래스들은 사용이 할때도 있고 안할때도 있으니, 그건 나중에 설명하기로 한다.

그럼 위의 첫번째 예제를 메소드를 사용하여 고쳐 보도록 하자.
1//    public class Exam07_01 {
2//        public static void view_star() {
3//            System.out.println("*****");
4//        }

5//        public static void main(String[] args) {
6//            view_star();
7//            System.out.println("연습삼아 쳐봤어요.");
8//            view_star();
9//            view_star();
10//           System.out.println("그만 할께요");
11//           view_star();
12//        }
13//    }
여기서 중요할 점은, class 밖에다가는, import, package, 또다른 class 이외에는 다른 코드를 사용할수가 없다는 점이다.

즉, 메소드가 단독적으로 class 밖에서 사용할수는 없다는 이야기이다.

2번째 라인 ~ 4번째 라인에서 사용된 메소드를 이용하여, 6, 8, 9, 11번째 라인에서, 메소드명으로 해당 메소드를 호출하여 결과값이 수정전 코드와 똑같게 출력되게 만들어 주었다.


2. 메소드의 종류
메소드의 종류에는 총 3가지가 있으나, 이 파트에서는 2가지만 다루도록 한다.
(1) call by name
: 메소드의 이름에 의해 호출되는 메소드로 특정 매개변수 없이 실행가능하다. 하지만, 다른 방식의 메소드 호출에 비해 기능이 상당히 제한적이다. 이 방식은 이미 결정된 결과를 출력하거나, 고정된 실행을 요구하는 것외에는 사용 할수가 없다.

위에 예제를 든 메소드가 이에 해당한다.

(2) call by value
: 메소드를 이름으로 호출할 때 특정 매개변수를 전달하여 그 값을 기초로 실행하는 방식인데 각 매개변수는 그 개수에 있어서 제한도 없고 자료형에도 제약이 없다. 클래스 형이 사용될수도 있다. 이 경우에는 상당히 동적이라고 말할 수가 있다.

예를 들어 보자.
1//    public class Exam07_02 {
2//        public static void view_star(int y, int x) {
3//           for(int j = 0; j < y; ++j) {
4//               for(int i = 0; i < x; ++i) {
5//                  System.out.print("*");
6//               }
7//               System.out.println();
8//           }
9//           // x = 75;
10//        }    // 행렬 형식의 출력 메소드

11//        public static void main(String[] ar) {
12//           view_star(2, 5);
13//           System.out.println("출력하자");
14//           view_star(3, 3);
15//           view_star(2, 10);
16//           System.out.println("출력된다");
17//           System.out.println("출력되었다");
18//           view_star(4, 7);
19//        }
20//    }
이렇게 매겨변수를 받아, 그 매개변수로 동적으로 실행시킬때 사용할수 있는 방식이 바로 call by value 방식이다.

여기서 생각해야 할 것 하나. 만약, 9번째 라인에 있는 주석을 제거하여 x = 75 라는 코드를 살려두었다고 하여도, 12, 14, 15, 18번째 라인에 있는 매개변수 x 에 해당되는 값들에 영향을 미치지는 않는다.

위의 메소드 영역과, 아래 main 영역은 전혀 차별화된 공간이며 서로 다른 영역이기 때문에 서로간의 값이 영향을 받지 않는다. 이렇게 원본 값이 변하지 않는 것이 call by value 이며, 훗날 배우게 될 call by reference 에서는 원본 값이 변하게 되는데, 이것은 나중에 설명하기로 한다.

(3) call by reference
: 메소드 호출시 매개변수로 사용되는 값이 특정 위치를 참조하는 reference 변수, 차후 설명


3. 결과형 리턴값
메소드를 실행한 후 결과로 되돌려 주는 값을 지칭하며, 이때는 return 예약어를 사용해야 한다.

하지만, 지금까지의 코드들은 대부분 되돌려주는 값이 없었다. 그렇기에 return 이라는 예약어가 생략 가능했었다.

이러한 것에는 여러 종류가 있는데, 이를 살펴보면...
void : 실행 후 돌려줄 결과가 없을 때
원시 타입 자료형 : 8대 자료형
클래스형 : 모든 클래스나 인터페이스 형
위의 예문을 본다면, 2번째 라인에서 void 가 사용되었는데, 이는 되돌려주는 값이 없다는 뜻이며, 이로 인해 return 이 생략이 되었던 것이다. 하지만, 9번째 라인의 주석을 치우고, return; 라는 구문을 추가할수도 있으며, return 이후에 나오는 값을, 되돌려 준다.
public class Exam07_03 {
    public static boolean aaa() {
       return false;
    }

    public static int bbb() {
       return 34;
    }

    public static int ccc(int x, int y) {
       int z = x + y;
       return z;
    }

    public static void main(String[] ar) {
       boolean a = aaa();
       System.out.println("a = " + a);
       int b = bbb();
       System.out.println("b = " + b);
       inc c = ccc(10, 20);
       System.out.println("c = " + c);
    }
}

여기에서는 3가지의 메소드가 사용되어졌다. 첫번째 메소드 aaa() 는 논리형인 boolean 값을 되돌려 주었고, 두번째 메소드 bbb() 에서는 정수형인 int 값을 되돌려 주었다. 세번째 메소드 ccc() 에서는 매개변수 int x, int y 를 받아서, 덧셈을 한후, 그 결과값을 되돌려 주는 기능을 수행한다.

이렇게, 메소드 안에서 어떠한 기능을 수행한후 되돌려 주고픈 값이 있을때, 그때 사용되는게 바로 이 return 이라는 예약어이다.


p.s 위의 글들은, 김승현 강사님열혈강의 Java Programming 의 Round 7-1, 2, 3, 동영상 강좌에 기초한 내용입니다.
:

BLOG main image
아무거나 공부하자!!! by Young79

공지사항

카테고리

분류 전체보기 (79)
Programing (29)
English (31)
Graphic (4)
Saying on T"We"tter (15)

최근에 올라온 글

최근에 달린 댓글

글 보관함

달력

«   2024/05   »
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
Total :
Today : Yesterday :