티스토리 뷰

day9 190228 자바의 메소드 오버로딩과 생성자에 대해서 배웠습니다.


강사님께서 별거 아니라는 생각이 들수도 있겠지만, 실전에서 굉장히 많이 쓰이는 기능들이라고

하시더군요.


<메소드 오버로딩(메소드 중복정의)>

: 한클래스 안에 같은 이름의 메소드를 여러개 만들 수 있는 것.

(단 매개변수의 타입, 개수, 순서 중 하나는 달라야 한다.

ex) println(4), println(응수), println(3.14) // plus기능에서 정수형plus, 실수형plus...


코드로 보시는게 이해가 빠를 것 같으니, 바로 코드로 설명하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    void m() {
        System.out.println("매개변수 없는 m()이 실행됨");
    }
 
    void m(int a) {
        System.out.println("m(int a)이 실행됨");
    }
 
    void m(int a, int b) {
        System.out.println("m(int a, int b)이 실행됨");
    }
 
    void m(String a) {
        System.out.println("m(String a)이 실행됨");
    }
 
cs

위와 같이, 4개의 이름이 같은 메소드들이 있습니다. 각각 입력받는 매개 변수가 다르죠. 이것을 메소드 오버로딩이라고 합니다.

입력받는 매개변수가 4개 다 다른 메소드로 인지하게됩니다.


1
2
3
4
5
6
7
8
9
10
public class MethodOverloadingApp {
    public static void main(String[] args) {
        MethodOverloading x = new MethodOverloading();
 
        x.m();
        x.m(20);
        x.m(2030);
        x.m("홍길동");
    }
}
cs

5~8행에서 위 4개의 메소드들을 순서대로 호출해봤습니다. 결과값은,

---------- 실행 ----------

매개변수 없는 m()이 실행됨

m(int a)이 실행됨

m(int a, int b)이 실행됨

m(String a)이 실행됨


위와 같이 출력되게 됩니다. 대조하여 보면 알 수 있듯, 각각의 맞는 메소드들이 호출되었습니다.



<생성자(=초기화 메소드)>

: 객체가 실행되자마자 처음 실행되는 메소드.

  생성자는 클래스의 이름과 똑같이 지어야한다.

  new키워드 뒤에 사용된다.

ex) Scanner sc = new Scanner(System.in);

(생성자)


* 캡슐화 : 제공되는 기능을 통해서 기능을 바꾸거나, 기능을 꺼내온다.

* 생성자는 반환타입을 적지 않는다.

* 기본생성자는 추가로 생성한 생성자가 존재하지 않을 경우에만 자동 추가된다.

* 생성자가 필요한 이유

: 객체가 만들어지면 원래 있던 필드에 정해놓은 기본값이 들어가있게 하기 위해서.

ex) 기본 색상이 녹턴그레이인 Car클래스는 생성자에 기본 색상을 녹턴그레이로 만든다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Car {
    
    String color;
 
    // 생성자 정의
    Car() {            // 기본 생성자
        System.out.println("기본 생성자가 실행됨.");
        color = "녹턴그레이";
    }
 
    Car(String customColor) {
        System.out.println("컬러를 전달받는 생성자가 실행됨.");
        color = customColor;
    }
 
    String getColor() {                // 16,20행 : 메소드를 통해 값을 바꾸고, 가져오고 한다. (캡슐화 과정)
        return color;
    }
 
    // 전달받은 값으로 필드값을 변경하는 메소드
    void setColor(String c) {
        color = c;
    }
}
cs

Car라는 클래스의 생성자와 메소드입니다. 우리가 자동차를 생산할 때, 기본 색상을 지정해두고 생산을 하게 되곤 합니다. 특정 요구에 따라, 다른 색상으로 변경을 하게되죠. 여기서 기본색상을 지정해두는 것이 기본생성자, 즉 6~9행이 됩니다. 아무런 매개변수를 받지 않고 color라는 변수에 녹턴그레이을 저장하게되죠. 

특정 요구에 따라, 다른 색상으로 변경하여 생산하는 것이 기본생성자가 아닌 다른 생성자가 적용되게 됩니다. 11~14행입니다. Car라는 이름의 메소드임으로 생성자입니다. 하지만, 매개변수에 customColor라는 String타입의 변수를 입력받게 됩니다. 입력받은 변수는 color에 저장되고, 기본 생성자와는 다른 변수값이 저장되게 되겠죠.


16~20행은 캡슐화의 과정입니다. 우리가 직접 메인 메소드에서 필드값을 건드려서 수정을 하는 것이 아닌, 메소드 자체를 통해서 color값을 수정하여 가져오는 것입니다.



위 설명의 예처럼, 코딩을 할 때, 기본설정과는 다른 설정으로 클래스를 사용하게 될 때 특정 생성자를 지정하여 쓰는 빈도가 높아 자주 사용한다고 합니다.

잔액이 0원인 통장이라는 class를 만드는 기본생성자가 있다면, 잔액이 2000원인 통장 class를 만드는 생성자가 있는 것이죠.

다음은 이전에 배웠던 통장 기능 프로그램을 메소드를 이용하여 조금 간략하게 바꾼 프로그램 소스입니다.

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
public class Account {
    int no;            // 계좌번호
    String owner;    // 예금주
    int balance;    // 잔액
    int password;    // 비밀번호
    
