이것이 자바다 6장 - 메소드

오늘·2021년 3월 4일
0

Java

목록 보기
11/42
post-custom-banner

필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해 다양한 기능을 수행하기도 한다. 메소드는 객체 간의 데이터 전달의 수단으로 사용된다.
외부로부터 매개값을 받을 수도 있고, 실행 후 어떤 값을 리턴할 수도 있다.

메소드 선언

선언부(리턴타입, 메소드이름, 매개변수선언)와 실행블록으로 구성된다.
메소드 선언부를 시그너처(signature)라고 하기도 한다.

// 메소드 형태
리턴타입 메소드이름 ([매개변수 선언,...]){
	실행코드
}

// 생성자 형태
클래스 ([매개변수 선언, ...]) {
	객체의 초기화 코드
}

강의

메소드 정의
접근지정자 리턴타입 메소드명(매개변수) {
	//동작할 내용
  }
	   

메소드는 정의해두었다가 사용할 때 호출해 사용
(호출)
리턴타입 변수명 = 메소드명(매개변수)

리턴타입

메소드가 실행 후 리턴하는 값의 타입을 말한다. 리턴이 없는 경우도 있지만 실행 후 결과를 호출한 곳에 넘겨줄 경우에는 리턴값이 있어야한다.

// 리턴 값이 없는 메소드
void powerOn(){...}
// 불러올때 전해줄 매개변수가 없으니 단순 호출
poserOn();


// 리턴이 있는 메소드
double avg(int x, int y){...}
// 불러올 때 필요한 값을 전해줘야하니
// double result = avg(10, 20);
/* 하지만 리턴타입이 있다고 해서 반드시 리턴값을 변수에 저장할 필요는 x
단순히 메소드 실행만이 중요하다면 변수 선언 없이 메소드 호출도 가능하다 */

avg(10, 20);

메소드 이름

주의 사항
1. 숫자로 시작하면 안되고, ($와 _를 제외한) 특수문자 사용 안됨
2. 관례적으로 메소드명은 소문자작성
3. 서로 다른 단어가 혼합된 이름이라면 뒤이어 오는 단어의 첫머리 글자는 대문자

void run(){ }
void startEngine(){ }
String studentName(){ }
int get_scores(){ }

매개 변수 선언

-매개 변수는 메소드가 실행할 때 필요한 데이터를 외부로부터 받기 위해 사용된다. 매개 변수가 필요한 경우가 있고 없는 경우도 있다.
-외부 클래스에서 ex.Book 클래스의 메소드를 호출하기 위해서는 Book b = new Book(); 으로 Book 객체를 생성하고, 참조변수인 b 변수에 도트( . )와 함께 메소드이름(매개값, ... ) 형태로 호출해야 메소드 블록이 실행된다.

(Book 클래스)
public class Book {
	int sum(int x, int y) {
    	int hap = x + y;
    	return hap;
    }
}


(메소드 호출)
public class Booknum {
	public static void main(String[] args) {
    	Book b = new Book();
        int result = b.hap(5,6);
        System.out.println(result);
    }
}

매개 변수의 수를 모를 경우

경우에 따라서는 메소드를 선언할 때 매개 변수의 개수를 알 수 없는 경우가 있다. 이때의 해결책은 매개 변수를 다음과 같이 배열 타입으로 선언하는 것이다.

// (1) 배열 타입으로 선언
int sum1(int[] values) { }

// (2) 배열을 생성하지 않고 값의 리스트만 넘겨주는 방법도 있다.
int sum2(int ... values) { }

sum1() 메소드를 호출할 때 배열을 넘겨줌으로써 배열의 항목 값들을 모두 전달할 수 있다. 배열의 항목 수는 호출 시 결정된다.

(1)
int[] values = { 1,2,3 };
int result = sum1(values);
int result = sum1(new int[] { 1,2,3,4,5 });

(2)
int[] values = { 1,2,3 };
int result = sum2(1,2,3);
int result = sum2(values);
int result = sum2(new int[] { 1,2,3,4,4 });

(강의)

메소드

// 경우에 따라 메소드를 선언할 때 매개변수의 개수를 알 수 없는 경우가 있다
// 해결책은 매개 변수를 배열 타입으로 선언하는 것이다
// 방법1. 
public class Computer {
	int sum1(int[] values) {
		int sum = 0 ;
		for(int i=0; i<values.length; i++) {
			sum += values[i];
		}
		return sum;
	}
	
	// 방법 2.
	//... : 매개변수에 ...을 사용해 선언하면 메소드 호출시 넘겨준 값의 갯수에 따라 배열이 생성된다
	int sum2(int ... values) {
		int sum = 0;
		for(int i=0; i<values.length; i++) {
			sum += values[i];
		}
		return sum;
	}
}

메인

