PowerPoint Presentation

Similar documents
PowerPoint Presentation

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

Microsoft PowerPoint - Lect04.pptx

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

PowerPoint Presentation

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint Presentation

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 05. 객체의 활용

JAVA PROGRAMMING 실습 08.다형성

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

5장.key

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 02. 표준 입출력

자바 프로그래밍

설계란 무엇인가?

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

Microsoft PowerPoint - Chapter 6.ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - Java7.pptx

JAVA PROGRAMMING 실습 05. 객체의 활용

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밊

Microsoft PowerPoint 장강의노트.ppt

Blog

Design Issues

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - 2강

PowerPoint Presentation

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

PowerPoint Presentation

슬라이드 1

PowerPoint Presentation

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

No Slide Title

07 자바의 다양한 클래스.key

Microsoft PowerPoint - additional06.ppt [호환 모드]

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

Modern Javascript

No Slide Title

PowerPoint 프레젠테이션

PowerPoint Presentation

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 09. 예외처리

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint Template

쉽게

제11장 프로세스와 쓰레드

JAVA PROGRAMMING 실습 02. 표준 입출력

4장.문장

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

17장 클래스와 메소드

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

C++ Programming

PowerPoint Presentation

PowerPoint 프레젠테이션

Microsoft PowerPoint - java1-lecture6.ppt [호환 모드]

슬라이드 1

PowerPoint 프레젠테이션

슬라이드 1

Microsoft PowerPoint - Chap12-OOP.ppt

Microsoft PowerPoint - additional07.ppt [호환 모드]

PowerPoint Presentation

PowerPoint 프레젠테이션

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft Word - EEL2 Lab4.docx

Microsoft PowerPoint - ch07 - 포인터 pm0415

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

untitled

Microsoft PowerPoint - 04-UDP Programming.ppt

교육자료

비긴쿡-자바 00앞부속

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밊

TEST BANK & SOLUTION

Microsoft PowerPoint - C++ 5 .pptx

Microsoft Word - java19-1-midterm-answer.doc

PowerPoint Presentation

JUNIT 실습및발표

(Microsoft PowerPoint - java2-lecture3.ppt [\310\243\310\257 \270\360\265\345])

Transcription:

객체지향프로그래밍 클래스와메소드심층연구 손시운 ssw5176@kangwon.ac.kr

접근제어 클래스안에변수나메소드들을누구나사용할수있게하면어떻게될까? 많은문제가발생할것이다. ( 예 ) 국가기밀서류를누구나보도록방치하면어떻게될까? 2

접근제어 접근제어 (access control): 다른클래스가특정한필드나메소드에접근하는 것을제어하는것 3

멤버수준에서의접근제어 4

