소개
이 랩에서는 메서드와 객체로 나아갑니다. 이번 과제의 목표는 매개변수를 사용하여 메서드를 정의하는 방법을 배우는 것입니다. 객체는 OOP(객체 지향 프로그래밍) 언어에서 매우 중요한 개념이므로, 이에 대한 충분한 지식을 갖는 것이 도움이 될 것입니다.
이 랩에서는 메서드와 객체로 나아갑니다. 이번 과제의 목표는 매개변수를 사용하여 메서드를 정의하는 방법을 배우는 것입니다. 객체는 OOP(객체 지향 프로그래밍) 언어에서 매우 중요한 개념이므로, 이에 대한 충분한 지식을 갖는 것이 도움이 될 것입니다.
어떤 경우에는, 누군가의 나이와 이름을 출력하는 것과 같이 유사한 문제를 해결하기 위해 재사용할 수 있는 코드가 필요합니다. 서로 다른 사람의 경우, 이름과 나이는 다릅니다. 이 두 변수는 매개변수로 코드 블록에 전달될 수 있습니다. 여기서 우리는 작업을 수행할 메서드 (method) 의 개념을 소개합니다.
예시:
다음 코드를 /home/labex/project/methodTest.java 파일에 작성하십시오:
public class methodTest
{
public static void main(String[] args)
{
// call our self-defined method
printInfo("Mike", 18);
// call our self-defined method
System.out.println(fibonacci(10));
System.out.println(fibonacciNormal(10));
}
// we define a class method to print personal info
public static void printInfo(String name, int age){
System.out.println("Hello " + name + ", your age is " + age);
}
// define a class method to compute fibonacci by recursion
public static int fibonacci(int n){
if(n<=2){
return 1;
}else{
return fibonacci(n-1)+fibonacci(n-2);
}
}
// define a class method to compute fibonacci by iteration loop
public static int fibonacciNormal(int n){
if(n<=2){
return 1;
}
int n1=1,n2=1,sum=0;
for(int i=0;i<n-2;i++){
sum=n1+n2;
n1=n2;
n2=sum;
}
return sum;
}
}
출력:
다음 명령을 사용하여 methodTest.java 파일을 실행하십시오:
javac /home/labex/project/methodTest.java
java methodTest
출력을 확인하십시오:
Hello Mike, your age is 18
55
55
위의 예에서, 우리는 printInfo라는 함수를 작성했습니다. 원하는 대로 이름을 지정할 수 있습니다. 두 개의 매개변수가 있으며 반환 유형은 void로, 아무것도 반환하지 않음을 의미합니다. 필요한 모든 유형으로 함수의 반환 유형을 결정할 수 있으며, 매개변수의 수와 유형은 무엇이든 될 수 있습니다. 다음과 같이 메서드를 정의할 수 있습니다:
예시:
public/private static/final/{not necessary} RETURN_TYPE METHOD_NAME( LIST OF PARAMETERS ) {
// STATEMENTS
}
public String getName(){}
public void setName(){}
public static void newInstance(){}
public final String msg(){}
Java 는 수학 함수와 같이 가장 일반적인 연산을 수행하는 많은 함수를 내장 라이브러리 메서드로 제공합니다. 이러한 함수를 **메서드 (method)**라고 합니다. 메서드는 이미 본 print 문과 유사한 구문을 사용하여 호출됩니다:
예시:
double root = Math.sqrt(16.0); // root = 4.0
double height = Math.sin(1.5); // height = 0.9974949866040544
Java 에는 두 가지 종류의 **타입 (type)**이 있습니다: 기본 타입 (primitive types) 과 객체 타입 (object types). int 및 boolean과 같은 기본 타입은 소문자로 시작하고, 객체 타입은 대문자로 시작합니다. 이러한 구별은 다음과 같은 차이점을 상기시켜주므로 유용합니다:
기본 변수를 선언하면 기본 값에 대한 저장 공간이 확보됩니다. 객체 변수를 선언하면 객체에 대한 참조를 위한 공간이 확보됩니다. 객체 자체에 대한 공간을 얻으려면
new연산자를 사용해야 합니다.
기본 변수를 초기화하지 않으면 해당 타입에 따라 기본값이 지정됩니다. 예를 들어,
int의 경우0,boolean의 경우false입니다. 객체 타입의 기본값은null이며, 이는 참조 변수가 참조하는 객체가 없음을 나타냅니다.
기본 변수는 한 메서드에서 수행하는 작업이 다른 메서드의 변수에 영향을 미칠 수 없다는 점에서 잘 격리되어 있습니다. 객체 변수는 잘 격리되어 있지 않기 때문에 다루기 까다로울 수 있습니다. 객체에 대한 참조를 인수로 전달하면 호출하는 메서드가 객체를 수정할 수 있으며, 이 경우 해당 효과를 볼 수 있습니다. 물론, 이것은 좋은 일일 수 있지만, 이를 인지해야 합니다.
기본 변수를 메서드에 전달하는 경우 (값으로 매개변수 전달)(passing parameter by value), 실제로 기본 값의 복사본을 만들고 메서드 내에서 해당 복사본을 사용합니다. 메서드 내의 모든 연산은 복사본에 대해 작동하며, 메서드 외부에서는 기본 변수의 값이 영향을 받지 않습니다. 그러나 비기본 객체를 메서드에 전달하는 경우 (참조로 매개변수 전달)(passing parameter by reference), 참조 변수를 메서드에 전달합니다. 모든 연산은 실제로 원래 객체를 사용하거나 영향을 미칩니다.
예시:
다음 코드를 /home/labex/project/objectTest.java 파일에 작성하십시오:
public class objectTest {
public static void main(String[] args){
// use new to create an Array object with two items
int[] numbers = new int[2];
// assign values to the array object
numbers[0] = 1;
numbers[1] = 2;
// create primitive variables in this way
int a = 1 , b = 2;
// create a test object
objectTest test = new objectTest();
test.changeInt(a, b);
System.out.println("Now a is " + a + ", b is " + b);
test.changeArray(numbers);
System.out.println("Now numbers contain:");
for(int i : numbers){
System.out.print(i + "\t");
}
}
// define an object method, change int value
public void changeInt(int a,int b){
a = 2;
b = 3;
System.out.println("In changeInt method, a is " + a + ", b is " + b);
}
// define an object method, change array value
public void changeArray(int[] number){
for(int i = 0;i < number.length;i++){
number[i] = number[i]+1; // change value of array item increasing by 1
}
System.out.println("In changeArray method, numbers contain:");
for(int i : number){
System.out.print(i + "\t");
}
System.out.println();
}
}
출력:
터미널에서 다음 명령을 사용하여 objectTest.java 파일을 실행하십시오:
javac /home/labex/project/objectTest.java
java objectTest
출력을 확인하십시오:
In changeInt method, a is 2, b is 3
Now a is 1, b is 2
In changeArray method, numbers contain:
2 3
Now numbers contain:
2 3
기본 타입과 객체 타입 간에는 또 다른 차이점이 있습니다. Java 에 새로운 기본 타입을 추가할 수는 없지만 (표준 위원회에 참여하지 않는 한), 새로운 객체 타입을 만들 수 있습니다! 다음 장에서 방법을 살펴보겠습니다.
메서드는 클래스에서 흔히 사용됩니다. 메서드는 특정 작업을 수행하는 코드 블록입니다. Java 는 우리가 직접 사용할 수 있는 많은 내장 클래스를 제공합니다. 메서드에 매개변수를 전달하는 방법에는 값으로 전달 (by value) 과 참조로 전달 (by reference) 의 두 가지가 있습니다. 그들의 효과는 다릅니다. 다음 랩에서 이를 소개할 예정입니다. 도움이 되기를 바랍니다.