강원대학교 자바프로그래밍 4. 클래스 설계 2 자바프로그래밍 1
객체 자신에게 메소드 호출하기 vs 다른 객체에게 메소드 호출하기 강원대학교자바프로그래밍 2
강원대학교 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()); momskims 자바프로그래밍 3
강원대학교 public class BankAccount { public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } 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()); momskims 자바프로그래밍 4
강원대학교 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()); momskims 자바프로그래밍 5
강원대학교 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()); momskims 자바프로그래밍 6
강원대학교 class BankAccount { private double balance = 0.0; final double BONUS_RATE = 0.01; public void deposit(double amount) { balance = amount + calculateBonus(amount); // 혹은 balance = amount + this.calculateBonus(amount); } public double getBalance() { return balance; } private double calculateBonus(double amount){ return amount*BONUS_RATE; } 자바프로그래밍 7
구성자에서 구성자 호출하기 강원대학교자바프로그래밍 8
강원대학교 public BankAccount() { balance = 0; } public BankAccount(double initialBalance) { balance = initialBalance; } public BankAccount() { this(0); } public BankAccount(double initialBalance) { balance = initialBalance; } 자바프로그래밍 9
인스턴스 멤버와 클래스 멤버 강원대학교자바프로그래밍 10 클래스 멤버 : 메소드와 필드 (, inner classes and interfaces)
인스턴스 필드와 클래스 필드 인스턴스 필드 : 인스턴스마다 존재하는 필드 클래스 필드 : 클래스 공통으로 하나만 존재하는 필드 public class BankAccount{ private double balance; private int accountNumber; private static int numberOfAccounts = 0; } 강원대학교자바프로그래밍 11
강원대학교 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 자바프로그래밍 12
강원대학교 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 numberOfAccounts: 1 balance: accountNumber: 1 b1 자바프로그래밍 13
강원대학교 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); BankAccount numberOfAccounts: 2 balance: accountNumber: 1 b1 balance: accountNumber: 2 b2 자바프로그래밍 14
클래스 필드에 접근하는 법 public class BankAccount{ double balance; int accountNumber; static int numberOfAccounts = 0; } BankAccount b1 = new BankAccount(100.0); // 인스턴스필드에는 레퍼런스를 통해 접근 System.out.println(b1.balance); // 클래스필드에는 클래스이름을 통해 접근 System.out.println(BankAccount.numberOfAccounts); 강원대학교자바프로그래밍 15
강원대학교 클래스 메소드 static 키워드가 메소드 앞에 붙으면 그 메소드는 개별 객체에 작용하 지 않는다는 의미 Static 메소드는 아래와 같은 형식으로 호출 ClassName. methodName(parameters) Math 클래스 메소드들은 대부분 static 메소드 자바프로그래밍 16
강원대학교 The Math class (-b + Math.sqrt(b*b - 4*a*c)) / (2*a) 자바프로그래밍 17
강원대학교 Mathematical Methods in Java Math.sqrt(x) square root Math.pow(x, y) power x y Math.exp(x) exex 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 자바프로그래밍 18
맥락에 맞게 사용해야 함 인스턴스 메소드에서 인스턴스 필드와 인스턴스 메소드에 직접 접근 가능 인스턴스 메소드에서 클래스 필드와 클래스 메소 드에 직접 접근 가능 클래스 메소드에서 클래스 필드와 클래스 메소드 에 직접 접근 가능 클래스 메소드에서 인스턴스 필드와 인스턴스 메 소드에 직접 접근 불가능 강원대학교자바프로그래밍 19
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 = amount + amount;} public void withdraw(double amount) { balance = balance – amount;} public static int getNumberOfAccounts() {return numberOfAccounts;} public static void main(String[] args) { BankAccount account = new BankAccount(100.0); account.deposit(100.0); withdraw(100.0); System.out.println(BankAccount.getNumberOfAccounts()); } 강원대학교자바프로그래밍 20
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 강원대학교자바프로그래밍 21
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! } 강원대학교자바프로그래밍 22
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! } 강원대학교자바프로그래밍 23
public class Adder { public static int add(int a, int b) { return a + b; } public static void main(String[] args) { System.out.println(add(1, 2)); // OK! // 같은 클래스 내 } 강원대학교자바프로그래밍 24
강원대학교 Constants( 상수 ): static final static final constant 는 다른 클래스에 의해 주로 사 용됨 static final constant 는 아래와 같은 방법으로 사용 public class Math {... public static final double E = ; public static final double PI = ; } double circumference = Math.PI * diameter; // Math 클래스 밖에서 사용 자바프로그래밍 25
접근성 private – 같은 클래서 내에서만 접근 가능 (package) – 같은 패키지 내에서만 접근 가능 protected – 같은 패키지, 혹은 서브클래스에서 접 근 가능 public – 누구나 접근 가능 강원대학교자바프로그래밍 26
강원대학교 클래스 멤버에의 접근성 외부로 노출시켜야 할 멤버는 public 내부 기능을 위한 멤버는 private 자바프로그래밍 27
강원대학교 Fields 에의 접근성 필드 변수에의 접근성 (accessibility) public int i;// 누구나 i 에 접근할 수 있음 int i;// 같은 패키지 안에서 접근할 수 있음 private int i; // 같은 클래스 안에서만 접근할 수 있음 일반적으로 클래스 외부에서 클래스 내의 필드에 접근하는 것은 정보 은닉 원칙에 어긋나므로 이를 허용하지 않도록 private 로 선언 필드 변수는 통상 private 로 선언 ! 자바프로그래밍 28
강원대학교 Fields public 클래스 필드에 직접 접근하려면 아래와 같이 할 수 있음 Student s = new Student(); System.out.println(s.name); s.name = “ 배철수 ”; 이런 방법은 권장하지 않음 필드 변수를 private 로 선언하고 그 객체가 지원하는 메소드를 통해서 변 경하는 것이 좋음 class Studnent { public String name = “ 철수 ”; // 필드 } 자바프로그래밍 29
강원대학교 private instance field private instance field 에는 해당 클래스 내에서만 접근 가능하다. public class BankAccount { private double balance; public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } } BankAccount maryAccount = new BankAccount(5000); maryAccount.balance = maryAccount.balance ; Tester: 컴파일 에러 ! 자바프로그래밍 30
강원대학교 메소드에의 접근성 외부로 노출시켜야 할 메소드는 public 내부 기능을 위한 메소드는 private 자바프로그래밍 31
강원대학교 class Account { private double balance = 0.0; final double BONUS_RATE = 0.01; public void deposit(double amount) { balance = amount + calculateBonus(amount); } public double getBalance() { return balance; } // Account 내부에서만 사용되는 메소드 private double calculateBonus(double amount){ return amount*BONUS_RATE; } 자바프로그래밍 32
객체지향프로그래밍강원대학교 Scope of Class Members Private 멤버는 class scope 를 갖는다. – 클래스 내의 어떤 메소드에서건 클래스 멤버를 사용할 수 있다. 클래스 밖에서 public member 를 사용하려면 어 떤 멤버를 사용할 것인지 명확히 지정해야 한다. Math.sqrt() // static member 의 경우 harrysChecking.getBalance() // instance member 의 경우 33
객체지향프로그래밍강원대학교 Scope of Class Members 메소드 내에서 필드 혹은 메소드 이름만 적어주면 this 를 붙여 준 것과 같다. 즉 현재 메소드를 실행 하고 있는 객체에게 메소드를 호출한 셈이다. public class BankAccount { public void transfer(double amount, BankAccount other) { withdraw(amount); // i.e., this.withdraw(amount); other.deposit(amount); }... } 34
기타 강원대학교자바프로그래밍 35
강원대학교 String Concatenation ( 문자열 연결 ) Use the + operator: 문자열을 다른 값과 + 연산자로 연결하면 다른 값 은 자동으로 문자열로 변환됨 String name = "Dave"; String message = "Hello, " + name; // message is "Hello, Dave" String a = "Agent"; int n = 7; String bond = a + n; // bond is “Agent7” 자바프로그래밍 36
강원대학교 Concatenation in Print Statements 아래 두 프로그램은 동일 결과 System.out.print("The total is "); System.out.println(total); System.out.println("The total is " + total); 자바프로그래밍 37
강원대학교 객체를 출력하면 객체에 toString() 메소드가 호출되고 그 반환값이 출력됨 객체를 문자열과 + 연산자로 연결하면 객체에 toString() 메소드가 호출되고 그 반환값이 문자열 과 연결됨 Rectangle r = new Rectangle(); System.out.println(r); // java.awt.Rectangle[x=0,y=0,width=0,height=0] Rectangle r = new Rectangle(); String s = r + ""; System.out.println(s); // java.awt.Rectangle[x=0,y=0,width=0,height=0] 자바프로그래밍 38
강원대학교 Strings and Numbers Number (integer 의 경우 ) 12 = C ( ) 1024 = ( ) = ( ) String "12" = "1024" = " " = 자바프로그래밍 39
강원대학교 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); 자바프로그래밍 40
강원대학교 Substrings String 클래스의 메소드 String greeting = "Hello, World!"; String sub = greeting.substring(0, 5); // sub is "Hello" inclusive exclusive 자바프로그래밍 41
강원대학교 Reading Input – Scanner 클래스 Scanner 인스턴스를 만들고 이 객체에 적절한 입력 메소드 호출 – next reads a word (until any white space) – nextLine reads a line (until user hits Enter) Scanner in = new Scanner(System.in); System.out.print("Enter quantity: "); int quantity = in.next(); 자바프로그래밍 42
강원대학교 객체를 생성하기 위해서는 키워드 new 생성자를 사용 Rectangle r = new Rectangle(1, 1, 2, 3); 그러나 String 객체만은 예외적으로 String s = " 스트링 “ 과 같이 간편하게 생성하는 것도 가능 특수문자 new line – "\n" 탭 – "\t" 따옴표 – "\"" 자바프로그래밍 43
강원대학교 Scanner scanner = new Scanner(System.in); String id = scanner.next(); if (id.matches("[12]"))... 정규식 (regular expression) [a-z] 입력 값을 검사하는 법 자바프로그래밍 44
강원대학교 Color c = panel.getBackground(); if(c.equals(Color.black))... if(panel.getBackground().equals(Color.black))... 이렇게 써도 된다. 자바프로그래밍 45
강원대학교 경과 시간 측정하는 법 long start = System.currentTimeMillis();.... long duration = (System.currentTimeMillis()-start)/1000; 자바프로그래밍 46
강원대학교 switch (expr) {// expr 는 정수나 char 등의 타입 ! case c1: statements // do these if expr == c1 break; case c2: statements // do these if expr == c2 break; case c2: case c3: case c4: // Cases can simply fall thru. statements // do these if expr == any of c's break;... default: statements // do these if expr != any above } switch 문장 형식 자바프로그래밍 47
강원대학교 Random Numbers and Simulations Random number generator 주사위 (random number between 1 and 6) Random generator = new Random(); int n = generator.nextInt(a); // 0 <= n < a double x = generator.nextDouble(); // 0 <= x < 1 int d = 1 + generator.nextInt(6); 자바프로그래밍 48
강원대학교 File Die.java 01: import java.util.Random; 02: 03: /** 04: This class models a die that, when cast, lands on a 05: random face. 06: */ 07: public class Die 08: { 09: /** 10: Constructs a die with a given number of sides. s the number of sides, e.g. 6 for a normal die 12: */ 13: public Die(int s) 14: { 15: sides = s; 16: generator = new Random(); 17: } 18: 자바프로그래밍 49
강원대학교 File Die.java 19: /** 20: Simulates a throw of the die the face of the die 22: */ 23: public int cast() 24: { 25: return 1 + generator.nextInt(sides); 26: } 27: 28: private Random generator; 29: private int sides; 30: } 자바프로그래밍 50
강원대학교 File DieTester.java 01: /** 02: This program simulates casting a die ten times. 03: */ 04: public class DieTester 05: { 06: public static void main(String[] args) 07: { 08: Die d = new Die(6); 09: final int TRIES = 10; 10: for (int i = 0; i < TRIES; i++) 11: { 12: int n = d.cast(); 13: System.out.print(n + " "); 14: } 15: System.out.println(); 16: } 17: } 자바프로그래밍 51
강원대학교 Wrappers 자바프로그래밍 52
강원대학교 Wrapper 인스턴스 자바프로그래밍 53
강원대학교 자동포장기능 (Auto-boxing) 기본 데이터타입과 wrapper 클래스 간 자동 변환 Double d = new Double(29.95); // 기존 방법 Double d = 29.95; // auto-boxing double x = d.doubleValue(); // 기존 방법 double x = d; // auto-unboxing 자바프로그래밍 54
강원대학교 자동포장기능 (Auto-boxing) ① d 의 포장을 벗겨 double 타입으로 만듦 ② 1 을 더함 ③결과를 Double 타입 객체로 포장 ④레퍼런스를 e 가 포장된 Double 타입 객체를 가리키도록 함 Double d = new Double(3.1); Double e = d + 1.0; 자바프로그래밍 55
객체지향프로그래밍강원대학교 Package Names and Locating Classes Use packages to avoid name clashes 패키지 이름은 혼동되지 않도록 정해야 한다. 권고 : 도메인 네임을 역순으로 사용 edu.sjsu.cs.walters: for Walters' classes java.util.Timer vs. javax.swing.Timer 56
객체지향프로그래밍강원대학교 Base Directories and Subdirectories for Packages com.horstmann.bigjava.Nemeric 57
객체지향프로그래밍강원대학교 Package Names and Locating Classes 소스 파일의 path name 은 package name 에 대응되도록 해 주어야 한 다. 기준 위치 (base directory) 는 classpath 환경변수에 지정해 준다. 기준위치에서 컴파일, 실행 등 작업을 할 때에는 classpath 를 설정해 주지 않아도 된다. com/horstmann/bigjava/Financial.java export CLASSPATH=/home/walters:. set CLASSPATH=c:\home\walters;. com.horstmann.bigjava.Nemeric 58
객체지향프로그래밍강원대학교 패키지를 사용한 프로그래밍 패키지명 결정 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 59
객체지향프로그래밍강원대학교 패키지를 사용한 프로그래밍 소스 파일을 맨 아래 디렉토리에 작성 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 파일 이름 클래스 이름 60