한 클래스내에 두개 이상의 동일한 이름을 가진 메소드를 선언하는것은 불가능하다. 그러나 이름이 동일한메소드에서 매개변수에 대한 정보가 서로 다르다면 동일한 이름을 가진 메소드를 두개 이상 선언하는것이 가능한데, 이를 우리는 메소드 오버로딩(Method Overloading)이라고 한다. 매개변수 정보가 서로 다르다는것이 어떤 의미일까? 코드로 보면 다음과 같이 볼 수 있다.
1 2 3 4 5 | class test{ void a(int b){} void a(int c, int p){} void a(int d, double e){} } | cs |
다음 클래스를 보면 a라는 동일한 이름을 가진 메소드가 3개 선언되었다. 첫번째 a라는 메소드는 정수형 b라는 매개변수를 두번째 a라는 메소드는 정수형 c라는 메소드는 정수형 d라는 매개변수와 실수형 e라는 매개변수를 받는다. a라는 이름이 동일한 3개의 메소드가 선언되었지만 이 코드는 오류가 나지 않는다. 앞에서 매개변수 정보가 서로 다르면 동일한 이름을 가진 메소드를 두개 이상 선언할 수 있다고 했다. 결론적으로 보면 매개변수 정보가 다르다는 것에 대한 의미는 두가지로 나눌 수 있다.
1 . 매개변수의 개수가 다른경우
2 . 매개변수의 형(type, 자료형)이 다른경우
그러나 밑의 코드와 같이 반환값의 자료형이 다른경우에는 메소드 오버로딩이 정의도지 못한다.
1 2 3 4 | class test{ int a(){} void a(){} } | cs |
이번에는 만약 이러한 경우가 주어졌다고 생각하자.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class qqqq { void a(int q,int w) {} void a(int q,double w) {} } class qw{ public static void main(String[] args) { qqqq i = new qqqq(); i.a(10, 'p'); } } | cs |
이렇게 자동 형변환 순서가 있는데, 저렇게 형변환이 일어나는 상황에서, 오버로딩된 두개의 메소드가 있게되면 형변환의 대상이 되는 데이터의 형변환 될때 가장 가까운위치에 있는 자료형으로 형변환이된다. 해당 코드에서는 'p'는 char형이므로 형변환에서 가장 가까운 자료형은 int이므로 2번째 줄에 있는 메소드에 들어가게 된다.
오버로딩은 클래스의 생성자에 대해서도 적용할 수 있다.
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 27 28 29 30 31 32 | class MethodOverride { private int reginum; private int passnum; MethodOverride(int rnum, int pnum){ reginum = rnum; passnum = pnum; } MethodOverride(int rnum){ reginum = rnum; passnum = 0; } void showinfo() { System.out.println("주민등록 번호 : " + reginum); if(passnum != 0) System.out.println("여권번호 : " + passnum); else System.out.println("여권을 가지고 있지 않습니다"); } } class over{ public static void main(String[] args) { MethodOverride a = new MethodOverride(909090,884949); MethodOverride b = new MethodOverride(92109120); a.showinfo(); b.showinfo(); } } | cs |
해당 코드에서 MethodOverride클래스를 보게되면 생성자가 두개가 선언되어있다. 이 두 생성자는 각각 두개의 값을 받을때, 하나의 값을 받을때 로 나뉘는데 오버로딩은 이와같이 다양한 상황에서까지 고려해야할때 사용할 수 도 있다.
1 2 3 | MethodOverride(int rnum){ this(reginum,0) } | cs |
위의 9번째줄에 위치한 생성자를 다음과 같이 고쳐보았다. this라는 키워드가 나오는데, 여기서 this는 '오버로딩 된 다른 생성자' 를 의미하게 된다. 여기서는 this(rnum,0)이라고 되어있기 때문에 해당 생성자는 reginum, 0을 인자로 받는 다른 생성자의 호출을 의미하게 된다. 해당 생성자가 값을 받게 되면 첫번째로 정의된 생성자를 통해서 초기화가 진행된다. this를 이용하면 코드의 중복성을 줄 일 수 있다는것이다.
이번에는 this를 다른 기능으로 활용해 보자.
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 27 28 29 30 31 32 | class thisa { private int data; thisa(int data){ this.data = data; } void setdat(int data) { this.data = data; } int getData() { return this.data; } } class th{ public static void main(String[] args) { thisa a = new thisa(10); thisa b = new thisa(90); System.out.println(a.getData()); System.out.println(b.getData()); a.setdat(11); b.setdat(99); System.out.println(a.getData()); System.out.println(b.getData()); } } | cs |
여기서 우리가 주의해 봐야할것은 인스턴스 변수 data(2번째줄)과 메소드와 생성자의 매개변수(4,7번째 줄)를 유심히 살펴보자. 모두 동일한 data라는 이름의 매개변수 혹은 인스턴스 변수를 사용하고 있다. 이와 같이 매개변수 이름과 인스턴스 변수의 이름이 동일한 경우에는 선언된 지역(클래스)내에서는 해당 이름을 인스턴스 변수가 아닌 매개변수로서 정의하게 된다. 다음과 같이 매개변수와 인스턴스 변수의 이름이 같은 경우에는 이렇게 되면 인스턴스 변수를 이름으로만 접근할 수 없게 되기 때문에, this키워드를 이용하면 선언된 지역 내에서도 인스턴스 변수에 접근할 수 있다.(5,9,12번째 줄). 해당 코드에서는 인스턴스 변수 data에 접근하기 위해서 this.data로 접근하는것을 볼 수 있다. 이렇게 인스턴스 변수에 접근하기 위해 사용하는 this키워드의 의미는 '이 문장이 속한 인스턴스'라는 의미를 가지게 된다.
'Language > Java' 카테고리의 다른 글
[Java]Java 문자열 보간표현식(Formatter) (0) | 2021.12.27 |
---|---|
[Java]JVM메모리 구조 (0) | 2021.12.26 |
public static void main(String[] args)의 의미 (0) | 2019.02.24 |
Class Method (0) | 2019.02.23 |
static을 붙여 선언한 클래스 변수 (0) | 2019.02.21 |