메쏘드(Methods)
작성자 정보
- 작성자 최고관리자
- 작성일
컨텐츠 정보
- 조회 291
본문
메쏘드 개요
메쏘드란 무엇알까요?? 메쏘드는 프로그램의 기능(동작) 입니다.
자동차를 하나의 프로그램으로 생각해봅시다.
자동차에는 여러가지 기능들이 있습니다.
그렇죠?? 예를 들어 시동걸기, 깜박이 켜기, 가속하기, 감속하기, 기어변경 등등..
이와 마찬가지로 다양한 프로그램들 또한 여러가지 기능(동작)들이 존재합니다.
이러한 기능들을 하나하나 분류한 것이 메쏘드 입니다.
메쏘드 구조
리턴 타입(return type)은 메쏘드의 이름 앞에 위치하며, 결과 값의 자료형(Types)을 나타냅니다.
메쏘드명(method name)은 여는 소괄호 ( 앞에 위치하고 말 그대로 이름을 의미합니다.
전달인자(parameters)는 소괄호 안 ( ... )에 위치하며, 외부로부터 전달받은 값을 지닙니다.
메쏘드 블럭(block)은 닫는 소괄호 ( 뒤에 위치하며 중괄호로 둘러싸여{ ... } 있습니다.
메쏘드 만들기
메쏘드는 클래스 블럭 안에 정의하여 만듭니다.
정의된 메쏘드를 호출(실행)하는 방법은 아래와 같습니다.
메쏘드와 프로그램 실행흐름
코드작성을 통해 메쏘드와 프로그램의 실행 흐름에 대해 알아봅시다.
한줄 띄어서 출력하도록 코드를 변경해볼까요?
위에서 작성한 코드에 threeLines()메쏘드를 만들어봅시다.
추가로 threeLines() 메쏘드를 구현합시다. 이 메쏘드는 공백문자 세 줄을 출력하는 기능을 합니다.
만들어진 threeLines() 메쏘드를 호출하여 Line 1: 과 Line 2:사이에 총 4줄 띄어쓰기를 넣도록 하겠습니다.
매개변수(Parameters)
다음으로 매개변수를 사용한 메쏘드를 정의해 보도록 합시다. 아래의 코드를 작성해 주세요.
위 코드에 printSquare()메쏘드를 추가 합니다~~
작성한 메쏘드를 호출해 볼까요??
결과화면에 출력된 4가 보이시나요?? 어떠한 과정을 거쳐 출력 되었는지 분석해봅시다.
먼저 main()메쏘드 블럭내 3번째줄에 printSquare(value);가 수행됩니다.
이로 인하여 printSqure()메쏘드에 전달인자로 value변수가 전달됩니다.
따라서 int x에 value값이 복사되어 매개변수 x의 값은 2가 됩니다.
다음으로 printSquare()메쏘드는 복사된 x값을 가지고 System.out.println(x *x);를 수행합니다.
결과화면값 4는 이와 같은 과정을 통해 출력된 것입니다.
Quiz 01: 아래 소스코드의 실행과정을 설명해주세요.
Quiz 02: 다음 소스코드의 에러원인을 찾아주세요. (힌트: 타입 불일치)
Quiz 03: 아래 코드는 컴파일이 가능한가요?
가능하다면 그이유와 결과값을 알려주세요. (힌트: 자료형 변환)
다수의 매개변수(Multiple Parameters)
다수의 매개변수를 사용한 메쏘드를 만들어 봅시다. 먼저 아래의 코드를 작성해줍니다.
위 코드에 곱셈기능을 하는 times()메쏘드를 추가해봅시다. 이 메쏘드는 매개변수로 두 개의 정수값을 받아 두 수의 곱을 출력합니다. 작성을 완료하였다면 main()메쏘드에서 times()메쏘드를 호출(call)해주세요.
위 결과화면의 수행 과정에 대해 생각봅시다.
단일 매개변수 메쏘드와 크게 다르지 않습니다.
먼저 main()메쏘드 블록의 첫라인에서 2 * 2의 결과값 4가 출력됩니다.
다음으로 둘째 라인에서 times(5, 4); 메쏘드를 호출하고있습니다.
호출에 의해 프로그램의 실행 흐름은 호출된 times() 메쏘드로 넘겨집니다.
times()메쏘드는 main()메쏘드로부터 넘겨진 값 5와 4를 전달인자로 매개변수 a와 b에 각각 복사합니다.
그 뒤,times()메쏘드 블록의 첫라인에서 a * b의 값을 출력하게 됩니다.
결과적으로 (5 * 4)의 결과값인 20이 출력됩니다.
times()메쏘드의 블럭내용이 더이상 없으므로 메쏘드가 종료됩니다.
따라서 프로그램의 실행흐름은 main()메쏘드로 다시 반환되게 됩니다.
실행흐름을 반환받은 main()메쏘드는 times()메쏘드를 호출했던 다음 명령을 수행하게 됩니다.
그러나 times()메쏘드 호출한 다음 수행 내용이 더이상 없기때문에 main()메쏘드 또한 종료되며 이로 인해 모든 프로그램이 종료되게됩니다.
리턴 값(Return Values)
리턴키워드(return)를 사용하여 값을 반환하는 메쏘드를 생성해봅시다.
먼저 값을 반환하는 메쏘드의 형식은 아래와 같습니다.
위 메쏘드는 STATEMENTS를 수행하여 최종적으로 EXPRESSION값을 TYPE형태로 반환합니다. (STATEMENTS 생략가능)
예제코드를 작성하여 이해를 도와볼까요? 이전에 작성했던 Square클래스입니다.
위 코드를 보면, printSquare()메쏘드에서 결과값을 화면에 출력하고있습니다.
이 메쏘드를 리턴값을 가지도록 변경해보겠습니다.
소스코드와 출력결과를 보며 코드의 실행과정을 분석해봅시다.
먼저 main()메쏘드의 첫라인에서 ①square(2)가 호출됩니다.
이로인해 ②square()메쏘드는 전달인자를 매개변수로 대입(int x = 2)받습니다.
그 후 ③x * x의 결과값 4를 반환합니다.
반환값은 ④value 변수에 대입됩니다.
다음으로 ⑤System.out.println()메쏘드에 "value = " + value를 전달인자로 호출합니다.
따라서 화면에 결과값 value = 4가 출력됩니다.
마지막으로 System.out.println()메쏘드를 호출하는데, 전달인자로 "value = " + square(5)를 넘겨줍니다.
여기서 먼저 ⑥sqaure(5)가 호출되어, ⑦전달인자가 매개변수로 대입(int x = 5)됩니다.
그 후 ⑧x * x의 결과값을 반환합니다.
반환값 25는 문자열과 덧셈연산(String Concatenation)이 되어 println()메쏘드의 ⑨전달인자를 최종완성합니다.
그 결과 value = 25가 출력됩니다.
변수의 활동영역(Variables Scope)
서울사는 철수와 부산사는 철수는 동명이인입니다.
서울철수는 서울에서 활동하며, 부산철수는 부산에서 활동합니다.
이와 마찬가지로 변수들은 각각의 활동영역을 가지고 있습니다.
활동영역은 그 변수가 어디에서 선언(define)되었는지에 따라 결정 됩니다.
따라서 이름이 같은 두 변수가 있더라도 변수의 선언된 영역이 다르다면, 활동영역이 다릅니다.
코드를 통해 이해를 돕겠습니다. 아래 코드의 수행결과를 예상해봅시다.
위 코드에서 선언된 변수는 두 가지 입니다.
먼저 main()블럭({...})에 선언된 int x = 5;이고, 다른 하나는 method()블럭에 선언된 int x = 10;입니다.
두 변수는 이름은 같지만 선언 영역이 다르므로, 전혀 다른 변수, 즉 활동역영이 다른 별개의 변수입니다.
매개변수(parameters) 또한 변수(variables)와 마찬가지로, 선언위치에 따라 활동영역이 결정됩니다.
이를 유의하여 아래 코드의 수행결과를 예측해봅시다.
위 코드에서 선언된 변수는 두 가지로서, main()블럭에 선언된 int x = 5;와 method()에 선언된 매개변수 int x 입니다.
(매개변수 또한 변수이기때문..) 두 변수는 이름은 같지만 활동영역이 다른 별개의 변수이므로 아래와 같은 결과가 출력됩니다.
main()블럭 안에서 변수 x는 시작부터 끝까지 5의 값을 저장합니다.
반면 method()의 매개변수 x는 먼저 5값을 전달받아 출력합니다.
다음으로 x값을 제곱하여 저장(x = x * x;)합니다.
이때 main()블럭에 선언된 x는 영향을 받지 않기때문에 계속 5의 값을 유지합니다.
마지막으로 그 값을 출력합니다.
메쏘드란 무엇알까요?? 메쏘드는 프로그램의 기능(동작) 입니다.
자동차를 하나의 프로그램으로 생각해봅시다.
자동차에는 여러가지 기능들이 있습니다.
그렇죠?? 예를 들어 시동걸기, 깜박이 켜기, 가속하기, 감속하기, 기어변경 등등..
이와 마찬가지로 다양한 프로그램들 또한 여러가지 기능(동작)들이 존재합니다.
이러한 기능들을 하나하나 분류한 것이 메쏘드 입니다.
메쏘드 구조
리턴 타입(return type)은 메쏘드의 이름 앞에 위치하며, 결과 값의 자료형(Types)을 나타냅니다.
메쏘드명(method name)은 여는 소괄호 ( 앞에 위치하고 말 그대로 이름을 의미합니다.
전달인자(parameters)는 소괄호 안 ( ... )에 위치하며, 외부로부터 전달받은 값을 지닙니다.
메쏘드 블럭(block)은 닫는 소괄호 ( 뒤에 위치하며 중괄호로 둘러싸여{ ... } 있습니다.
class Methods {
// public static: 두가지 키워드는 나중에 배움. 일단 따라칠것!
// 리턴타입: void - 반환 값이 없음을 의미.
// 메쏘드명: main
// 전달인자: String[] args - 추후 설명.
// 메쏘드블럭: { ... }
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
메쏘드 만들기
메쏘드는 클래스 블럭 안에 정의하여 만듭니다.
class HelloWorld {
// 메쏘드 생성: 리턴타입, 이름, 전달인자, 블럭의 내용을 정의
public static TYPE NAME(PARAMETERS) {
...
}
}
정의된 메쏘드를 호출(실행)하는 방법은 아래와 같습니다.
class HelloWorld {
// 정의된 메쏘드.
public static TYPE NAME() {
...
}
// main 메쏘드: 프로그램 실행의 시작점
public static void main(String[] args) {
NAME(); // 메쏘드 호출.
}
}
메쏘드와 프로그램 실행흐름
코드작성을 통해 메쏘드와 프로그램의 실행 흐름에 대해 알아봅시다.
class NewLine {
public static void main(String[] args) {
System.out.println("Line 1:");
System.out.println("Line 2:");
}
}
한줄 띄어서 출력하도록 코드를 변경해볼까요?
class NewLine {
public static void main(String[] args) {
System.out.println("Line 1:");
System.out.println(""); // 한 줄 띄어쓰기.
System.out.println("Line 2:");
}
}
위에서 작성한 코드에 threeLines()메쏘드를 만들어봅시다.
class NewLine {
// threeLines() 메쏘드 정의.
public static void threeLines() {
// 아직 메쏘드의 동작을 구현하지 않음.
}
public static void main(String[] args) {
System.out.println("Line 1:");
System.out.println(""); // 한 줄 띄어쓰기.
System.out.println("Line 2:");
}
}
추가로 threeLines() 메쏘드를 구현합시다. 이 메쏘드는 공백문자 세 줄을 출력하는 기능을 합니다.
class NewLine {
// threeLines() 메쏘드 정의.
public static void threeLines() {
System.out.println("");
System.out.println("");
System.out.println("");
}
public static void main(String[] args) {
System.out.println("Line 1:");
System.out.println(""); // 한 줄 띄어쓰기.
System.out.println("Line 2:");
}
}
만들어진 threeLines() 메쏘드를 호출하여 Line 1: 과 Line 2:사이에 총 4줄 띄어쓰기를 넣도록 하겠습니다.
class NewLine {
// threeLines() 메쏘드 정의.
public static void threeLines() {
System.out.println(""); // 한 줄 띄어쓰기.
System.out.println(""); // 한 줄 띄어쓰기.
System.out.println(""); // 한 줄 띄어쓰기.
}
public static void main(String[] args) {
System.out.println("Line 1:");
System.out.println(""); // 한 줄 띄어쓰기.
threeLines(); // threeLines() 메쏘드 호출!
System.out.println("Line 2:");
}
}
매개변수(Parameters)
다음으로 매개변수를 사용한 메쏘드를 정의해 보도록 합시다. 아래의 코드를 작성해 주세요.
public class Square {
public static void main(String[] args) {
int value = 2;
System.out.println("value = " + value);
}
}
위 코드에 printSquare()메쏘드를 추가 합니다~~
// 리턴타입: void
// 메쏘드명: printSquare
// 매개변수: int x
public static void printSquare(int x) {
System.out.println(x * x);
}
작성한 메쏘드를 호출해 볼까요??
public class Square {
public static void printSquare(int x) {
System.out.println(x * x); // 매개변수 x의 제곱값을 출력
}
public static void main(String[] args) {
int value = 2;
System.out.println("value = " + value);
printSquare(value); // printSquare() 메쏘드 호출
// value 변수를 전달인자로 넘김
}
}
결과화면에 출력된 4가 보이시나요?? 어떠한 과정을 거쳐 출력 되었는지 분석해봅시다.
먼저 main()메쏘드 블럭내 3번째줄에 printSquare(value);가 수행됩니다.
이로 인하여 printSqure()메쏘드에 전달인자로 value변수가 전달됩니다.
따라서 int x에 value값이 복사되어 매개변수 x의 값은 2가 됩니다.
다음으로 printSquare()메쏘드는 복사된 x값을 가지고 System.out.println(x *x);를 수행합니다.
결과화면값 4는 이와 같은 과정을 통해 출력된 것입니다.
Quiz 01: 아래 소스코드의 실행과정을 설명해주세요.
Public class Square {
public static void printSquare(int x) {
System.out.println(x * x);
}
public static void main(String[] args) {
int value = 2;
System.out.println("value = " + value);
printSquare(value); // printSquare() 메쏘드 호출
// value 변수를 전달인자로 넘김
printSquare(3); // 3을 전달인자로 넘김
printSquare(value * 2); // value * 2의 결과값을 전달인자로 넘김
}
}
Quiz 02: 다음 소스코드의 에러원인을 찾아주세요. (힌트: 타입 불일치)
public class Square2 {
public static void printSquare(int x) {
System.out.println(x * x);
}
public static void main(String[] args) {
printSquare("hello"); // Compile Error
printSquare(5.5); // Compile Error
}
}
Quiz 03: 아래 코드는 컴파일이 가능한가요?
가능하다면 그이유와 결과값을 알려주세요. (힌트: 자료형 변환)
public class Square3 {
public static void printSquare(double x) {
System.out.println(x * x);
}
public static void main(String[] args) {
printSquare(3);
}
}
다수의 매개변수(Multiple Parameters)
다수의 매개변수를 사용한 메쏘드를 만들어 봅시다. 먼저 아래의 코드를 작성해줍니다.
public class Multiply {
public static void main(String[] args) {
System.out.println(2 * 2); // 4가 출력
}
}
위 코드에 곱셈기능을 하는 times()메쏘드를 추가해봅시다. 이 메쏘드는 매개변수로 두 개의 정수값을 받아 두 수의 곱을 출력합니다. 작성을 완료하였다면 main()메쏘드에서 times()메쏘드를 호출(call)해주세요.
public class Multiply {
public static void times(int a, int b) {
System.out.println(a * b); // a * b의 결과 값 출력
}
public static void main(String[] args) {
System.out.println(2 * 2); // 4가 출력
times(5, 4); // times()에 전달인자로 5와 4를 넘기며 메쏘드 호출
}
}
위 결과화면의 수행 과정에 대해 생각봅시다.
단일 매개변수 메쏘드와 크게 다르지 않습니다.
먼저 main()메쏘드 블록의 첫라인에서 2 * 2의 결과값 4가 출력됩니다.
다음으로 둘째 라인에서 times(5, 4); 메쏘드를 호출하고있습니다.
호출에 의해 프로그램의 실행 흐름은 호출된 times() 메쏘드로 넘겨집니다.
times()메쏘드는 main()메쏘드로부터 넘겨진 값 5와 4를 전달인자로 매개변수 a와 b에 각각 복사합니다.
그 뒤,times()메쏘드 블록의 첫라인에서 a * b의 값을 출력하게 됩니다.
결과적으로 (5 * 4)의 결과값인 20이 출력됩니다.
times()메쏘드의 블럭내용이 더이상 없으므로 메쏘드가 종료됩니다.
따라서 프로그램의 실행흐름은 main()메쏘드로 다시 반환되게 됩니다.
실행흐름을 반환받은 main()메쏘드는 times()메쏘드를 호출했던 다음 명령을 수행하게 됩니다.
그러나 times()메쏘드 호출한 다음 수행 내용이 더이상 없기때문에 main()메쏘드 또한 종료되며 이로 인해 모든 프로그램이 종료되게됩니다.
리턴 값(Return Values)
리턴키워드(return)를 사용하여 값을 반환하는 메쏘드를 생성해봅시다.
먼저 값을 반환하는 메쏘드의 형식은 아래와 같습니다.
public static TYPE NAME() {
STATEMENTS; // 메쏘드의 동작내용들..
return EXPRESSION; // 최종 리턴값
}
위 메쏘드는 STATEMENTS를 수행하여 최종적으로 EXPRESSION값을 TYPE형태로 반환합니다. (STATEMENTS 생략가능)
예제코드를 작성하여 이해를 도와볼까요? 이전에 작성했던 Square클래스입니다.
public class Square4 {
public static void printSquare(int x) {
System.out.println(x * x); // 매개변수 x의 제곱값을 출력
}
public static void main(String[] args) {
int value = 2;
System.out.println("value = " + value);
printSquare(value); // printSquare() 메쏘드 호출
// value 변수를 전달인자로 넘김
}
}
위 코드를 보면, printSquare()메쏘드에서 결과값을 화면에 출력하고있습니다.
이 메쏘드를 리턴값을 가지도록 변경해보겠습니다.
public class Square4 {
public static int square(int x) {
return x * x; // 매개변수 x의 제곱값을 반환
}
public static void main(String[] args) {
int value = square(2); // 1: square()메쏘드에 2를 전달.
// 2: 결과값 4가 반환(return)
// 3: 반환값을 value에 대입.
System.out.println("value = " + value); // value 값 출력
System.out.println("value = " + square(5)); // square(5)의 반환 값 출력
}
}
소스코드와 출력결과를 보며 코드의 실행과정을 분석해봅시다.
먼저 main()메쏘드의 첫라인에서 ①square(2)가 호출됩니다.
이로인해 ②square()메쏘드는 전달인자를 매개변수로 대입(int x = 2)받습니다.
그 후 ③x * x의 결과값 4를 반환합니다.
반환값은 ④value 변수에 대입됩니다.
다음으로 ⑤System.out.println()메쏘드에 "value = " + value를 전달인자로 호출합니다.
따라서 화면에 결과값 value = 4가 출력됩니다.
마지막으로 System.out.println()메쏘드를 호출하는데, 전달인자로 "value = " + square(5)를 넘겨줍니다.
여기서 먼저 ⑥sqaure(5)가 호출되어, ⑦전달인자가 매개변수로 대입(int x = 5)됩니다.
그 후 ⑧x * x의 결과값을 반환합니다.
반환값 25는 문자열과 덧셈연산(String Concatenation)이 되어 println()메쏘드의 ⑨전달인자를 최종완성합니다.
그 결과 value = 25가 출력됩니다.
변수의 활동영역(Variables Scope)
서울사는 철수와 부산사는 철수는 동명이인입니다.
서울철수는 서울에서 활동하며, 부산철수는 부산에서 활동합니다.
이와 마찬가지로 변수들은 각각의 활동영역을 가지고 있습니다.
활동영역은 그 변수가 어디에서 선언(define)되었는지에 따라 결정 됩니다.
따라서 이름이 같은 두 변수가 있더라도 변수의 선언된 영역이 다르다면, 활동영역이 다릅니다.
코드를 통해 이해를 돕겠습니다. 아래 코드의 수행결과를 예상해봅시다.
public class VariableScope {
public static void method() {
int x = 10;
System.out.println("method x = " + x);
}
public static void main(String[] args) {
int x = 5;
System.out.println("main x = " + x);
method();
}
}
위 코드에서 선언된 변수는 두 가지 입니다.
먼저 main()블럭({...})에 선언된 int x = 5;이고, 다른 하나는 method()블럭에 선언된 int x = 10;입니다.
두 변수는 이름은 같지만 선언 영역이 다르므로, 전혀 다른 변수, 즉 활동역영이 다른 별개의 변수입니다.
매개변수(parameters) 또한 변수(variables)와 마찬가지로, 선언위치에 따라 활동영역이 결정됩니다.
이를 유의하여 아래 코드의 수행결과를 예측해봅시다.
public class VariableScope2 {
public static void method(int x) {
System.out.println("method x = " + x);
x = x * x;
System.out.println("method x = " + x);
}
public static void main(String[] args) {
int x = 5;
System.out.println("main x = " + x);
method(x);
System.out.println("main x = " + x);
}
}
위 코드에서 선언된 변수는 두 가지로서, main()블럭에 선언된 int x = 5;와 method()에 선언된 매개변수 int x 입니다.
(매개변수 또한 변수이기때문..) 두 변수는 이름은 같지만 활동영역이 다른 별개의 변수이므로 아래와 같은 결과가 출력됩니다.
main()블럭 안에서 변수 x는 시작부터 끝까지 5의 값을 저장합니다.
반면 method()의 매개변수 x는 먼저 5값을 전달받아 출력합니다.
다음으로 x값을 제곱하여 저장(x = x * x;)합니다.
이때 main()블럭에 선언된 x는 영향을 받지 않기때문에 계속 5의 값을 유지합니다.
마지막으로 그 값을 출력합니다.
관련자료
-
이전
-
다음
댓글 0개
등록된 댓글이 없습니다.