3 클래스 구현 자바프로그래밍 강원대학교
클래스 구현 순서 클래스의 공개 인터페이스 설계 메소드 선언 (메소드 사용 사례를 적어 봄) 구성자 선언 주석 기입 및 API 문서 제작 필드 선언 메소드 구현 테스트 자바프로그래밍 강원대학교
객체(Object)와 추상화(Abstraction) 외부에 보이는 개념 (기능과 사용법) 내부의 세부 내용 외부에 나타나는 개념은 추상화(abstraction)를 통해 형성됨 추상화(abstraction): 중요하지 않은 세부 내용을 제거함으로써 핵심적인 내용만을 추출함 자바프로그래밍 강원대학교
클래스의 공개 인터페이스 설계(Designing the Public Interface of a Class) 지원되는 메소드의 종류, 각 메소드의 사용법 자바프로그래밍 강원대학교
클래스의 공개 인터페이스 설계(Designing the Public Interface of a Class) 예: 자동차 (Car) 자동차가 갖추어야 할 기능 = 자동차 클래스의 공개 인터페이스 accelerate break turn 자바프로그래밍 강원대학교
클래스의 공개 인터페이스 설계(Designing the Public Interface of a Class) 예: 은행계좌 (bank account) 은행계좌가 갖추어야 할 기능 = 은행계좌 클래스의 공개 인터페이스 deposit (예금하다) withdraw (출금하다) get balance (잔고를 조회하다) 자바프로그래밍 강원대학교
클래스 설계 순서 클래스의 공개 인터페이스 설계 메소드 선언 (메소드 사용 사례를 적어 봄) 구성자 선언 주석 기입 및 API 문서 제작 필드 선언 메소드 구현 테스트 자바프로그래밍 강원대학교
메소드 선언 (Method Delaration) access specifier method name list of parameters Class BankAccount { public void deposit(double amount) { . . . } public void withdraw(double amount) { . . . } public double getBalance() { . . . } } return type method body 자바프로그래밍 강원대학교
메소드 사용 Class BankTester { Public static void main(String[] args) BankAccount myAccount = new BankAccount(); myAccount.deposit(2000.0); myAccount.withdraw(500.0); System.out.println(myAccount.getBalance()); } 자바프로그래밍 강원대학교
클래스 설계 순서 클래스의 공개 인터페이스 설계 메소드 선언 (메소드 사용 사례를 적어 봄) 구성자 선언 주석 기입 및 API 문서 제작 필드 선언 메소드 구현 테스트 자바프로그래밍 강원대학교
구성자 선언 (Constructor Declaration) 구성자는 객체를 구성할 때 실행한다. 객체의 상태변수(field)를 초기화하는 데 주로 사용된다. 구성자 이름은 클래스 이름과 같다. 반환값을 갖지 않는다. 파라미터리스트가 서로 다른 여러개의 구성자가 있을 수 있다. public BankAccount(); // 초기 잔고가 0인 계좌 구성 public BankAccount(double initialBalance); // 초기 잔고가 initialBalance인 계좌 구성 자바프로그래밍 강원대학교
BankAccount Public Interface public interface of a class = public constructors + public methods public class BankAccount { public BankAccount() { ... } public BankAccount(double initialBalance) { ... } public void deposit(double amount) { ... } public void withdraw(double amount) { ... } public double getBalance() { ...} // private fields } 자바프로그래밍 강원대학교
클래스 설계 순서 클래스의 공개 인터페이스 설계 메소드 선언 (메소드 사용 사례를 적어 봄) 구성자 선언 주석 기입 및 API 문서 제작 필드 선언 메소드 구현 테스트 자바프로그래밍 강원대학교
Commenting on the Public Interface 정해진 규칙에 맞추어 주석을 달면 javadoc 도구를 사용해 API 문서를 만들어 낼 수 있다. $ javadoc BankAccount.java /** BankAccount는 은행계좌로서 입금, 출금이 가능하며 현재 잔고를 확인할 수 있다. */ public class BankAccount { . . . } 자바프로그래밍 강원대학교
/** 계좌에서 출금한다. @param amount 출금액수 /** 계좌에서 출금한다. @param amount 출금액수 */ public void withdraw(double amount) { // 구현은 나중에 함 (implementation filled in later ) } /** 잔고를 보여준다. @return 잔고 */ public double getBalance() { // 구현은 나중에 함 (implementation filled in later ) } 자바프로그래밍 강원대학교
자바프로그래밍 강원대학교
자바프로그래밍 강원대학교
Instance Instance of a class = an object of the class 철수, 영희는 사람 클래스의 인스턴스이다. 메리, 독구, 쫑은 개 클래스의 인스턴스이다. 철수, 영희, 메리, 독구, 쫑은 모두 객체이다. 자바프로그래밍 강원대학교
클래스 설계 순서 클래스의 공개 인터페이스 설계 메소드 선언 (메소드 사용 사례를 적어 봄) 구성자 선언 주석 기입 및 API 문서 제작 필드 선언 메소드 구현 테스트 자바프로그래밍 강원대학교
Fields public class BankAccount { private double balance; // 인스턴스 필드 public BankAccount() { ... } public BankAccount(double initialBalance) { ... } public void deposit(double amount) { ... } public void withdraw(double amount) { ... } public double getBalance() { ...} } 자바프로그래밍 강원대학교
클래스 설계 순서 클래스의 공개 인터페이스 설계 메소드 선언 (메소드 사용 사례를 적어 봄) 구성자 선언 주석 기입 및 API 문서 제작 필드 선언 메소드 구현 테스트 자바프로그래밍 강원대학교
메소드 구현 Some methods do not return a value Some methods return an output value public void withdraw(double amount) { double newBalance = balance - amount; balance = newBalance; } public double getBalance() { return balance; } 자바프로그래밍 강원대학교
구성자 (constructor) 구현 public BankAccount() { balance = 0.0; } public BankAccount(double initialBalance) { balance = initialBalance; } BankAccount harrysChecking = new BankAccount(1000.0); BankAccount marysChecking = new BankAccount(); 1000.0 0.0 harrysChecking marysChecking 자바프로그래밍 강원대학교
인자와 매개변수 (arguments and parameters) public class BankAccount { private double balance; public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } } call-by-value (값 복사) 파라미터 메소드 선언 BankTester 클래스의 main 메소드 인자(argument) 메소드 활용 BankAccount harrysChecking = new BankAccount(); harrysChecking.deposit(3000.0); 0.0 3000.0 자바프로그래밍 강원대학교
완성된 BankAccount 클래스 자바프로그래밍 강원대학교
File BankAccount.java 01: /** 02: A bank account has a balance that can be changed by 03: deposits and withdrawals. 04: */ 05: public class BankAccount 06: { 07: /** 08: Constructs a bank account with a zero balance. 09: */ 10: public BankAccount() 11: { 12: balance = 0; 13: } 14: 15: /** 16: Constructs a bank account with a given balance. 17: @param initialBalance the initial balance 18: */ 자바프로그래밍 강원대학교
File BankAccount.java 19: public BankAccount(double initialBalance) 20: { 21: balance = initialBalance; 22: } 23: 24: /** 25: Deposits money into the bank account. 26: @param amount the amount to deposit 27: */ 28: public void deposit(double amount) 29: { 30: double newBalance = balance + amount; 31: balance = newBalance; 32: } 33: 34: /** 35: Withdraws money from the bank account. 36: @param amount the amount to withdraw 자바프로그래밍 강원대학교
File BankAccount.java 37: */ 38: public void withdraw(double amount) 37: */ 38: public void withdraw(double amount) 39: { 40: double newBalance = balance - amount; 41: balance = newBalance; 42: } 43: 44: /** 45: Gets the current balance of the bank account. 46: @return the current balance 47: */ 48: public double getBalance() 49: { 50: return balance; 51: } 52: 53: private double balance; 54: } 자바프로그래밍 강원대학교
클래스 설계 순서 클래스의 공개 인터페이스 설계 메소드 선언 (메소드 사용 사례를 적어 봄) 구성자 선언 주석 기입 및 API 문서 제작 필드 선언 메소드 구현 테스트 자바프로그래밍 강원대학교
Testing a Class BlueJ와 같은 도구를 이용 main 메소드가 들어 있는 Test 클래스를 작성 자바프로그래밍 강원대학교
Testing with Bluej 자바프로그래밍 강원대학교
File BankAccountTester.java 01: /** 02: A class to test the BankAccount class. 03: */ 04: public class BankAccountTester 05: { 06: /** 07: Tests the methods of the BankAccount class. 08: @param args not used 09: */ 10: public static void main(String[] args) 11: { 12: BankAccount harrysChecking = new BankAccount(); 13: harrysChecking.deposit(2000.0); 14: harrysChecking.withdraw(500.0); 15: System.out.println(harrysChecking.getBalance()); 16: } 17: } 자바프로그래밍 강원대학교
정리 자바프로그래밍 강원대학교
클래스 선언문 구성 class ClassName { fields methods nested classes and interfaces } 클래스 멤버 class 앞에 public을 붙일 수 있다. 이 경우 세상 누구나 이 클래스를 사용할 수 있다는 의미 public이 없으면 같은 패키지 내에서만 사용할 수 있다. 자바프로그래밍 강원대학교
Fields 필드 변수 선언 타입과 변수이름을 적어줌 선언과 함께 초기값을 정해줄 수도 있음 int i; // i는 int 타입 변수임 Student s; // s는 Student 타입 레퍼런스 변수임 선언과 함께 초기값을 정해줄 수도 있음 int i = 4; Student s = new Student(); 자바프로그래밍 강원대학교
필드와 메소드 public class Box { private int length, width, height; Box 인스턴스 public void setLength(int p) {length=p;} public void setWidth(int p) {width=p;} public void setHeight(int p) {height=p;} public int displayVolume() {System.out.println(length*width*height);} } Box 인스턴스 Length Width height 객체데이터 (상태변수) 메소드 자바프로그래밍 강원대학교
Categories of Variables Fields (인스턴스 필드) Local variables (지역변수) Parameter (파라미터) 메소드에 속하며 메소드가 실행되는 동안에만 존재함 public class BankAccount { private double balance; public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } } 자바프로그래밍 강원대학교
메소드를 구현할 때 파라미터 수를 미리 정하지 않을 수도 있다 메소드를 구현할 때 파라미터 수를 미리 정하지 않을 수도 있다 (variable number of parameters) 자바프로그래밍 강원대학교
가변수 파라미터 함수 (variable number of parameters) class Adder public int add(int... values) Adder adder = new Adder(); adder.add(1, 3, 7); adder.add(1, 2); adder.add(1, 3, 7, 8); 자바프로그래밍 강원대학교
가변수 파라미터 함수의 구현 (variable number of parameters) class Adder public int add(int... values) { int sum = 0; for (int i = 0; i < values.length; i++) sum += values[i]; return sum; } 자바프로그래밍 강원대학교
지역변수의 영역 자바프로그래밍 강원대학교
지역변수의 영역 (Scope of a local variable) 변수가 선언된 부분부터 변수가 포함되어 있는 블록의 끝까지 자바프로그래밍 강원대학교
Scope of Local Variables Rectangle r = new Rectangle(5, 10, 20, 30); if (x >= 0) { double r = Math.sqrt(x); // Error–can't declare another variable called r here . . . } 자바프로그래밍 강원대학교
Scope of Local Variables if (x >= 0) { double r = Math.sqrt(x); . . . } // Scope of r ends here else { Rectangle r = new Rectangle(5, 10, 20, 30); // OK–it is legal to declare another r here . . . } 자바프로그래밍 강원대학교
Overlapping Scope 지역변수와 필드가 같은 이름을 가질 때는 지역변수가 필드를 가린다(shadow). public class Coin { . . . public double getExchangeValue(double exchangeRate) { double value; // Local variable . . . return value; } private String name; private double value; // Field with the same name } 자바프로그래밍 강원대학교
Overlapping Scope 가려진 필드에 접근하는 방법 – this 사용 public Coin(double value, String name) { this.value = value; this.name = name; } private String name; private double value; 자바프로그래밍 강원대학교
기타 자바프로그래밍 강원대학교
부울 타입 변수 Just use the simpler test if (married == true) . . . // Don't 자바프로그래밍 강원대학교
주의 if (0 < amount < 1000) … // 오류 if (0< amount && amount < 1000) … if (ch == ‘S’ || ‘M’) … // 오류 if (ch == ‘S’ || ch == ‘M’) … 자바프로그래밍 강원대학교
Q나 q가 입력될 때까지 입력을 복창하는 루프 Scanner in = new Scanner(System.in) boolean done = false; while (!done) { System.out.print("Enter value, Q to quit: "); String input = in.next(); if (input.equalsIgnoreCase("Q")) done = true; else { System.out.println(input); } } 자바프로그래밍 강원대학교
중간에서 완료여부를 판단하는 루프 boolean done = false; while (!done) { Print prompt String input = read input; if (end of input indicated) done = true; else { // Process input } } 자바프로그래밍 강원대학교
초계값 (Sentinel Values) Sentinel value: 데이터 세트의 끝을 표시하는 값 0이나 -1같은 숫자보다는 Q와 같은 문자를 사용하는 것이 좋음 System.out.print("Enter value, Q to quit: "); String input = in.next(); if (input.equalsIgnoreCase("Q")) We are done else { double x = Double.parseDouble(input); . . . } String을 double 타입으로 변환해주는 메소드 자바프로그래밍 강원대학교
같은 클래스 객체간에도 상호작용이 있을 수 있다. 같은 클래스 객체간에도 상호작용이 있을 수 있다. 자바프로그래밍 강원대학교
BankAccount BankAccount 1000 계좌이체 (transfer) 300 BankAccount 계좌이체 (transfer) 300 BankAccount BankAccount 700 300 자바프로그래밍 강원대학교
public void withdraw(double amount) public class BankAccount { public BankAccount() public BankAccount(double initialBalance) public void deposit(double amount) public void withdraw(double amount) public void transfer(double amount, BankAccount other) public double getBalance() private double balance; } BankAccount kims, moms; kims = new BankAccount(); moms = new BankAccount(1000.0); moms.deposit(2000.0); moms.transfer(500.0, kims); System.out.println(moms.getBalance()); System.out.println(kims.getBalance()); moms kims 자바프로그래밍 강원대학교
public class BankAccount { public void deposit(double amount) double newBalance = balance + amount; balance = newBalance; } public void withdraw(double amount){...} public void transfer(double amount, BankAccount other) withdraw(amount); other.deposit(amount); } private double balance; BankAccount kims, moms; kims = new BankAccount(); moms = new BankAccount(1000.0); moms.deposit(2000.0); moms.transfer(500.0, kims); System.out.println(moms.getBalance()); System.out.println(kims.getBalance()); moms kims 자바프로그래밍 강원대학교
public class BankAccount { public void deposit(double amount) double newBalance = balance + amount; balance = newBalance; } public void withdraw(double amount){...} public void transfer(double amount, BankAccount other) withdraw(amount); // 객체 자신에게 메소드를 호출할 때는 // 메소드 이름만 적어주면 됨 other.deposit(amount); // 다른 객체에게 메소드를 호출할 때는 // 그 객체를 가리키는 레퍼런스를 // 적어 주어야 함 } private double balance; 자바프로그래밍 강원대학교
public class BankAccount { public void deposit(double amount) double newBalance = balance + amount; balance = newBalance; } public void transfer(double amount, BankAccount other) this.withdraw(amount) other.deposit(amount); } private double balance; BankAccount kims, moms; kims = new BankAccount(); moms = new BankAccount(1000.0); moms.deposit(2000.0); moms.transfer(500.0, kims); System.out.println(moms.getBalance()); System.out.println(kims.getBalance()); moms kims 자바프로그래밍 강원대학교
구성자에서 구성자 호출하기 자바프로그래밍 강원대학교
public BankAccount() { balance = 0; } public BankAccount(double initialBalance) { balance = initialBalance; } public BankAccount() { this(0); } public BankAccount(double initialBalance) { balance = initialBalance; } 자바프로그래밍 강원대학교
인스턴스 멤버와 클래스 멤버 자바프로그래밍 강원대학교
인스턴스 필드와 클래스 필드 인스턴스 필드: 인스턴스마다 존재하는 필드 클래스 필드: 클래스 공통으로 하나만 존재하는 필드 클래스 필드를 선언할 때는 static으로 선언한다. public class BankAccount{ private double balance; private int accountNumber; private static int numberOfAccounts = 0; } 자바프로그래밍 강원대학교
public class BankAccount{ private double balance; private int accountNumber; private static int numberOfAccounts = 0; public BankAccount(double initialBalance){ balance = initialBalance; // increment number of Accounts and assign account number accountNumber = ++numberOfAccounts; } public int getAccountNumber() { return accountNumber; 클래스 BankAccount numberOfAccounts: 0 자바프로그래밍 강원대학교
public class BankAccount { private double balance; private int accountNumber; private static int numberOfAccounts = 0; public BankAccount(double initialBalance){ balance = initialBalance; accountNumber = ++numberOfAccounts; } BankAccount b1 = new BankAccount(100.0); 클래스 balance: 100.0 accountNumber: 1 BankAccount numberOfAccounts: 1 b1 자바프로그래밍 강원대학교
public class BankAccount { private double balance; private int accountNumber; private static int numberOfAccounts = 0; public BankAccount(double initialBalance){ balance = initialBalance; accountNumber = ++numberOfAccounts; } BankAccount b1 = new BankAccount(100.0); BankAccount b2 = new BankAccount(200.0); balance: 100.0 accountNumber: 1 b1 BankAccount numberOfAccounts: 2 balance: 200.0 accountNumber: 2 b2 자바프로그래밍 강원대학교
클래스 메소드 메소드를 static르로 선언하면 그 메소드는 개별 객체에 작용하지 않는다는 의미 ClassName. methodName(parameters) Math 클래스 메소드들은 대부분 static 메소드 자바프로그래밍 강원대학교
The Math class (-b + Math.sqrt(b*b - 4*a*c)) / (2*a) 자바프로그래밍 강원대학교
Mathematical Methods in Java Math.sqrt(x) square root Math.pow(x, y) power xy Math.exp(x) ex Math.log(x) natural log Math.sin(x), Math.cos(x), Math.tan(x) sine, cosine, tangent (x in radian) Math.round(x) closest integer to x Math.min(x, y), Math.max(x, y) minimum, maximum 자바프로그래밍 강원대학교
double r = Math.random(); Random generator = new Random(); double r = generator.nextDouble(); 자바프로그래밍 강원대학교
public class BankAccount { private double balance; private int accountNumber; private static int numberOfAccounts = 0; public BankAccount(double initialBalance) { balance = initialBalance; accountNumber = ++numberOfAccounts; } public void deposit(double amount) {balance = balance + amount;} public void withdraw(double amount) {balance = balance – amount;} public static int getNumberOfAccounts() {return numberOfAccounts;} public static void main(String[] args) { deposit(100.0); ------- 에러! BankAccount account = new BankAccount(100.0); account.deposit(100.0); // OK! System.out.println(BankAccount.getNumberOfAccounts()); 자바프로그래밍 강원대학교
public class Adder { public int add(int a, int b) { return a + b; } public static void main(String[] args) { System.out.println(add(1, 2)); // error! Cannot make a static reference to the non-static method add(int, int) from the type Adder 자바프로그래밍 강원대학교
public class Adder { public int add(int a, int b) { return a + b; } public static void main(String[] args) { Adder adder = new Adder(); System.out.println(adder.add(1, 2)); // OK! 자바프로그래밍 강원대학교
public class Adder { public static int add(int a, int b) { return a + b; } public static void main(String[] args) { System.out.println(Adder.add(1, 2)); // OK! 자바프로그래밍 강원대학교
public class Adder { public static int add(int a, int b) { return a + b; } public static void main(String[] args) { System.out.println(Adder.add(1, 2)); // OK! System.out.println(add(1, 2)); // OK! // 클래스 내부에서는 // 클래스이름 생략 가능! 자바프로그래밍 강원대학교
static final Constants(상수) public class Math { . . . public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; } double circumference = Math.PI * diameter; // Math 클래스 밖에서 사용 자바프로그래밍 강원대학교
자바프로그래밍 강원대학교
Converting between Strings and Numbers Convert to number: Convert to string: String str = “35”; String xstr = “12.3”; int n = Integer.parseInt(str); double x = Double.parseDouble(xstr); int n = 10; String str = "" + n; str = Integer.toString(n); 자바프로그래밍 강원대학교
입력 값을 검사하는 법 Scanner scanner = new Scanner(System.in); String id = scanner.next(); if (id.matches("[a-z]")) ... if (id.matches("a.c")) ... if (id.matches("a?c")) ... if (id.matches("a*c")) ... if (id.matches("a+c")) ... if (id.matches("a.*c")) ... 정규식 (regular expression) 자바프로그래밍 강원대학교
이렇게 써도 된다. Color c = panel.getBackground(); if(c.equals(Color.black)) ... if(panel.getBackground().equals(Color.black)) ... Color 클래스의 static field Color 객체 자바프로그래밍 강원대학교
경과 시간 측정하는 법 long start = System.currentTimeMillis(); .... long duration = System.currentTimeMillis()-start; 자바프로그래밍 강원대학교
코드 실행시간 측정법 class TimeTest1 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); long total = 0; for (int i = 0; i < 10000000; i++) { total += i; } long stopTime = System.currentTimeMillis(); long elapsedTime = stopTime - startTime; System.out.println(elapsedTime); 객체지향프로그래밍 강원대학교
Wrappers 자바프로그래밍 강원대학교
Wrapper 인스턴스 자바프로그래밍 강원대학교
자동포장기능 (Auto-boxing) 기본 데이터타입과 wrapper 클래스 간 자동 변환 Double d = new Double(29.95); // 기존 방법 Double d = 29.95; // auto-boxing double x = d.doubleValue(); // 기존 방법 double x = d; // auto-unboxing 자바프로그래밍 강원대학교
Package Names and Locating Classes Use packages to avoid name clashes 패키지 이름은 혼동되지 않도록 정해야 한다. 권고: 도메인 네임을 역순으로 사용 edu.sjsu.cs.walters: for Walters' classes (walters@cs.sjsu.edu) java.util.Timer vs. javax.swing.Timer 객체지향프로그래밍 강원대학교
Base Directories and Subdirectories for Packages com.horstmann.bigjava.Nemeric 객체지향프로그래밍 강원대학교
Package Names and Locating Classes 소스 파일의 path name은 package name에 대응되도록 해 주어야 한다. 기준 위치(base directory)는 classpath 환경변수에 지정해 준다. 기준위치에서 컴파일, 실행 등 작업을 할 때에는 classpath를 설정해 주지 않아도 된다. com.horstmann.bigjava.Nemeric com/horstmann/bigjava/Financial.java export CLASSPATH=/home/walters:. set CLASSPATH=c:\home\walters;. 객체지향프로그래밍 강원대학교
패키지를 사용한 프로그래밍 패키지명 결정 kr.ac.kangwon.ckjeong.homework1 기본 디렉토리 (기준 위치) 설정 mkdir c:\oop 기본 디렉토리 안에 패키지명과 일치하는 서브디렉토리를 만듦 cd c:\oop mkdir kr mkdir kr\ac mkdir kr\ac\kangwon mkdir kr\ac\kangwon\ckjeong mkdir kr\ac\kangwon\ckjeong\homework1 객체지향프로그래밍 강원대학교
패키지를 사용한 프로그래밍 소스 파일을 맨 아래 디렉토리에 작성 c:\oop\kr\ac\kangwon\ckjeong\homework1\Test.java 소스 파일에 package 문장 삽입 package kr.ac.kangwon.ckjeong.homework1 기본 디렉토리에서 소스 파일 컴파일 cd c:\oop javac kr\ac\kangwon\ckjeong\homework1\Test.java 기본 디렉토리에서 프로그램 실행 java kr.ac.kangwon.ckjeong.homework1.Test 파일 이름 클래스 이름 객체지향프로그래밍 강원대학교