객체지향언어 3탄으로 오버로딩, this, 클래스매서드애 대해서 알아보겠습니다.
● 오버로딩이란?
: 동일한 이름의 메소드를 둘 이상 동시에 정의하는 것을 의미합니다.
오버로딩을 가능하게 하는 2가지 조건
1) 입렵의 매개변수의 자료형이 서로 다르게 정의 되어 있을 때 허용합니다.
2) 자료형이 같아도 개수가 다를때 사용가능합니다.
- 2가지중 어느 한가지라도 충족한다면 오버로딩 할 수 있습니다.
class Adder{
public int add(int n1, int n2){
return n1+n2;
}
public int add(int n1, int n2, int n3){ -- 자료형은 같지만 개수가 달라서 가능
return n1+n2+n3;
}
public double add(double n1, double n2){ -- 자료형이 달라서 가능
}
public double add(int n1, double n2){ -- 자료형이 달라서 가능
return n1+n2;
}
public double add(double n1, int n2){ -- 자료형이 달라서 가능
return n1+n2;
}
- 메소드 오버로딩 성공과 실패
// 메소드 오버로딩이 성공한 사례
class MethodOverloading {
public int getSum(int i, int j) {
return i + j;
}
public int getSum(int i, int j, int k) {
return i + j + k;
}
}
// 메소드 오버로딩이 실패한 사례
class MethodOverloadingFail {
public int getSum(int i, int j) {
return i + j;
}
public double getSum(int i, int j) {
return (double)(i + j);
}
}
-두 개의 getSum() 메소드는 매개변수의 개수, 타입이 모두 같기 때문에 메소드 오버로딩 실패
주의 사항 1>
형변환의 규칙까지 적용해야만 메소드가 구분되는 애매한 상황은 만들지 않아야 합니다.
class MethodOverload {
void isYourFunc( int n ) { … }
void isYourFunc( int n1, int n2 ) {…}
void isYourFunc( int n1, double n2 ) {…}
}
MethodOverload inst = new MethodOverload();
inst.isYourFunc(10, ‘a’);
문자 'a'는 int형으로도, double형으로도 변환이 가능합니다.
형변환 규칙을 적용하되 가장 가까운 위치의 자료형으로 변환이 이루어집니다.
따라서 isYourFunc(int n1, int n2)가 호출합니다.
주의 사항 2>
반 환형이 다른 것은 메소드 오버로딩이 성립 안됩니다.
반환형이 다르지만 자료형이 같으면 error입니다. 반환형은 결과를 가지고 수행하는 것이지 호출 시에는 정보가 없기 때문에 method overloading 을 하는 것과 관련이 없습니다.
※ 생성자 오버로딩
class person {
private String name; // 이름
private int milID; // 군번
person(String name, int mID){
this.name = name;
this.milID =mID;
}
person(String name){
this.name = name;
this.milID =0;
}
생성자 overloading = 1) 매개 변수의 갯수가 다르던지 2)자료형이 달르면 수행 가능 합니다.
- 생성자의 오버로딩은 하나의 클래스를 기반으로 다양한 형태의 인스턴스 생성을 가능하게 합니다.
● This
: this를 이용하면 생성자 내에서 다른 생성자를 호출할 수 있습니다. 또한 생성자의 추가 정의에 대한 편의를 제공하며 생성자마다 중복되는 초기화 과정의 중복을 피할 수 있습니다.
생성자 안에서 field 값으로 접근하고자 할때는 - this.field 이름 = this 정확히 어떤 것인지 지정해주는 명령어입니다.
* this의 필요성
- 객체의 멤버 변수와 메소드 변수의 이름이 같은 경우
- 다른 메소드 호출 시 객체 자신의 레퍼런스를 전달할 때
- 메소드가 객체 자신의 레퍼런스를 반환할 때
new 와 this
lass person {
private String name; // 이름
private int milID; // 군번
person(String name, int mID){
this.name = name;
this.milID =mID;
}
person(String name){
this.name = name;
this.milID =0;
}
public void showInfo() {
System.out.println("이름 : " + name);
if (milID!=0){
System.out.println("군번 : " + milID);
}
}
}
new 실행!
1. person 이라는 자료형을 찾고, 메모리 크기만큼을 계산해서 할당합니다.(name, milid, 생성자, showinfo)
1-1. this 라는 key word 를 생성하는데 =this 라는 방을 new 하는 순간 할당되게 됩니다.
this에는 시작 주소값이 저장되어 있다.
2. 생성자 호출하여 구현합니다
3. 시작 값을 반환해줍니다. = this 값을 return 해주고 있는 것입니다. (참소변수) = 시작 주소값으로 갑니다.
그때마다 할당 되는 메모리의 주소값입니다. new 할 때마다 할당 되는 주소값을 가지게 되므로 항상 다릅니다.
- 같아 보여도 this의 값은 다릅니다.(같은 keyword 라고해서 오해하지 말자)
- this 라는 키워드는 정의되고 있는 자료형 안에서만 사용가능하므로 외부에서는 사용이 불가합니다.
- this 를 넣어주므로서 매개변수와 필드의 이름을 동일하게 할 수 있습니다.
this 의 실패
public Book() {
System.out.println("생성자가 호출되었음");
this(null, null, 0); // 생성자의 첫 번째 문장이 아니기 때문에 컴파일 오류
}
● 클래스매서드
: static 메소드(클래스 메소드) - 기본적인 특성과 접근 방법은 static 변수와 동일합니다.
class NumberPrinter {
public static void showInt(int n) { System.out.println(n); }
public static void showDouble(double n) { System.out.println(n); }
}
class ClassMethod {
public static void main(String[] args) {
NumberPrinter.showInt(20); // 클래스의 이름을 통한 호출
NumberPrinter np = new NumberPrinter();
np.showDouble(3.15); // 인스턴스의 이름을 통한 호출
}
}
class 의 이름으로 static이 선언된 변수에 접근할 수 있도록 합니다.
class로 가서 static 을 보고 할당 받은 메모리가 있기 때문에 가능합니다.
'빅데이터 > JAVA' 카테고리의 다른 글
[JAVA] Scanner (0) | 2020.04.30 |
---|---|
[JAVA] System.out.println() , 자바의 메모리 모델 (0) | 2020.04.30 |
[JAVA] 객체지향언어(생성자, 정보은닉/접근제어 지시자,Static) (0) | 2020.04.29 |
[JAVA] 객체지향언어(Object oriented Programming) [Class, new] (0) | 2020.04.26 |
[JAVA] METHOD (0) | 2020.04.25 |