Microsoft PowerPoint - 4장

Similar documents
JAVA PROGRAMMING 실습 02. 표준 입출력

JAVA PROGRAMMING 실습 05. 객체의 활용

4Àå

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

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

JAVA PROGRAMMING 실습 05. 객체의 활용

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

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

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

PowerPoint Presentation

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

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

C++ Programming

PowerPoint 프레젠테이션

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

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

JAVA PROGRAMMING 실습 07. 상속

PowerPoint Presentation

PowerPoint Presentation

설계란 무엇인가?

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft PowerPoint - 2강

슬라이드 1

예제 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

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

PowerPoint Presentation

JVM 메모리구조

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

Microsoft PowerPoint - Chapter 6.ppt

쉽게 풀어쓴 C 프로그래밍

C++ Programming

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

쉽게 풀어쓴 C 프로그래밍

Design Issues

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

PowerPoint Presentation

PowerPoint 프레젠테이션

제11장 프로세스와 쓰레드

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

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

Microsoft PowerPoint - Chap12-OOP.ppt

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

No Slide Title

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

PowerPoint Presentation

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

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

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

금오공대 컴퓨터공학전공 강의자료

Microsoft PowerPoint - Lect04.pptx

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

PowerPoint Template

JAVA PROGRAMMING 실습 09. 예외처리

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

Microsoft PowerPoint 장강의노트.ppt

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

PowerPoint Template

슬라이드 1

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

Slide 1

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - Java7.pptx

Spring Data JPA Many To Many 양방향 관계 예제

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

설계란 무엇인가?

PowerPoint 프레젠테이션

No Slide Title

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

11장 포인터

PowerPoint Template

PowerPoint 프레젠테이션

Microsoft PowerPoint - CSharp-10-예외처리

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 02. 표준 입출력

Slide 1

PowerPoint Presentation

PowerPoint 프레젠테이션

Microsoft Word - EEL2 Lab4.docx

PowerPoint Presentation

교육자료

Microsoft PowerPoint - 6주차.pptx

5장.key

PowerPoint 프레젠테이션

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

17장 클래스와 메소드

Transcription:

1 객체지향적언어의목적 2 제 4 장클래스와객체 소프트웨어의생산성을향상 컴퓨터산업발전에따라소프트웨어의생명주기 (life cycle) 단축 객체지향적언어는상속, 다형성, 객체, 캡슐화등소프트웨어의재사용을위한여러장치를내장 소프트웨어의재사용과부분수정을통해소프트웨어를다시만드는부담을대폭줄임으로써소프트웨어의생산성이향상실세계에대한쉬운모델링 과거 소프트웨어는수학계산을하거나통계처리를하는등의처리과정, 계산절차가중요 현대 컴퓨터가산업전반에활용됨에따라실세계에서발생하는일을프로그래밍 실세계의일은절차나과정보다일과관련된많은물체 ( 객체 ) 들의상호작용으로묘사하는것이이해가용이 실세계의일을보다쉽게프로그래밍하기위한객체중심의객체지향적언어탄생 절차지향적프로그래밍과객체지향적프로그래밍 시작 객체지향언어의특성 : 캡슐화 3 절차지향적프로그래밍 기존의프로그래밍언어 작업순서를표현하는컴퓨터명령집합객체지향적프로그래밍 프로그램을실제세상에가깝게모델링 컴퓨터가수행하는작업을객체들간의상호작용으로표현 커피자판기 동전입력 돈이충분한가? 예 상품선택 아니오 4 캡슐화 메소드 ( 함수 ) 와데이터를클래스내에정의하고구현 외부에서는공개된메소드의인터페이스만을접근할있음 외부에서는비공개데이터에직접접근하거나메소드의구현세부를알수없다. 객체내데이터에대한보안, 보호, 외부접근제한 -> 정보은닉화 실세계의캡슐화 돈통커피통물통프림통컵통 상품재고있나? 아니오 자판기엔진 디스플레이버튼 1 버튼 2 버튼 3 객체지향적프로그래밍의객체들의상호관련성 예상품인도끝절차지향적프로그래밍의실행절차 자바객체의캡슐화 객체 String name; int age; void speak(); void eat(); void study(); 데이타필드 (field) 메소드 (method)

