본문 바로가기

Java/문법

7-2장 메서드

1. 메서드 정의하기 

 

 - 메서드 

  - 클래스의 기능 

  - 자바 제어자 리턴(반환) 타입 메서드명(입력매개변수) {

        메서드 내용

    }

 

public static int sum(int a, int b) {
	//메서드 내용
}

- 리턴 타입 : 메서드 종료 이후 변환(반환)되는 값의 자료형

- 입력매개변수 : 메서드를 호출할 때 전달되는 값의 자료형과 전달받은 값을 저장할 지역 변수명을 정의 

- 입력값으로 int형 2개의 값을 입력받아 처리하며, 메서드가 종료된 이후에 int값을 리턴한다

 

2. 여러 리턴 타입의 메서드 살펴보기 

 

 1) 리턴 타입이 void이고, 입력매개변수가 없는 메서드 

void print() {
	System.out.println("안녕");
}

 2) 리턴 타입이 int이고, 입력매개변수가 없는 메서드 

int data() {
	return 3;
}

3) 리턴 타입이 double이고, 입력매개변수가 2개인 메서드 

double sum(int a, double b) {
	return a+b;
}

 

3. 메서드 호출하기 

 

1) 클래스 외부에서 메서드 호출하기 

 

 - 클래스 외부에서 메서드를 사용하려면 먼저 객체를 생성

 - 객체의 위치를 저장하고 있는 참조 변수를 이용해 메서드를 호출 ㅏ

 - 리턴값이 없는 메서드 -> 그대로 메서드만 호출 (a.print())

 - 리턴값이 있는 메서드 

 -> 리턴되는 값을 저장할 수 있는 변수를 선언해 대입 ( int k = a.data(0)

 - 입력매개변수가 있는 메서드

 -> 해당 자료형의 값을 넘겨줘야 함 

 -> double (int a, double b) 메서드 에는 2개의 입력 매개변수가 있으며, 첫 번째는 int, 두 번째는 double 자료형을 입력값으로 받음 

package createobject;

//클래스 정의 
	class A {
		//리턴 타입 void, 입력매개변수 없음
		void print() {
			System.out.println("안녕");
		}
		//리턴 타입 int, 입력매개변수 없음
		int data() {
			return 3;
		}
		//리턴 타입 double, 입력매개변수 2개 
		double sum(int a, double b) {
			return a+b;
		}
		//리턴 타입 void, 내부에 리턴 포함(함수를 종료함)
		void printMonth(int m) {
			if(m<0 || m>12) {
				System.out.println("잘못된 입력");
				return; //메서드 종료
			}
			System.out.println(m+"월입니다.");
		}
	}
public class createobject_3 {
	public static void main(String[] args) {
		//객체 생성
		A a = new A();
		//메서드 호출(멤버 활용)
		a.print();
		
		int k= a.data();
		a.data();
		System.out.println(k);
		
		double result = a.sum(3, 5.2);
		System.out.println(result);
		a.printMonth(5);
		a.printMonth(15);
		
	}
	
}

 

2) 클래스 내부에서 메서드 호출하기 

 

 - 클래스 내부에 있는 메서드끼리는 객체를 생성하지 않고 서로를 호출하라 수 있다.

 - 단, static가 붙은 메서드는 static이 붙은 필드 또는 메서드만 호출 가능

 - 같은 멤버끼리는 클래스 내부에서 얼마든지 객체를 생성하지 않고 서로를 호출할 수 있다.

package createobject;

public class createobject_4 {
	public static void main(String[] args) {
		//같은 클래스 안에 있는 내부 메서드 호출
		print();
		
		int a = twice(3);
	    System.out.println(a);
	    
	    double b = sum(a,5.8);
	    System.out.println(b);
	    
	}
	public static void print() {
		System.out.println("안녕");
	}
	
	public static int twice(int k) {
		return k*2;
	}
	
	public static double sum(int m, double n) {
		return m+n;
	}
}

 

3) 입력매개변수가 배열인 메서드 호출하기 

 

 - 호출할 때의 배열 데이터 입력 방법

package createobject;

import java.util.Arrays;

public class createobject_5 {
	public static void main(String[] args) {
		//배열을 입력매개변수로 하는 메서드 호출
		int[] a = new int[] {1,2,3};
		printArray(a);
		printArray(new int[] {1,2,3});
		//printArray({1,2,3}); //오류 발생 
	}
	public static void printArray(int[] a) {
		System.out.println(Arrays.toString(a));
	}
}

 

4) 기본 자료형 입력매개변수와 참조 자료형 입력매개변수의 차이 

 

 - 참조자료형(배열)이 입력매개변수로 넘겨질 때 실제 객체가 전달되는 것이 아니라 객체의 위칫값이 전달

 - 기본 자료형 입력매개변숫값의 변화 

package createobject;

