Download presentation
Presentation is loading. Please wait.
Published byHaakon Skoglund Modified 6년 전
1
제 4주 – 클래스 설계 제 4주 목표 클래스를 구현하는 법을 배운다. 변수 선언 메소드 구현 구성자 객체지향프로그래밍
강원대학교
2
캡슐화 (encapsulation) 내부의 동작과 상태가 외부 사용자에게는 보이지 않게함 자동차 움직이는 기능을 함
사용자는 간단한 조작 방법(public interface)만 알면 됨 내부 엔진, 구동축, 스프링, 전자제어 등 상세한 구현 및 동작 내용은 운전자에게 보이지 않음 객체지향프로그래밍 강원대학교
3
객체 객체 객체에 캡슐화 개념 적용 내부가 아무리 복잡하더라고 사용자에게는 단순하게 보임 외부에 보이는 개념 (기능과 사용법)
내부의 세부 내용 객체지향프로그래밍 강원대학교
4
추상화 (Astraction) 외부에 나타나는 개념은 추상화를 통해 형성됨
추상화: 중요하지 않은 세부 내용을 제거함으로써 핵심적인 내용만을 추출함 자동차의 예 엔진 회전시키고 냉각수 돌리고 스프링 쿠션 주고 배기가스 정화하는 등 시시콜콜 많은 것들이 그 안에 있지만 이들을 생략하고 문짝과 지붕, 엔진과 핸들이 달린 탈 것이라고 표현하는 것 추상화 단계 실제 의자 – 의자 그림 – 의자 아이콘 – “의자” 문자 표현은 고도의 추상화 결과 객체지향프로그래밍 강원대학교
5
단계적인 추상화 객체 안에는 다른 객체가 들어 있다. 객체의 제작자가 있고 사용자가 있다.
객체의 사용자는 객체 내부에 대해 자세히 알 필요가 없다. 객체의 사용법은 잘 정의되어 있으며 알려져 있다. (자바 라이브러리 API 문서) 객체지향프로그래밍 강원대학교
6
클래스의 설계 구동클래스 – 지금까지 작성한 main 메소드를 가진 클래스 작업클래스 – 고유한 기능을 갖는 클래스
라이브러리에 있는 클래스 사용자가 정의하는 크래스들 지금까지 다른 사람이 설계한 클래스를 이용함 (Printstream, String, JFrame, StringTokenizer) 새로운 클래스를 설계하는 법을 공부함 객체지향프로그래밍 강원대학교
7
클래스 정의문 구성 class ClassName { fields methods
nested classes and interfaces } 클래스 멤버 class 앞에 public을 붙일 수 있다. 이 경우 세상 누구나 이 클래스를 사용할 수 있다는 의미 public이 없으면 같은 패키지 내에서만 사용할 수 있다. 객체지향프로그래밍 강원대학교
8
Fields (변수) 변수 선언 타입과 변수이름을 적어줌 선언과 함께 초기값을 정해줄 수도 있음
int i; // i는 int 타입 변수임 Student s; // s는 Student 타입 레퍼런스 변수임 선언과 함께 초기값을 정해줄 수도 있음 int i = 4; Student s = new Student(); 객체지향프로그래밍 강원대학교
9
Fields (변수) 변수에의 접근성 (accessibility) public int i; // 누구나 i에 접근할 수 있음
private int i; // 같은 클래스 안에서만 접근할 수 있음 일반적으로 클래스 외부에서 클래스 내의 변수에 접근하는 것은 캡슐화원칙에 어긋나므로 이를 허용하지 않음 통상 private로 선언 객체지향프로그래밍 강원대학교
10
Fields (변수) 클래스 변수에 직접 접근하려면 아래와 같이 함 Student s = new Student();
System.out.println(s.name); s.name = “배철수”; class Studnent { String name = “철수”; } 이런 방법은 권장하지 않음 객체의 내부 상태는 그 객체가 지원하는 메소드를 통해서 변경하는 것이 좋음 객체지향프로그래밍 강원대학교
11
Methods (메소드) class ClassName { fields methods
nested classes and interfaces } 객체지향프로그래밍 강원대학교
12
메소드 정의 (Method Definition)
access specifier list of parameters method name public void deposit(double amount) { } public void withdraw(double amount) { } public double getBalance() { } return type method body 객체지향프로그래밍 강원대학교
13
메소드 사용 메소드 정의 public class Tester {
public static void main(String[] args){ Account a = new Account(); a.deposit(100.0); double money = a.getBalance(); System.out.println("잔액은 " + money + "원입니다."); } class Account { private double balance = 0.0; public void deposit(double amount) { balance += amount; public double getBalance() { return balance; 메소드 사용 메소드 정의 객체지향프로그래밍 강원대학교
14
public static void main(String[] args){ Account a = new Account();
public class Tester { public static void main(String[] args){ Account a = new Account(); a.deposit(100.0); double money = a.getBalance(); System.out.println("잔액은 " + money + "원입니다."); } class Account { private double balance = 0.0; public void deposit(double amount) { balance += amount; public double getBalance() { return balance; 인자 (argument) 매개변수 (parameter) 외부에서 balance에 직접 접근하지 못함! 객체지향프로그래밍 강원대학교
15
public static void main(String[] args){ Account a = new Account();
public class Tester { public static void main(String[] args){ Account a = new Account(); a.deposit(100.0); double money = a.getBalance(); System.out.println("잔액은 " + money + "원입니다."); } class Account { private double balance = 0.0; public void deposit(double amount) { balance += amount; public double getBalance() { return balance; 인자 (argument) call-by-value (값 복사) 매개변수 (parameter) 객체지향프로그래밍 강원대학교
16
매개변수 2개 사용 다중정의 public class Tester {
public static void main(String[] args){ Account a = new Account(); a.deposit(100.0, 200.0); double money = a.getBalance(); System.out.println("잔액은 " + money + "원입니다."); } class Account { private double balance = 0.0; public void deposit(double amount) { balance += amount; public void deposit(double a1, double a2) { balance = a1 + a2; public double getBalance() { return balance; 매개변수 2개 사용 다중정의 객체지향프로그래밍 강원대학교
17
sumValue = sum(value1, value2);
메소드 사용 int sumValue; int value1 = 40; int value2 = 2; sumValue = sum(value1, value2); argument (인자) parameter 메소드 정의 int sum(int addend1, int addend2) { return addend1 + addend2; } 객체지향프로그래밍 강원대학교
18
메소드에의 접근성 외부로 노출시켜야 할 메소드는 public 내부 기능을 위한 메소드는 private 객체지향프로그래밍
강원대학교
19
private double balance = 0.0; final double BONUS_RATE = 0.01;
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; 객체지향프로그래밍 강원대학교
20
private double balance = 0.0; final double BONUS_RATE = 0.01;
class Account { private double balance = 0.0; final double BONUS_RATE = 0.01; public void deposit(double amount) { balance = amount + calculateBonus(amount); } // Account 내부에서만 사용되는 메소드 private double calculateBonus(double amount){ return amount*BONUS_RATE; 다른 객체에게 메소드를 호출할 때: reference.methodName(); 자기자신에게 메소드를 호출할 때: methodName(); 객체지향프로그래밍 강원대학교
21
다른 객체에게 메소드를 호출할 때: reference.methodName();
class LabelViewer extends JFrame { ... JPanel panel = new JPanel(); JLabel label = new label(“라벨”); panel.add(lebel); add(panel); } 객체지향프로그래밍 강원대학교
22
클래스의 공개 인터페이스 설계(Designing the Public Interface of a Class)
예: 은행계좌 (bank account) 추상화: 은행계좌가 갖추어야 할 필수 기능 예금 출금 잔고조회 이러한 기능들은 public 메소드로 구현됨 객체지향프로그래밍 강원대학교
23
메소드 Methods of BankAccount class: 이 메소드들은 아래 예처럼 사용될 것이다.
deposit (예금하다) withdraw (출금하다) getBalance (잔고) harrysChecking.deposit(2000); harrysChecking.withdraw(500); System.out.println(harrysChecking.getBalance()); 객체지향프로그래밍 강원대학교
24
구성자 (Constructor) 구성자는 객체가 구성될 때 실행된다. 객체 내부 변수를 초기화하는 데 사용된다.
구성자 이름은 클래스 이름과 같으며 반환값을 갖지 않는다. 파라미터가 서로 다른 여러개의 구성자가 있을 수 있다. (다중정의) public BankAccount(); public BankAccount(double initialBalance); BankAccount 객체를 구성할 때 아래와 같이 하면 초기 잔고가 5000 원인 계좌가 만들어진다. BankAccount account = new BankAccount(5000); 객체지향프로그래밍 강원대학교
25
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 field } 객체지향프로그래밍 강원대학교
26
Implementing and Using Constructors
public BankAccount() { balance = 0; } public BankAccount(double initialBalance) { balance = initialBalance; } BankAccount harrysChecking = new BankAccount(1000); BankAccount marysChecking = new BankAccount(); 1000 harrysChecking marysChecking 객체지향프로그래밍 강원대학교
27
Implementing Methods 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; } 객체지향프로그래밍 강원대학교
28
인스턴스 (instance) Instance of a class = an object of the class
철수, 영희는 사람 클래스의 인스턴스이다. 메리, 독구, 쫑은 개 클래스의 인스턴스이다. 철수, 영희, 메리, 독구, 쫑은 모두 객체이다. 객체지향프로그래밍 강원대학교
29
Instance Fields public class BankAccount { public BankAccount() { ... } public BankAccount(double initialBalance) { ... } public void deposit(double amount) { ... } public void withdraw(double amount) { ... } public double getBalance() { ...} private double balance; } 객체지향프로그래밍 강원대학교
30
Instance Fields 객체지향프로그래밍 강원대학교
31
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: */ 객체지향프로그래밍 강원대학교
32
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 객체지향프로그래밍 강원대학교
33
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: } 객체지향프로그래밍 강원대학교
34
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); 14: harrysChecking.withdraw(500); 15: System.out.println(harrysChecking.getBalance()); 16: } 17: } 객체지향프로그래밍 강원대학교
35
Commenting on the Public Interface
정해진 규칙에 맞추어 주석을 달면 javadoc 도구를 사용해 API 문서를 만들어 낼 수 있다. $ javadoc BankAccount.java /** BankAccount는 은행계좌로서 입금, 출금이 가능하며 현재 잔고를 확인할 수 있다. */ public class BankAccount { } 객체지향프로그래밍 강원대학교
36
/** 계좌에서 출금한다. @param amount 출금액수
/** 계좌에서 출금한다. @param amount 출금액수 */ public void withdraw(double amount) { // implementation filled in later } /** 잔고를 보여준다. @return 잔고 */ public double getBalance() { // implementation filled in later } 객체지향프로그래밍 강원대학교
37
객체지향프로그래밍 강원대학교
38
객체지향프로그래밍 강원대학교
39
System.out.println("멍멍!"); } public void eat() {
Dog.java 작업 클래스 Cat.java 작업 클래스 public class Dog { public void bark() { System.out.println("멍멍!"); } public void eat() { System.out.println("짭짭!"); public class Cat { public void meow() { System.out.println("야옹!"); } public void eat() { System.out.println("얌냠!"); AnimalDrive.java 구동 클래스 public class AnimalDrive { public static void main(String[] args) { Dog mary = new Dog(); // 객체생성 Cat navy = new Cat(); // 객체생성 mary.bark(); // 객체에 행동 지시 mary.eat(); // 객체 메소드 호출 navy.meow(); navy.eat(); } $ javac Dog.java Cat.java $ javac AnimalDrive.java $ java AnimalDrive 멍멍! 짭짭! 야옹! 얌냠! 객체지향프로그래밍 강원대학교
40
$ javac DogTest.java $ java DogTest 멍멍! 짭짭! public class Dog {
Dog.java public class Dog { public void bark() { System.out.println("멍멍!"); } public void eat() { System.out.println("짭짭!"); $ javac DogTest.java $ java DogTest 멍멍! 짭짭! Dog.java 파일은 다시 컴파일 할 필요가 없음 같은 디렉토리에 있는 클래스는 import하지 않고 그냥 사용할 수 있음 DogTest.java public class DogTest { public static void main(String[] args) { Dog mary = new Dog(); // 객체생성 Dog john = new Dog(); // 객체생성 mary.bark(); // 객체에 행동 지시 mary.eat(); // 객체 메소드 호출 john.bark(); john.eat(); } Dog 인스턴스를 두 개 생성하여 하나는 mary라고 하고 다른 하나는 john이라고 했음 mary와 john은 모두 Dog 클래스에 속하는 객체임 객체지향프로그래밍 강원대학교
41
Instance Fields 인스턴스마다 각각 가지고 있는 필드 public class Dog {
private int age; // instance field public void setAge(int a) { age = a; } public int getAge() { return age; public void bark() { System.out.println("멍멍!"); public void eat() { System.out.println("짭짭!"); public class DogTest { public static void main(String[] args) { Dog mary = new Dog(); Dog john = new Dog(); mary.setAge(3); john.setAge(5); } instance field 3 5 mary john 객체지향프로그래밍 강원대학교
42
Categories of Variables
Instance fields Local variables Parameter variables 메소드에 속하며 메소드가 실행되는 동안에만 존재함 public class BankAccount { private double balance; public void deposit(double amount) { double newBalance = balance + amount; balance = newBalance; } } 객체지향프로그래밍 강원대학교
43
public class BankAccountTester {
public static void main(String[] args) BankAccount harrysChecking = new BankAccount(3000); BankAccount marysChecking = new BankAccount(1000); harrysChecking.withdraw(2000); marysChecking.withdraw(500); System.out.println(harrysChecking.getBalance()); System.out.println(marysChecking.getBalance()); } harrysChecking public void withdraw(double amount) { double newBalance = balance - amount; balance = newBalance; } balance: 3000 marysChecking balance: 1000 BankAccount 인스턴스가 두개 구성되었고 각 객체마다 balance라는 인스턴스 필드를 가지고 있다. withdraw 메소드 내의 balance는 그 중 어느 것일까? 객체지향프로그래밍 강원대학교
44
public class BankAccountTester {
public static void main(String[] args) BankAccount harrysChecking = new BankAccount(3000); BankAccount marysChecking = new BankAccount(1000); harrysChecking.withdraw(2000); // A marysChecking.withdraw(500); // B System.out.println(harrysChecking.getBalance()); System.out.println(marysChecking.getBalance()); } public void withdraw(double amount) { double newBalance = balance - amount; balance = newBalance; } withdraw 메소드를 실행하는 객체가 갖고 있는 인스턴스 필드이다. A 문장이 실행될 때의 balance는 harrysChecking 객체 내의 balance B 문장이 실행될 때의 balance는 marysChecking 객체 내의 balance 객체지향프로그래밍 강원대학교
45
메소드를 실행하는 객체 자신을 가리키는 키워드 this 의미를 명확히 하기 위해 위와 같이 적어 줄 수도 있다.
public class BankAccountTester { public static void main(String[] args) BankAccount harrysChecking = new BankAccount(3000); BankAccount marysChecking = new BankAccount(1000); harrysChecking.withdraw(2000); marysChecking.withdraw(500); System.out.println(harrysChecking.getBalance()); System.out.println(marysChecking.getBalance()); } public void withdraw(double amount) { double newBalance = this.balance - amount; balance = newBalance; } 메소드를 실행하는 객체 자신을 가리키는 키워드 this 의미를 명확히 하기 위해 위와 같이 적어 줄 수도 있다. 객체지향프로그래밍 강원대학교
46
구성자 내에서의 this 사용 public BankAccount() { this(0.0); } public BankAccount(double initialBalance) { balance = initialBalance; } BankAccount harrysChecking = new BankAccount(1000.0); BankAccount marysChecking = new BankAccount(); 1000.0 0.0 harrysChecking marysChecking 객체지향프로그래밍 강원대학교
47
잡동사니 객체지향프로그래밍 강원대학교
48
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 클래스 밖에서 사용 객체지향프로그래밍 강원대학교
49
Calling Static Methods
ClassName. methodName(parameters) Math 클래스 메소드들은 대부분 static 메소드 객체지향프로그래밍 강원대학교
50
The Math class (-b + Math.sqrt(b*b - 4*a*c)) / (2*a) 객체지향프로그래밍 강원대학교
51
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 객체지향프로그래밍 강원대학교
52
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” 객체지향프로그래밍 강원대학교
53
Concatenation in Print Statements
아래 두 프로그램은 동일 결과 System.out.print("The total is "); System.out.println(total); System.out.println("The total is " + total); 객체지향프로그래밍 강원대학교
54
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); 객체지향프로그래밍 강원대학교
55
Substrings String 클래스의 메소드
String greeting = "Hello, World!"; String sub = greeting.substring(0, 5); // sub is "Hello" inclusive exclusive 객체지향프로그래밍 강원대학교
56
Reading Input – Scanner 클래스
Scanner in = new Scanner(System.in); System.out.print("Enter quantity: "); int quantity = in.next(); Scanner 인스턴스를 만들고 이 객체에 적절한 입력 메소드 호출 next reads a word (until any white space) nextLine reads a line (until user hits Enter) 객체지향프로그래밍 강원대학교
57
객체를 생성하기 위해서는 키워드 new 생성자를 사용 Rectangle r = new Rectangle(1, 1, 2, 3);
그러나 String 객체만은 예외적으로 String s = "스트링“ 과 같이 간편하게 생성하는 것도 가능 특수문자 new line - “\n“ 탭 - ”\t“ 따옴표 - ”\“” 객체지향프로그래밍 강원대학교
58
현재시각 알아내는 법 import java.util.Date; Date d = new Date();
String s = d.toString() System.out.println(s); Sat Mar 22 11:42:02 KST 2008 객체지향프로그래밍 강원대학교
59
JPanel 속 부품 배치 기본적으로는 옆으로 나란히 배치 (FlowLayout) 너비가 모자라면 아래로 내려옴
세로 배치 방법 JPanel panel = new JPanel(); panel.setLayout(new GridLayout(0, 1)); 혹은 panel.setLayout(new BoxLayout(container, BoxLayout.X_AXIS)); 객체지향프로그래밍 강원대학교
60
입력 값을 검사하는 법 Scanner scanner = new Scanner(System.in);
String id = scanner.next(); if (id.matches("[12]")) ... 정규식 (regular expression) [a-z] 객체지향프로그래밍 강원대학교
61
이렇게 써도 된다. Color c = panel.getBackground();
if(c.equals(Color.black)) ... if(panel.getBackground().equals(Color.black)) ... 객체지향프로그래밍 강원대학교
62
경과 시간 측정하는 법 long start = System.currentTimeMillis(); ....
long duration = (System.currentTimeMillis()-start)/1000; 객체지향프로그래밍 강원대학교
63
그래픽 프로그램에서 frame.repaint(); 프레임을 새로 그려줌 그 과정에서 프레임 내에 있는 부품들도 모두 새로 그림
프레임은 시스템이 프레임의 paintComponent 메소드를 호출해 줌으로써 새로 그려짐 부품들이 새로이 그려지는 것도 시스템이 부품들의 paintComponent 메소드를 호출해 주는 것임 객체지향프로그래밍 강원대학교
64
그래픽 프로그램에서 System.exit(0); 프로그램과 프로그램에 의해 그려진 창을 모두 종료함
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 프로그램에 의해 그려진 프레임 창을 종료하면 프로그램도 함께 종료되게 해 줌 객체지향프로그래밍 강원대학교
65
switch 문장 형식 switch (expr) { // expr는 정수나 char 등의 타입! case c1:
statements // do these if expr == c1 break; case c2: statements // do these if expr == c2 case c3: case c4: // Cases can simply fall thru. statements // do these if expr == any of c's . . . default: statements // do these if expr != any above } 객체지향프로그래밍 강원대학교
Similar presentations