자바 프로그래밍 입문#4

파핑·2022년 3월 11일
0

JAVA PROGRAMMING

목록 보기
5/12
post-thumbnail

자바 공부기록4일차


#함수 호출과 스택 메모리

함수가 수행될 때 컴퓨터 메모리를 어떻게 사용하는지 살펴보자.
함수를 호출하면 그 함수만을 위한 메모리가 할당된다. 이 메모리 공간을 스택(stack)이라고 부른다.
스택은 자료를 밑에서 부터 쌓아올리는 구조인데 그렇기 때문에 마지막에 추가된 자료부터 순서대로 사용할 수 있다.
이 구조를 LIFO(Last In First Out)구조라고 부른다.

함수가 호출되면 그 함수가 사용할 메모리 공간이 스택에 생성된다. 프로그램을 시작할 때 main( )함수부터 호출하기 때문에 가장 먼저 main( )함수에 포함된 변수 num1, num2, sum을 저장할 메모리 공간이 생성된다.
그리고 main( )함수에서 add( )함수를 호출하면 add( )함수를 저장할 메모리 공간이 스택에 새롭게 생성된다.

add( )함수 수행이 끝나고 함수에 할당했던 메모리 공간을 해제하는 과정을 살펴보자.

add( )함수 수행이 끝나고 결과 값이 반환되면 add( )함수가 사용하던 메모리 공간은 자동으로 사라진다. 프로그램에서 여러 함수를 사용하는 경우에 함수를 호출한 순서대로 메모리 공간이 만들어지고 맨 마지막에 호출한 함수부터 반환된다.
따라서 메모리 공간도 맨 마지막에 추가된 것부터 스택에서 사라진다.

그리고 그림에서 보듯 num1, num2 변수와 add( )함수에서 사용하는 n1, n2변수는 서로 다른 메모리 공간을 사용하므로 이름이 같아도 달라도 상관없다.
이렇게 함수 내부에서만 사용하는 변수를 지역 변수라고 한다. 지역 변수는 스택메모리에 생성된다.

-함수의 장점

이렇게 복잡한 함수를 사용하는 이유가 뭘까? 함수의 장점을 알아보자.

①함수를 사용하면 기능을 나누어 코드를 효율적으로 구현할 수 있다.
계산기를 구현하려면 숫자를 입력받아야 한다. 그리고 사칙 연산을 한 뒤 결과 값이 출력된다. 이 과정을 구현하는 코드를 main( )함수 안에 한꺼번에 작성할 수 있겠지만 덧셈, 뺄셈, 곱셈, 나눗셈으로 기능을 나누어 각 연산을 수행하는 함수를 여러 개 만든 뒤 main( )함수에서 필요할 때마다 각 함수를 호출할 수도 있다.
이렇게 기능을 분리해서 만들면 프로그램의 가독성도 좋아진다.

②기능별로 함수를 구현해 놓으면 기능을 매번 코드로 만들지 않아도 함수를 호출하면 되서 편리하다.

중복되는 코드도 막을 수 있다.

③프로그램을 실행할 때 생긴 오류를 수정하는 디버깅 작업을 할 때 편리하다.
하나의 기능이 하나의 함수로 구현되어 있기 때문에 오류가 난 기능만 찾아서 수정하면 된다.


-클래스 기능을 구현하는 메서드
자바 프로그램에는 클래스 내부에서 사용하는 멤버 함수가 있다. 이를 메서드라고 하는데 메서드는 멤버 변수를 사용하여 클래스의 기능을 구현한다.
즉 메서드는 함수에 객체 지향 개념이 포함된 용어로 이해하면된다. 스택메모리의 사용 방법, 함수의 장점 등 모두 메서드에 동일하게 적용된다고 보면 된다.

그럼 Student 클래스에 메서드를 직접 구현해 보자.

public class Student {
ㅤint studentID;
ㅤString studentName;
ㅤint grade;
ㅤString address;

ㅤpublic String getStudentName(ㅤ) {
ㅤreturn studentName;
ㅤ}
//학생의 이름을 반환하는 메서드
}

메서드 이름은 해당 클래스를 사용하는 코드의 입장에서 짓는 것이 좋다. 예를 들어 Studnet클래스를 사용하는 A클래스가 있다고 치자 A클래스에서 학생이름을 가져오는 기능을 제공하는 메서드 이름은 getStudentName으로 짓는 것이 좋다. 이 메서드의 반환 값은 studnetName인데 studentName 자료형이 String이므로 반환형도 String으로 한다.

이번에는 학생 이름을 멤버 변수에 대입하는 setStudnetName( )메서드를 만들어 보자.

...
ㅤpublic void setStudnetName(String Name) {
ㅤstudentName = name;
ㅤ}
}

setStudnetName( )메서드는 Studnet클래스 사용하는 다른 코드에서 학생 이름을 새로 지정하거나 바꾸어 준다. studnetName값을 지정하는 기능을 제공하는 것이다. 이 메서드는 이름을 전달받아 지정하는 것이기 때문에 매개변수 name이 필요하다. 매개변수 name을 멤버변수 studentName에 대입하면 학생 이름이 지정된다. 반환 값은 없으므로 반환형은 void로 지정한다.


profile
html/css공부 중(JAVA잠시 접어두는 중)

0개의 댓글