Power Java 제8장 클래스와 객체 I.

Slides:



Advertisements
Similar presentations
3. 메소드와 변수 SCJP 자격증 프로젝트 발표자 : 최선웅. 1. 메 소 드 개 념 2. 메 소 드 양 식 3. 메 소 드 변 수 4. 메 소 드 예 제 5. 참 고 문 헌 / 자 료 목 차.
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Chap07 상속 Section 1 : 상속의 개요 Section 2 : 멤버 변수의 상속
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
최윤정 Java 프로그래밍 클래스 상속 최윤정
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
6장 객체-지향 설계 ①.
C++ Exspresso 제5장 클래스의 기초.
7장 배열 ②.
Lesson 5. 레퍼런스 데이터형.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
Lesson 9. 예외처리.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
Power Java 제4장 자바 프로그래밍 기초.
C++ Espresso 제12장 템플릿.
두근두근 파이썬 수업 13장 객체란 무엇인가요?.
두근두근 파이썬 수업 13장 객체란 무엇인가요?.
제4장 클래스와 객체 객체 지향 기법을 이해한다. 클래스를 작성할 수 있다. 클래스에서 객체를 생성할 수 있다.
제7장 클래스와 객체.
Power Java 제14장 배치 관리자.
3장 자바의 기본문법(2).
2007 1학기 11 프로젝트 기초 실습.
Java 6장. 클래스 : 속성 public class SumTest {
Tail-recursive Function, High-order Function
제 4 장 클래스 작성 4-1 LAB.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
10장. 예외처리.
자바 5.0 프로그래밍.
C#.
13. 연산자 오버로딩.
C 프로그래밍 C언어 (CSE2035) (Chap11. Derived types-enumerated, structure, and union) (1-1) Sungwook Kim Sogang University Seoul, Korea Tel:
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
7장 인터페이스와 추상 클래스.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
인터넷응용프로그래밍 JavaScript(Intro).
Lesson 4. 수식과 연산자.
Lesson 2. 기본 데이터형.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Effective Java [Issue 1 and 2]
에어 조건문.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
자바 5.0 프로그래밍.
자바 가상 머신 프로그래밍 Chap 10. 자바 컴파일링의 안쪽 ② Pslab 오민경.
Power Java 제11장 상속.
JA A V W. 06.
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
에어 PHP 입문.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 05. 복사 생성자.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
Power Java 제14장 배치 관리자.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
어서와 C언어는 처음이지 제21장.
OOP Practices OOP presentation 6 작성자 Kimjinsik 소속 Mobile computing Lab
7 생성자 함수.
6 객체.
3장 자바의 기본문법(2).
Presentation transcript:

Power Java 제8장 클래스와 객체 I

이번 장에서 학습할 내용 1. 클래스와 객체 2. 객체의 일생 3. 메소드 직접 클래스를 작성해 봅시다. 4. 필드 5. UML 직접 클래스를 작성해 봅시다.

먼저 앞장에서 학습한 클래스와 객체의 개념을 복습해봅시다. QUIZ 먼저 앞장에서 학습한 클래스와 객체의 개념을 복습해봅시다. 속성 동작 객체는 ________과 _________을 가지고 있다. 자동차가 객체라면 클래스는 ________이다. 설계도

클래스의 구성 클래스(class)는 객체의 설계도라 할 수 있다. 클래스는 필드와 메소드로 이루어진다. 필드(field)는 객체의 속성을 나타낸다. 메소드(method)는 객체의 동작을 나타낸다.

클래스 정의의 예 필드 정의! 메소드 정의! 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; 필드 정의! 메소드 정의!

테스트 클래스 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); }

속도: 70 주행거리: 0 색상: blue 속도: 110 주행거리: 10 색상: white

2. 객체의 일생 c.speedUp(); c = null; Car c = new Car();

객체의 생성

객체를 가리키는 참조값을 담을 수 있는 변수만 생성됨. 주의 Car myCar; 위의 문장으로 객체가 생성되는 것은 아님!!! 객체를 가리키는 참조값을 담을 수 있는 변수만 생성됨.

참조 변수와 대입 연산 Car car1 = new Car(); Car car2 = car1; // 대입 연산의 의미

객체의 사용 객체를 이용하여 필드와 메소드에 접근할 수 있다.

객체의 소멸 객체는 참조가 없어지면 소멸!!

객체의 소멸

3. 메소드

매개 변수

값에 의한 전달

매개 변수가 객체인 경우 아주 중요!!

메소드 호출

메소드 호출의 예제 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() 함수로 난수 발생기를 초기화해 주어야 합니다)

