함수(Function)란?
특정 작업을 여러 번 반복해야 할 때, 같은 코드를 계속 작성하면 코드의 중복이 심해진다는 문제가 생긴다.
이때 사용하는 것이 함수(Function)이다.
반복되는 코드를 따로 빼서 함수라는 틀로 선언해두고, 필요한 곳에서 함수를 호출해서 사용하면 된다. 이렇게 하면 같은 코드를 여러 번 작성할 필요가 없어지고, 코드를 수정해야 할 때도 함수만 수정하면 되기 때문에 관리하기도 훨씬 편하다.
함수는 클래스 안에 선언해야 하며, 함수 안에 또 다른 함수를 선언할 수는 없다.
public class Main {
public static void main(String[] args) {
work();
work();
work();
}
public static void work() {
System.out.println("work1");
System.out.println("work2");
System.out.println("work3");
}
}
매개변수를 이용하는 함수
함수를 사용할 때마다 같은 값만 사용하는 것이 아니라, 상황에 따라 다른 값을 전달하고 싶을 때가 있다.
이때 사용하는 것이 매개변수(Parameter)이다.
매개변수는 함수를 선언할 때 전달받을 값을 저장하는 변수이다.
함수를 호출할 때 값을 전달하면, 전달된 값이 매개변수에 저장되어 함수 안에서 사용할 수 있다.
함수를 호출할 때 전달하는 값을 인수(Argument)라고 하며, 전달한 인수는 함수의 매개변수(Parameter)에 순서대로 저장된다.
또한 함수를 호출할 때는 매개변수의 개수와 자료형이 함수를 선언한 것과 일치해야 한다.
만약 개수가 다르거나 자료형이 다르면 오류가 발생한다.
public static void main(String[] args) {
work(10, 20);
work2("라푼젤");
}
// 매개변수 개수, 타입 일치해야 됨.
public static void work(int num1, int num2) {
System.out.println(num1 + num2);
}
public static void work2(String name) {
System.out.println("안녕하세요 저는 " + name + "입니다.");
}
리턴값이 있는 함수
함수는 작업을 수행한 뒤 리턴(return)을 이용해 결과값을 외부로 전달할 수 있다.
쉽게 말하면 함수가 자신의 리턴값으로 변신한다고 생각하면 된다.
예를 들어 아래 코드에서 plus() 함수는 두 수를 더한 결과를 리턴한다.
public static void main(String[] args) {
plus(10, 20); // 30
plus(5, 15); // 20
}
public static int plus(int num1, int num2) {
System.out.println(num1 + num2);
return num1 + num2;
}
하지만 위 코드에서는 리턴값을 사용하지 않았기 때문에, 단순히 계산 결과만 반환하고 끝난다.
리턴값을 사용하는 이유
리턴값이 필요한 가장 큰 이유는 함수의 결과를 이용해 다른 작업을 할 수 있기 때문이다.
예를 들어 원의 넓이를 구하는 함수가 있다고 해보자.
public static void main(String[] args) {
double rst1 = circleArea(10);
double rst2 = circleArea(20);
System.out.println(rst1);
System.out.println(rst2);
System.out.println(rst1 / 2); // 157.0
System.out.println(rst2 * 2); // 1256.0
}
public static double circleArea(int radius) {
return radius * radius * 3.14;
}
circleArea() 함수는 계산한 원의 넓이를 리턴하기 때문에, 그 결과를 변수에 저장할 수도 있고 다른 계산에 사용할 수도 있다.
예를 들어 circleArea(10)은 314.0으로 변신하므로 아래와 같이 생각할 수 있다.
double rst1 = 314.0;
이렇게 전달받은 값을 이용해 rst1 / 2처럼 추가 계산을 하거나, 다른 함수의 매개변수로 전달하는 등 다양한 작업을 할 수 있다.
즉, 함수의 결과를 2차 작업에 활용하려면 함수가 결과값을 리턴해야 한다.
지역 변수
함수 안에서 선언하는 모든 변수는 지역변수(Local Variable)이다.
지역변수는 자신이 선언된 함수 안에서만 사용할 수 있으며, 함수의 실행이 끝나면 메모리에서 자동으로 해제된다.
public static void main(String[] args) {
int a = 10; // 4바이트
String b = "hello"; // 8바이트
work();
int c = 20; //4바이트
String d = "world"; // 8바이트
}
public static void work() {
int c = 10; // 4바이트
String d = "hello"; // 8바이트
System.out.println(c);
System.out.println(d);
}
main() 함수에서는 a, b, c, d가 지역변수이고, work() 함수에서는 c, d가 지역변수이다.
여기서 중요한 점은 함수마다 사용하는 메모리가 서로 분리되어 있다는 것이다.
- main() 함수는 a(4바이트)와 b(8바이트)를 사용한다.
- work() 함수도 c(4바이트)와 d(8바이트)를 사용한다.
work() 함수가 호출되면 work()만의 메모리 공간이 생성되고, 함수가 종료되면 work()에서 사용한 메모리만 해제된다. main()에서 사용하던 변수들은 그대로 유지된다.
즉, work() 함수의 c와 main() 함수의 c는 이름만 같을 뿐 서로 다른 변수이다.
지역변수의 가장 큰 특징은 함수가 실행되는 동안에만 존재하고, 함수가 끝나면 메모리에서 자동으로 사라진다는 것이다. 그래서 다른 함수에서는 해당 지역변수를 사용할 수 없다.
인스턴스 변수
변수는 선언하는 위치에 따라 인스턴스 변수와 지역변수로 나뉜다.
지역변수는 함수 안에서 선언하는 변수이고, 함수가 실행되는 동안에만 사용할 수 있다. 함수의 실행이 끝나면 메모리에서 자동으로 해제된다.
반면 인스턴스 변수는 클래스 안에 선언하고, 객체가 생성될 때 함께 생성되는 변수이다. 객체가 존재하는 동안에는 계속 사용할 수 있으며, 여러 메서드에서 같은 값을 공유할 수 있다.
public class Instance {
public static void main(String[] args) {
Person p1 = new Person();
p1.age = 20;
p1.name = "홍길동";
p1.home = "서울";
p1.height = 180.5;
p1.introduce();
}
}
class Person {
int age;
String name;
String home;
double height;
public void introduce() {
System.out.println("나이: " + age + " 이름: " + name + " 사는 곳: " + home + " 키: " + height);
}
}
Person 클래스의 age, name, home, height는 모두 인스턴스 변수이다.
Person p1 = new Person();을 실행하면 Person 객체가 생성되고, 이와 동시에 인스턴스 변수들도 함께 생성된다.
이후 p1.age = 20, p1.name = "홍길동"처럼 값을 저장하면, introduce() 메서드에서도 같은 값을 그대로 사용할 수 있다.
반면 introduce() 메서드 안에서 선언하는 변수는 모두 지역변수이다.
public void introduce() {
int year = 2026; // 지역변수
}
year는 introduce()가 실행되는 동안에만 존재하며, 메서드가 종료되면 메모리에서 자동으로 해제된다.
'알고리즘 > Java' 카테고리의 다른 글
| [Java] static 변수 / 메서드 (0) | 2026.07.14 |
|---|---|
| [Java] 리스트(List) / 맵(Map) (0) | 2026.07.14 |
| [Java] 클래스 (0) | 2026.07.13 |
| [Java] 배열의 복사 (0) | 2026.07.13 |
| [Java] 반복문 for, while (0) | 2026.07.10 |
댓글