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 |