자바의 메서드 - 매개변수&인자, Getter&Setter, 메서드 오버로딩, 타입 변환, 값복사&주소복사

Yeppi's 개발 일기·2022년 5월 19일
0

JAVA

목록 보기
13/27

메서드의 매개변수의 전체적인 개념 설명은
JAVA 시리즈 11번
바로 여기에 설명해두었으니, 참고해보자!


1. Method 매개변수와 인자(Argument)

1) 개념

매개변수의 개수 및 타입에 맞게 인자를 전달하자

  • 매개변수 : 메서드 안에 선언된 로컬변수(위 링크 참조)

  • 인자 : 메서드 호출할 때 전달하는 데이터

  • 메서드를 호출하기 위해서는
    꼭 매개변수의 개수와 타입에 맞춰서 인자를 전달



2) 실습

📌 매개변수와 인자 사용 📌

  • 3개의 인자를 넣어보자!
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

📌 매개변수의 유무 📌

자체적으로 변수 선언 VS 오직 멤버변수만 사용

  1. 로컬 변수만 사용 → 자체적으로 변수를 선언하여 사용
  2. 멤버 변수만 사용 → 오직 멤버변수만을 사용하여 기능을 처리
  3. 로컬 변수 + 멤버 변수 모두 사용
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);		
	}
}


📌 리턴타입의 유무 📌

리턴타입 있다 VS 없다

리턴 타입 있다

  • 값을 받아서 처리하기(현 실습)
  • 매개변수 없을수도 있을수도
  • 실행 결과의 출력문 있음

리턴 타입 없다

  • 링크 참조
  • 메서드를 호출한 쪽에서 return 값을 받고 출력문 실행
  • 반환 값 int, String, double 타입으로 변경한 후, 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 와 return 🧐

  • return 타입을 void 로 선언한 후, 단순 제어로만 사용 가능
public void A() {
	return;
}
  • void 메서드에서 return 값; 은 불가능
public void B() {
	return 0;
}



2. Getter & Setter Method

1) 개념

  • private 으로 선언된 멤버 변수(필드)에 대해
    접근 및 수정할 수 있는 메서드를 public 으로 제공

  • Setter → private 멤버변수에 값을 할당
    Getter → 값을 리턴

  • get() 메서드만 제공 되는 경우 → read-only 필드

  • 이클립스에서 자동으로 생성
    <Alt> + <Shift> + <S>



2) 📌 get() set() 자동완성 실습 📌

  • 단축키 누른 후, 해당하는 멤버변수를 체크
  • 엔터 누르면, 멤버변수에 대한 get() set() 메서드가 생성
	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;
	}


3. Method Overloading

클래스 하나, 메서드 여러개

  • 하나의 클래스에 이름이 같은 메소드를 여러 개 선언
  • ❗ 매개변수의 개수타입 다르게

📌 메서드 오버로딩 예시 📌

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



4. Method 타입변환

  • 메소드를 호출할 때(main)
    매개변수의 타입이 일치하지 않아도 타입 변환이 가능하다면?
    정상적으로 메소드 호출을 처리

📌 메서드 타입 변환 예시 📌

  • 반환 타입이 int형인 메서드
	public int avgScore(double jScore, double pScore) {
		int sum = (int) (jScore + pScore);
		int avg = sum/2;
		return avg;
	}
  • 메서드 호출 시 double 형으로 사용
		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);

출력결과

  • int 형이 double 형으로 형변환되어 출력
16.0
33.0


5. Method 값 복사 & 주소 복사

기본형은 값 복사, 참조형은 주소 복사

1) 값 복사

  • 매개 변수가 기본 타입인 경우

  • 인자로 전달된 값이 그대로 매개 변수에 복사되어 전달

📌 값 복사 실습 📌

	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


2) 주소 복사

  • 매개 변수가 참조 타입인 경우

  • 값이 저장된 주소 자체를 복사하기 때문에
    변경된 값은 변경된 상태 그대로 유지

📌 주소 복사 실습 📌

	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


복습 겸 정리하니까 놓쳤던 부분도 습득할 수 있어서 좋다.. 다음 생성자도 힘내서 정리하자!

profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글