public class ComputerExample {
	public static void main(String[] args) {
		Computer myCom = new Computer();
		
		// 방법 1 호출
		// 값을 선언한 뒤 넣어주기
		int values1[] = {1,2,3};
		int result1 = myCom.sum1(values1);
		System.out.println("result1 : "+result1);
		
		// 직접 뒤에 넣어주기
		int result2 = myCom.sum1(new int[] {1,2,3,4,5});
		System.out.println("result2 : " + result2);
		
		
		
		// 방법2 호출
		// ... 을 사용해준 (매개변수 갯수를 모를때 만들어준 배열) 입력
		int result3 = myCom.sum2(1,2,3);
		System.out.println("result3 : " + result3);
		
		int result4 = myCom.sum2(1,2,3,4,5);
		System.out.println("result4 : " + result4);
	}
}

리턴(return)문

리턴값이 있는 메소드, 없는 메소드

-메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴(return)문을 사용해 리턴값을 지정해야 한다. return 문이 실행되면 메소드는 즉시 종료된다.
-void로 선언된 리턴값이 없는 메소드에서도 return; 형태로 return 문을 사용할 수는 있는데, 사용시 메소드 실행을 강제 종료시킨다.

-리턴있는 예시

int plus(int x, int y) {
	int result = x + y;
    	return result;
}

-리턴없는 void의 return 사용 예시

void run(){
	while(true){
    		if(num>0) {
            		System.out.println("진행하세요");
                    	num-= 1;
                } else {
                	System.out.println("중지합니다");
                    return;
                    // run 메소드 실행 종료
                }
        }
}


(강의)
```java
메소드 종류
public int testSum() { // 리턴타입이 int인 메소드
	hap = num1 + num2;
	return hap;
}
	
public double testSum1() { // 리턴타입이 double 인 메소드
	hap = num1 + num2;
	return hap;
}
public void testSum2() { // 리턴타입이 없는 void 메소드
	hap = num1 + num2;
	System.out.println(hap);
}	
void print() { // 리턴타입이 없는 void 메소드
	System.out.println(hap);
}

메소드 호출

클래스 내, 외부의 호출에 의해 실행된다.

객체 내∙외부에서의 호출

-클래스 내에서 다른 메소드를 호출할 경우 메소드(매개값, ...); 형태로 작성하면 된다.
-클래스 변수 = new 클래스(…); 안해줘도 된다는 것

-메소드는 객체에 소속된 멤버이므로 객체가 존재하지 않으면 메소드도 존재하지 않기 때문에 객체 외부에서 호출시 클래스로부터 객체를 생성해야 한다.
클래스 변수 = new 클래스(…); 해줘야 한다는 것
-객체 생성 되었다면 참조 변수와 함께 도트( . ) 연산자를 사용해 메소드를 호출할 수 있다. 도트는 객체 접근 연산자로 객체가 가지고 있는 필드나 메소드에 접근할 때 사용된다.

public class Calcu {
	int plus(int x, int y) {
		int result = x + y;
		return result;
	}

	double avg(int x, int y) {
		double sum = plus(x, y); // 2. int plus() 호출
		double result = sum / 2;
		return result;
	}

	void execute() {
		double result = avg(7, 10); // 1. double avg() 호출
		println("실행결과: " + result); // 3. 계산 후 println() 호출
	}

	void println(String message) {
		System.out.println(message);
	}
}
// 객체에서 같은 멤버인 다른 메소드 호출시 아래와 같은 형태
// int plus(int x, int y)
// double sum = plus(x, y);
// double result = avg(7, 10);

---------------------------

public class CalcuEx {
	public static void main(String[] args) {
    		Calcu myCalc = new Calcu();
            myCalc.execute();
        }
}
// 외부 객체에서 다른 객체 호출시 아래와 같은 형태
// Calcu myCalc = new Calcu();
// 참조변수.메소드(…); ←리턴값이 없거나, 있어도 리턴값을 받지 않을 경우
// myCalc.execute();
// 타입변수 = 참조변수.메소드(…) ←리턴값이 있고, 리턴값을 받고 싶을 경우
// int sum = myCalc.plus();

메소드 오버로딩

클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 메소드 오버로딩(overloading)이라 한다. 사전적 의미는 많이 싣는 것을 뜻한다. 하나의 메소드 이름으로 여러 기능을 담는다 하여 붙여진 이름이라 생각할 수 있다.

(강의)

// 메소드 명을 똑같이 해도 매개변수가 다르면 오류 안남 : 메소드 오버로딩
// 메소드 오버로딩 규칙
// 1.메소드 명이 동일 2.매개변수가 티입,순서,갯수 달라야함 3.리턴타입은 상관 없
// 메소드의 리턴타입과 매개변수의 리턴타입은 같아야함
	
int sum(int num1, int num2) {
	return num1+num2;
}
double sum(double num1, double num2, double num3) {
	return num1 + num2 + num3;
}
String sum(String num1, String num2) {
	return num1 + num2;
}
post-custom-banner

0개의 댓글