본문 바로가기
Java/Java 기초문법

[JAVA 기초] 자바 오버로딩, 생성자

by dev수니 2021. 3. 10.
반응형

 

 1  오버로딩(overloading)

 

 

 

오버로딩(overloading)은 매개변수의 개수와 타입은 다르지만 이름이 같은 메서드를 여러 개 정의 하는 것을 말한다.

 

 

일반적으로 메서드를 사용할 때는 메서드의 이름으로 구분해서 사용한다. 하지만 같은 기능을 하는 메서드가 매번 이름이 달라야 한다면 매우 비효율적일 것이다.

 

int sum(int a, int b){
    return a+b;
}

 

두 개의 인자(파라미터)를 받아 합을 리턴해주는 메서드이다. 만약 세 수의 합을 구하고 싶을 때는 새로운 메서드를 선언해야 한다.

 

int sum_3(int a, int b, int c){
    return a+b+c;
}

 

 

만약 매개변수가 더 늘어나거나 자료형이 달라지면 매번 새로운 메서드 이름을 지정해야 하는 번거로움이 발생한다. 그리고 사용자가 매개변수에 따라 수많은 메서드의 이름을 기억해야 하는 불편함도 있을 것이다.

 

 

이러한 불편함을 해소하기 위해 오버로딩을 사용한다. 오버로딩을 사용하는 방법은 다음과 같다.

 

int sum(int a, int b){
    return a+b;
}
int sum(int a, int b, int c){
    return a+b+c;
}

 

이렇게 작성해 놓으면 메서드가 호출될 때 파라미터의 개수와 타입에 따라 자동으로 메서드가 호출된다.

 

 

 

 


 

EX 오버로딩 예제 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package java_practice;
 
public class Overloading1 {
    
    static int sum(int a, int b) {
        System.out.println("인자가 둘일 경우 호출됨.");
        return a + b;
    }
    static int sum(int a, int b, int c) {
        System.out.println("인자가 셋일 경우 호출됨.");
        return a + b + c;
    }
    static double sum(double a, double b) {
        System.out.println("double 타입일 경우 호출됨.");
        return a + b;
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(sum(3,4));
        System.out.println(sum(3,4,7));
        System.out.println(sum(3.2,4.5));
    }
}
cs

 

 

sum이라는 메서드를 오버로딩하고 실제 결과를 확인하는 코드이다.

 

 

같은 이름의 메서드를 여러개 작성했지만 오류가 발생하지 않는 것은 매개변수의 타입과 개수로 어느 메서드를 이용할지 구분할 수 있기 때문이다.

줄20에서는 int타입의 매개변수가 2개이므로 줄5의 메서드가 호출되어 "인자가 둘일 경우 호출 됨."이라는 문장이 출력되고 결과 값이 7로 호출되었다.

줄 21과 22역시 타입과 매개변수의 개수에 맞는 메서드가 각각 호출되었다. 

 

 

오버로딩을 사용한 대표적인 메서드가 지금까지 출력할 때 사용했던 System.out.println()메서드이다.

println()메서드는 숫자, 문자열, boolean값을 모두 출력한다.  이는 println()메서드가 다양한 타입에 대해 오버로딩 되어있기 때문이다.

 

 

 


 

 

 2  생성자(Constructor)

 

 

 

지금까지 인스턴스 변수를 초기화할 때 참조변수를 통해서 일일이 초기화를 했다. 그러나 생성해야할 인스턴스 개수가 많아지면 상당히 번거로워지게 된다.

 

 

생성자란 인스턴스를 생성할 때 호출되어 인스턴스 변수들을 초기화하는 일종의 메서드이다. 생성자의 이름은 클래스의 이름과 같으며 생성자에는 리턴값이 없다. 그러므로 반환 타입도 붙여주지 않는다.

 

 

모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 한다. 그러나 지금까지 우리가 클래스를 작성할 때는 전혀 생성자를 신경쓰지 않았다. 그 이유는 아무런 생성자도 정의되지 않았을 경우 컴파일러가 자동으로 '기본 생성자'를  추가해주기 때문이다.

 

 

따라서 "모든 클래스에는 하나 이상의 생성자가 있어야 한다."라는 조건을 만족시키기 위해서 컴파일러는 자동으로 기본 생성자를 추가한다.

 

 

class Cellphone{
     String color;
     int capacity;
     String model;
     int price;
     Cellphone() {   // 컴파일시 컴파일러가 자동으로 추가
     }
}

 

 

컴파일러가 추가한 기본 생성자는 아무 내용도 없으므로 인스턴스에 아무런 영향을 주지 않는다. 만약 인스턴스가 생성될 때 필요한 작업이 있으면 기본 생성자 내부에 작성해주면 된다.

 

 

Cellphone() {
     // 필요한 작업 작성
}

 

생성자를 통해 인스턴스가 생성될 때 인스턴스 변수를 바로 초기화할 수 있다.

 

 

 

 

 

 

 

 

매개변수를 갖고 있는 생성자

 

