JAVA/JAVA

Java | 메소드 Overloading & 생성자 Overload

pathas 2020. 1. 22. 17:32

Overloading 오버로딩

메소드의 이름은 동일하게 지정하고 매개변수의 유형과 개수를 변경하여
여러 개의 메소드를 하나의 메소드처럼 정의하는 기법

→ 비슷한 유형의 메소드들이 여러 개 필요할 때
서로 다른 메소드들을 마치 하나의 메소드처럼 사용할 수 있음

  1. 메소드 이름 동일하게 설정
  2. 메소드 매개변수 유형, 개수 다르게 설정
  3. 필요에 따라 메소드 return형을 다르게 설정
    ※ return형만 다르게 작성하면 에러 발생

사용례_메소드 오버로딩

public class PrintTest {

    // Method Overloading, 매개변수 O, 반환값 X
    void print(char c) {    // char형 매개변수
        System.out.println("입력받은 문자: "+c);
    }

    void print(int i) {        // int형 매개변수
        System.out.println("입력받은 정수: "+i);
    }

    void print(boolean b) {     // boolean형 매개변수
        System.out.println("입력받은 논리값: "+b);
    }

    public static void main(String[] args) {
        PrintTest pt = new PrintTest();
        pt.print('A');        // 입력받은 문자: A
        pt.print(23);        // 입력받은 정수: 23
        pt.print(23>33);    // 입력받은 논리값: false

    }

※ 메소드 이름은 print로 동일하지만 매개변수 유형에 따라서 서로 다른 메소드가 호출됨


Constructor Overload 생성자 오버로드

다양한 방법으로 멤버변수의 값을 초기화할 수 있도록 함

생성자도 하나의 메소드이기 때문에 메소드 오버로딩과 형식은 동일함


사용례_생성자 오버로드

class Person {

    // 멤버 변수
    private String name; // 이름
    private int age; // 나이

    // 기본 생성자, 생략 가능
    Person(){}

    // 생성자 오버로드, 가능한 조합 개수=2의 멤버변수 개수 제곱(기본생성자 포함)
    Person(int a){
        age = a;
    }

    Person(String n){
        name = n;
    }

    // 여러 가지 조합이 가능하지만 보통 아래의 형식을 많이 사용함
    Person(String n, int a){
        name = n;
        age = a;
    }

    // 정보 출력 메소드
    void display() {
        System.out.println("이름: " + name + ", 나이: " + age);
    }

public class PersonHandling {
    public static void main(String[] args) {

        Person p = new Person();
         // Person 클래스의 객체 p를 생성하면서 기본생성자 Person 호출
        p.display();    // 이름: null, 나이: 0

        Person p2 = new Person(23);
        p2.display();    // 이름: null, 나이: 23

        Person p3 = new Person("홍길동");
        p3.display();    // 이름: 홍길동, 나이: 0

        Person p4 = new Person("강감찬", 23);
        p4.display();    // 이름: 강감찬, 나이: 23
    }
}

※ 생성자의 이름은 모두 Person으로 동일하지만
매개변수에 따라 서로 다른 생성자가 호출되고, 멤버 변수에 저장되는 값이 달라짐

 

※ 멤버 변수의 값을 따로 설정하지 않으면 문자 자료형은 null,
정수, 실수 자료형은 0,
논리형은 false로 기본값이 초기화됨


사용례_메소드 오버로딩 + 생성자 오버로드

Method간 호출

  1. main() → 일반 메소드[객체 생성, 객체명.메소드명(~)]
  2. 서로 다른 클래스 : 일반 메소드 → 일반 메소드[객체생성, 객체명.메소드명(~)]
  3. 동일한 클래스 : 생성자, 일반 메소드 → 일반 메소드[메소드명(~)]
    ※ 동일한 클래스 내의 메소드는 메소드 이름만으로 호출 가능
public class PrintTest {

    /* Constructor Overload + Method Overloading
        생성자 내부에서 클래스 내의 다른 메소드 호출 */
    PrintTest(){};
    PrintTest(char x){
        print(x);
    };
    PrintTest(int y){
        print(y);
    };
    PrintTest(boolean z){
        print(z);
    };

    // Method Overloading, 매개변수 O, 반환값 X
    void print(char c) {
        System.out.println("입력받은 문자: " + c);
    }

    void print(int i) {
        System.out.println("입력받은 정수: " + i);
    }

    void print(boolean b) {
        System.out.println("입력받은 논리값: " + b);
    }

    public static void main(String[] args) {
        PrintTest pt1 = new PrintTest('v');      // 입력받은 문자: v
        PrintTest pt2 = new PrintTest(23);       // 입력받은 정수: 23
        PrintTest pt3 = new PrintTest(23 > 11);  // 입력받은 논리값: true
    }
}

여러 개의 메소드나 생성자를 마치 하나처럼 사용할 수 있게 하는 기법인
오버로딩과 생성자 오버로드에 대해 알아보았습니다.

오버로딩 / 오버로드를 사용하면

비슷한 유형의 메소드들을 하나의 이름으로 묶어서 편리하게 사용할 수 있고,

생성자 역시 매개변수에 따라 자동으로 매개변수에 맞는 생성자가 호출되도록 할 수 있습니다.