JAVA 3일차.

김재현·2022년 7월 30일
0

Java

목록 보기
3/15

메서드

  • 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것.
    기본적으로 수학의 함수와 유사하며, 어떤 값을 입력하면 작업을 수행해서 결과를 반환한다.
  • 차이점은 메서드는 함수와 달리 입력값 또는 출력값이 없을 수 있고, 둘 다 없을 수도 있다.
  • 메서드가 내부적으로 어떤 과정을 거쳐 결과를 내는지 알 필요는 없다. 메서드에 투입하는 값과 반환하는 결과만 알면 된다.
  • 메서드는 크게 '선언부(header, 머리)' 와 '구현부(body, 몸통)'으로 이루어져 있따. 메서드를 구현하는 것은 선언부와 구현부를 작성하는 것을 뜻한다.
int add(int a, int b){       // 선언부
	int result = a+ b;
    return result;           // 호출한 메서드로 결과를 반환한다.
}

선언부를 제외하면 모두 구현부이다.

메서드의 선언부

  • 메서드 선언부는 '메서드의 이름'과 '매개변수 선언', 그리고 '반환타입'으로 구성되어 있다.
    메서드가 작업을 수행하기 위해 어떤 값들을 필요로 하고 작업의 결과로 어떤 타입의 값을 반환하는지에 대한 정보를 제공.
int add (int x, int y){
	int result = x + y;
    return result;
}
  • int add (int x, int y)가 선언부이다.
  • int는 반환(출력)타입이며, add는 메서드 이름, (int x, int y)는 매개변수를 선언한 부분이다. 즉, 두 개의 정수를 입력받아서 두 값을 더한 결과를 int 타입으로 반환하는 메서드이다.
  • 메서드의 선언부는 후에 변경사항이 발생하지 않도록 신중히 작성해야하는데, 선언부를 변경하게 되면, 메서드가 호출되는 모든 곳이 함께 변경되어야 하기 때문이다.

매개변수 선언(parameter declaration)

  • 매개변수는 메서드가 작업을 수행하는데 필요한 값들(입력)을 제공받기 위한 값.
    필요한 값의 개수만큼 변수를 선언하며 각 변수 간의 구분은 ','를 사용.
    주의점은 일반적인 변수 선언과 다르게 두 변수 타입이 같아도 변수의 타입을 생략할 수 없다는 점.
int add (int x, int y) {~~~~}   // ok.
int add (int x, y) {~~~~}       // 에러.
  • 입력해야할 값의 개수가 많은 경우에는 배열이나 참조변수를 사용할 수 있다.
    값을 입력받을 필요가 없다면, 괄호 안에 아무것도 적지 않는다.

반환타입(return type)

  • 작업수행 결과(출력)인 '반환값(return value)'의 타입을 적는다.
    반환값이 없는 경우 'void'를 적는다.
  • 위에 정의된 'print99danAll'은 구구단 전체를 출력하는데 작업을 수행한느데 필요한 값(입력)도, 작업수행의 결과인 반환값(출력)도 없다. 그래서 반환타입이 'void'이다.

메서드의 구현부

  • 선언부 다음에 오는 {} 안에 들어가는 것을 '메서드의 구현부'라고 하는데, 여기에 메서드를 호출했을 때 수행될 문장들을 넣는다.

return 문

  • 반환타입이 'void'가 아닌 경우, 구현부 안에 return 반환값;이 반드시 포함되어 있어야 한다. 작업을 수행한 결과인 반환값을 호출한 메서드로 전달하는데, 이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.
  • 매개변수와 달리 return문은 단 하나의 값만 반환할 수 있는데, 메서드로의 입력(매개변수)는 여러개일 수 있어도 출력(반환값)은 최대 하나만 허용하는 것이다.
int add (int x, int y){     // 반환타입은 int
	int result = x + y;     // 출력 result 역시 int
    return result;          
}

지역변수 (local variable)

  • 메서드 내 선언된 변수들은 메서드 내에서만 사용하므로 서로 다른 메서드라면 같은 이름의 변수를 선언해도 됨. 메서드 내에서 선언된 변수를 '지역변수'라고 한다.
  • 매개변수 역시 메서드 내에서 선언된 것으로 간주되므로 지역변수이다.

