Download presentation
Presentation is loading. Please wait.
1
6장 객체-지향 설계 ①
2
목차 매개변수 전달 사람 바꾸기 정적 변수와 메소드 은행 계좌 열고 닫기 은행 거래 횟수 세기 계좌 이체
3
사람 바꾸기 매개변수 전달을 연습해 보기 위해서, 사람을 바꾸는 프로그램인, ChangingPeople.java, Person.java 를 수정해 보자. 교재의 그림 6.5와 같이 프로그램의 실행과정을 추적해 보자. 실제로 프로그램을 실행시켜 그 결과를 확인해 보자. changePeople() 메소드가 원하는대로 잘 동작하도록 수정해 보자. (주석 참고)
4
사람 바꾸기 ( ChangingPeople.java )
// ********************************************************************** // ChangingPeople.java // // 매개변수 전달 실습 - Person 객체들을 변경하는 메소드를 포함하고 있다. public class ChangingPeople { // // 두개의 Person 객체, 하나의 정수, 하나의 문자열의 값을 설정하고, // Person 객체들을 변경하는 메소드에 이 정보들을 보낸다. public static void main (String[] args) Person person1 = new Person ("Sally", 13); Person person2 = new Person ("Sam", 15); int age = 21; String name = "Jill"; System.out.println ("\nParameter Passing... Original values..."); System.out.println ("person1: " + person1); System.out.println ("person2: " + person2); System.out.println ("age: " + age + "\tname: " + name + "\n"); changePeople (person1, person2, age, name); System.out.println ("\nValues after calling changePeople..."); }
5
사람 바꾸기 ( ChangingPeople.java )
// // 첫번째 실 매개변수를 "Jack - 나이 101"로 바꾸고, // 두번째 실 매개변수를 세번째와 네번째 매개변수에서 주어진 이름과 // 나이를 가지는 사람으로 바꾼다. public static void changePeople (Person p1, Person p2, int age, String name) { System.out.println ("\nInside changePeople... Original parameters..."); System.out.println ("person1: " + p1); System.out.println ("person2: " + p2); System.out.println ("age: " + age + "\tname: " + name + "\n"); // 정보 변경하기 Person p3 = new Person (name, age); p2 = p3; name = "Jack"; age = 101; p1.changeName (name); p1.changeAge (age); // 변경 정보 출력하기 System.out.println ("\nInside changePeople... Changed values..."); }
6
사람 바꾸기 ( Person.java ) // **************************************************************** // Person.java // // 사람을 표현하는 간단한 클래스 // *************************************************************** public class Person { private String name; private int age; // // 주어진 이름과 나이로 Person 객체를 설정한다. public Person (String name, int age) this.name = name; this.age = age; } // 사람의 이름을 매개변수 newName의 값으로 바꾼다. public void changeName(String newName) name = newName;
7
사람 바꾸기 ( Person.java ) // // 사람의 나이를 매개변수 newAge의 값으로 바꾼다. public void changeAge (int newAge) { age = newAge; } // 사람의 이름과 나이를 문자열로 반환한다. public String toString() return name + " - Age " + age;
8
은행 계좌 열고 닫기 아래와 같이 Account.java를 수정해 보자. 계좌의 총 개수를 관리해 보자.
계좌의 총 개수를 저장하기 위한 정수형 변수 numAccounts를 private static 타입으로 생성한다. 계좌를 생성할 때마다 이 변수의 값을 증가 시키도록, 구성자에 해당 코드를 추가한다. 계좌의 총 개수를 리턴하는 static 메소드 getNumAccounts() 를 생성한다. 계좌를 닫는 close() 메소드를 작성해 보자. 계좌가 닫혔다는 것을 나타내기 위해, 이름을 “CLOSED”로, 잔액을 0으로 설정한다. 계좌가 하나 닫혔으므로, 계좌의 총 개수를 하나 줄인다.
9
은행 계좌 열고 닫기 (cont.) 두 계좌를 하나로 합치는 consolidate() 메소드를 작성해 보자.
두 개의 계좌를 매개변수로 받아, 이를 합친 하나의 계좌를 리턴한다. 이때, 두 계좌의 소유주가 같아야 합칠 수 있으며, 두 계좌의 계좌번호가 같을 경우에는 합칠 수 없다. 만약, 계좌를 합칠 수 없다면 null을 리턴하고, 적절한 메시지를 출력한다. 두 계좌를 합칠 새로운 계좌를 생성하여, 두 계좌의 잔액을 합하여 잔액으로 설정하고, 소유주의 이름은 그대로 설정하며, 계좌번호는 새로 생성한다. 그리고 기존의 두 계좌는 닫는다. 수정한 Account.java를 테스트하는 프로그램을 작성해 보자. 사용자로부터 세 명의 소유주의 이름을 읽어 들여, 잔액을 100으로 해서 계좌를 생성한다. 계좌들의 정보를 출력한다. 첫 번째 계좌를 닫고, 두 번째와 세 번째 계좌를 하나로 합치도록 시도한다. (합쳐질 수도 있고, 못 합쳐질 수도 있을 것이다.) 다시 계좌들의 정보를 출력한다.
10
은행 계좌 열고 닫기 (Account.java)
//******************************************************* // Account.java // 입금, 출금, 소유주 변경, 계좌정보 제공의 메소드들을 // 가지는 은행 계좌 클래스 public class Account { private double balance; private String name; private long acctNum; // // 구성자 - 잔액, 소유주, 계좌번호를 초기화한다. public Account(double initBal, String owner, long number) balance = initBal; name = owner; acctNum = number; } // 잔액이 출금을 하기에 충분한지 확인하고, // 만약 그렇다면, 잔액에서 출금액 만큼을 제하고, // 그렇지 않다면, 메세지를 출력한다. public void withdraw(double amount) if (balance >= amount) balance -= amount; else System.out.println("Insufficient funds");
11
은행 계좌 열고 닫기 (Account.java)
// // 잔액에 입금액을 더한다. public void deposit(double amount) { balance += amount; } // 잔액을 반환한다. public double getBalance() return balance; // 소유주, 계좌번호, 잔액을 문자열로 반환한다. public String toString() return "Name:" + name + "\nAccount Number: " + acctNum + "\nBalance: " + balance;
12
은행 거래 횟수 세기 입금이나 출금의 횟수를 셀 수 있도록 Account.java를 수정해 보자.
입금 횟수, 총 입금량, 출금 횟수, 총 출금량을 저장할 4개의 private static 변수를 선언한다. 이 4개의 값들을 리턴하는 4개의 메소드를 작성한다. ex. public static int getNumDeposits() 이 4개의 변수들의 값을 적절히 업데이트 하도록 입금과 출금 메소드를 수정한다. ProcessTransactions.java는 두 개의 계좌를 생성하고, 이에 대해 입금과 출금 거래를 반복 수행한다. 총 거래 횟수와 거래량을 출력하도록 이 프로그램을 완성하고, 실행시켜 그 결과를 확인해 보자.
13
은행 거래 횟수 세기 (Account.java)
//******************************************************* // Account.java // 입금, 출금, 소유주 변경, 계좌정보 제공의 메소드들을 // 가지는 은행 계좌 클래스 public class Account { private double balance; private String name; private long acctNum; // // 구성자 - 잔액, 소유주, 계좌번호를 초기화한다. public Account(double initBal, String owner, long number) balance = initBal; name = owner; acctNum = number; } // 잔액이 출금을 하기에 충분한지 확인하고, // 만약 그렇다면, 잔액에서 출금액 만큼을 제하고, // 그렇지 않다면, 메세지를 출력한다. public void withdraw(double amount) if (balance >= amount) balance -= amount; else System.out.println("Insufficient funds");
14
은행 거래 횟수 세기 (Account.java)
// // 잔액에 입금액을 더한다. public void deposit(double amount) { balance += amount; } // 잔액을 반환한다. public double getBalance() return balance; // 소유주, 계좌번호, 잔액을 문자열로 반환한다. public String toString() return "Name:" + name + "\nAccount Number: " + acctNum + "\nBalance: " + balance;
15
은행 거래 횟수 세기 (ProcessTransactions.java)
//******************************************************* // ProcessTransactions.java // 하루 동안에 두개의 은행 계좌에서 입금과 출력을 처리하는 클래스 import java.util.Scanner; public class ProcessTransactions { public static void main(String[] args){ Account acct1, acct2; // 두개의 계좌 String keepGoing = "y"; // 거래를 계속할 것인지의 여부 String action; // 입금이나 출금 double amount; // 입금이나 출금을 할 금액 long acctNumber; // 거래할 계좌 Scanner scan = new Scanner(System.in) // 두개의 계좌 생성 acct1 = new Account(1000, "Sue", 123); acct2 = new Account(1000, "Joe", 456); System.out.println("The following accounts are available:\n"); System.out.println(acct1); System.out.println(); System.out.println(acct2); while (keepGoing.equals("y") || keepGoing.equals("Y")) // 거래할 계좌번호와, 무엇을 할 것인지, 얼마를 할 것인지에 대한 정보를 얻어온다. System.out.print("\nEnter the number of the account you would like to access: "); acctNumber = scan.nextLong(); System.out.print("Would you like to make a deposit (D) or withdrawal (W)? "); action = scan.next(); System.out.print("Enter the amount: "); amount = scan.nextDouble();
16
은행 거래 횟수 세기 (ProcessTransactions.java)
if (amount > 0) if (acctNumber == acct1.getAcctNumber()) if (action.equals("w") || action.equals("W")) acct1.withdraw(amount); else if (action.equals("d") || action.equals("D")) acct1.deposit(amount); else System.out.println("Sorry, invalid action."); else if (acctNumber == acct2.getAcctNumber()) System.out.println("Sorry, invalid account number."); System.out.println("Sorry, amount must be > 0."); System.out.print("\nMore transactions? (y/n)"); keepGoing = scan.next(); } // 입금 횟수를 출력한다. // 출금 횟수를 출력한다. // 총 입금액을 출력한다. // 총 출금액을 출력한다.
17
계좌 이체 계좌 이체를 수행할 수 있도록 Account.java를 수정해 보자. 아래와 같은 계좌 이체 메소드를 작성한다.
public void transfer(Account acct, double amount) 계좌 이체를 테스트하는 TransferTest.java를 작성한다. 두 개의 계좌를 만든다. 아래와 같은 일을 반복하는 loop을 작성한다. “첫 번째 계좌에서 두 번째 계좌로, 두 번째 계좌에서 첫 번째 계좌로, 종료” 중 하나를 선택하도록 메시지를 출력한다. 이체를 선택하면, 이체 금액을 받아들이고, 이체를 실행 후, 그 결과를 출력한다. 종료를 선택하면 loop을 빠져 나오고, 계좌들의 현재 정보를 출력한다. static 계좌 이체 메소드를 중복 정의한다. public static void transfer(Account acct1, Account acct2, double amount) static 계좌 이체 메소드를 테스트 하도록 TransferTest.java를 수정한다.
18
계좌 이체 (Account.java) //******************************************************* // Account.java // 입금, 출금, 소유주 변경, 계좌정보 제공의 메소드들을 // 가지는 은행 계좌 클래스 public class Account { private double balance; private String name; private long acctNum; // // 구성자 - 잔액, 소유주, 계좌번호를 초기화한다. public Account(double initBal, String owner, long number) balance = initBal; name = owner; acctNum = number; } // 잔액이 출금을 하기에 충분한지 확인하고, // 만약 그렇다면, 잔액에서 출금액 만큼을 제하고, // 그렇지 않다면, 메세지를 출력한다. public void withdraw(double amount) if (balance >= amount) balance -= amount; else System.out.println("Insufficient funds");
19
계좌 이체 (Account.java) //----------------------------------------------
// 잔액에 입금액을 더한다. public void deposit(double amount) { balance += amount; } // 잔액을 반환한다. public double getBalance() return balance; // 소유주, 계좌번호, 잔액을 문자열로 반환한다. public String toString() return "Name:" + name + "\nAccount Number: " + acctNum + "\nBalance: " + balance;
Similar presentations