메소드 호출의 예제 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();

결과 화면 예상값을 입력하시오: 3 틀렸습니다

난수발생기 사용 예 Math.random() /* 출력 결과: 0.8835488755737285 0.7442235907969202 0.04143887519495115 0.7752670113987891 0.525644276817284 0.9810655979902362 0.9857864655525691 0.5176456441171947 0.9534154184106848 0.5711598917262706 0.9167881479510426 0.9683895991289863 0.5570482364156645 0.640266931881892 0.7521635329694171 0.37944742406283405 0.1930044225804538 0.6713601888567906 0.28656122448550325 0.9697966362643208 */ 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());

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 까지의 실수를 랜덤하게 출력     // 3.7670135E-5 라는 값이 나올 수도 있는데 이것은     // 0.000037670135 입니다.     float f = oRandom.nextFloat();     System.out.println(f);     // true(참), false(거짓) 중의 하나를 랜덤하게 출력     Boolean b = oRandom.nextBoolean();     System.out.println(b);   } } 3 0.40327173 true

중복 메소드 메소드 오버라이딩(method overriding) 메소드 호출시 매개 변수를 보고 일치하는 메소드가 호출된다. 만약 square(3.14)와 같이 호출되면 컴파일러는 매개 변수의 개수, 타입, 순서 등을 봐서 두 번째 메소드를 호출한다.

중복 메소드 예제 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("실수 버전 호출");