메서드 호출

메서드 이름(값1, 값2, ....);     // 메서드를 호출하는 방법.
print99danAll();               // void print99danAll()을 호출.
int result = add (3, 5);       // int add(int x, int y)를 호출하고 결과를 result에 저장. 

인수(argument)와 매개변수(parameter)

  • 메서드를 호출할 때 ()안에 지정해준 값들을 '인수' 또는 '인자'라고 하는데, 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 한다.
  • 인수는 메서드가 호출되면서 매개변수에 대입되므로, 인자의 타입은 매개변수의 타입과 일치하거나 자동 형변환이 가능해야한다.
int result = add(1, 2, 3);      // 에러 발생. 메서드에 선언된 매개변수의 개수가 다름. 
int result = add(1.0, 2.0);     // 에러 발생. 메서드에 선언된 매개변수의 타입이 다름. 
  • 반환타입이 void가 아닌 경우, 멧더가 작업을 수행하고 반환한 값을 대입연산자로 변수에 저장하는 것이 보통이지만, 저장하지 않아도 문제가 되지 않는다.

메서드의 실행 흐름


1. class MyMath를 생성한다.
2. 메서드를 생성한다.
add, subtract, multiply, divede를 각각 메서드로 생성했으며, a와 b는 매개변수로 공통되게 사용되었지만, 같은 값이 아닌 각기 다른 값이다.

long result = a + b;
return result;            는
return a+b;               로 간략화 할 수 있다.
  1. 클래스 MyMath에서 인스턴스 mm을 생성한다.
    Mymath mm = new MyMath
  2. 메서드 들을 호출하기 위한 구문을 작성한다.
    long result1 = mm.add(x, y);
    메서드 add에 인자 x와 y가 대입되어 result1에 저장된다.
  3. 결과값을 호출할 수 있는 구문을 작성한다.
    System.out.println("~~~" + result);

return문

  • return문은 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다.
    반환값의 유무에 관계 없이 모든 메서드에는 적어도 하나의 return문이 있어야 한다.
    반환타입이 void인 경우, 컴파일러가 메서드의 마지막에 return;을 자동으로 추가해준다.
  • 반환타입이 void가 아닌 경우, 즉 반환값이 있는 경우, 반드시 return문이 있어야 한다. return문이 없으면 '컴파일 에러'가 발생한다.
int add (int x, int y){     
	int result = x + y;     
    return result;          // 반환타입이 void가 아니므로 생략 불가. 
}

반환값

  • return문의 반환값으로 주로 변수가 오지만, 항상 그렇지는 않다.
int add (int x, int y){     
	int result = x + y;     
    return result;      
}
int add (int x, int y){     
	return x + y;   
}

resultx + y과 같으니 치환할 수 있다고 생각하면 간단하다.

  • 간단한 메서드의 경우 if문 대신 조건연산자를 사용해서 작성할 수 있다.

호출 스택

  • 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간 결과 등을 저장하는데 사용된다.
    메서드가 작업을 마치면 할당되었던 메모리 공간은 반환되어 비워진다.


1. 프로그램 실행 전.
2. 프로그램이 실행되면 main메서드가 실행되고 호출 스택에 쌓이게 된다.
3. main메서드가 println()메서드를 호출하게 되고 main위에 println() 메서드가 main위에 쌓인다. main메서드는 대기상태가 되고 println()메서드가 실행된다.
4. println()메서드가 작업을 종료하면 메모리를 반환하고 스택에서 사라진다. main메서드가 다시 동작한다.
5. 더이상 실행할 작업이 없어지면 main메서드도 종료되고 스택은 완전히 비워지며, 프로그램 역시 종료된다.

  • 호출스택을 조사해보면 메서드 간의 호출 관계와 수행 중인 메서드가 어느 것인지 알 수 있다. 아래에 쌓인 메서드가 위에 있는 메서드를 호출하기 때문이다.

  • 특징

    메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받음.
    메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거됨.
    호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드.
    아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드.

  • 반환타입(return type)이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드(caller)에게 반환한다. 대기상태에 있던 호출한 메서드는 넘겨받은 결과값으로 수행을 계속하게 된다.

0개의 댓글