1. 함수의 개념
함수란 특정 입력값을 받아 내부 로직을 수행 후 그 결과값을 반환하는 프로그램 단위이다. 즉 어떠한 기능을 정의한 코드들의 독립적인 집합이라고 볼 수 있다. 이러한 함수의 개념은 Java 의 객체지향을 이해하는데 필수적인 요소이다.
함수는 클래스 내부에 구현되며 멤버 함수라고도 불린다.
함수(메서드) 를 정의하고 사용하는데에는 아래와 같은 이유들이 있다.
- 기능을 공통화 함으로써 중복되는 코드를 줄여 경량화 및 가독성을 높일 수 있다.
- 기능에 문제가 생겼을때 해당 메서드만 수정하면 됨으로 다른 코드의 영향도를 낮추어 유지보수에 용이하다.
함수(메서드) 정의 방법
- 리턴 타입을 정의해주어야 한다. 리턴값이 없다면 void 를 입력해준다.
- 메서드는 0 ~여러개의 다양한 타입의 파라미터 값을 받을 수 있다.
- 반환 타입이 void 가 아닌경우 반드시 정의된 타입에 맞는 변수 또는 상수값을 반환해야 한다.
2. 함수 예제 1 - 홀수, 짝수 판별기
가장 기본적으로 main() 메서드를 활용해 홀수, 짝수 판별기를 만들어 보자.
자바 파일을 컴파일 하고 실행하면 main() 메서드가 실행 된다.
만약 main() 메서드가 존재하지 않는다면 아래와 같은 오류가 발생한다.
표준 입력을 통해 사용자로부터 값을 받고 그 값이 짝수인지 홀수인지를 판별하는 함수를 정의할 것이다.
2-1. 먼저 static main() 메서드에 로직을 간단하게 정리해보자.
import java.util.Scanner;
public class App {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("짝수 홀수 판별기 : 수를 입력하기 - ( 0 입력시 종료 )");
int num = sc.nextInt();
if(num <= 0) break;
if(num % 2 == 0)
System.out.println("[ 짝수 ] 를 입력했다. - " + num);
else
System.out.println("[ 홀수 ] 를 입력했다. - " + num);
}
System.out.println("판별기 종료");
sc.close();
}
}
nextInt() 로 값을 받는다.
0 입력시 종료되는 짝수 홀수 판별기 이다. 아래는 실행 결과이다.
2-2. 홀짝 판별 기능 메서드화
위 로직에서 홀짝 판별 기능을 메서드로 따로 간단 구현해볼것이다.
import java.util.Scanner;
public class App {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("짝수 홀수 판별기 : 수를 입력하기 - ( 0 입력시 종료 )");
int num = sc.nextInt();
if(num <= 0) break;
if(getEven(num))
System.out.println("[ 짝수 ] 를 입력했다. - " + num);
else
System.out.println("[ 홀수 ] 를 입력했다. - " + num);
}
System.out.println("판별기 종료");
sc.close();
}
private static boolean getEven(int num) {
return num % 2 == 0;
}
}
getEven() 이라는 함수를 생성하여 홀짝 기능을 메서드화했다. 해당 메서드는 private 이기때문에 외부 참조는 불가하며 같은 클래스내에서만 재사용 가능하다.
여기서 주목할점은 getEven() 이라는 함수를 정의할때 static 을 붙였다는 것이다.
static은 왜 붙여준것일까?
뒤 내용에서 자세한 설명을 다룬다고 한다. 이 부분에서는 간단하게 설명하자면 메모리에 일반 함수와 static(정적) 함수 또는 변수들이 올라오는 시점이 다르기 때문이다. static 이 먼저 올라오고 그다음 일반 함수, 변수들이 메모리에 올라오는데 getEven() 이라는 함수가 만약 일반 함수라면, static main() 메서드가 메모리에 올라왔을때 getEven() 은 메모리상에 존재하지 않는 상태이기 때문에 아래와 같은 참조 오류가 발생한다.
그렇기 때문에 static main() 이 메모리상에 올라가는 시점에 getEven() 함수 또한 동일한 시점에 메모리에 올려주어야 함으로 getEven() 함수에도 static 을 붙여준다.
잘 작동한다.
3. static 실습하기.
static 의 특징
- static 으로 변수 선언시 클래스 변수로 선언해야 한다.
- static 은 메서드 내부에서 사용 불가능하다.
- static 은 함수 외부에 있는 static 변수 참조 가능하다.
- static 함수는 함수 밖 인스턴스 변수를 참조 불가능하다. 서로 메모리에 올라가는 시점이 다르다.
public class Main {
/**
* static 은 클래서 변수 선언
* 클래스가 메모리에 올라갈때 생성
* */
static double PIE = 3.141592;
static boolean isPositive(int num) {
return num > 0;
}
// 인스턴스 변수
String title = "참조 가능하지 체크";
public static void main(String[] args) {
/*
1. static 은 메서드 내부에서 사용 불가능.
Illegal modifier for parameter num; only final is permitted 오류 발생
*/
// static int num = 0;
/*
2. static 은 함수 외부에 있는 static 변수 참조 가능.
*/
System.out.println(PIE);
/*
3. static 은 함수 앞에 붙일 수 있다.
*/
int num = 5;
boolean result = isPositive(num);
System.out.println(result);
/*
4. static 함수는 함수 밖 인스턴스 변수를 참조 불가능하다.
왜냐하면 static 과 인스턴스는 서로 메모리에 올라가는 시점이 다르기 때문이다.
Non-static field 'title' cannot be referenced from a static context 오류 발생.
*/
// String test = title;
}
}
4. 함수 예제 2 - 파보나치 수
import java.util.Scanner;
public class FibonacciV3 {
static int getUserInput() {
Scanner sc = new Scanner(System.in);
System.out.println("수열 개수를 입력해주세요.");
int num = sc.nextInt();
sc.close();
return num;
}
static void getFibonacci(int[] fibonacci) {
int a = 1;
int b = 1;
int num = fibonacci.length;
fibonacci[0] = a;
fibonacci[1] = b;
for (int i = 0; i < num-2; ++i) {
fibonacci[i+2] = a + b;
a = b;
b = fibonacci[i+2];
}
}
static void printResult(int[] numbers) {
System.out.println("결과 확인 ");
int fibonacci[] = {1,2,3};
for (int number : numbers) {
System.out.println(number);
}
}
public static void main(String[] args) {
System.out.println("파보나치 수열 만들기! V3");
int num = getUserInput();
int[] fibonacci = new int[num];
getFibonacci(fibonacci);
printResult(fibonacci);
}
}
'Java 문법 > 코딩은 처음이라 with 자바 (책)' 카테고리의 다른 글
[Java] - 제어문4 : 조건문 - switch 문 (0) | 2023.03.12 |
---|---|
[Java] - 제어문3 : while 문 (0) | 2023.03.12 |
[Java] - 제어문2 : 조건문 - if 문 (1) | 2023.03.12 |
[Java] - 제어문1 : for 문 && 향상된 for 문 (0) | 2023.03.12 |
[Java] - 배열 (1차원 배열, 다차원 배열) (0) | 2023.03.11 |