대부분의 응용 프로그램을 설계할 때, 응용 프로그램을 기능 단위로 나눕니다. 코드를 작은 부분으로 나누면 설계가 용이하고, 코드를 이해하기 쉬우며, 단위로 디버깅 할 수 있기 때문에 코드를 작은 부분으로 나누는 것은 응용 프로그램을 디자인하는 핵심 원칙입니다.
Java에서는 클래스들 내에서 명명된 코드 블록을 단위로 응용 프로그램을 구성합니다. 이것을 메소드라고 하며, 메소드는 작업을 수행하거나 값을 계산하는, 클래스의 구성원입니다.
method 란?
객체는 상태와 행위(동작). 이렇게 2가지로 구분할 수 있다.
객체가 동작하기 위해 선언한 것을 method 라고 한다.
block : 같은 동작을 실행하기 위해 묶여있는 statement 의 묶음.
메소드 : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것
함수, 서브루틴, 프로시저, 서브 프로그램과 비슷한 개념
cf).
1. 함수 : 특정 작업을 수행하거나 값을 반환하는 코드 블록
2. 서브루틴, 서브 프로그램 : 보통 메소드와 함수를 포괄하는 더 일반적인 용어로 사용되곤 합니다. 이들은 재사용 가능한 코드 조각을 만드는 데 도움이 되며, 코드의 가독성과 유지보수를 쉽게 합니다.
3. 프로시저 : 값을 반환하지 않는 메소드나 함수를 가리키는데 사용되곤 합니다. 이는 자바에서 'void' 반환 타입을 가진 메소드와 유사한 개념입니다.
함수는 기능에 집중을 한다.
VS
프로시저 : 함수와는 상관없이 일정한 순서에 따라 실행해야 하는 블록 (절차에 집중)
ex). 함수가 어떻게 동작하는지는 알 필요없고, 인자만 전달하고 기능만 사용해
System.out.println("OK");
java는 함수와 프로시저를 동일하게 사용한다.
추상화 : 불필요한 것을 제외하고, 필요한 것만 명확히 제공하는 기법
ex). 몬드리안
main 메소드 내에 모든 기능을 작성하지 말고, 나누어서 각 메소드에 작성해라.
문제를 쪼갤 수 없을 때까지 쪼개기 (divide & conquer)
표준 출력을 위해 java.lang 패키지의 System.out 이라는 클래스를 사용.
JVM 내에 static 공간은 따로 있음. 정적 바인딩 시 여기에 적재됨. C언어의 함수와 똑같이 동작.
이름 + 파라미터 + 바디가 있어야 함.
폰노이만 아키텍처에서 모든 동작을 하기 위해서는 데이터가 메모리 내에 있어야 한다.
ex). Class 를 객체로 선언
바인딩 : 디스크 -> 메모리로 데이터 로딩
Dynamic Binding : 필요할 때만 로딩
Static Binding : 항상 메모리에 로딩되어 있음.
다른 클래스에서 메소드 호출
중첩 호출도 가능하다.
본인이 본인을 호출도 가능하다 = 재귀호출
public class Hello {
void myMethod() {
System.out.println();
}
static int add(int i, int j) {
return i+j;
}
public static void main(String[] args) {
Hello hi = new Hello();
hi.myMethod();
int i=5, j=1;
int sum = add(i,j);
Sample.addInt(i, j);
}
}
class Sample { // public 클래스는 하나다.
static int addInt(int i, int j) {
return i+j;
}
}
return문을 만나면 메소드는 실행을 멈추고 즉시 호출자 코드로 돌아감
메소드가 void 가 아닌 다른 타입으로 정의된 경우 반환 메커니즘을 사용하여 호출자에게 값을 반환합니다.
메소드 안에 할당된 변수
클래스 변수 = 클래스 안에, 메소드 밖에 선언된 변수
void 는 반환을 하지 않지만 프로시저 역할을 한다. return을 사용하는 경우에는 특정 조건에 따라 메소드를 종료시켜야 할 때 사용한다.