예제 class A { private int a; int b; public int c; // 전용 // 디폴트 // 공용 public class Test { public static void main(string args[]) { A obj = new A(); // 객체생성 obj.a = 10; // 전용멤버는다른클래스에서는접근안됨 obj.b = 20; // 디폴트멤버는접근할수있음 obj.c = 30; // 공용멤버는접근할수있음 5

예제 6

중간점검문제 필드의경우, private 로만드는것이바람직한이유는무엇인가? 필드를정의할때아무런접근제어수식자를붙이지않으면어떻게되는가? 7

정보은닉 정보은닉이란구현의세부사항을클래스안에감추는것이다 8

설정자와접근자 설정자 (mutator, setter) 필드의값을변경하는메소드 setxxx() 형식 접근자 (accessor, getter) 필드의값을반환하는메소드 getxxx() 형식 9

설정자와접근자 public class Account { private int regnumber; private String name; private int balance; public String getname() { return name; public void setname(string name) { this.name = name; public int getbalance() { return balance; public void setbalance(int balance) { this.balance = balance; 10

예제 public class AccountTest { public static void main(string[] args) { Account obj = new Account(); obj.setname("tom"); obj.setbalance(100000); System.out.println(" 이름은 " + obj.getname() + " 통장잔고는 " + obj.getbalance() + " 입니다."); 이름은 Tom 통장잔고는 100000 입니다. 11

설정자와접근자는왜사용하는가? 접근자와설정자를사용해야만나중에클래스를업그레이드할때편하다. 설정자에서매개변수를통하여잘못된값이넘어오는경우, 이를사전에차단할수있다. 접근자에서필요할때마다필드값을계산하여반환할수있다. 접근자만을제공하면자동적으로읽기만가능한필드를만들수있다. 12

접근자와설정자의장점예제 설정자는변수의값을변경하려는외부의시도를주의깊게검사할수있다. public void setage(int age) { if( age < 0 ) this.age = 0; else this.age = age; 13

UML UML(Unified Modeling Language): UML은클래스만을그리는도구는아니고객체지향설계시에사용되는일반적인모델링언어라고할수있다. UML을사용하면소프트웨어를본격적으로작성하기전에구현하고자하는시스템을시각화하여검토할수있다. 14

가시성표시자 필드나메소드의이름앞에는가시성표시자 (visibility indicator) 가올수있 다 15

클래스간의관계 16

UML 의예 Car 예제를 UML 로그려보면다음과같다. 17

Television 클래스의 UML Television -ison -volume -channel +setchannel() +getchannel() +setvolume() +getvolume() +turnon() +turnoff() +tostring() 18

LAB: 안전한배열만들기 만약인덱스가배열의크기를벗어나게되면실행오류가발생한다. 따라서 실행오류를발생하지않는안전한배열을작성하여보자. 19

SOLUTION public class SafeArray { private int a[]; public int length; public SafeArray(int size) { a = new int[size]; length = size; public int get(int index) { if (index >= 0 && index < length) { return a[index]; return -1; public void put(int index, int value) { if (index >= 0 && index < length) { a[index] = value; else System.out.println(" 잘못된인덱스 " + index); 20

SOLUTION public class SafeArrayTest { public static void main(string args[]) { SafeArray array = new SafeArray(3); for (int i = 0; i < (array.length + 1); i++) { array.put(i, i * 10); 잘못된인덱스 3 21

생성자 생성자 (contructor): 객체가생성될때에필드에게초기값을제공하고필요 한초기화절차를실행하는메소드 22

생성자정의 23

생성자의예 public class MyCounter { int counter; MyCounter() { counter = 1; 24

생성자의예 public class MyCounterTest { public static void main(string args[]) { MyCounter obj1 = new MyCounter(); MyCounter obj2 = new MyCounter(); System.out.println(" 객체 1의 counter = " + obj1.counter); System.out.println(" 객체 2의 counter = " + obj2.counter); 객체 1 의 counter = 1 객체 2 의 counter = 1 25

매개변수를가지는생성자 class MyCounter { int counter; MyCounter(int value) { counter = value; 26

생성자의예 public class MyCounterTest { public static void main(string args[]) { MyCounter obj1 = new MyCounter(100); MyCounter obj2 = new MyCounter(200); System.out.println(" 객체 1 의 counter = " + obj1.counter); System.out.println(" 객체 2 의 counter = " + obj2.counter); 객체 1 의 counter = 100 객체 2 의 counter = 200 27

생성자의예 28

LAB: Television 생성자 생성자를추가해보자. public class Television { private int channel; // 채널번호 private int volume; // 볼륨 private boolean onoff; // 전원상태 void print() { System.out.println(" 채널은 " + channel + " 이고볼륨은 " + volume + " 입니다."); 29

SOLUTION public class Television { private int channel; // 채널번호 private int volume; // 볼륨 private boolean onoff; // 전원상태 Television(int c, int v, boolean o) { channel = c; volume = v; onoff = o; void print() { System.out.println(" 채널은 " + channel + " 이고볼륨은 " + volume + " 입니다."); 30

SOLUTION public class TelevisionTest { public static void main(string[] args) { Television mytv = new Television(7, 10, true); mytv.print(); Television yourtv = new Television(11, 20, true); yourtv.print(); 31

SOLUTION 32

LAB: Box 클래스 33

SOLUTION public class Box { private int width; private int length; private int height; private int volume; public int getvolume() { return volume; Box(int w, int l, int h) { width = w; length = l; height = h; volume = width * length * height; 34

SOLUTION public class BoxTest { public static void main(string[] args) { Box b = new Box(20, 20, 30); System.out.println(" 상자의부피는 " + b.getvolume() + " 입니다 "); 상자의부피는 12000 입니다 35

생성자가없는클래스 vs. 생성자가있는클래스 생성자가없는클래스 public class Dummy { public class DummyTest { public static void main(string args[]) { Dummy obj = new Dummy(); 생성자가있는클래스 public class Dummy { public Dummy(int a) { return volume; public class DummyTest { public static void main(string args[]) { Dummy obj1 = new Dummy(); Dummy obj2 = new Dummy(1); 36

생성자오버로딩 메소드처럼생성자도오버로딩될수있다. 37

예제 public class Student { private int number; private String name; private int age; Student() { number = 100; name = "New Student"; age = 18; Student(int number, String name, int age) { this.number = number; this.name = name; this.age = age; @Override public String tostring() { return "Student [number=" + number + ", name=" + name + ", age=" + age + "]"; 38

this 로현재객체나타내기 메소드나생성자에서 this 는현재객체를나타낸다. public class Point { public int x = 0; public int y = 0; // 생성자 public Point(int x, int y) { this.x = x; this.y = y; 39

this() public class Rectangle { private int x, y; private int width, height; Rectangle() { this(0, 0, 1, 1); Rectangle(int width, int height) { this(0, 0, width, height); Rectangle(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; //... 40

this() 41

LAB: 날짜를나타내는 Date 클래스 42

SOLUTION public class Date { private int year; private String month; private int day; public Date() { // 기본생성자 this(1900, "1월", 1); public Date(int year) { // 생성자 this(year, "1월", 1); public Date(int year, String month, int day) { // 생성자 this.month = month; // this는현재객체를가리킨다. this.day = day; this.year = year; @Override public String tostring() { return "Date [year=" + year + ", month=" + month + ", day=" + day + "]"; 43

SOLUTION public class DateTest { public static void main(string[] args) { Date date1 = new Date(2015, "8월", 10); Date date2 = new Date(2020); Date date3 = new Date(); System.out.println(date1); System.out.println(date2); System.out.println(date3); Date [year=2015, month=8 월, day=10] Date [year=2020, month=1 월, day=1] Date [year=1900, month=1 월, day=1] 44

LAB: 시간를나타내는 Time 클래스 45

SOLUTION class Time { private int hour; // 0-23 private int minute; // 0-59 private int second; // 0-59 // 첫번째생성자 public Time() { this(0, 0, 0); // 두번째생성자 public Time(int h, int m, int s) { hour = ((h >= 0 && h < 24)? h : 0); // 시간검증 minute = ((m >= 0 && m < 60)? m : 0); // 분검증 second = ((s >= 0 && s < 60)? s : 0); // 초검증 // 시 : 분 : 초 의형식으로출력 public String tostring() { return String.format("%02d:%02d:%02d", hour, minute, second); 46

SOLUTION public class TimeTest { public static void main(string args[]) { // Time 객체를생성하고초기화한다. Time time = new Time(); System.out.println(" 기본생성자호출후시간 : "+time.tostring()); // 두번째생성자호출 Time time2 = new Time(13, 27, 6); System.out.print(" 두번째생성자호출후시간 : "+time2.tostring()); // 올바르지않은시간으로설정해본다. Time time3 = new Time(99, 66, 77); System.out.print(" 올바르지않은시간설정후시간 : "+time3.tostring()); 기본생성자호출후시간 : 00:00:00 두번째생성자호출후시간 : 13:27:06 올바르지않은시간설정후시간 : 00:00:00 47

LAB: 원을나타내는 Circle 클래스 48

SOLUTION public class Point { private int x, y; public Point(int a, int b) { x = a; y = b; @Override public String tostring() { return "Point [x=" + x + ", y=" + y + "]"; 49

SOLUTION public class Circle { private int radius; private Point center; public Circle(Point p, int r) { center = p; radius = r; @Override public String tostring() { return "Circle [radius=" + radius + ", center=" + center + "]"; 50

SOLUTION public class CircleTest { public static void main(string args[]) { Point p = new Point(25, 78); Circle c = new Circle(p, 10); System.out.println(c); Circle [radius=10, center=point [x=25, y=78]] 51

필드초기화방법 필드선언시초기화 public class Hotel { public int capacity = 10; // 10 으로초기화한다. private boolean full = false; // false 로초기화한다.... 52

필드초기화방법 인스턴스초기화블록 (instance initializer block) public class Car { int speed; Car() { System.out.println(" 속도는 " + speed); { speed = 100; public static void main(string args[]) { Car c1 = new Car(); Car c2 = new Car(); 53

메소드로기초형변수가전달되는경우 기초형변수가전달되는경우 54

예제 public class MyCounter { int value; void inc(int a) { a = a + 1; public class MyCounterTest1 { public static void main(string args[]) { x = 10 MyCounter obj = new MyCounter(); int x = 10; obj.inc(x); System.out.println("x = " + x); 55

메소드로객체가전달되는경우 객체를메소드로전달하게되면객체가복사되어전달되는것이아니고참 조변수의값이복사되어서전달된다. 56

예제 class MyCounter { int value = 0; void inc(mycounter ctr) { ctr.value = ctr.value + 1; public class MyCounterTest2 { public static void main(string args[]) { MyCounter obj = new MyCounter(); System.out.println("obj.value = " + obj.value); obj.inc(obj); System.out.println("obj.value = " + obj.value); obj.value = 0 obj.value = 1 57

메소드로배열이전달되는경우 배열도객체이기때문에배열을전달하는것은배열참조변수를복사하는 것이다. 58

메소드에서객체반환하기 public class Box { int width, length, height; int volume; Box(int w, int l, int h) { width = w; length = l; height = h; volume = w * l * h; Box whoslargest(box box1, Box box2) { if (box1.volume > box2.volume) return box1; else return box2; 59

메소드에서객체반환하기 public class BoxTest { public static void main(string args[]) { Box obj1 = new Box(10, 20, 50); Box obj2 = new Box(10, 30, 30); Box largest = obj1.whoslargest(obj1, obj2); System.out.println("(" + largest.width + "," + largest.length + "," + largest.height + ")"); (10,20,50) 60

LAB: 같은크기의 Box 인지확인하기 2 개의박스가같은치수인지를확인하는메소드 issamebox() 를작성하여보 자. 만약박스의크기가같으면 true 를반환하고크기가다르면 false 를반환 한다. issamebox() 의매개변수는객체참조변수가된다. 61

SOLUTION public class Box { int width, length, height; Box(int w, int l, int h) { width = w; length = l; height = h; boolean issamebox(box obj) { if ((obj.width==width) && (obj.length==length) && (obj.height==height)) return true; else return false; 62

SOLUTION public class BoxTest { public static void main(string args[]) { Box obj1 = new Box(10, 20, 50); Box obj2 = new Box(10, 20, 50); System.out.println("obj1 == obj2 : " + obj1.issamebox(obj2)); obj1 == obj2 : true 63

정적멤버 정적멤버 (static member) 는모든객체를통틀어서하나만생성되고모든객 체가이것을공유하게된다. 64

인스턴스멤버 vs 정적멤버 클래스의멤버는인스턴스멤버와정적멤버로나누어진다. 65

인스턴스변수 인스턴스마다별도로생성되기때문에인스턴스변수 (instance variable) 라고 도한다. 66

정적변수 정적변수는모든객체에공통인변수이다. 정적변수는하나의클래스에하나만존재한다 67

정적변수예제 public class Car { private String model; private String color; private int speed; // 자동차의시리얼번호 private int id; private static int numbers = 0; public Car(String m, String c, int s) { model = m; color = c; speed = s; // 자동차의개수를증가하고 id 에대입한다. id = ++numbers; 68

SOLUTION public class CarTest { public static void main(string args[]) { Car c1 = new Car("S600", white, 80); // 첫번째생성자호출 Car c2 = new Car("E500", blue, 20); // 첫번째생성자호출 int n = Car.numbers; // 정적변수 System.out.println(" 지금까지생성된자동차수 = " + n); 지금까지생성된자동차수 = 2 69

정적메소드 변수와마찬가지로메소드도정적메소드로만들수있다. 정적메소드는 static 수식자를메소드앞에붙이며클래스이름을통하여호 출되어야한다. ( 예 ) double value = Math.sqrt(9.0); 70

정적메소드예제 public class Car { private String model; private String color; private int speed; // 자동차의시리얼번호 private int id; // 실체화된 Car 객체의개수를위한정적변수 private static int numbers = 0; public Car(String m, String c, int s) { model = m; color = c; speed = s; // 자동차의개수를증가하고 id에대입한다. id = ++numbers; // 정적메소드 public static int getnumberofcars() { return numbers; // OK! 71

정적메소드예제 public class CarTest { public static void main(string args[]) { Car c1 = new Car("S600", white, 80); // 첫번째생성자호출 Car c2 = new Car("E500", blue, 20); // 첫번째생성자호출 int n = Car.getNumberOfCars(); // 정적메소드호출 System.out.println(" 지금까지생성된자동차수 = " + n); 지금까지생성된자동차수 = 2 72

정적메소드사용시주의할점 객체가생성되지않은상태에서호출되는메소드이므로객체안에서만존재하는인스턴스변수들은사용할수없다. 정적메소드에서인스턴스메소드를호출하면오류가된다. 정적메소드는 this 키워드를사용할수없다. this가참조할인스턴스가없기때문이다. 73

LAB: 직원클래스작성하기 직원을나타내는클래스에서직원들의수를카운트하는예를살펴보자. 직 원의수를정적변수로나타낸다. 객체가하나씩생성될때마다생성자에서 정적변수 count 를증가한다. 74

SOLUTION public class Employee { private String name; private double salary; private static int count = 0; // 정적변수 // 생성자 public Employee(String n, double s) { name = n; salary = s; count++; // 정적변수인 count를증가 // 객체가소멸될때호출된다. protected void finalize() { count--; // 직원이하나줄어드는것이므로 count를하나감소 // 정적메소드 public static int getcount() { return count; 75

SOLUTION public class EmployeeTest { public static void main(string[] args) { Employee e1, e2, e3; e1 = new Employee(" 김철수 ", 35000); e2 = new Employee(" 최수철 ", 50000); e3 = new Employee(" 김철호 ", 20000); int n = Employee.getCount(); System.out.println(" 현재의직원수 =" + n); 현재의직원수 =3 76

내장클래스 자바에서는클래스안에서클래스를정의할수있다. 77

내장클래스의분류 78

내부클래스 클래스안에클래스를선언하는경우이다. 79

내부클래스예제 public class OuterClass { private int value = 10; class InnerClass { public void mymethod() { System.out.println(" 외부클래스의 private 변수값 : " + value); OuterClass() { InnerClass obj = new InnerClass(); obj.mymethod(); 80

내부클래스예제 public class InnerClassTest { public static void main(string[] args) { OuterClass outer = new OuterClass(); 외부클래스의 private 변수값 : 10 81

LAB: 내부클래스 게임에서캐릭터가여러가지아이템을가지고있다. 이것을코드로구현하 여보자. 아이템은캐릭터만사용한다고가정하자. 그러면캐릭터를나타내 는클래스안에아이템을내부클래스로정의할수있다. 82

SOLUTION import java.util.arraylist; public class GameCharacter { private class GameItem { String name; int type; int price; int getprice() { return price; @Override public String tostring() { return "GameItem [name=" + name + ", type=" + type + ", price=" + price + "]"; 83

SOLUTION private ArrayList<GameItem> list = new ArrayList<>(); public void add(string name, int type, int price) { GameItem item = new GameItem(); item.name = name; item.type = type; item.price = price; list.add(item); public void print() { int total = 0; for (GameItem item : list) { System.out.println(item); total += item.getprice(); System.out.println(total); 84

SOLUTION public class GameChracterTest { public static void main(string[] args) { GameCharacter charac = new GameCharacter(); charac.add("sword", 1, 100); charac.add("gun", 2, 50); charac.print(); GameItem [name=sword, type=1, price=100] GameItem [name=gun, type=2, price=50] 150 85

내부클래스를사용하는이유 86