Cellphone(String color, int capacity) {
      this.color = color;
      this.capacity = capacity;
}

 

매개변수가 있는 생성자가 작성되면 기본생성자는 무시된다. 인스턴스를 생성할 때 알맞은 파라미터로 호출하면 이 생성자를 통해 인스턴스가 생성된다. 만약 기본 생성자를 통한 작업이 필요하다면 사용자가 직접 작성해서 사용할 수도 있다.

 

Cellphone() {
      this.color = "Black";
      this.capacity = 64;
}

 

 

 

 


 

 

EX 생성자 예제

 

기존의 경우 다음과 같이 일일이 참조변수로 초기화시켜줬다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package java_practice;
class Cellphone{
    String color;
    int capacity;
    String model;
    int price;
    void print(){
        System.out.printf("색상 : %s \n용량 : %d \n모델 : %s \n가격 : %d", color, capacity, model, price);
    }
}
public class Constructor {
    public static void main(String[] args) {
           Cellphone myPhone = new Cellphone();
           myPhone.color = "검정";
           myPhone.capacity = 256;
           myPhone.model = "iPone12";
           myPhone.price = 1300000;
           myPhone.print();
    }
}
cs

 

 

위와 같이 참조변수를 통해 하나하나 초기화를 할 경우 인스턴스의 개수가 늘어날수록 코드가 길어지고 복잡해진다. 따라서 생성자를 이용하면 편리하다. 다음은 위의 코드를 생성자를 이용한 경우이다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package java_practice;
class Cellphone{
    String color;
    int capacity;
    String model;
    int price;
    Cellphone(String color, int capacity, String model, int price) {
           this.color = color;
           this.capacity = capacity;
           this.model = model;
           this.price = price;
    }
    void print(){
        System.out.printf("색상 : %s \n용량 : %d \n모델 : %s \n가격 : %d", color, capacity, model, price);
    }
}
public class Constructor {
    public static void main(String[] args) {
           Cellphone myPhone = new Cellphone("검정"256"iPone12"1300000);
           myPhone.print();
    }
}
cs

 

줄7 부터 12까지 매개변수가 있는 생성자를 선언해주었고 입력받은 매개변수를 통해 Cellphone클래스의 인스턴스 변수값을 초기화하는 작업을 해주었다.

 

 

그리고 줄19에서 인스턴스가 생성될 때 인스턴스 변수를 바로 초기화해주었다. 이처럼 생성자를 사용하게 되면 인스턴스객체 생성과 동시에 변수 선언이 가능해 편리하다.

 

 

 

 

 


 

 

Ex 고급 예제

 

스캐너로 값과 연산자를 입력받고 연산결과를 호출하는 계산기 클래스이다.

 

 

- class Calcul : 클래스생성
- 인스턴스변수 :
      int left, right, result;  // 왼,오,결과값
      String op;  // 연산자("+","-","/","*")
- 클래스변수 : int count = 0;  // 연산횟수 저장
- 인스턴스메서드 :
      void operation() : op의 내용에 따라서,+,-,*,/ 의 연산 결과를변수 result에 대입.(Switch문)
- 인스턴스메서드 :
     void print() : sysout (출력 메서드 생성)

 

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package java_practice;
 
class Calcul {
    int left, right, result;    // 연산할 값과 연산결과 저장 변수
    String op;            // 연산자입력 변수
    static int count = 0;    // 연산횟수 저장 (클래스)변수
    
   Calcul(int l, int r, String o){    // 생성자, 입력값을 받아서 인스턴스 변수로 전달
        this.left = l;    // l을 left로 전달
        this.right = r;    // r을 right로 전달
        this.op = o;    // o을 op로 전달
    }
    
    void operation() {    // 연산 메서드 switch문
        switch(op){
        case "+" :         // 조건을 변수 op가 +일 때로 지정
            result = left + right;    // 변수 result에 연산값 저장
            break;        // 연산이 끝나면 switch문을 빠져나옴.
        case "-" :
            result = left - right;
            break;
        case "/" :
            result = left / right;
            break;
        case "*" :
            result = left * right;
            break;
        }
        count++;    // 연산 횟수 저장(인스턴스 변수에 클래스 변수는 접근가능)
    }
    
    void print() {    // 출력 메서드
        System.out.println(left + op + right + "=" + result + "입니다.");
    }
}
public class Class_CalculatorSwitch {
 
    public static void main(String[] args) {

        Calcul obj1 = new Calcul(5,3,"+");    // 인스턴스 객체 생성, 변수 초기화
        Calcul obj2 = new Calcul(62"-");
        Calcul obj3 = new Calcul(83"*");
        
        obj1.operation();    // 연산 메서드 실행
        obj2.operation();
        obj3.operation();
        
        System.out.println("연산 횟수는 : " + Calcul.count);    // 연산횟수 출력
        obj1.print();    // 출력메서드 실행
        obj2.print();
        obj3.print();
    }
}
cs

 

반응형

댓글