[Java] 2_2_클래스와 객체1(2)

Haeun Noh·2022년 8월 13일
0

0813


이번 강의에서는 메서드와 함수에 대해서 배울 것이다. 메서드는 main밖에 모르고 함수도 아는 것이 별로 없어서 확실하게 개념을 잡고 가는 강의였던 것 같다. 그럼 정리를 시작해보자.



메서드

: 객체의 기능을 제공하기 위해 클래스 내부에 구현되는 함수

메서드는 함수의 일종이다. 함수 중에서 객체, 클래스 안에 멤버 변수들을 이용해서 구현된 함수를 말한다.

그렇다면 과연 함수라는 것은 무엇일까?



함수

: 하나의 기능을 수행하는 일련의 코드
: 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드의 집합

함수에는 입력과 출력이 있다. 만약 더하기라는 함수가 있다면 '더한다' 라는 능력을 구현하기 위해서 두 개를 입력을 받을 것이고, 두 개의 값이 더해져서 더해진 출력이 나올 거다.

중복되는 기능은 함수로 구현하여 함수를 호출하여 사용한다.
예를 들어 보자. 두 숫자를 더한다, 가장 좋은 성적 두 개를 더한다, 두 거리를 더한다 에서 모두 더한다라는 기능을 가지고 있다는 것이 나타나진다. 이 때 이러한 더한다라는 기능을 가지는 어떠한 것을 따로 구현하여 더할 필요가 있을 때, 이러한 함수를 호출하여 사용한다.
이러한 기능을 제공하는 것을 가져다 사용하는 것을 함수를 호출한다라고 말한다.


함수 정의하기

함수를 정의한다는 것은 함수를 코드로 구현한다라는 것이다. 함수를 정의할 때는 함수의 이름 매개변수 반환 값을 선언하고 코드를 구현한다.

함수를 구현할 때, 함수는 하나의 기능을 함수 이름에 맞게 구현을 하는 것이 가장 적절하다.

함수를 정의할 때는 다음과 같이 정의할 수 있다.

(함수 반환형) (함수 이름) (매개변수) {
	...
	...
    (return 예약어);
}

int add (int num1, int num2) {
	int result;
    result = num1 + num2;
    return result;
}
  • 함수 반환형 : 함수의 기능과 관련하여 명명
  • 함수 이름 : 함수의 기능과 관련하여 명명
  • 매개변수 : 함수의 수행을 위해 필요한 변수
  • return : 함수 수행 결과를 반환하기 위한 예약어

위의 예시에서 add함수 이름이다.
입력이 되는 값은 자료형과 같이 쓰고, 이를 매개 변수라고 한다.
더한 값이 result에 있고 이 값을 돌려주기 위해서 return에 알려주어야 한다.
result의 데이터 타입은 int이기 때문에 맨 위의 add 앞에 int를 써준다.

여기에서 반환값이나 변수가 없을 수도 있다.

함수 정의에 관련된 예제를 보며 확실히 이해해보자.

package classpart;

public class FunctionTest {

	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 30;
		
		int sum = addNum(num1, num2);
		System.out.println(sum);
	}

	public static int addNum(int n1, int n2) {
		int result = n1 + n2;
		return result;
	}
}

n1n2addNum이라는 함수에서 새로 선언된 변수이고, 이 변수들의 역할은 num1num2의 값을 복사해서 받는 역할을 한다. num1, 즉 n1의 값이 10이고 num2, 즉 n2의 값이 30이므로 result의 값은 n1 + n2의 값인 40이다. 그 뒤에 resultreturn(반환)하여 main함수에서 선언된 sum변수에 반환값이 들어가 출력된다.


함수를 왜 사용하나요?

함수를 사용하는 가장 큰 이유는 바로 반복적인 프로그래밍을 피할 수 있기 때문이다. 우리가 코드를 짤 때, 코드가 너무 길면 어떻겠는가? 보기에도 힘들고 가독성도 떨어지고 해석하기에서 힘듦이 있을 것이다.

함수를 사용하는 이유를 세 가지로 나누었다.
1. 코드를 효율적으로 구현하기 위함
2. 필요한 기능만 호출해서 구현할 수 있음
3. 유지 보수할 때 유용함

우리가 필요한 기능을 따로 분리해서 구현하게 되면 내가 기능이 필요할 때 해당 기능만 호출해서 구현할 수 있으니 훨씬 효율적인 코드가 될 것이다. 필요한 기능별로 구별해놓으면 필요할 때마다 필요한 기능이 있는 함수를 호출해서 쓸 수 있기 때문이다. 또한 우리가 코드를 작성하게 되면 분명 오류가 발생할 것이다. 이 때 하나하나 다 바꿔주는 것이 아닌 한꺼번에 고칠 수 있어 유지 보수에 아주 유용하다.



함수와 스택 메모리

스택(stack)이란?

: 함수가 호출될 때 사용하는 메모리
: 함수의 기능 수행이 끝나면 자동으로 반환되는 메모리

함수 호출과 스택 메모리 구조

위의 함수 정의와 관련된 예제를 보며 함수 호출과 스택 메모리 구조를 알아보자.

  1. main()함수가 사용할 메모리 공간이 스택에 생성된다.
  2. main()에서 add()를 호출한다.
  3. add()함수가 사용할 메모리 공간이 스택에 생성된다.

메모리 생성 방향은 다음과 같다고 할 수 있다.

num1, num2, sum --> n1, n2, result

위의 함수 정의와 관련된 예제를 다시 예시로 들어보겠다.
main()이라는 함수가 있었고, main()함수addNum()이라는 함수를 호출했다. 이 때 함수가 사용할 메모리를 스택이라고 하는데 스택의 구조는 택배상자에 물건이 점점 쌓이는 구조라고 생각하면 이해가 빠를 것이다.



profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글