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) 선언부에서 리턴 타입 intretrun 반환값타입이 일치해야 합니다.


함수 호출방법

참조변수.메서드이름(); 

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 이 붙은 블럭 안에는 인스턴스 변수 , 함수 가 오면 안된다.}







+ Recent posts