    Account(int newNo, String newOwner, int newPassword) {
        no = newNo;                        // 생성자를 따로 선언하는 예
        owner = newOwner;                // 잔액0원인 통장개설 생성자
        password = newPassword;
        balance = 0;
    }
    
    Account(int newNo, String newOwner, int newPassword, int newBalance) {
        no = newNo;                        // 잔액을 입력하는 통장개설 생성자
        owner = newOwner;
        password = newPassword;
        balance = newBalance;
    }
 
    // 통장 정보 출력 기능
    void displayInfo() {
        System.out.println("계좌번호 : " + no);
        System.out.println("예 금 주 : " + owner);
        System.out.println("비밀번호 : " + password);
        System.out.println("잔    액 : " + balance + "원");
    }
 
    // 입금기능 : 입금액을 전달받아서 잔액을 증가시키는 기능
    void deposit (int money) {    // 잔액 증가시키는 것이므로 제공x > void타입)
        if (money>0) {
            balance += money;
            System.out.println("입금이 완료되었습니다.");
            System.out.println("입금 후 잔액 : " + balance + "원");
        } else {
            System.out.println("올바르지 않습니다.");
        }
    }
 
    // 비밀번호 변경 기능 : 옛날 비밀번호와 새 비밀번호를 전달받아서 비밀번호를 변경하는 기능
    void changePassword (int prePassword, int newPassword) {
        // 옛날 비밀번호와 현재 비밀번호가 일치한다면 비밀번호 변경
        // 일치하지 않으면 화면에 에러메세지 출력
        if ( password == prePassword ) {
            password = newPassword;
            System.out.println("비밀번호가 변경되었습니다!");
        } else {
            System.out.println("비밀번호가 일치하지 않습니다!");
        }
    }
}
cs


2~5행에 Account의 필드들을 설정하고, 7행에 잔액0원의 생성자, 14행에 잔액을 입력받는 생성자, 21, 29, 40 행에 각각 통장정보출력, 입금기능, 비밀번호 변경기능 메소드를 구현 하였습니다. 이렇게 메소드화 한후에, 메인 메소드에서 호출하여 적용시켜봤습니다.

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.util.Scanner;
 
public class AccountApp2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        Account[] accounts = new Account[3];
 
        for (;;) {
            System.out.println("1.입력 | 2.조회 | 3.입금 | 4.비밀번호 변경 | 0.종료");
            System.out.println();
 
            System.out.print("메뉴 선택> ");
            int selectNo = sc.nextInt();
 
            if ( selectNo == 1) {                            // 1. 입력
                for (int i=0; i<2; i++) {
                    // 번호, 소유주, 비번, 잔액을 입력받아서
                    // Account객체를 생성하고(매개변수 4개짜리 생성자 활용)
                    // accounts 배열에 담기
                    System.out.print("통장번호 입력> ");
                    int no = sc.nextInt();
                    System.out.print("예금주 입력> ");
                    String owner = sc.next();
                    System.out.print("비밀번호 입력> ");
                    int password = sc.nextInt();
                    System.out.print("잔액 입력> ");
                    int balance = sc.nextInt();
 
                    Account a = new Account(no, owner, password, balance);
                    accounts[i] = a;
                }
            } else if ( selectNo == 2) {                    // 2. 조회
                    for (int i=0; i<2; i++) {
                        accounts[i].displayInfo();
                        System.out.println();
                    }
            } else if ( selectNo == 3) {                    // 3. 입금
                System.out.print("입금하실 계좌번호> ");
                int inputNo = sc.nextInt();
                System.out.print("입금액> ");
                int inputAmount = sc.nextInt();
 
                Account judge = null;
 
                for (Account i : accounts) {
                    if ( i.no == inputNo) {
                        judge = i;
                        break;
                    }
                }
                // 입금액이 저장되지않음!! 여기서부터 다시.
                    if (judge != null) {
                        judge.deposit(inputAmount);
                    } else {
                        System.out.println("존재하지않는 계좌번호 입니다!");
                    }
            } else if ( selectNo == 4) {                    // 4. 비밀번호 변경
                System.out.print("변경하실 계좌번호> ");
                int changeNo = sc.nextInt();
                System.out.print("비밀번호 입력> ");
                int prePassword = sc.nextInt();
                System.out.print("새 비밀번호 입력> ");
                int newPassword = sc.nextInt();
 
                Account judge = null;
 
                for (Account i : accounts) {
                    if ( i.no == changeNo) {
                        judge = i;
                        break;
                    }
                }
 
                if (judge != null) {
                    judge.changePassword(prePassword, newPassword);
                } else {
                    System.out.println("계좌가 존재하지 않습니다.");    
                }
            } else if ( selectNo == 0) {
                System.out.println("프로그램을 종료합니다.");
                break;
            }
        }
    }
}
cs


점점.. 그럴싸해지는 모습이 계속 학구열을 높이게 되는 것 같습니다. 이게 프로그래밍의 장점인 것 같네요...

다음 시간 쯤엔 상속을 배우게 될 것 같습니다. 


day9.zip


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함