메소드
메소드는 클래스 영역에 있는 작업을 실행하기 위한 명령문의 집합이다. 메소드를 사용하면 코드 중복을 줄일 수 있어 코드의 쉬운 유지보수, 재사용이 가능하다.
매서드는 선언부와 구현부로 구성된다.
1
2
3
4
5
6
int add(int a, int b)//선언부
{//구현부 시작
int result = a + b;
return result;
//구현부 끝
}
선언부는 리턴타입 매서드이름(타입 변수명, 타입 변수명, ...)
이고 매개변수의 갯수는 상관없다. 매개변수는 매서드 영역에 있기 때문에 지역변수이다.
구현부는 코드의 집합
이다.
메서드를 호출하면 메서드가 필요한 메모리를 스택메모리에 할당받는다. 메서드의 블럭을 나가면 사용했던 메모리를 해제하고 그 전에 사용하고 있던 메서드있다면 그 메서드로 돌아간다.다음은 코드에 따라 스택메모리의 변화를 나타낸 그림이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Class CallStack{
// 1
public static void main(String[] args){ // 2
first(); // 8
} // 9
void first(){// 3
second(); // 7
}
void second(){ // 4
System.out.println("end"); // 5 6
}
}
매개변수
매개변수는 기본형, 참조형이 있다. 기본형은 boolean, byte, char, short, int, double, float, long이며 기본형 매개변수는 read만
가능하다. 참조형은 기본형을 제외한 타입이고 참조형 매개변수는 read, write
가 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Class Data{
int data
}
Class prac{
public static void main(String[] args){
Data a = new Data();
a.data = 1;
System.out.println(a.data); // 1 출력
changeNum(a.data);
System.out.println(a.data) ;// 1 출력
chageNum(a);
System.out.println(a.data) ;// 10 출력
}
static void changeNum(int num){ //기본형 매개변수
num = 10;
}
static void changeNum(Data d){ //참조형형 매개변수
d.data = 10;
}
}
changeNum(int num)메소드를 실행하였을 때 메모리를 그림으로 나타낸 것이다. 메소드에 기본형 매개변수를 사용하면 값만 복사해오기 때문에 메소드 안에서는 값이 변하겠지만 메소드가 종료되면 스택메모리에서 사라진다. 스택메모리에서 사라지면서 10으로 바꾼 값도 사라진다.
기본형 매개변수는 값을 복사해(읽어) 올뿐 매개변수의 값을 변경할 수 X
changeNum(Data d)메소드를 실행하였을 때 메모리를 그림으로 나타낸 것이다. 메소드에 참조형 매개변수를 사용하면 그 변수의 주솟값을 가져오기 때문에 매개변수의 값을 가르키게 되고 값을 바꾸면 매개변수의 값이 변하게 된다. 메소드가 종료되어도 이미 힙에 저장된 변수값은 바뀌었으므로 값이 바뀌게 된다.
참조형 매개변수는 주소값을 복사해(읽어)와서 매개변수의 값을 변경할 수 O
인스턴스 메소드와 static 메소드
인스턴스 메소드와 static 메소드는 객체 생성 여부에 따라 사용할 수 있는 멤버가 다르다.
인스턴스 메소드는 객체 생성 후 실행 할 수 있는 메소드이고 static 메소드는 메소드가 정의되어있는 클래스가 있다면 객체가 생성되지 않아도 사용할 수 있는 메소드이다.
메소드 종류 | 객체 생성 여부 | 인스턴스 변수 | 인스턴스 메소드 | static 변수 | static 메소드 |
---|---|---|---|---|---|
static 메소드 | X | X | X | O | O |
인스턴스 메소드 | O | O | O | O | O |
static메소드는 객체 생성과 상관없이 사용할 수 있어야하기 떄문에 객체 생성 후에 사용할 수 있는 인스턴스 변수나 메소드는 사용할 수 없다. 반면에 인스턴스 메소드는 객체 생성 후에 사용할 수 있기 떄문에 static 변수,메소드 와 인스턴스 변수,메소드 모두 사용 가능 하다.
오버로딩
오버로딩은 메소드의 이름은 똑같은데 매개변수의 수나 타입이 다른 메소드들
을 정의하는 것을 말한다. 메소드의 이름: 메소드의 수 (1:N) 관계를 가진다. 오버로딩을 판단할 때 리턴타입은 신경쓰지않는다. 가장 대표적인 메소드의 예는 println
이다.
1
2
3
4
5
6
7
8
9
10
void println()
void println(boolean input)
void println(char input)
void println(char[] input)
void println(double input)
void println(float input)
void println(long input)
void println(int input)
void println(Object input)
생성자
생성자는 객체가 생성될 때마다 인스턴스 변수를 초기화하는 메서드이다. 모든 클래스에는 생성자가 하나이상 있어야한다. 객체 생성 시 클래스에 생성자가 없으면 컴파일러가 자동적으로 기본생성자를 만들어준다. 그러나 클래스에 생성자가 한 개이상 있으면 컴파일러는 자동생성자를 추가하지 않는다.
생성자의 조건은 다음과 같다.
- 클래스의 이름과 생성자의 이름은 같아야한다.
- 리턴값이 없지만 void를 붙이지 않는다.
1 2 3 4 5 6 7 8 9 10 11 12 13
Class Book{ int page // 인스턴스 변수 String name; Book(){ // 매개변수가 없는 생성자 = 기본생성자 //인스턴스 변수 초기화 } Book(int a, String b){// 매개변수가 있는 생성자 //인스턴스 변수 초기화 } }
생성자 this()
this()는 코드의 중복을 줄이고 코드의 재사용성을 높이기 위해 사용하는 생성자이다. 같은 클래스에서 다른 생성자를 호출할 때 생성자의 첫 문장에서 사용할 수 있다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Class Book{
int page;
String name;
Book(){
this(100,"Harry Poter");
/*
page = 100;
name = "Harry Poter";
과 같다
*/
}
Book(int a, String b){
page = a;
name = b;
}
}
참조변수 this
this는 인스턴스 변수를 가르키는 참조변수로, 모든 인스턴스 메서드에 지역변수로 존재하며 생략이 가능하다. 인스턴스 메소드 안에서 인스턴스 변수와 이름이 같은 지역변수가 있는 경우에는 지역변수와 인스턴스 변수를 구분하기 위하여 참조변수 this를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Class Book{
int page; // = this.page
String name; // = this.name (생략가능)
Book(){
this(100,"Harry Poter");
/*
page = 100;
name = "Harry Poter";
과 같다
*/
}
Book(int page, String name){
this.page = page; //인스턴스 변수 page , 지역변수 page
this.name = name; // 인스턴스 변수 name, 지역변수 name
}
}
Comments powered by Disqus.