메서드의 매개변수의 전체적인 개념 설명은
❗ JAVA 시리즈 11번 ❗
바로 여기에 설명해두었으니, 참고해보자!
매개변수의 개수 및 타입에 맞게 인자를 전달하자
매개변수 : 메서드 안에 선언된 로컬변수(위 링크 참조)
인자 : 메서드 호출할 때 전달하는 데이터
메서드를 호출하기 위해서는
꼭 매개변수의 개수와 타입에 맞춰서 인자를 전달
public class Student {
public String name = "yeppi";
. . .
public void avgScore(int jScore, int pScore, int sScore) {
System.out.println("avg(int, int, int) 호출 결과는?");
int sum = jScore + pScore + sScore;
int avg = sum/3;
System.out.println(name + "의 평균 점수는? " + avg);
}
}
public static void main(String[] args) {
Student kim = new Student();
kim.printAvg(11, 22, 33); // 3개의 인자
}
출력결과
avg(int, int, int) 호출 결과는?
yeppi의 평균 점수는? 22
public class Student {
public String name = "yeppi";
private int score = 99;
public Student() {
System.out.println("---> Student 객체 생성");
}
// 로컬 변수만 사용하는 메소드
public void localTest() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum = sum + i;
}
System.out.println("1 ~ 10까지의 합 : " + sum);
}
// 멤버변수만 사용하는 메소드
public void printInfo() {
System.out.println(name + "의 점수 : " + score);
}
// 멤버변수와 로컬변수를 모두 사용하는 메소드
public void avgScore(int jScore, int pScore, int sScore) {
System.out.println("avg(int, int, int) 호출 결과는?");
int sum = jScore + pScore + sScore;
int avg = sum/3;
System.out.println(name + "의 평균 점수는? " + avg);
}
}
리턴 타입 있다
- 값을 받아서 처리하기(현 실습)
- 매개변수 없을수도 있을수도
- 실행 결과의 출력문 있음
리턴 타입 없다
- 위 링크 참조
- 메서드를 호출한 쪽에서 return 값을 받고 출력문 실행
return 반환할 값;
public class Student {
public String name = "yeppi";
private int score = 99;
public Student() {
System.out.println("---> Student 객체 생성");
}
// 로컬 변수만 사용하는 메소드
public int localTest() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum = sum + i;
}
return sum;
}
// 멤버변수만 사용하는 메소드
public String printInfo() {
return name + "의 점수 : " + score;
}
// 멤버변수와 로컬변수를 모두 사용하는 메소드
public double avgScore(int jScore, int pScore, int sScore) {
System.out.println("avg(int, int, int) 호출 결과는?");
int sum = jScore + pScore + sScore;
int avg = sum/3;
return avg;
}
}
main
)에서 리턴 값을 받아서 사용 Student kim = new Student();
// 리턴한 결과 값 받아서 사용
int sum = kim.localTest();
System.out.println("1 ~ 10까지의 합 : " + sum);
System.out.println("");
String studentInfo = kim.printInfo();
System.out.println(studentInfo);
System.out.println("");
double avgScore = kim.avgScore(83, 77, 79);
System.out.println(kim.name + "의 평균 점수 : " + avgScore);
System.out.println("-------");
// 바로 사용
System.out.println("1 ~ 10까지의 합 : " + kim.localTest());
System.out.println(kim.printInfo());
System.out.println(kim.name + "의 평균 점수 : "
+ kim.avgScore(11, 22, 33));
출력결과
---> Student 객체 생성
1 ~ 10까지의 합 : 55
yeppi의 점수 : 99
avg(int, int, int) 호출 결과는?
yeppi의 평균 점수 : 79.0
-------
1 ~ 10까지의 합 : 55
yeppi의 점수 : 99
avg(int, int, int) 호출 결과는?
yeppi의 평균 점수 : 22.0
void
로 선언한 후, 단순 제어로만 사용 가능public void A() {
return;
}
void
메서드에서 return 값;
은 불가능public void B() {
return 0;
}
private
으로 선언된 멤버 변수(필드)에 대해
접근 및 수정할 수 있는 메서드를 public
으로 제공
Setter → private
멤버변수에 값을 할당
Getter → 값을 리턴
get()
메서드만 제공 되는 경우 → read-only 필드
이클립스에서 자동으로 생성
<Alt> + <Shift> + <S>
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
클래스 하나, 메서드 여러개
int a(int num1, int num2) {
int sum = num1 + num2;
int avg = sum/2;
return avg;
}
int b(int num1, int num2, int num3) {
int sum = num1 + num2 + num3;
int avg = sum/3;
return avg;
}
int c(double num1, int num2) {
int sum = (int) num1 + num2;
int avg = sum/2;
return avg;
}
a와 b
⇒ 매개변수의 개수가 다르기 때문에 오버로딩
a와 c
⇒ 매개변수의 개수는 같지만 데이터타입이 다르기 때문에 오버로딩
b와 c
⇒ 개수와 타입이 모두 다르기 때문에 오버로딩
👉 인자에따라 호출되는 메소드가 달라지게 됨
👉 묵시적 형 변환이 가능하다면 타입이 달라도 OK
main
) public int avgScore(double jScore, double pScore) {
int sum = (int) (jScore + pScore);
int avg = sum/2;
return avg;
}
Student kim = new Student();
double result = kim.avgScore(11, 22); // 묵시적형변환 후 세팅
System.out.println(result);
result = kim.avgScore(22.2, 44.4); // 바로 매개변수에 세팅
System.out.println(result);
출력결과
16.0
33.0
기본형은 값 복사, 참조형은 주소 복사
매개 변수가 기본 타입인 경우
인자로 전달된 값이 그대로 매개 변수에 복사되어 전달
public static void main(String[] args) {
int num1 = 11;
int num2 = 99;
// 11, 99
System.out.println("num1 처음 : " + num1);
System.out.println("num2 처음 : " + num2);
System.out.println("");
// 99, 11
swap(num1, num2); // 메서드 호출 끝나고 메모리는 소멸
// 11, 99
System.out.println("num1 swap한 후 : : " + num1);
System.out.println("num2 swap한 후 : " + num2);
}
private static void swap(int number1, int number2) {
int temp = number1;
number1 = number2;
number2 = temp;
System.out.println("swap() 에서 number1 : " + number1);
System.out.println("swap() 에서 number2 : " + number2);
System.out.println("");
}
출력결과
swap()
에서 number1
, number2
값을 교환하면?
11, 99 에서 99,11로 변경
swap()
종료 되면?
해당 메서드에서 사용했던 로컬 변수 number1
, number2
는 메모리에서 사라짐
⇒ 따라서, main의 num1
, num2
변수는 여전 11, 99가 할당되어 있음
num1 처음 : 11
num2 처음 : 99
swap() 에서 number1 : 99
swap() 에서 number2 : 11
num1 swap한 후 : : 11
num2 swap한 후 : 99
매개 변수가 참조 타입인 경우
값이 저장된 주소 자체를 복사하기 때문에
변경된 값은 변경된 상태 그대로 유지
public static void main(String[] args) {
Student student = new Student();
student.number1 = 11;
student.number2 = 99;
System.out.println("number1 처음 : " + student.number1);
System.out.println("number2 처음 : " + student.number2);
System.out.println("");
swap(student);
System.out.println("number1 swap한 후 : " + student.number1);
System.out.println("number2 swap한 후 : " + student.number2);
}
private static void swap(Student s) {
int temp = s.number1;
s.number1 = s.number2;
s.number2 = temp;
System.out.println("swap() 에서 number1 : " + s.number1);
System.out.println("swap() 에서 number2 : " + s.number2);
System.out.println("");
}
출력결과
number1 처음 : 11
number2 처음 : 99
swap() 에서 number1 : 99
swap() 에서 number2 : 11
number1 swap한 후 : 99
number2 swap한 후 : 11
복습 겸 정리하니까 놓쳤던 부분도 습득할 수 있어서 좋다.. 다음 생성자도 힘내서 정리하자!