이전 장에서 우리는 System.out.println()을 자주 사용했습니다. 그렇다면 이것이 무엇입니까?
println()은 메소드(Method)이고, System은 시스템 클래스(Class)이며, out은 표준 출력 객체(Object)입니다. 이 문장의 사용법은 시스템 클래스 System에 있는 표준 출력 객체의 println() 메서드를 호출하는 것입니다.
Java 메소드는 함께 기능을 수행하는 명령문의 모음입니다.
방법은 어떤 유형의 문제를 해결하기 위한 순서화된 단계의 조합입니다.
클래스나 객체에 포함된 메서드
메소드는 프로그램에서 생성되고 다른 곳에서 참조됩니다.
일반적으로 메서드 정의에는 다음 구문이 포함됩니다.
수정자 반환 값 유형 메소드 이름(매개변수 유형 매개변수 이름) {
...
메소드 본문...
반환 값;
}
메소드에는 메소드 헤더와 메소드 본문이 포함됩니다. 메소드의 모든 부분은 다음과 같습니다.
수정자: 선택적인 수정자는 컴파일러에 메서드 호출 방법을 알려줍니다. 이 메소드에 대한 액세스 유형을 정의합니다.
반환 값 유형: 메서드는 값을 반환할 수 있습니다. returnValueType은 메소드 반환 값의 데이터 유형입니다. 일부 메서드는 필요한 작업을 수행하지만 값을 반환하지 않습니다. 이 경우 returnValueType은 키워드 void 입니다.
메소드 이름: 메소드의 실제 이름입니다. 메소드 이름과 매개변수 목록이 함께 메소드 서명을 구성합니다.
매개변수 유형: 매개변수는 자리 표시자와 같습니다. 메소드가 호출되면 값이 매개변수로 전달됩니다. 이 값을 실제 매개변수 또는 변수라고 합니다. 매개변수 목록은 메소드의 매개변수 유형, 순서 및 매개변수 개수를 나타냅니다. 매개변수는 선택사항이며 메소드에는 매개변수가 포함될 수 없습니다.
메서드 본문: 메서드 본문에는 메서드의 기능을 정의하는 특정 문이 포함되어 있습니다.
좋다:
publicstaticintage(생일){...}
여러 매개변수가 있을 수 있습니다.
staticfloatinterest(floatprincipal,intyear){...}
참고: 일부 다른 언어에서는 메소드가 프로시저 및 기능을 의미합니다. void가 아닌 반환 값을 반환하는 메서드를 함수라고 하며, void 반환 값을 반환하는 메서드를 프로시저라고 합니다.
아래 메소드에는 2개의 매개변수 num1과 num2가 포함되어 있으며 이 두 매개변수의 최대값을 반환합니다.
/**두 개의 정수 변수 데이터 중 더 큰 값을 반환합니다*/
publicstaticintmax(intnum1,intnum2){
모욕;
if(숫자1>숫자2){
결과=번호1;
}또 다른{
결과=숫자2;
}
결과 반환;
}
Java는 메서드가 값을 반환하는지 여부에 따라 메서드를 호출하는 두 가지 방법을 지원합니다.
프로그램이 메소드를 호출하면 프로그램 제어가 호출된 메소드로 이전됩니다. 호출된 메서드의 return 문이 실행되거나 메서드 본문 닫는 대괄호에 도달하면 제어가 프로그램에 반환됩니다.
메서드가 값을 반환할 때 메서드 호출은 일반적으로 값으로 처리됩니다. 예를 들어:
intlarger=max(30,40);
메서드 반환 값이 void인 경우 메서드 호출은 문이어야 합니다. 예를 들어, println 메소드는 void를 반환합니다. 다음 호출은 명령문입니다.
System.out.println("Java에 오신 것을 환영합니다!");
다음 예제에서는 메서드를 정의하고 호출하는 방법을 보여줍니다.
publicclassTestMax{
/**주요 메소드*/
publicstaticvoidmain(String[]args){
인티=5;
intj=2;
intk=max(i,j);
System.out.println("최대값"+i+
"그리고"+j+"는"+k);
}
/**두 정수 변수 중 더 큰 값을 반환합니다*/
publicstaticintmax(intnum1,intnum2){
모욕;
if(숫자1>숫자2){
결과=번호1;
}또 다른{
결과=숫자2;
}
결과 반환;
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
5와 2 사이의 최대값은 5입니다.
이 프로그램에는 main 메소드와 max 메소드가 포함되어 있습니다. Main 메소드는 JVM에 의해 호출됩니다. 그 외에는 다른 메소드와 다르지 않습니다.
예제에 표시된 것처럼 기본 메서드의 헤더는 변경되지 않고 public 및 static 수정자를 사용하여 void 유형 값을 반환하고 메서드 이름은 main이며 String[] 유형 매개 변수를 사용합니다. String[]은 매개변수가 문자열 배열임을 나타냅니다.
이 섹션에서는 void 메서드를 선언하고 호출하는 방법을 설명합니다.
다음 예제에서는 printGrade라는 메서드를 선언하고 이를 호출하여 지정된 성적을 인쇄합니다.
publicclassTestVoidMethod{
publicstaticvoidmain(String[]args){
printGrade(78.5);
}
publicstaticvoidprintGrade(더블스코어){
if(점수>=90.0){
System.out.println('A');
}
elseif(점수>=80.0){
System.out.println('B');
}
elseif(점수>=70.0){
System.out.println('C');
}
elseif(점수>=60.0){
System.out.println('D');
}
또 다른{
System.out.println('F');
}
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
기음
여기서 printGrade 메소드는 void 유형 메소드이며 값을 반환하지 않습니다.
void 메소드에 대한 호출은 명령문이어야 합니다. 따라서 메인 메소드의 세 번째 줄에 있는 문장이라고 부릅니다. 세미콜론으로 끝나는 모든 명령문과 같습니다.
메소드를 호출할 때 매개변수를 제공해야 하며, 매개변수 목록에 지정된 순서대로 제공해야 합니다.
예를 들어, 다음 메소드는 연속해서 n번 메시지를 인쇄합니다.
publicstaticvoidnPrintln(문자열 메시지,intn){
for(inti=0;i<n;i++)
System.out.println(메시지);
}
다음 예에서는 값 전달의 효과를 보여줍니다.
이 프로그램은 두 변수를 교환하는 메서드를 만듭니다.
publicclassTestPassByValue{
publicstaticvoidmain(String[]args){
정수1=1;
정수2=2;
System.out.println("Beforeswapmethod,num1is"+
숫자1+"그리고 숫자2는"+숫자2);
//스왑 메소드 호출 swap(num1,num2);
System.out.println("Afterswapmethod,num1is"+
숫자1+"그리고 숫자2는"+숫자2);
}
/**두 변수를 교환하는 방법*/
공공정적voidswap(intn1,intn2){
System.out.println("tInsidetheswapmethod");
System.out.println("tt교환 전n1is"+n1
+"n2is"+n2);
//n1과 n2의 값을 교환한다 inttemp=n1;
n1=n2;
n2=온도;
System.out.println("ttAfterswappingn1is"+n1
+"n2is"+n2);
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
스왑 방법 전, num1is1 및 num2is2
스왑 방법 내부
교환 전n1is1n2is2
스와핑 후n1is2n2is1
Afterswap 방법, num1is1 및 num2is2
두 개의 매개변수를 전달하는 swap 메서드를 호출합니다. 흥미롭게도 실제 매개변수의 값은 메소드가 호출된 후에도 변경되지 않습니다.
위에서 사용된 max 메소드는 int 유형 데이터에만 적용됩니다. 하지만 두 가지 부동 소수점 데이터 유형의 최대값을 얻으려면 어떻게 해야 할까요?
해결 방법은 다음 코드와 같이 이름은 같지만 매개 변수가 다른 다른 메서드를 만드는 것입니다.
publicstaticdoublemax(doublenum1,doublenum2){
if(숫자1>숫자2){
반환번호1;
}또 다른{
반환번호2;
}
}
max 메소드를 호출할 때 int 매개변수를 전달하면 int 매개변수의 max 메소드가 호출됩니다.
double 매개변수가 전달되면 double 유형의 최대 메소드 본문이 호출됩니다. 이를 메소드 오버로딩이라고 합니다.
즉, 클래스의 두 메소드는 이름은 같지만 매개변수 목록은 다릅니다.
Java 컴파일러는 메소드 서명을 기반으로 호출해야 하는 메소드를 결정합니다.
메소드 오버로딩은 프로그램을 더 명확하고 읽기 쉽게 만들 수 있습니다. 밀접하게 관련된 작업을 수행하는 메서드는 동일한 이름을 사용해야 합니다.
오버로드된 메서드에는 다른 매개변수 목록이 있어야 합니다. 수정자 또는 반환 유형만을 기반으로 메서드를 오버로드할 수 없습니다.
변수의 범위는 변수가 참조될 수 있는 프로그램의 부분입니다.
메소드 내에서 정의된 변수를 지역 변수라고 합니다.
지역 변수의 범위는 선언부터 시작하여 이를 포함하는 블록의 끝에서 끝납니다.
지역 변수를 사용하려면 먼저 선언해야 합니다.
메소드의 매개변수 범위는 전체 메소드를 포함합니다. 매개변수는 실제로 지역 변수입니다.
for 루프의 초기화 부분에서 선언된 변수는 루프 전체에 걸쳐 범위를 갖습니다.
그러나 루프 본문에 선언된 변수의 적용 범위는 해당 선언부터 루프 본문 끝까지입니다. 여기에는 아래와 같은 변수 선언이 포함되어 있습니다.
메서드 내에서 중첩되지 않은 다른 블록에서 동일한 이름을 가진 지역 변수를 여러 번 선언할 수 있지만 중첩된 블록 내에서 지역 변수를 두 번 선언할 수는 없습니다.
때때로 프로그램이 실행되는 동안 프로그램에 메시지를 전달하고 싶을 때가 있습니다. 이는 main() 함수에 명령줄 인수를 전달하여 수행됩니다.
명령줄 매개변수는 프로그램 실행 시 프로그램 이름 바로 뒤에 오는 정보입니다.
다음 프로그램은 모든 명령줄 인수를 인쇄합니다.
publicclassCommandLine{
publicstaticvoidmain(Stringargs[]){
for(inti=0;i<args.length;i++){
System.out.println("args ["+i+"]:"+args[i]);
}
}
}
아래와 같이 프로그램을 실행합니다.
javaCommandLinethisisa명령줄200-100
실행 결과는 다음과 같습니다.
인수[0]:이것
인수[1]:is
인수[2]:a
인수[3]:명령
인수[4]:라인
인수[5]:200
인수[6]:-100
객체가 생성되면 생성자를 사용하여 객체를 초기화합니다. 생성자는 자신이 속한 클래스와 이름이 동일하지만 생성자에는 반환 값이 없습니다.
생성자는 일반적으로 클래스의 인스턴스 변수에 초기 값을 할당하거나 완전한 객체를 생성하는 데 필요한 기타 단계를 수행하는 데 사용됩니다.
생성자를 사용자 정의하는지 여부에 관계없이 Java는 모든 멤버를 0으로 초기화하는 기본 생성자를 자동으로 제공하므로 모든 클래스에는 생성자가 있습니다.
자신만의 생성자를 정의하면 기본 생성자는 유효하지 않게 됩니다.
다음은 생성자 메서드를 사용하는 예입니다.
//간단한 생성자 static classMyClass{
intx;
//다음은 생성자 MyClass(){
x=10;
}
}
다음과 같이 생성자를 호출하여 객체를 초기화할 수 있습니다.
publicclassConsDemo{
publicstaticvoidmain(Stringargs[]){
MyClasst1=newMyClass();
MyClasst2=newMyClass();
System.out.println(t1.x+""+t2.x);
}
}
대부분의 경우 매개변수가 있는 생성자가 필요합니다.
다음은 생성자 메서드를 사용하는 예입니다.
//간단한 생성자 classMyClass{
intx;
//다음은 생성자 MyClass(inti){
x=i;
}
}
다음과 같이 생성자를 호출하여 객체를 초기화할 수 있습니다.
publicclassConsDemo{
publicstaticvoidmain(Stringargs[]){
MyClasst1=newMyClass(10);
MyClasst2=newMyClass(20);
System.out.println(t1.x+""+t2.x);
}
}
실행 결과는 다음과 같습니다.
1020
JDK 1.5부터 Java는 동일한 유형의 변수 매개변수를 메소드에 전달하는 것을 지원합니다.
메소드의 가변 매개변수 선언은 다음과 같습니다.
유형이름...매개변수이름
메서드 선언에서 매개변수 유형을 지정한 후 줄임표(...)를 추가합니다.
메소드에는 하나의 변수 매개변수만 지정할 수 있으며, 이 매개변수는 메소드의 마지막 매개변수여야 합니다. 모든 일반 매개변수는 그 앞에 선언되어야 합니다.
publicclassVarargsDemo{
publicstaticvoidmain(Stringargs[]){
//가변 매개변수 메소드 호출 printMax(34,3,3,2,56.5);
printMax(newdouble[]{1,2,3});
}
publicstaticvoidprintMax(이중...숫자){
if(숫자.길이==0){
System.out.println("인수 전달 없음");
반품;
}
doubleresult=숫자[0];
for(inti=1;i<numbers.length;i++)
if(숫자[i]>결과){
결과=숫자[i];
}
System.out.println("Themaxvalueis"+result);
}
}
위 예제의 컴파일 및 실행 결과는 다음과 같습니다.
최대값은 56.5입니다.
최대값은 3.0입니다.
Java에서는 가비지 수집기에 의해 객체가 파괴(재활용)되기 전에 호출되는 이러한 메소드 정의를 허용합니다. 이 메소드는 재활용된 객체를 지우는 데 사용됩니다.
예를 들어 finalize()를 사용하여 객체에 의해 열린 파일이 닫혔는지 확인할 수 있습니다.
finalize() 메서드에서는 객체가 소멸될 때 수행할 작업을 지정해야 합니다.
finalize()의 일반적인 형식은 다음과 같습니다.
보호된 공허 최종화()
{
//여기에 터미널 코드가 있습니다}
protected 키워드는 finalize() 메서드가 클래스 외부의 코드에 의해 호출되지 않도록 보장하는 한정자입니다.
물론, Java의 메모리 재활용은 JVM에 의해 자동으로 완료될 수 있습니다. 수동으로 사용하실 경우 위의 방법을 사용하시면 됩니다.
publicclassFinalizationDemo{
publicstaticvoidmain(String[]args){
Cakec1=newCake(1);
Cakec2=newCake(2);
Cakec3=newCake(3);
c2=c3=널;
System.gc();//Java 가비지 수집기 호출}
}
classCakeextendsObject{
개인정보;
publicCake(int){
this.id=id;
System.out.println("CakeObject"+id+"iscreated");
}
protectedvoidfinalize()throwsjava.lang.Throwable{
super.finalize();
System.out.println("CakeObject"+id+"isdisposed");
}
}
위의 코드를 실행하면 출력 결과는 다음과 같습니다.
C:1>javaFinalizationDemo
CakeObject1이 생성되었습니다.
CakeObject2가 생성되었습니다.
CakeObject3이 생성되었습니다.
CakeObject3가 처분되었습니다.
CakeObject2가 처리되었습니다.