20150912
메서드(method)
메서드 자주 사용되는 내용(특정 기능을 수행)의 코드를 메서드로 작성해 놓고 호출 을 하는 방식으로 코드의 양을 줄이고 메서드 한쪽에서만 관리할 수 있어서 유지보수가 편리해 집니다.
* 메서드는 한 가지 기능만 수행하도록 작성
* 반복적으로 수행 되어야 하는 여러 문장을 하나의 메서드로 정의
* 관련된 여러 문장을 하나의 메서드로 만들어 놓는것이 좋습니다.
함수 작성법
리턴타입 메서드이름 (타입 변수명, 타입 변수명,...) {
//메서드 호출시 수행될 코드
}
직접 코드로 작성하면 아래와 같습니다.
int add (int a, int b){ <- 선언부
int result = a + b; <- 구현부
return result;
}
int add (int a, int b){
//구현부
int result = a + b;
return result;
}
메서드 마지막 부분에 return 혹은 { }블럭 마지막 문장까지 수행 했을때 종료되고 호출 했던 부분으로 돌아갑니다.
반환값이 없으면 return; 만 작성하고
있으면 return 반환값; 을 작성 하시면 됩니다.
반환값의 타입은 리턴타입과 일치해야 합니다.
int add(int a, int b) 선언부에서 리턴 타입 int 와 retrun 반환값의 타입이 일치해야 합니다.
함수 호출방법
참조변수.메서드이름();
static 메서드는 같은 클래스 안에서 인스턴스 메서드를 호출 할 수 없어요.
이유는
클래스 로딩과 객체를 만들고 생성자로 초기화 하는 순서를 생각 하셔야 해요.
클래스 로딩-> 객체 생성
static 은 클래스가 로딩될때 만들어지고 인스턴스 는 코드가 실행이 되어야 객체를 만듭니다. 그런데 인스턴스가 만들기 전에 사용할 수 있는 static 메서드에서 인스턴스 메서드를 사용하는건 아직 만들어지지 않은것을 호출 하는 것이 되겠죠?
(그래서 안됩니다.)
재귀 호출
메서드 내부에서 자기 자신의 함수를 호출 하는것
팩토리얼(!) 을 예로 들 수 있습니다.
아래 코드로 설명할게요.
long factorial (int n){
long result = 1;
if (n == 1) {
result = 1 ;
}else {
result = n*factorial(n-1);
}
return result;
}
함수 파라미터 값인 n이 함수 안에 코드에서 n의 수를 줄여가면서 다시 자신의 함수를 호출 합니다. 그럼 조건 n == 1 이 충족 될때까지 n값을 줄여나가면서 계속 자신의 함수를 호출하겠죠? 이게 재귀 호출입니다. 자신의 함수안에서 또 자신을 호출하는거죠.
오버로딩
메서드 이름이 같아야 한다.
매개변수의 개수 또는 타입이 달라야 한다.
리턴타입이 다른것과는 상관 없다.
void sum();
void sum(int a, long b);
// 변수의 개수가 같고 변수 타입의 순서가 달라도 오버로딩이 된다.
void sum(int a, long b);
void sum(int a);
void sum(String a);
장점
메서드 이름으로 기능을 예측 할 수 있다.
메서드 이름을 절약
오류의 가능성을 줄인다.
생성자
생성자는 클래스의 이름과 같아야 한다.
생성자는 리턴 값이 없다.
객체를 만들때 예) Sum s = new Sum();
Sum(); 에 해당하는 부분이 생성자 이고 앞에 있는 new 가 인스턴스를 만든다.
생성자가 인스턴스를 만드는것이 아니다.
생성자를 만들지 않으면 기본 생성자 아무 내용도 없는 생성자를 만든다.
생성자는 멤버 변수를 초기화 해주기 위해서 사용된다.
Sum() {
a = 1;
hello = "안녕하세요";
}
매개변수가 있는 생성자도 만들 수 있다.
Sum(int c, String d) {
a = c;
hello = d;
}
객체를 만들고 초기에 변수값을 넣어줄때는
car c = new Car();
c.a = 1;
c.hello = "안녕하세요";
보다는
Car c = new Car(1, "안녕하세요"); 가 더 간결하고 직관적이다.
같은 크래스 안에서 생성자를 호출 할때는 this() 를 사용한다.
제일 첫 줄에 사용해야함
car(){
this("white", "auto", 4);
}
car(String color, String gearType, int door){...}
this 는 변수를 구별할때도 사용됨
int color;
color(int color) {
this color = color;
}
this 가 붙은건 클래스안에 있는 변수
초기화
초기화 3가지 방법
명시적 초기화
class car {
int door = 4; //기본형 변수 초기화
Engine e = new Engine(); //참조현 변수 초기화
}
초기화 블럭
아무것도 없이 블럭만 사용하거나 static을 붙이는 초기화
{ 인스턴스 초기화 블럭 }
static{ 클래스 초기화 블럭 }
초기화 생성자보다 먼저 실행된다.
클래스 변수 초기화 순서 : 기본값 -> 명시적 초기화-> 클래스 초기화 블럭
인스턴스변수의 초기화 순서:기본값-> 명시적 초기화-> 인스턴스 초기화 블럭-> 생성자
클래스 초기화 블럭은 처음에 1번
인스턴스 초기화 블럭은 객체가 만들어 질때마다 실행
static 이 붙은 블럭 안에는 인스턴스 변수 , 함수 가 오면 안된다.}