객체지향의특성 : 상속 객체지향언어에서의상속 5 6 실세계에서의상속예 - 유전적인상속관계표현 동물 생물 식물 어류사람나무풀 class Animal { String name; int age; void eat() { void sleep() { void love() { 상속 class Human extends Animal { String hobby; String job; void work() { void cry() { void laugh() { Animal 객체 String name; 부모 int age; void eat(); void sleep(); void love(); Human 객체 String name; 부모 int age; void eat (); void sleep(); void love(); String hobby; String job; 자식 void work(); void cry(); void laugh(); 상속 : 상위클래스의특성을하위클래스가물려받음 상위클래스 : 수퍼클래스, 하위클래스 : 서브클래스 서브클래스 수퍼클래스코드의재사용 새로운특성추가가능 자바는다중상속을지원않음 인터페이스를통해다중상속과같은효과얻음 객체지향의특성 : 다형성 클래스와객체 7 다형성 같은메시지또는함수에서객체에따라서다른동작가능함 다형성은오버라이딩과밀접한관계가있음 동물부모 소리내기 상속 8 클래스 객체의공통된특징을기술한것 객체의특성과행위를정의객체 물리적공간을갖는구체적인것, 실체 클래스의인스턴스 ( 실체 ) 클래스를구체화한객체를인스턴스 (instance) 라고부름 객체와인스턴스는같은뜻으로사용 멍멍! 야옹! 꼬꼬댁! 사례 클래스 : 소나타자동차, 객체 : 출고된실제소나타 100대 클래스 : 벽시계, 객체 : 우리집벽에걸린벽시계들 클래스 : 책상, 객체 : 우리가사용중인실제책상들

클래스와객체사례 클래스구성 9 클래스 : 사람 이름, 직업, 나이, 성별, 혈액형밥먹기, 잠자기, 말하기, 걷기 10 클래스에대한접근권한 public class Person { public String name; public int age; 클래스키워드 클래스이름 필드 (field) 이름 최승희 직업 의사 나이 45 성별 여 혈액형 A 이름 이미녀 직업 골프선수 나이 28 성별 여 혈액형 O 이름 김미남 직업 교수 나이 47 성별 남 혈액형 AB public Person() { public Person(String s) { name = s; 생성자 (constructor) 생성자 객체 : 최승희 객체 : 이미녀 객체 : 김미남 public String getname() { return name; 메소드 (methgod) 클래스선언 객체생성 11 클래스접근권한, public public 접근권한은다른모든클래스들이이클래스에대해사용혹은접근이가능함을의미 class Person Person이라는이름의클래스정의 class 다음에클래스의이름을선언 클래스는 { 로시작하여 로닫으며이곳에모든멤버필드와메소드를구현필드 (field) 값을저장할맴버변수를선언 멤버변수혹은필드라고함 필드앞에붙은접근지정자 public은이필드가다른클래스에서접근될수있도록공개한다는의미생성자 (constructor) 클래스의이름과동일한메소드 클래스의객체가생성될때만호출되는메소드메소드 (method) 메소드는실행가능한함수이며객체의행위를구현 메소드앞에붙은접근지정자 public은이메소드가다른클래스에서접근될수있도록공개한다는의미 12 객체생성 객체는 new 키워드를이용하여생성 new 는객체의생성자호출 객체를생성하는두단계 객체에대한레퍼런스변수선언 객체생성 public static void main (String args[]) { Person aperson; // 레퍼런스변수 aperson 선언 aperson = new Person( 김미남 ); // Person 객체생성 aperson.age = 30; // 객체멤버접근 int i = aperson.age; // 30 String s = aperson.getname(); // 객체메소드호출

객체생성및사용예 객체의활용 13 14 (1) Person aperson; aperson 객체의멤버접근 객체생성 (2) aperson = new Person( 김미남 ); aperson name age Person 타입의객체 " 김미남 " 객체레퍼런스. 멤버 Person() { getname() { 객체의필드에값대입 public class ClassExample { public static void main (String args[]) { Person aperson = new Person(" 홍길동 "); 객체의필드에서값읽기 객체사용 (3) aperson.age = 30; aperson name age " 김미남 " 30 Person() { getname() { aperson.age = 30; int i = aperson.age; String s = aperson.getname(); 객체의메소드호출 (4) String s = aperson.getname(); aperson name age " 김미남 " 30 s " 김미남 " Person() { getname() { return name; 15 예제 4-1 : 상품하나를표현하는클래스 Goods 만들기 상품하나를표현하는클래스 Goods를작성하라. 상품은 String 타입의 name, int 타입의 price, numberofstock, sold 등네개의필드를갖는다. Goods 클래스내에 main() 메소드를작성하여 Goods 객체를하나생성하고이객체에대한레퍼런스변수명을 camera로하라. 그리고나서 camera의상품이름 (name 필드 ) 을 Nikon, 값 (price) 을 400000, 재고갯수 (numberofstock) 를 30, 팔린개수 (sold) 를 50으로설정하라. 그리고설정된이들값을화면에출력하라. public class Goods { String name; int price; int numberofstock; int sold; Goods camera = new Goods(); camera.name = Nikon ; camera.price = 400000; camera.numberofstock = 30; camera.sold = 50; System.out.println(" 상품이름 :" + camera.name); System.out.println(" 상품가격 :" + camera.price); System.out.println(" 재고수량 :" + camera.numberofstock); System.out.println(" 팔린수량 :" + camera.sold); 상품이름 :Nikon 상품가격 :400000 재고수량 :30 팔린수량 :50 예제 4-2 : 지수클래스 MyExp 만들기 16 클래스 MyExp를작성하라. MyExp는지수값을표현하는클래스로서두개의정수형멤버필드 base와 exp를가진다. 2 3 의경우 base는 2이며, exp는 3이된다. base와 exp는양의정수만을가지는것으로가정한다. 또한 MyExp는정수값을리턴하는 getvalue() 라는멤버메소드를제공한다. getvalue() 는 base와 exp 값으로부터지수를계산하여정수값으로리턴한다. 예를들어 MyExp객체의 base 필드가 2이고 exp가 3이라면 getvalue() 는 8을리턴한다. public class MyExp { int base; int exp; int getvalue() { int res=1; for(int i=0; i<exp; i++) res = res * base; return res; MyExp number1 = new MyExp(); number1.base = 2; number1.exp = 3; MyExp number2 = new MyExp(); number2.base = 3; number2.exp = 4; System.out.println("2 의 3 승 = " + number1.getvalue()); System.out.println("3 의 4 승 = " + number2.getvalue()); 2 의 3 승 = 8 3 의 4 승 = 81

17 객체배열 객체배열생성과정 18 객체배열선언과생성사례 Person[] pa; pa = new Person[10]; for (int i=0;i<pa.length;i++) { pa[i] = new Person(); pa[i].age = 30 + i; Person[] pa; pa = new Person[10]; for (int i=0;i<pa.length;i++) { pa[i] = new Person(); pa[i].age = 30 + i; for (int i=0;i<pa.length;i++) System.out.print(pa[i].age+ ); 객체배열을위한레퍼런스선언레퍼런스배열생성객체생성객체배열사용 pa Person[] pa; pa = new Person[10]; for (int i=0;i<pa.length;i++) { pa[i] = new Person(); pa[i].age = 30 + i; for (int i=0;i<pa.length;i++) System.out.print(pa[i].age+ ); 30 31 32 33 34 35 36 37 38 39 pa pa[0] pa[1] pa[2] pa[3] pa[4] pa[5] pa[6] pa[7] pa[8] pa[9] pa pa[0] pa[1] pa[2] pa[3] pa[4] pa[5] pa[6] pa[7] pa[8] pa[9] Person 객체 age=30 age=31 age=32 age=33 age=34 age=35 age=36 age=37 age=38 age=39 예제 4-3 : 객체배열생성 메소드형식 19 java.util.scanner 클래스를이용하여상품을입력받아 Goods 객체를생성하고이들을 Goods 객체배열에저장하라. 상품즉 Goods 객체를 3 개입력받으면이들을모두화면에출력하라. import java.util.scanner; public class GoodsArray { Goods [] goodsarray; goodsarray = new Goods [3]; Scanner s = new Scanner(System.in); for(int i=0; i<goodsarray.length; i++) { String name = s.next(); int price = s.nextint(); int n = s.nextint(); int sold = s.nextint(); goodsarray[i] = new Goods(name, price, n, sold); for(int i=0; i<goodsarray.length; i++) { System.out.print(goodsArray[i].getName()+" "); System.out.print(goodsArray[i].getPrice()+" "); System.out.print(goodsArray[i].getNumberOfStock()+" "); System.out.println(goodsArray[i].getSold()); class Goods { private String name; private int price; private int numberofstock; private int sold; Goods(String name, int price, int numberofstack, int sold) { this.name = name; this.price = price; this.numberofstock = numberofstock; this.sold = sold; String getname() {return name; int getprice() {return price; int getnumberofstock() {return numberofstock; int getsold() {return sold; 콜라 500 10 20 사이다 1000 20 30 맥주 2000 30 50 콜라 500 10 20 사이다 1000 20 30 맥주 2000 30 50 키입력부분 20 메소드 메소드는함수이며함수만드는방법과동일 모든메소드는반드시클래스안에있어야함 ( 캡슐화원칙 ) 메소드구성형식 접근지정자 public. private, protected, default( 접근지정자생략된경우 ) 리턴타입 메소드가반환하는결과값의데이터타입 메소드이름, 인자, 코드 접근지정자리턴타입메소드이름메소드인자들 public int getsum(int i, int j) { int sum; sum = i + j; return sum; 메소드코드

인자전달 - call by value call by value : 기본데이터의값전달사례 21 22 자바의메소드호출시인자전달방식 값에의한호출 (call by value) public class Person { public String name; public int age; 기본데이터타입의값을전달하는경우 값이복사되어전달 메소드의매개변수의값이변경되어도호출한인자의값은변경되지않음객체혹은배열을전달하는경우 객체나배열의레퍼런스만이전달됨 객체혹은배열이통째로복사되어전달되는것이아님 메소드의매개변수와호출한인자가객체혹은배열을공유 public class CallByValue { public static void main (String args[]) { Person aperson = new Person(" 홍길동 "); int a = 33; aperson.setage(a); System.out.println(a); a 33 값복사 n 33 33 34 33 public Person(String s) { name = s; setage() 가호출되면매겨변수 n 이생성된다. public void setage(int n) { age = n; n++; setage() 가끝나면 n 은사라진다. 33 23 call by value : 객체전달사례 class MyInt { int val; MyInt(int i) { val = i; public class CallByValueObject { public static void main (String args[]) { Person aperson = new Person(" 홍길동 "); MyInt a = new MyInt(33); aperson.setage(a); System.out.println(a.val); 호출 public class Person { public String name; public int age; public Person(String s) { name = s; public void setage(myint i) { age = i.val; i.val++; 24 MyInt a = new MyInt(33); a MyInt 객체생성 aperson.setage(a); 레퍼런스 a 의복사본전달객체가복사되는것은아님 a a val 33 레퍼런스복사 val 33 val 34 i i public void setage(myint i) 매개변수로레퍼런스 i 가생성인자로전달된레퍼런스 a 값을복사해전달받음 i 는 a 의객체를가리키며 a 와 i 는서로동일한객체를공유 i.val++; 레퍼런스 i 가가리키는 MyInt 객체의 val 값 1 증가 34 * 객체가복사되어전달되는것이아님객체에대한레퍼런스만이복사되어전달 System.out.println(a.val); 34 가화면에출력 a val 34 setage() 메소드가끝나면레퍼런스 i 가사라짐

call by value : 배열전달사례 예제 4-4 : 배열의전달 25 26 인자로배열을전달하면배열의레퍼런스만이전달됨 char 배열을메소드의인자로전달하여배열속의공백 (' ') 문자를, 로대치하는프로그램을작성하라. public class ArrayParameter { public static void main (String args[]) { int a[] = {1,2,3,4,5; increase(a); for(int i=0; i<a.length; i++) System.out.print(a[i]+ ); 2 3 4 5 6 a 레퍼런스복사 1 2 23 34 45 5 6 array static void increase(int [] array) { for(int i=0; i< array.length; i++) { array[i] ++; public class ArrayParameter { static void replacespace(char a[]) { for (int i = 0; i < a.length; i++) if (a[i] == ' ') a[i] = ','; static void printchararray(char a[]) { for (int i = 0; i < a.length; i++) System.out.print(a[i]); System.out.println(); public static void main (String args[]) { char c[] = {'T','h','i','s',' ','i','s',' ','a',' ','p','e','n','c','i','l','.'; printchararray(c); replacespace(c); printchararray(c); This is a pencil. This,is,a,pencil. 메소드오버로딩 오버로딩된메소드호출 27 28 오버로딩 (Overloading) 한클래스내에서두개이상의이름이같은메소드작성 메소드이름이동일하여야한다. 메소드의인자가개수서로다르거나, 메소드의인자타입이서로달라야한다. 메소드의이름이같고인자의개수나타입이모두같은데메소드의리턴타입이다르면메소드오버로딩이성립되지않으며컴파일오류가발생한다. public static void main (String args[]) { MethodSample a = new MethodSample(); int i = a.getsum(1, 2); public class MethodSample { public int getsum(int i, int j) { return i + j; public int getsum(int i, int j, int k) { return i + j + k; // 메소드오버로딩이성공한사례 class MethodOverloading { public int getsum(int i, int j) { return i + j; public int getsum(int i, int j, int k) { return i + j + k; public double getsum(double i, double j) { return i + j; // 메소드오버로딩이실패한사례 class MethodOverloadingFail { public int getsum(int i, int j) { return i + j; public double getsum(int i, int j) { return (double)(i + j); int j = a.getsum(1, 2, 3); double k = a.getsum(1.1, 2.2); public double getsum(double i, double j) { return i + j;

this 레퍼런스 다음그림에서 id 는어떤 id 인가? 29 30 this 의기초개념 현재객체자기자신을가리킨다. 자기자신에대한레퍼런스 같은클래스내에서클래스멤버, 변수를접근할때객체이름이없으면묵시적으로 this 로가정 this 의필요성 객체의멤버변수와메소드변수의이름이같은경우 객체자신을메소드에전달또는반환할때 class Samp { int id; public Samp(int x) {this.id = x; public void set(int x) {this.id = x; public int get() {return id; id void set(int id) { id = id; id? 객체???? id void set(int id) { id = id; 객체 두개의 id 모두인자로정의된 id 이다. this 에대한이해 객체의치환 31 class Samp { int id; public Samp(int x) {this.id = x; public void set(int x) {this.id = x; public int get() {return this.id; Samp ob1 = new Samp(3); Samp ob2 = new Samp(3); Samp ob3 = new Samp(3); ob1.set(5); ob2.set(6); ob3.set(7); ob1 ob2 ob3 id 5 void set(int x) {this.id = x; id 6 void set(int x) {this.id = x; id 7 void set(int x) {this.id = x; 32 * 객체의치환은객체가복사되는것이아니며레퍼런스가복사된다. class Samp { int id; public Samp(int x) {this.id = x; public void set(int x) {this.id = x; public int get() {return this.id; ob1 Samp ob1 = new Samp(3); Samp ob2 = new Samp(4); Samp s; s = ob2; ob1 = ob2; // 객체의치환 System.out.println("ob1.id="+ob1.id); System.out.println("ob2.id="+ob2.id); ob1.id=4 ob2.id=4 ob2 s 이객체는가비지가된다. id 3 void set(int x) {this.id = x; id 4 void set(int x) {this.id = x;

생성자 생성자개념 33 34 생성자의특징 생성자는메소드 생성자의이름은클래스이름과동일 생성자는 new를통해객체를생성할때만호출됨 생성자도오버로딩가능 생성자는리턴타입을지정할수없다. 생성자는하나이상정의되어야함 개발자가생성자를하나도정의하지않으면자동으로기본생성자가정의됨 컴파일러에의해자동생성 기본생성자를디폴트생성자 (default constructor) 라고도함 생성자정의와생성자호출 예제 4-5 : 생성자정의와호출 35 36 생성자는리턴타입없음 생성자오버로딩가능 생성자명은클래스이름과동일 class Samp { int id; public Samp(int x) { this.id = x; public Samp() { this.id = 0; public void set(int x) {this.id = x; public int get() {return this.id; new 문장과일치하는생성자호출 클래스 Book 을 String title, String author, int ISBN 의 3 개의필드를갖도록정의하라. public class Book { String title; String author; int ISBN; public Book(String title, String author, int ISBN) { this.title = title; this.author = author; this.isbn = ISBN; Samp ob1 = new Samp(3); Samp ob2 = new Samp(); Samp s; // 생성자호출하지않음 Book javabook = new Book("Java JDK", " 황기태 ", 3333);

37 기본생성자 기본생성자 (default constructor) 클래스에생성자가하나도정의되지않은경우 컴파일러에의해자동으로생성 인자없는생성자 아무작업없이단순리턴 디폴트생성자라고도부름 class DefaultConstructor{ int x; public void setx(int x) {this.x = x; public int getx() {return x; DefaultConstructor p= new DefaultConstructor(); p.setx(3); 개발자가작성한코드 class DefaultConstructor{ int x; public void setx(int x) {this.x = x; public int getx() {return x; public DefaultConstructor() { 컴파일러에의해자동삽입된기본생성자 DefaultConstructor p= new DefaultConstructor(); p.setx(3); 컴파일러가자동으로기본생성자를삽입한코드 38 기본생성자가자동생성되지않는경우 클래스에생성자가하나라도존재하면자동으로기본생성자가생성되지않음 class DefaultConstructor{ int x; public void setx(int x) {this.x = x; public int getx() {return x; public DefaultConstructor(int x) { this.x = x; DefaultConstructor p1= new DefaultConstructor(3); int n = p1.getx(); DefaultConstructor p2= new DefaultConstructor(); p2.setx(5); 컴파일러가기본생성자를자동생성하지않음 public DefaultConstructor() { 컴파일오류. 해당하는생성자가없음!!! this(), 생성자에서다른생성자호출 this() 사용실패예 39 this() 같은클래스의다른생성자호출시사용 생성자내에서만사용가능 다른메소드에서는사용불가 반드시생성자코드의제일처음에수행 public class Book { String title; String author; int ISBN; public Book(String title, String author, int ISBN) { this.title = title; this.author = author; this.isbn = ISBN; public Book(String title, int ISBN) { this(title, "Anonymous", ISBN); public Book() { title = "Holy Bible" this(null, null, 0); ISBN = 3333 System.out.println(" 생성자가호출되었음 "); Book javabook = new Book("Java JDK", " 황기태 ", 3333); Book holybible = new Book("Holy Bible", 1); Book emptybook = new Book(); 40 public Book() { System.out.println(" 생성자가호출되었음 "); this(null, null, 0); // 생성자의첫번째문장이아니기때문에컴파일오류

객체의소멸과가비지 가비지사례 41 42 객체소멸 new에의해생성된객체메모리를자바가상기계에게되돌려주는행위 가용메모리에포함시킴자바에서객체삭제기능없음 개발자에게는매우다행스러운기능 C/C++ 에서는할당받은객체를개발자가프로그램내에서삭제해야함 Person a, b; a = new Person( 이몽룡 ); b = new Person( 성춘향 ); b = a; // b 가가리키던객체는가비지가됨 Person 객체 a 이몽룡 Person 객체 b 성춘향 가비지 객체에대한레퍼런스가없어지면객체는가비지 (garbage) 가됨 자바가상기계의가비지컬렉터가가비지메모리를반환 가비지 예제 4-6 : 가비지발생 가비지컬렉션 43 44 다음소스에서언제가비지가발생하는지설명하라. public class GarbageEx { String a = new String("Good"); String b = new String("Bad"); String c = new String("Normal"); String d, e; a = null; d = c; c = null; a b c Good Bad Normal a b c null null 가비지 Good Bad Normal 가비지컬렉션 자바에서는가비지들을자동회수, 가용메모리공간으로이동하는행위 자바가상기계내에포함된가비지컬렉터 (garbage collector) 에의해자동수행개발자에의한강제가비지컬렉션 System 또는 Runtime 객체의 gc() 메소드호출 System.gc(); // 가비지컬렉션작동요청 d d 자바가상기계에강력한가비지컬렉션을요청. 그러나자바가상기계가가비지컬렉션시점을전적으로판단 e e null (a) 초기객체생성시 (b) 코드전체실행후

접근지정자이해 클래스접근지정자 45 46 클래스앞에올수있는접근지정자 public 접근지정자 public class Person { 다른모든클래스가접근가능 접근지정자생략 (default 접근지정자 ) class Person { 또는 package-private 라고도함 같은패키지내에있는클래스에서만접근가능 다른말로같은디렉토리에있는클래스끼리접근가능 멤버접근지정자 접근지정자의이해 47 48 default ( 또는 package-private) public private protected 같은패키지내에서접근가능 패키지내부, 외부클래스에서접근가능 정의된클래스내에서만접근가능 상속받은하위클래스에서도접근불가 같은패키지내에서접근가능 다른패키지에서접근은불가하나상속을받은경우하위클래스에서는접근가능 public 접근지정자사례 class A { void f() { B b = new B(); b.n = 3; b.g(); public class B { public int n; public void g() { n = 5; 패키지 P class C { public void k() { B b = new B(); b.n = 7; b.g(); 멤버에접근하는클래스 멤버의접근지정자 default private protected public 같은패키지의클래스 O X O O 다른패키지의클래스 X X X O private 접근지정자사례 class A { void f() { B b = new B(); b.n = 3; b.g(); public class B { private int n; private void g() { n = 5; 패키지 P class C { public void k() { B b = new B(); b.n = 7; b.g();

default 접근지정자사례 49 class A { void f() { B b = new B(); b.n = 3; b.g(); protected 접근지정자사례 class A { void f() { B b = new B(); b.n = 3; b.g(); public class B { int n; void g() { n = 5; public class B { protected int n; protected void g() { n = 5; D가 B를상속받음 class D extends B { void f() { n = 3; g(); 패키지 P 패키지 P class C { public void k() { B b = new B(); b.n = 7; b.g(); class C { public void k() { B b = new B(); b.n = 7; b.g(); 50 예제 4-7 : 접근지정자의사용 다음의소스를컴파일해보고오류가난이유를설명하고오류를수정하시오. class Sample { public int a; private int b; int c; public class AccessEx { Sample aclass = new Sample(); aclass.a = 10; aclass.b = 10; aclass.c = 10; 예제 4-7 결과 Static 이해를위한그림 51 52 눈은각사람마다있고공기는모든사람이소유 ( 공유 ) 한다 오류가수정된소스 class Sample { public int a; private int b; int c; public int getb() { return b; public void setb(int value) { b = value; public class AccessEx { Sample aclass = new Sample(); aclass.a = 10; aclass.setb(10); aclass.c = 10; Sample 클래스의 a와 c는각각 public, default 지정자로선언이되었으므로같은패키지에속한 AccessEx 클래스에서접근이가능 b는 private으로선언이되었으므로 AccessEx 클래스에서는접근이불가능 private 접근지정자를갖는멤버는클래스내부에 get/set 메소드를만들어서접근한다. 사람은모두각가눈을가지고태어난다. 세상에는이미공기가있으며태어난사람은모두공기를공유한다. 그리고공기역시각사람의것이다.

static 멤버와 non-static 멤버 non-static 멤버와 static 멤버의차이 53 non-static 멤버의특성 공간적 - 멤버들은객체마다독립적으로별도존재 인스턴스멤버라고도부름 시간적 - 필드와메소드는객체생성후비로소사용가능 비공유의특성 - 멤버들은여러객체에의해공유되지않고배타적 static 멤버란? 객체를생성하지않고사용가능 객체마다생기는것이아님 클래스당하나만생성됨 클래스멤버라고도부름 특성 class StaticSample { int n; // non-static 필드 void g() { //non-static 메소드 static int m; // static 필드 static void f() { //f() 는 static 메소드 공간적특성 - static 멤버들은클래스당하나만생성. 시간적특성 - static 멤버들은클래스가로딩될때공간할당. 공유의특성 - static 멤버들은동일한클래스의모든객체에의해공유 54 선언공간적특성시간적특성공유의특성 non-static 멤버 class Sample { int n; void g() { 멤버는객체마다별도존재. - 인스턴스멤버라고부름. 객체생성시함께멤버생성됨 - 객체가생길때멤버도생성 - 객체생성후멤버사용가능 - 객체가사라지면멤버도사라짐 동일한클래스의객체들에의해공유되지않음. - 멤버는객체내에각각공간유지 static 멤버 class Sample { static int m; static void g() { 멤버는클래스당하나생성 - 멤버는객체내부가아닌별도의공간에생성 - 클래스멤버라고부름클래스로딩시에멤버생성 - 객체가생기기전에이미생성 - 객체가생기기전에도사용가능 - 객체가사라져도멤버는사라지지않음 - 멤버는프로그램이종료될때사라짐 동일한클래스의객체들에의해공유됨 55 static 멤버를객체의멤버로접근하는사례 class StaticSample { public int n; public void g() { 56 m = 20; public void h() { m = 30; public static int m; public static void f() { m = 5; public class Ex { StaticSample s1, s2; s1 = new StaticSample(); s1.n = 5; s1.g(); s1.m = 50; // static s2 = new StaticSample(); s2.n = 8; s2.h(); s2.f(); // static System.out.println(s1.m); StaticSample s1, s2; s1 = new StaticSample(); s1.n = 5; s1.g(); s1.m = 50; s1 s1 m f() { m 20 f() { n 5 g() { m=20; h() { m=30; m 50 f() { n 5 g() { m=20; h() { m=30; 다음페이지계속 static 멤버생성 s1.g() 호출에의해 static 멤버 m 의값이 20 으로설정 s1.m=50; 에의해 static 멤버 m 의값이 50 으로설정 5

57 s2 = new StaticSample(); s2.n = 8; s2.h(); s1 s1, s2 에의해공유 n 5 g() { m=20; h() { m=30; m 30 f() { n 8 g() { m=20; h() { m=30; s2 58 s2.h() 호출에의해 static 멤버 m 의값이 30 으로설정 s1, s2 에의해공유 m 5 f() { m=5; static 멤버를클래스이름으로접근하는사례 s2.f(); s1 n 5 g() { m=20; h() { m=30; n 8 g() { m=20; h() { m=30; s2 s2.f() 호출에의해 static 멤버 m 의값이 5 로설정 System.out.println(s1.m); 5 출력 class StaticSample { public int n; public void g() { 59 m = 20; public void h() { m = 30; public static int m; public static void f() { m = 5; public class Ex { StaticSample.m = 10; StaticSample.m = 10; StaticSample s1; s1 = new StaticSample(); System.out.println(s1.m); s1 m 10 f() { m 10 f() { n g() { m=20; h() { m=30; 10 출력 static 멤버생성 객체 s1 생성 60 static 의활용 전역변수와전역함수를만들때활용 자바에서의캡슐화원칙 다른모든클래스에서공유하는전역변수나전역함수도클래스내부에만정의 java.lang.math 클래스 JDK와함께배포되는 java.lang.math 클래스 모든메소드가 static으로정의되어다른모든클래스에서사용됨 객체를생성하지않고바로호출할수있는상수와메소드제공 StaticSample s1; s1 = new StaticSample(); System.out.println(s1.m); s1.f(); StaticSample.f(); s1.f(); s1 m 5 f() { n g() { m=20; h() { m=30; public class Math { // 권하지않는사용법 static int abs(int a); Math m = new Math(); static double cos(double a); int n = m.abs(-5); static int max(int a, int b); static double random(); // 바른사용법 int n = Math.abs(-5); StaticSample.f(); s1.f(); 의호출과동일함

61 static 메소드의제약조건 static 메소드는오직 static 멤버만접근가능 객체가생성되지않은상황에서도사용이가능하므로객체에속한인스턴스메소드, 인스턴스변수등사용불가 인스턴스메소드는 static 멤버들을모두사용가능 static 메소드에서는 this 키워드를사용할수없음 객체가생성되지않은상황에서도호출이가능하기때문에현재실행중인객체를가리키는 this 레퍼런스를사용할수없음 예제 4-8 : static 을이용한달러와우리나라원화사이의변환예제 62 static 필드와메소드를이용하여달러와한국원화사이의변환을해주는환율계산기를만들어보자. class CurrencyConverter { private static double rate; // 한국원화에대한환율 public static double todollar(double won) { return won/rate; // 한국원화를달러로변환 public static double tokwr(double dollar) { return dollar * rate; // 달러를한국원화로변환 public static void setrate(double r) { rate = r; // 환율설정. KWR/$1 public class StaticMember { CurrencyConverter.setRate(1121); // 미국달러환율설정 System.out.println(" 백만원은 " + CurrencyConverter.toDollar(1000000) + " 달러입니다."); System.out.println(" 백달러는 " + CurrencyConverter.toKWR(100) +" 원입니다."); 백만원은 892.0606601248885 달러입니다. 백달러는 112100.0 원입니다. final final 필드 63 64 final 클래스 - 더이상클래스상속불가능 final 필드, 상수정의 상수를정의할때사용 final class FinalClass {.. class DerivedClass extends FinalClass { // 컴파일오류발생.. class SharedClass { public static final double PI = 3.141592653589793; 상수필드는선언시에초기값을지정하여야한다 상수필드는한번정의되면값을변경할수없다 final 메소드 - 더이상오버라이딩불가능 public class SuperClass { protected final int finalmethod() { class DerivedClass extends SuperClass { protected int finalmethod() { // 컴파일오류, 오버라이딩할수없음 public class FinalFieldClass { final int ROWS = 10; // 상수정의, 이때초기값 (10) 을반드시설정 final int COLS; // 컴파일오류, 초기값을지정하지않았음 void f() { int [] intarray = new int [ROWS]; // 상수활용 ROWS = 30; // 컴파일오류발생, final 필드값을변경할수없다.