public class createobject_6 {
	public static void main(String[] args) {
		int a =3;
		int result1 = twice(3);
		System.out.println(result1);
		int result2 = twice(a);
		System.out.println(result2);
		System.out.println(a);
	}
	public static int twice(int a) {
		a=a*2;
		return a;
	}
}

 

 - 기본자료형일 때는 실제 값 전달

 - 기본 자료형의 값이 메서드의 지역 변수에 복사 

 

 - twice(3)

  - 3은 twice() 메서드의 지역 변수 a에 복사되고, a의 값을 두 배로 곱한 값을 a값으로 저장한 후에 리턴

 

 - twice(a)

  - int a(twice()메서드의 지역변수)=a(main()메서드의 지역변수) 실행

  - main()메서드의 지역 변수 a의 스택 메모리값이 twice()메모리의 지역 변수 a로 복사 

 

 - tiwce() 메서드의 호출이 끝나고 다시 main()메서드로 돌아오면 main() 메서드의 값 여전히  3

 

- 참조 자료형 매개변숫값의 변화

package createobject;

import java.util.Arrays;

public class createobject_7 {
	public static void main(String[] args) {
		int[] array = new int[] {1,2,3};
		modifyData(array);
		printArray(array);
	}
	
	public static void modifyData(int[] a) {
		a[0] = 4;
		a[1] = 5;
		a[2] = 6;
	}
	
	public static void printArray(int[] a) {
		System.out.println(Arrays.toString(a));
	}
}

 

 - 참조 자료형은 스택 메모리에 객체의 참좃값(위칫값)을 저장하고 있으므로 실제 객체가 아닌 객체의 참좃값이 전달돼 복사 

- 호출된 메서드에서 객체의 값을 변경한 후 호출한 메서드로 돌아오면 값이 바뀌게 됨

 

4. 오버로딩된 메서드 

 

 - 메서드 시그니처(mathod signature) : 메서드명과 입력매개변수의 자료형

 - 자바 가상 머신은 메서드 시그니처가 다르면 메서드명이 동일해도 다른 메서드로 인식

 - 메서드 오버로딩 (method overloding) :

  입력매개변수의 개수나 자료형이 다른 여러개의 동일한 이름을 지닌 메서드를 같은 공간에 정의

 

 - 리턴 타입 메서드명 (자료형 변수명, 자료형 변수명,..) {

}

int sum (int a, int b) {
	return 3;
}
package createobject;

public class createobject_8 {
	public static void main(String[] args) {
		print();
		print(3);
		print(5.8);
		print(2,5); //서로 다른 시그니처를 지니고 있는 print()메서드를 입력매개변수에 따라 호출
	}
	public static void print() {
		System.out.println("데이터가 없습니다.");
	}
	public static void print(int a) {
		System.out.println(a);
	}
	public static void print(double a) {
		System.out.println(a);
	}
	/*
	public static void print(double b) {
		System.out.println(b);
	} void print(double a){}와 중복으로 정의 불가능 
	 */
	public static void print(int a, int b) {
		System.out.println("a:"+ a +"b:"+b);
	}
	/*
	 * public static void print(int a, int b) {
		System.out.println("a:"+ a +"b:"+b);
		return a+b; void print(int a, int b){}와 중복으로 정의 불가능
	}
	 */
}

 

5. 가변 길이 배열 입력매개변수 메서드 

 

 - 개수가 정해지지 않은 가변 길이의 입력을 받는 입력매개변수로  입력된 값들은 배열로 저장 

 - 입력되는 모든 값은 같은 자료형이어야 함 

 

 - 리턴 타입 메서드명 (자료형... 참조 변수명) {

   ...

}

 

package createobject;

public class createobject_9 {
	public static void main(String[] args) {
		//method1(int...values) 
		method1(1,2);
		method1(1,2,3);
		method1();
		
		//method2(String...values)
		method2("안녕","방가");
		method2("땡큐","베리","감사");
		method2();
	}
	public static void method1(int...values) {
		System.out.println("배열의 길이:"+values.length);
		for(int k:values) {
			System.out.print(k+"");
		}
		System.out.println();
	}
	public static void method2(String...values) {
		System.out.println("배열의 길이:"+values.length);
		for(String k:values) {
			System.out.print(k+"");
		}
		System.out.println();
	}
}

 - method1(int...values) 

 : 개수와 상관없이 정수를 입력으로 받을 수 있음

 - method2(String...values) 

 : 개수와 상관없이 문자열을 입력으로 받을 수 있음

- 오버로딩만 사용했다면 적어도 3개의 메서드 오버로딩 수행

- 가변 길이 배열 입력매개변수를 사용한다면 단 1개의 메서드만 정의해 모든 메서드 호출에 대응 할 수 있음

'Java > 문법' 카테고리의 다른 글

8-1장 패키지와 임포트  (0) 2023.04.24
7-4장 this 키워드와 this() 메서드  (0) 2023.04.24
7-3장 생성자  (0) 2023.04.24
7-1장 필드  (0) 2023.04.24
6-2장 객체의 생성과 활용  (0) 2023.04.24