중복 메소드 예제 정수 버전 호출 실수 버전 호출 public class CarTest1 { public static void main(String[] args) { Car myCar = new Car(); // 첫번째 객체 생성 myCar.setSpeed(100); // 정수 버전 메소드 호출 myCar.setSpeed(79.2); // 실수 버전 메소드 호출 } 정수 버전 호출 실수 버전 호출

4. 필드 선언 변수의 종류 필드의 선언 필드의 사용 범위 설정자와 접근자 필드의 초기화 변수와 변수의 비교

자바에서의 변수의 종류 필드(field) 또는 인스턴스 변수: 클래스 안에서 선언되는 멤버 변수 지역 변수(local variable): 메소드나 블록 안에서 선언되는 변수 필드 Class Car { int speed; … void speedUp(int s){ int limit=100; } 지역 변수

필드의 선언

필드의 사용 범위

설정자와 접근자 설정자(mutator) 필드의 값을 설정하는 메소드 setXXX() 형식 접근자(accessor) 필드의 값을 반환하는 메소드 getXXX() 형식

설정자와 접근자의 예 … (P. 196)

설정자와 접근자의 사용

설정자와 접근자는 왜 사용하는가? 설정자에서 매개 변수를 통하여 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있다. (음수, …) 필요할 때마다 필드값을 계산하여 반환할 수 있다. 접근자만을 제공하면 자동적으로 읽기만 가능한 필드를 만들 수 있다. myCar.speed = -10;

필드의 초기화 생성자를 사용하는 방법 -> 다음 장에서 학습

주의

변수와 변수의 비교 “변수1 == 변수2”의 의미 참조형 변수의 경우, 객체의 내용이 같다는 의미가 아니다. Object 클래스의 equal() 메소드를 재정의 하여야 한다

UML :클래스 다이어그램 UML(Unified Modeling Language)

클래스와 클래스의 관계 Is-a Use Has-a

6. 예제

예제 class DeskLamp { // 인스턴스 변수 정의        // 인스턴스 변수 정의        private boolean isOn; // 켜짐이나 꺼짐과 같은 램프의 상태          // 메소드 정의        public void turnOn() // 램프를 켠다.        {              isOn = true;        }        public void turnOff() // 램프를 끈다.              isOn = false;        public String toString() {              return "현재 상태는 " + (isOn == true ? "켜짐" : "꺼짐"); }

예제 public class DeskLampTest {        public static void main(String[] args) { // 역시 객체를 생성하려면 new 예약어를 사용한다.              DeskLamp myLamp = new DeskLamp();                // 객체의 메소드를 호출하려면 도트 연산자인 .을 사용한다.              myLamp.turnOn();              System.out.println(myLamp);              myLamp.turnOff();        } } 현재 상태는 켜짐 현재 상태는 꺼짐

예제 #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 + "입니다.";

예제 #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); }

예제 #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) { // 나머지 접근자와 변경자

예제 #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); }

LAB. P. 214. LAB, 3. BankAccountTest.java 를 완성하시오. 본문에 등장하는 은행 계좌를 나타내는 BankAccount 클래스를 입력하고 다양한 실험을 하여 보자. BankAccount는 잔고를 나타내는 정수형 멤버 변수(balance)를 가지고 있고,예금 인출 메소드(draw)와 예입 메소드(deposit), 현재의 잔고를 반환하는 메소드(getBalance)를 가지고 있다. 1. 설정자 메소드와 접근자 메소드를 정의하라. 설정자 : deposit() 메소드와 withdraw() 메소드 접근자 : getBalance() 메소드

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

LAB. 2. main() 메소드 안에서 a1, a2 두 개의 BankAccount 객체를 생성하고 다음과 같은 순서로 메소드를 호출한다. a1의 잔고를 100으로 한다. a2의 잔고를 50으로 한다. a1에서 60을 인출한다. a2에서 30을 인출한다. a1의 현재 잔고를 얻어 화면에 출력한다. getbalnce() 호출 a2의 현재 잔고를 얻어 화면에 출력한다. getbalnce() 호출

LAB. 3. 현재 잔액을 출력하는 printBalance() 메소드를 구현하고 a1, a2 객체를 통해 메소드를 테스트하라. a1의 현재 잔고를 얻어 화면에 출력한다. printBalance() 메소드 호출 a2의 현재 잔고를 얻어 화면에 출력한다. printBalance() 메소드 호출

LAB. 4. 현재 잔액에 대하여 연 7.5%의 이자를 계산하고 그 값을 반환하는 addInterest() 메소드를 구현하고 각 은행 계좌 객체인 a1, a2에 대해 addInterest 메소드를 호출하여 이자값을 출력하여라. 5. BankAccount 클래스의 예금 인출 메소드인 withdraw()를 현재 잔고가 음수이면 예금 인출이 일어나지 않도록 변경하라. 이러한 BankAccount 클래스의 변경으로 BankAccountTest 클래스를 변경하여야 하는가? 예금이 인출하려는 금액보다 작으면 인출되지 않아야 하며, 또한 예금이 0원이거나 음수일 때(대출) 인출이 되지 않아야 한다. 예금 입금 시 “???가 입금되었습니다” 메시지가 출력되게 하고, 잘못된 출금 시 적절한 오류 메시지가 출력되게 하라. 위 각 경우를 검사할 수 있는 문장을 main 메소드 내에 작성하라.

6. BankAccount 클래스의 잔고를 나타내는 balance 멤버 변수의 자료형을 int형에서 double형으로 변경하라 6. BankAccount 클래스의 잔고를 나타내는 balance 멤버 변수의 자료형을 int형에서 double형으로 변경하라. BankAccount 클래스의 변경으로 BankAccountTest클래스를 변경하여야 하는가? 7. BankAccount 클래스 앞에 public을 추가하고 프로그램을 컴파일 해보자. 어떤 오류가 발생하는가? public을 붙이는 것과 붙이지 않는 것의 차이는 무엇인가?

8. BankAccount 클래스 안에도 public static void main(String[] args){ }을 추가하여 보라. 컴파일 오류가 발생하는가? 만약 컴파일 오류가 발생하지 않으면 BankAccount 클래스와BankAccountTest 클래스의 main()메소드에 각각 println() 문장을 넣어서 어떤 main() 메소드가 수행되는지를 확인하라. 메인 함수를 각각의 클래스에 모두 선언하여도 오류는 발생하지 않는다. 하지만 호출은 파일명(프로젝트 명)과 같은 클래스의 메인 함수만이 호출된다.

9. 7번 문제와 8번 문제의 실험 결과를 토대로 public 클래스와 main() 메소드에 대하여 어떤 결론을 내릴 수 있는가? 하나의 파일에는 파일명과 일치하는 클래스 명에만 public이 사용될 수 있으며 또한 파일명과 일치하는 public 클래스의 메인 메소드 만이 호출된다는 것을 알 수 있다. 하지만 파일명과 일치하는 클래스 파일이 다른 클래스를 포함하고 있을 때는 포함된 클래스는 public 클래스이어도 무방하다.

Programming 3. 주사위를 나타내는 클래스인 Dice를 작성하여 보자. Dice클래스에 필요한 필드와 메소드를 생각하여 보자. 메소드에는 주사위를 굴리는 메소드인 roll()을 포함하라. roll() 메소드를 작성할 때 난수를 얻는 다음 문장을 참조하라. Dice클래스를 테스트하기 위한 별도의 클래스를 작성하여 테스트 하라. (DiceTest 클래스) 메소드 : roll(), getFace 멤버변수 : face face = (int) (Math.random() * 6) +1;

Q & A