Download presentation
Presentation is loading. Please wait.
1
Power Java 제8장 클래스와 객체 I
2
이번 장에서 학습할 내용 1. 클래스와 객체 2. 객체의 일생 3. 메소드 직접 클래스를 작성해 봅시다. 4. 필드
5. UML 직접 클래스를 작성해 봅시다.
3
먼저 앞장에서 학습한 클래스와 객체의 개념을 복습해봅시다.
QUIZ 먼저 앞장에서 학습한 클래스와 객체의 개념을 복습해봅시다. 속성 동작 객체는 ________과 _________을 가지고 있다. 자동차가 객체라면 클래스는 ________이다. 설계도
4
클래스의 구성 클래스(class)는 객체의 설계도라 할 수 있다. 클래스는 필드와 메소드로 이루어진다.
필드(field)는 객체의 속성을 나타낸다. 메소드(method)는 객체의 동작을 나타낸다.
5
클래스 정의의 예 필드 정의! 메소드 정의! class Car { // 필드 정의 public int speed; // 속도
public int mileage; // 주행거리 public String color; // 색상 // 메소드 정의 public void speedUp() { // 속도 증가 메소드 speed += 10; } public void speedDown() { // 속도 감소 메소드 speed -= 10; public String toString() { // 객체의 상태를 문자열로 반환하는 메소드 return "속도: " + speed + " 주행거리: " + mileage + " 색상: " + color; 필드 정의! 메소드 정의!
6
테스트 클래스 public class CarTest {
public static void main(String[] args) { Car myCar = new Car(); // 첫번째 객체 생성 Car yourCar = new Car(); // 두번째 객체 생성 myCar.speed = 60; // 객체의 필드 변경 myCar.mileage = 0; // 객체의 필드 변경 myCar.color = "blue"; // 객체의 필드 변경 myCar.speedUp(); // 객체의 메소드 호출 System.out.println(myCar); yourCar.mileage = 10; // 객체의 필드 변경 yourCar.speed = 120; // 객체의 필드 변경 yourCar.color = "white"; // 객체의 필드 변경 yourCar.speedDown(); // 객체의 메소드 호출 System.out.println(yourCar); }
7
속도: 70 주행거리: 0 색상: blue 속도: 110 주행거리: 10 색상: white
8
2. 객체의 일생 c.speedUp(); c = null; Car c = new Car();
9
객체의 생성
10
객체를 가리키는 참조값을 담을 수 있는 변수만 생성됨.
주의 Car myCar; 위의 문장으로 객체가 생성되는 것은 아님!!! 객체를 가리키는 참조값을 담을 수 있는 변수만 생성됨.
11
참조 변수와 대입 연산 Car car1 = new Car(); Car car2 = car1; // 대입 연산의 의미
12
객체의 사용 객체를 이용하여 필드와 메소드에 접근할 수 있다.
13
객체의 소멸 객체는 참조가 없어지면 소멸!!
14
객체의 소멸
15
3. 메소드
16
매개 변수
17
값에 의한 전달
18
매개 변수가 객체인 경우 아주 중요!!
19
메소드 호출
20
메소드 호출의 예제 import java.util.*; class DiceGame { int diceFace;
int userGuess; private void RollDice() { diceFace = (int)(Math.random() * 6) + 1; } private int getUserInput(String prompt) System.out.println(prompt); Scanner s = new Scanner(System.in); return s.nextInt(); Math.random() 메소드(함수)는, "0.0 이상에서 1.0 미만 (greater than or equal to 0.0 and less than 1.0)"의 double형 실수 값을 반환합니다. 즉, 0.0 은 나올 수 있지만 1.0 은 나올 수 없습니다. "난수 발생기 초기화"는 자동으로 실행되기에, 직접 초기화할 필요는 없습니다. (반면 C++언어에서는 srand() 함수로 난수 발생기를 초기화해 주어야 합니다)
21
메소드 호출의 예제 private void checkUserGuess() { if( diceFace == userGuess )
System.out.println("맞았습니다"); else System.out.println("틀렸습니다"); } public void startPlaying() int userGuess = getUserInput("예상값을 입력하시오: "); RollDice(); checkUserGuess(); public class DiceGameTest { public static void main(String[] args) { DiceGame game = new DiceGame(); game.startPlaying();
22
결과 화면 예상값을 입력하시오: 3 틀렸습니다
23
난수발생기 사용 예 Math.random()
/* 출력 결과: */ public class Foo { public static void main(String[] args) { // 0.0 ~ 1.0 사이의 실수 난수 구하기 for (int i = 1; i <= 20; i++) System.out.println(Math.random());
24
java.util.Random 클래스로 난수를 만드는 법:
Foo.java import java.util.Random; class Foo { public static void main(String args[]) { Random oRandom = new Random(); // 1~10까지의 정수를 랜덤하게 출력 int i = oRandom.nextInt(10) + 1; System.out.println(i); // 0.0f 에서 1.0f 까지의 실수를 랜덤하게 출력 // E-5 라는 값이 나올 수도 있는데 이것은 // 입니다. float f = oRandom.nextFloat(); System.out.println(f); // true(참), false(거짓) 중의 하나를 랜덤하게 출력 Boolean b = oRandom.nextBoolean(); System.out.println(b); } } true
25
중복 메소드 메소드 오버라이딩(method overriding) 메소드 호출시 매개 변수를 보고 일치하는 메소드가 호출된다.
만약 square(3.14)와 같이 호출되면 컴파일러는 매개 변수의 개수, 타입, 순서 등을 봐서 두 번째 메소드를 호출한다.
26
중복 메소드 예제 class Car { // 필드 선언 private int speed; // 속도
// 중복 메소드: 정수 버전 public void setSpeed(int s) { speed = s; System.out.println("정수 버전 호출"); } // 중복 메소드: 실수 버전 public void setSpeed(double s) { speed = (int)s; System.out.println("실수 버전 호출");
27
중복 메소드 예제 정수 버전 호출 실수 버전 호출 public class CarTest1 {
public static void main(String[] args) { Car myCar = new Car(); // 첫번째 객체 생성 myCar.setSpeed(100); // 정수 버전 메소드 호출 myCar.setSpeed(79.2); // 실수 버전 메소드 호출 } 정수 버전 호출 실수 버전 호출
28
4. 필드 선언 변수의 종류 필드의 선언 필드의 사용 범위 설정자와 접근자 필드의 초기화 변수와 변수의 비교
29
자바에서의 변수의 종류 필드(field) 또는 인스턴스 변수: 클래스 안에서 선언되는 멤버 변수
지역 변수(local variable): 메소드나 블록 안에서 선언되는 변수 필드 Class Car { int speed; … void speedUp(int s){ int limit=100; } 지역 변수
30
필드의 선언
31
필드의 사용 범위
32
설정자와 접근자 설정자(mutator) 필드의 값을 설정하는 메소드 setXXX() 형식 접근자(accessor)
필드의 값을 반환하는 메소드 getXXX() 형식
33
설정자와 접근자의 예 … (P. 196)
34
설정자와 접근자의 사용
35
설정자와 접근자는 왜 사용하는가? 설정자에서 매개 변수를 통하여 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있다. (음수, …) 필요할 때마다 필드값을 계산하여 반환할 수 있다. 접근자만을 제공하면 자동적으로 읽기만 가능한 필드를 만들 수 있다. myCar.speed = -10;
36
필드의 초기화 생성자를 사용하는 방법 -> 다음 장에서 학습
37
주의
38
변수와 변수의 비교 “변수1 == 변수2”의 의미 참조형 변수의 경우, 객체의 내용이 같다는 의미가 아니다.
Object 클래스의 equal() 메소드를 재정의 하여야 한다
39
UML :클래스 다이어그램 UML(Unified Modeling Language)
40
클래스와 클래스의 관계 Is-a Use Has-a
42
6. 예제
43
예제 class DeskLamp { // 인스턴스 변수 정의
// 인스턴스 변수 정의 private boolean isOn; // 켜짐이나 꺼짐과 같은 램프의 상태 // 메소드 정의 public void turnOn() // 램프를 켠다. { isOn = true; } public void turnOff() // 램프를 끈다. isOn = false; public String toString() { return "현재 상태는 " + (isOn == true ? "켜짐" : "꺼짐"); }
44
예제 public class DeskLampTest {
public static void main(String[] args) { // 역시 객체를 생성하려면 new 예약어를 사용한다. DeskLamp myLamp = new DeskLamp(); // 객체의 메소드를 호출하려면 도트 연산자인 .을 사용한다. myLamp.turnOn(); System.out.println(myLamp); myLamp.turnOff(); } } 현재 상태는 켜짐 현재 상태는 꺼짐
45
예제 #2-1 class BankAccount { // 은행 계좌 int accountNumber; // 계좌 번호
BankAccountTest.java // P. 205 class BankAccount { // 은행 계좌 int accountNumber; // 계좌 번호 String owner; // 예금주 int balance; // 잔액을 표시하는 변수 void deposit(int amount) { // 저금 balance += amount; } void withdraw(int amount) { // 인출 balance -= amount; public String toString() { return "현재 잔액은 " + balance + "입니다.";
46
예제 #2-2 public class BankAccountTest { public static void main(String[] args) { BankAccount myAccount = new BankAccount(); // 객체의 메소드를 호출하려면 도트 연산자인 .을 사용한다. myAccount.deposit(10000); System.out.println(myAccount); myAccount.withdraw(8000); }
47
예제 #3-1 DateTest.java // P. 206 import java.util.Scanner; class Date {
private int year; private String month; private int day; public void setDate(int y, String m, int d) { month = m; day = d; year = y; } public void printDate() { System.out.println(year + "년 " + month + " " + day + "일"); public int getYear() { return year; public void setYear(int y) { public String getMonth() { return month; public void setMonth(String m) { // 나머지 접근자와 변경자
48
예제 #3-2 public class DateTest { public static void main(String[] args) { Date date = new Date(); date.setDate(2009, "3월", 2); date.printDate(); date.setYear(2010); }
49
LAB. P. 214. LAB, 3. BankAccountTest.java 를 완성하시오.
본문에 등장하는 은행 계좌를 나타내는 BankAccount 클래스를 입력하고 다양한 실험을 하여 보자. BankAccount는 잔고를 나타내는 정수형 멤버 변수(balance)를 가지고 있고,예금 인출 메소드(draw)와 예입 메소드(deposit), 현재의 잔고를 반환하는 메소드(getBalance)를 가지고 있다. 1. 설정자 메소드와 접근자 메소드를 정의하라. 설정자 : deposit() 메소드와 withdraw() 메소드 접근자 : getBalance() 메소드
50
BankAccountTest.java class BankAccount // 은행 계좌 {
int balance; // 잔액을 표시하는 변수 public deposit(int amount) // 저금 ; } void withdraw(int amount) // 인출 int getbalnce() // 잔액조회 public class BankAccountTest public static void main(String[] args) BankAccountTest.java
51
LAB. 2. main() 메소드 안에서 a1, a2 두 개의 BankAccount 객체를 생성하고 다음과 같은 순서로 메소드를 호출한다. a1의 잔고를 100으로 한다. a2의 잔고를 50으로 한다. a1에서 60을 인출한다. a2에서 30을 인출한다. a1의 현재 잔고를 얻어 화면에 출력한다. getbalnce() 호출 a2의 현재 잔고를 얻어 화면에 출력한다. getbalnce() 호출
52
LAB. 3. 현재 잔액을 출력하는 printBalance() 메소드를 구현하고 a1, a2 객체를 통해 메소드를 테스트하라.
a1의 현재 잔고를 얻어 화면에 출력한다. printBalance() 메소드 호출 a2의 현재 잔고를 얻어 화면에 출력한다. printBalance() 메소드 호출
53
LAB. 4. 현재 잔액에 대하여 연 7.5%의 이자를 계산하고 그 값을 반환하는 addInterest() 메소드를 구현하고 각 은행 계좌 객체인 a1, a2에 대해 addInterest 메소드를 호출하여 이자값을 출력하여라. 5. BankAccount 클래스의 예금 인출 메소드인 withdraw()를 현재 잔고가 음수이면 예금 인출이 일어나지 않도록 변경하라. 이러한 BankAccount 클래스의 변경으로 BankAccountTest 클래스를 변경하여야 하는가? 예금이 인출하려는 금액보다 작으면 인출되지 않아야 하며, 또한 예금이 0원이거나 음수일 때(대출) 인출이 되지 않아야 한다. 예금 입금 시 “???가 입금되었습니다” 메시지가 출력되게 하고, 잘못된 출금 시 적절한 오류 메시지가 출력되게 하라. 위 각 경우를 검사할 수 있는 문장을 main 메소드 내에 작성하라.
54
6. BankAccount 클래스의 잔고를 나타내는 balance 멤버 변수의 자료형을 int형에서 double형으로 변경하라
6. BankAccount 클래스의 잔고를 나타내는 balance 멤버 변수의 자료형을 int형에서 double형으로 변경하라. BankAccount 클래스의 변경으로 BankAccountTest클래스를 변경하여야 하는가? 7. BankAccount 클래스 앞에 public을 추가하고 프로그램을 컴파일 해보자. 어떤 오류가 발생하는가? public을 붙이는 것과 붙이지 않는 것의 차이는 무엇인가?
55
8. BankAccount 클래스 안에도 public static void main(String[] args){ }을 추가하여 보라. 컴파일 오류가 발생하는가? 만약 컴파일 오류가 발생하지 않으면 BankAccount 클래스와BankAccountTest 클래스의 main()메소드에 각각 println() 문장을 넣어서 어떤 main() 메소드가 수행되는지를 확인하라. 메인 함수를 각각의 클래스에 모두 선언하여도 오류는 발생하지 않는다. 하지만 호출은 파일명(프로젝트 명)과 같은 클래스의 메인 함수만이 호출된다.
56
9. 7번 문제와 8번 문제의 실험 결과를 토대로 public 클래스와 main() 메소드에 대하여 어떤 결론을 내릴 수 있는가?
하나의 파일에는 파일명과 일치하는 클래스 명에만 public이 사용될 수 있으며 또한 파일명과 일치하는 public 클래스의 메인 메소드 만이 호출된다는 것을 알 수 있다. 하지만 파일명과 일치하는 클래스 파일이 다른 클래스를 포함하고 있을 때는 포함된 클래스는 public 클래스이어도 무방하다.
57
Programming 3. 주사위를 나타내는 클래스인 Dice를 작성하여 보자. Dice클래스에 필요한 필드와 메소드를 생각하여 보자. 메소드에는 주사위를 굴리는 메소드인 roll()을 포함하라. roll() 메소드를 작성할 때 난수를 얻는 다음 문장을 참조하라. Dice클래스를 테스트하기 위한 별도의 클래스를 작성하여 테스트 하라. (DiceTest 클래스) 메소드 : roll(), getFace 멤버변수 : face face = (int) (Math.random() * 6) +1;
58
Q & A
Similar presentations