4 장 클래스 작성.

Slides:



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

6 장 객체 - 지향 설계 ③. 목차 GUI 레이아웃  전화기 키 패드 전화기 키 패드 전화기 키 패드 모양의 GUI 를 만드는 Telephone.java, TelephonePanel.java 를 완성해 보자.  주석을 참고하여 TelephonePanel.java.
목 차 C# 언어 특징 .NET 프레임워크 C# 콘솔 프로그램 C# 윈도우 프로그램 실습 프로그래밍세미나 2.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
최윤정 Java 프로그래밍 클래스 상속 최윤정
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
7장 배열 ③.
컴퓨터 프로그래밍 실습 #7 제 4 장 GUI 클래스 작성.
8장 상속 ②.
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
3장 객체-지향 프로그래밍 언어.
제 9 장 구조체와 공용체.
6장 객체-지향 설계 ①.
제 4 장 클래스 작성 Lab 4- 2.
1학기 Java 요약.
7장 배열 ②.
19장 스윙과 이벤트 처리 Section 1 스윙 컴포넌트 Section 2 이미지 아이콘과 라벨
제 8 장 상속.
6장 객체-지향 설계 ②.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
9장 다형성 Lab 9-2.
10장 예외 Lab 10-2.
5장 조건과 반복 ③.
윤 홍 란 4 장 클래스 작성 윤 홍 란
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
자바 5.0 프로그래밍.
패키지와 접근 제어 패키지에 대하여 접근 제어에 대하여.
Power Java 제14장 배치 관리자.
그래픽 사용자 인터페이스와 사건처리.
Java 6장. 클래스 : 속성 public class SumTest {
Lesson 7. 클래스와 메소드 - 1.
제 4 장 클래스 작성 4-1 LAB.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
자바 5.0 프로그래밍.
4 장 클래스 작성.
7장 인터페이스와 추상 클래스.
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
자바응용.
10장 tkinter로 GUI 만들기.
제3장 클래스와 객체의 사용.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
10장 객체-지향 프로그래밍 I ©창병모.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
Power Java 제11장 상속.
JA A V W. 06.
Fucntion 요약.
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
제 4 장 클래스 작성 Lab 4- 2.
Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects)
윤 홍 란 4 장 클래스 작성 윤 홍 란
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
Chapter 4 클래스 작성.
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
2.가상머신의 탐험 도구, Oolong에 대하여 ps lab 김윤경.
제 4 장 Record.
Power Java 제14장 배치 관리자.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
5장 조건과 반복 ③.
7 생성자 함수.
6 객체.
Presentation transcript:

4 장 클래스 작성

Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects) 그래픽 사용자 인테페이스 버튼과 텍스트 필드 © 2004 Pearson Addison-Wesley. All rights reserved

클래스 작성 지금까지 이제부터 객체지향 프로그램 프로그램의 시작 점 Java 클래스 라이브러리에 미리 정의된 클래스들을 사용하였다. 이제부터 우리가 직접 클래스를 작성한다. 직접 작성한 클래스를 사용하여 프로그램을 디자인 한다. 객체지향 프로그램 객체의 특성과 기능을 정의하는 클래스로 이루어진다. 프로그램의 시작 점 메인 메쏘드를 포함하는 클래스 © 2004 Pearson Addison-Wesley. All rights reserved

클래스와 객체 객체 현실 세계의 주사위 프로그램 내에서 주사위 표현 주사위 객체 생성 상태(state) 와 행동(behavior)을 갖고 있다. 상태와 행동은 어떤 관계가 있을까? 현실 세계의 주사위 이 주사위의 표면 값이 상태가 될 수 있다. 이 주사위의 기본 적인 행동은 주사위를 굴리는 것이 될 것이다. 프로그램 내에서 주사위 표현 주사위의 상태와 행동을 모델링 하는 Die라는 클래스로 정의한다. 이 클래스는 주사위 객체의 청사진(설계도)라고 할 수 있다. 주사위 객체 생성 이 클래스를 사용하여 원하는 만큼의 주사위 객체를 생성할 수 있다. © 2004 Pearson Addison-Wesley. All rights reserved

(Method declarations) 클래스 클래스 (상태)을 위한 데이터 선언 (행동)을 위한 메쏘드 선언 int size, weight; char category; 데이터 선언들 (Data declarations) 메쏘드 선언들 (Method declarations) © 2004 Pearson Addison-Wesley. All rights reserved

클래스 객체(Object) 예: Die class new ( )를 사용하여 클래스로부터 생성 데이터: 객체의 상태를 정의 데이터: 객체의 상태를 정의 메쏘드: 객체의 행동(behavior) 정의 예: Die class faceValue 변수 주사위의 표면 값을 나타냄 (상태) roll 메쏘드 1 -6 사이의 임의 값(random number)으로 주사위 굴리기 표현 (행동) © 2004 Pearson Addison-Wesley. All rights reserved

Rollingdice.java //******************************************************************* // 사용자-정의 클래스의 생성과 사용을 보여준다. public class RollingDice { // 두 개의 Die 객체를 생성하고 그들을 몇 번 굴린다. public static void main (String[] args) Die die1, die2; int sum; die1 = new Die(); die2 = new Die(); die1.roll(); die2.roll(); System.out.println ("Die One: " + die1 + ", Die Two: " + die2); © 2004 Pearson Addison-Wesley. All rights reserved

RollingDice.java(cont’d) die1.roll(); die2.setFaceValue(4); System.out.println ("Die One: " + die1 + ", Die Two: " + die2); sum = die1.getFaceValue()+die2.getFaceValue(); System.out.println ("Sum: " + sum); sum = die1.roll() + die2.roll(); System.out.println ("New sum: " + sum); } © 2004 Pearson Addison-Wesley. All rights reserved

Die.java /************************************************************* // 1과 6사이의 표면 값을 갖는 하나의 주사위를 나타낸다. //************************************************************ public class Die { private final int MAX = 6; // 최대 표면 값 private int faceValue; // 현재 표면 값 // 구성자(constructor): 초기 표면 값을 설정한다. public Die() faceValue = 1; } // 주사위를 굴리고 결과 값을 반환한다. public int roll() faceValue = (int)(Math.random() * MAX) + 1; return faceValue; © 2004 Pearson Addison-Wesley. All rights reserved

Die.java (Cont’d) // 표면 값 설정. public void setFaceValue (int value) { // 표면 값 설정. public void setFaceValue (int value) { faceValue = value; } // 표면 값 반환 public int getFaceValue() return faceValue; // 이 주사위의 스트링 표현 반환 public String toString() String result = Integer.toString(faceValue); return result; © 2004 Pearson Addison-Wesley. All rights reserved

Die 클래스 두 개의 데이터 값 4개의 메쏘드 MAX 상수: 최대 표면 값 faceValue 변수: 현재 표면 값 roll 메쏘드 Math 클래스의 random 메쏘드를 사용하여 새로운 표면 값을 얻음. setFaceValue 메쏘드: 표면 값 설정 getFaceValue 메쏘드: 현재 표면 값 반환 toString 메쏘드: 현재 표면 값을 스트링으로 반환 © 2004 Pearson Addison-Wesley. All rights reserved

데이터 유효범위(Scope) 데이터의 유효범위(scope of data) 클래스 내에서 선언된 데이터 프로그램에서 그 데이터가 참조(사용) 될 수 있는 범위를 말한다. 클래스 내에서 선언된 데이터 클래스의 모든 메쏘드 내에서 참조될 수 있다. 메쏘드 내에서 선언된 데이터 그 메쏘드 안에서만 참조된다. 지역 데이터 (local data)라 부른다. 예 Die 클래스의 toString 메쏘드에서 선언된 result 변수 메쏘드의 지역변수로 메쏘드 내에서만 사용될 수 있다. © 2004 Pearson Addison-Wesley. All rights reserved

실체 데이터(Instance Data) 실체 변수(Instance variable) 한 클래스로부터 생성되는 각 객체 각 객체가 유지하는 변수 Die 클래스의 faceValue 변수 한 클래스로부터 생성되는 각 객체 메쏘드 정의들을 공유하지만 실체 변수들을 위한 메모리 공간을 각각 독립적으로 갖는다. Die 객체가 생성될 때 faceValue 변수의 메모리가 할당된다. 따라서 두 개의 서로 다른 객체는 각기 다른 상태를 가질 수 있다. © 2004 Pearson Addison-Wesley. All rights reserved

실체 데이터(Instance Data) RollingDice 프로그램에서 두 개의 Die 객체 die1 5 faceValue 2 각각의 Die 객체는 자신의 상태를 나타내는 faceValue 변수를 각각 유지한다. © 2004 Pearson Addison-Wesley. All rights reserved

toString 메쏘드 객체를 표현하는 모든 클래스 toString 메쏘드 toString 메쏘드를 정의하여야 한다. 객체를 나타내는 적절한 스트링을 반환한다. 객체가 스트링과 접합되거나 매개변수로 println 메쏘드로 전달될 때 자동으로 호출된다. © 2004 Pearson Addison-Wesley. All rights reserved

구성자(Constructors) 구성자(constructor) Die 구성자 객체가 생성될 때 호출되는 특수 메쏘드로 주로 객체를 초기화 구성자(constructor)는 클래스와 같은 이름을 갖는다. Die 구성자 새로운 die 객체의 표면 값을 1 로 초기화 한다. public Die() { faceValue = 1; } © 2004 Pearson Addison-Wesley. All rights reserved

UML 클래스 다이어그램 UML: Unified Modeling Language UML 다이어그램(diagram) 클래스와 객체들 사이의 관계 표현에 사용 UML class diagram 각 클래스를 사각형으로 표현 클래스 이름, 데이터의 속성(attributes), 메쏘드 등을 포함 클래스들을 연결하는 화살표 클래스들 사이에 관계 (associations)가 있음을 나타냄. 화살표 머리를 갖는 점선 한 클래스가 다른 클래스의 메쏘드를 사용(uses)함을 나타냄. © 2004 Pearson Addison-Wesley. All rights reserved

UML 클래스 다이어그램 RollingDice 프로그램의 UML 클래스 다이어그램: RollingDice Die main (args : String[]) : void Die faceValue : int roll() : int setFaceValue (int value) : void getFaceValue() : int toString() : String © 2004 Pearson Addison-Wesley. All rights reserved

Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects) 그래픽 사용자 인테페이스 버튼과 텍스트 필드 © 2004 Pearson Addison-Wesley. All rights reserved

캡슐화(Encapsulation) 객체의 두 가지 관점 외적 관점 내적(internal) 외적(external) 클래스가 정의하는 변수들과 메쏘드들의 세부 사항 외적(external) 객체가 제공하는 서비스들과 프로그램의 다른 부분과의 연동 방법 외적 관점 객체는 서비스를 제공하는 캡슐화된 개체(encapsulated entity) 서비스를 제공하는 메쏘드들은 그 객체의 인터페이스(창구) 역할을 한다. © 2004 Pearson Addison-Wesley. All rights reserved

캡슐화(Encapsulation) 클라이언트 캡슐화된 객체 클라이언트 메쏘드 데이터 black box로 볼 수 있다. 내부의 일은 클라이언트로부터 감추어져 있다. 클라이언트 실체 데이터를 관리하는 객체의 인터페이스 메쏘드를 호출 한다. 메쏘드 데이터 클라이언트 © 2004 Pearson Addison-Wesley. All rights reserved

캡슐화(Encapsulation) 객체는 자기 관리(self-governing)되어야 한다. 객체의 상태는 메쏘드에 의해서 변경되어야 한다. 다른 객체가 직접 접근하여 상태를 바꾸는 것을 불가능/어렵게 해야 한다 © 2004 Pearson Addison-Wesley. All rights reserved

가시성 조정자(Visibility Modifiers) 3가지 가시성 조정자 public, protected, private 적절한 가시성 조정자를 사용하여 캡슐화를 완성할 수 있다. 가시성 조정자는 메쏘드나 데이터의 특성을 구체화 한다. final 상수를 정의할 때 사용하는 조정자이다. protected 조정자 상속과 관련해서 8장에서 소개 © 2004 Pearson Addison-Wesley. All rights reserved

가시성 조정자(Visibility Modifiers) public 멤버 멤버 필드와 메소드는 클래스의 내외 어느 곳에서나 접근이 가능 private 멤버 클래스 내부에서만 접근 가능 package 멤버 package 혹은 default는 아무 것도 기술하지 않았을 때 같은 패키지 내에서는 자유롭게 접근할 수 있으나, 패키지 외부에서는 접근할 수 없다. © 2004 Pearson Addison-Wesley. All rights reserved

가시성 조정자(Visibility Modifiers) 일반적 규칙 객체의 데이터는 공용으로 선언하면 안된다. 서비스 메쏘드 객체의 서비스(창구)를 제공하는 메쏘드로 공용 메쏘드로 선언되어 클라이언트로부터 호출 될 수 있도록 한다. 지원 메쏘드 서비스 메쏘드를 지원하는 메쏘드로 공용으로 선언되면 안 된다. © 2004 Pearson Addison-Wesley. All rights reserved

가시성 조정자(Visibility Modifiers) public private 변수 Variables 메쏘드 Methods 캡슐화 위반 캡슐화 시행 클라이언트에 서비스 제공 클래스 내의 다른 메쏘드 지원 © 2004 Pearson Addison-Wesley. All rights reserved

접근 메쏘드(Accessors)와 변이 메쏘드(Mutators) 접근 메쏘드(accessor method) 변수의 현재 값 반환 getX 변이 메쏘드(mutator method) 변수 값 변경 setX 왜 제공하나? 실체 데이터는 전용으로 선언되기 때문에 클래스는 보통 데이터 값을 접근하거나 변경할 수 있는 서비스를 제공한다. © 2004 Pearson Addison-Wesley. All rights reserved

Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects) 그래픽 사용자 인테페이스 버튼과 텍스트 필드 © 2004 Pearson Addison-Wesley. All rights reserved

메쏘드 선언(Declarations) 메쏘드 선언(method declaration) 메쏘드 호출 메쏘드의 실행이 끝나면 메쏘드가 호출(invoked, called)될 때 실행되는 코드를 명시한다. 메쏘드 호출 제어의 흐름은 호출된 메쏘드로 넘어가서 그 메쏘드의 문장들을 하나씩 실행한다. 메쏘드의 실행이 끝나면 제어는 호출된 위치로 반환되어 실행이 계속된다. 값 반환 값을 반환할 경우: 반환 값의 타입 명시 값을 반환하지 않을 경우: 예약어 void 사용 © 2004 Pearson Addison-Wesley. All rights reserved

메쏘드 제어 흐름(Control Flow) 호출된 메쏘드가 호출한 메쏘드와 같은 클래스에 있을 경우 메쏘드의 이름만을 사용한다. myMethod(); myMethod compute © 2004 Pearson Addison-Wesley. All rights reserved

메쏘드 제어 흐름(Control Flow) 호출된 메쏘드가 호출한 메쏘드와 다른 클래스나 객체에 속할 경우 obj.doIt(); main doIt helpMe helpMe(); 다른 클래스 © 2004 Pearson Addison-Wesley. All rights reserved

매개변수 리스트(parameter list) 메쏘드 헤더(Method Header) 메쏘드 선언은 메쏘드 헤더 (method header)로 시작한다. char calc (int num1, int num2, String message) 메쏘드 이름 (method name) 매개변수 리스트(parameter list) 매개변수 리스트는 각 매개변수의 타입(type)과 이름(name)을 선언한다. 메소드 선언에서 사용된 매개변수 이름을 형식 매개변수(formal parameter)라 부른다. 반환 타입 (return type) © 2004 Pearson Addison-Wesley. All rights reserved

메쏘드 본체(Method Body) 메쏘드 헤더(method header) 다음에 메쏘드 본체(method body)가 온다. char calc (int num1, int num2, String message) { int sum = num1 + num2; char result = message.charAt (sum); return result; } “sum” 과 “result”는 지역 데이터(local data) 임. 지역 데이터는 메쏘드가 호출 될 때 마다 생성되었다가 메쏘드가 끝날 때 소멸된다. 반환 문은 반드시 메쏘드 헤더에 명시된 반환 타입과 일치하는 값을 갖고 있어야 한다. © 2004 Pearson Addison-Wesley. All rights reserved

반환 문(return Statement) 메쏘드의 반환 타입(return type) 메쏘드를 호출한 지점으로 반환하게 되는 값의 타입을 나타낸다. 값을 반환하지 않는 메쏘드는 void 반환 타입을 갖는다. 반환 문(return statement)은 반환될 값을 명시한다. return expression; 이 때 수식(expression)의 결과는 반드시 반환 타입과 같아야 한다. © 2004 Pearson Addison-Wesley. All rights reserved

매개변수(Parameters) 메쏘드가 호출되면, 호출 지점의 실 매개변수들이 (actual parameters) 메쏘드 헤더의 형식 매개변수들로 복사된다. 실 매개변수(actual parameters) ch = obj.calc (25, count, "Hello"); char calc (int num1, int num2, String message) { int sum = num1 + num2; char result = message.charAt (sum); return result; } 형식 매개변수(fomal parameters) © 2004 Pearson Addison-Wesley. All rights reserved

지역 데이터(Local Data) 지역 변수(local variables) 메쏘드 안에서 선언되는 것을 보았다. 메쏘드의 형식 매개변수(formal parameters) 메쏘드가 호출 되면 자동 지역 변수(automatic local variables)로 생성된다. 메쏘드가 종료되면, 모든 지역 변수(형식 매개변수)을 위한 기억장소 소멸 클래스 내에 선언된 실체 변수(instance variables) 객체가 존재하는 한 소멸되지 않고 메모리에 존재한다. © 2004 Pearson Addison-Wesley. All rights reserved

은행 계좌(Bank Account) 예제 은행계좌를 Account 클래스를 사용하여 나타내었다. Account 클래스의 상태(state) 계좌 번호(account number) 잔액(current balance) 예금주 이름(name of the owner) Account의 행동(behaviors) (혹은 서비스): 입금(deposits) 출금(withdrawals) 이자 가산(adding interest) © 2004 Pearson Addison-Wesley. All rights reserved

Transactions.java //******************************************************************* // 여러 Account 객체들의 생성과 사용을 보인다. public class Transactions {    //---------------------------------------------------------------    //  은행 계좌를 몇 개 만들고 다양한 서비스를 요청한다.    public static void main (String[] args)    {       Account acct1 = new Account ("Ted Murphy", 72354, 102.56);       Account acct2 = new Account ("Jane Smith", 69713, 40.00);       Account acct3 = new Account ("Edward Demsey", 93757, 759.32);       acct1.deposit (25.85);       double smithBalance = acct2.deposit (500.00);             © 2004 Pearson Addison-Wesley. All rights reserved

Transactions.java   System.out.println ("Smith balance after deposit: " +   smithBalance); System.out.println ("Smith balance after withdrawal: " +                                  acct2.withdraw (430.75, 1.50));       acct1.addInterest();       acct2.addInterest();       acct3.addInterest();       System.out.println ();       System.out.println (acct1);       System.out.println (acct2);       System.out.println (acct3);    } } © 2004 Pearson Addison-Wesley. All rights reserved

Account.java //******************************************************************* //  입금과 출금 같은 기본적인 서비스를 가진 은행 계좌를 나타낸다. import java.text.NumberFormat; public class Account {    private final double RATE = 0.035;  // 이자율 3.5%    private long acctNumber;    private double balance;    private String name;                                                                                 //  예금주, 계좌번호, 초기 잔액을 정의하여 계좌를 설정한다.    public Account (String owner, long account, double initial)    {       name = owner;       acctNumber = account;       balance = initial;    } © 2004 Pearson Addison-Wesley. All rights reserved

Account.java // 명시한 금액을 계좌에 입금하고 새로운 잔액을 반환한다.   //  명시한 금액을 계좌에 입금하고 새로운 잔액을 반환한다.     public double deposit (double amount)    {       balance = balance + amount;       return balance;    }   //  명시한 금액을 계좌로부터 출금/수수료를 적용하고 새로운 잔액 반환      public double withdraw (double amount, double fee)       balance = balance - amount -fee; return balance;      //  계좌에 이자를 추가하여 새로운 잔액을 반환한다.    public double addInterest ()       balance += (balance * RATE);                                         © 2004 Pearson Addison-Wesley. All rights reserved

Account.java // 계좌의 현재 잔액을 반환한다. public double getBalance () {    //  계좌의 현재 잔액을 반환한다.    public double getBalance ()    {       return balance;    }    //  계좌를 한 줄의  스트링으로 표현하여 반환한다.    public String toString ()       NumberFormat fmt = NumberFormat.getCurrencyInstance();       return (acctNumber + "\t" + name + "\t" + fmt.format(balance)); } © 2004 Pearson Addison-Wesley. All rights reserved

Bank Account 예제 acct1 acctNumber 72354 balance 102.56 name “Ted Murphy” acct2 69713 acctNumber 40.00 balance name “Jane Smith” © 2004 Pearson Addison-Wesley. All rights reserved

구성자(Constructors) 구성자는 객체 생성되면 자동 실행 구성자는 반환 타입 없음 구성자에 리턴 타입을 사용하면 오류 꼭 구성자(constructor) 정의해야 하나? 꼭 그럴 필요는 없다 각각의 클래스는 매개변수가 없는 디폴트 구성자를 갖게 된다. © 2004 Pearson Addison-Wesley. All rights reserved

Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects) 그래픽 사용자 인테페이스 버튼과 텍스트 필드 © 2004 Pearson Addison-Wesley. All rights reserved

그래픽 객체(Graphical Objects) 이 장에서 그래픽 객체의 다른 예들을 더 살펴보도록 하자. © 2004 Pearson Addison-Wesley. All rights reserved

SmilingFace 예제 SmilingFace 클래스의 main 메쏘드 SmilingFacePanel 클래스 프로그램을 위한 프레임을 준비하여 SmilingFacePanel 클래스를 실체화 하고 디스플레이 한다. SmilingFacePanel 클래스 JPanel 클래스의 특징을 상속(inherit)받아 확장(extends)하여 만든다. 패널(panel)의 paintComponent 메쏘드 패널이 visible해지면 자동 실행되어 (얼굴을 )그린다. © 2004 Pearson Addison-Wesley. All rights reserved

SmilingFace.java //******************************************************************** //  별도의 패널 클래스를 사용하는 것을 보여준다. import javax.swing.JFrame; public class SmilingFace {    //  프로그램의 주 프레임을 생성한다.    public static void main (String[] args)    {       JFrame frame = new JFrame ("Smiling Face");       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);       SmilingFacePanel panel = new SmilingFacePanel();       frame.getContentPane().add(panel);       frame.pack();       frame.setVisible(true);    } } © 2004 Pearson Addison-Wesley. All rights reserved

SmilingFacePanel.java //******************************************************************** //  별도의 패널 클래스를 사용하는 것을 보여준다. import javax.swing.JPanel; import java.awt.*; public class SmilingFacePanel extends JPanel {    private final int BASEX = 120, BASEY = 60; // (그림의) 머리를 위한 기준 점    //  구성자: 이 패널의 주 특성을 설정한다.    public SmilingFacePanel ()    {       setBackground (Color.blue);       setPreferredSize (new Dimension(320, 200)0;       setFont (new Font("Arial", Font.BOLD, 16));    } © 2004 Pearson Addison-Wesley. All rights reserved

SmilingFacePanel.java // 얼굴을 그린다.    // 얼굴을 그린다.    public void paintComponent (Graphics page)    {       super.paintComponent (page);       page.setColor (Color.yellow);       page.fillOval (BASEX, BASEY, 80, 80);  // 머리       page.fillOval (BASEX-5, BASEY+20, 90, 40);  // 귀       page.setColor (Color.black);       page.drawOval (BASEX+20, BASEY+30, 15, 7);  // 눈       page.drawOval (BASEX+45, BASEY+30, 15, 7);       page.fillOval (BASEX+25, BASEY+31, 5, 5);  // 눈동자       page.fillOval (BASEX+50, BASEY+31, 5, 5); © 2004 Pearson Addison-Wesley. All rights reserved

SmilingFacePanel.java page.drawArc (BASEX+20, BASEY+25, 15, 7, 0, 180);  // 눈썹       page.drawArc (BASEX+45, BASEY+25, 15, 7, 0, 180);       page.drawArc (BASEX+35, BASEY+40, 15, 10, 180, 180);  // 코       page.drawArc (BASEX+20, BASEY+50, 40, 15, 180, 180);  // 입       page.setColor (Color.white);       page.drawString ("Always remember that you are unique!",                             BASEX-105, BASEY-15);       page.drawString ("Just like everyone else.", BASEX-45, BASEY+105);    } } © 2004 Pearson Addison-Wesley. All rights reserved

Smiling Face 예제 모든 Swing 컴포넌트는 paintComponent 메쏘드를 갖는다. 패널을 위한 그래픽 문맥(graphics context)을 나타내는 그래픽 객체를 받아들인다. 예제에서는 적당한 Graphics 메쏘드를 불러 얼굴을 그렸다. 패널에 그리는 것과 다른 GUI 컴포넌트들을 패널에 추가하는 것의 차이점에 유의하라 © 2004 Pearson Addison-Wesley. All rights reserved

Splat 예제 Splat 예제는 조금 다른 구성을 갖고 있다. 패널의 paintComponent 메쏘드 몇 개의 속이 채워진 원들을 패널에 그리는데 각 원은 자신의 그래픽 정보를 유지하는 독립적인 객체로 표현 패널의 paintComponent 메쏘드 각 원으로 하여금 자신을 스스로 그리도록 요청한다. Splat.java (국문 185쪽, 영문 180쪽) 참조 SplatPanel.java (국문 186쪽, 영문 181쪽) 참조 Circle.java (국문 188쪽, 영문 182쪽) 참조 © 2004 Pearson Addison-Wesley. All rights reserved

Splat.java //******************************************************************** //  그래픽 객체의 사용을 보여준다. import javax.swing.*; import java.awt.*; public class Splat {    //  원들의 모임을 보여준다.    public static void main (String[] args)    {       JFrame frame = new JFrame ("Splat");       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new SplatPanel());       frame.pack();       frame.setVisible(true);    } } © 2004 Pearson Addison-Wesley. All rights reserved

SplatPanel.java //******************************************************************** //  그래픽 객체의 사용을 보여준다. import javax.swing.*; import java.awt.*; public class SplatPanel extends JPanel {    private Circle circle1, circle2, circle3, circle4, circle5;    //  구성자: 다섯 개의 Circle 객체들을 생성한다.    public SplatPanel ()    {       circle1 = new Circle (30, Color.red, 70, 35);       circle2 = new Circle (50, Color.green, 30, 20);       circle3 = new Circle (100, Color.cyan, 60, 85);       circle4 = new Circle (45, Color.yellow, 170, 30);       Circle5 = new Circle (60, Color.blue, 200, 60);       setPreferredSize (new Dimension(300, 200));       setBackground (Color.black);    } © 2004 Pearson Addison-Wesley. All rights reserved

SplatPanel.java   //-----------------------------------------------------------------    // 각 원이 스스로를 그리게 요청함으로써 이 패널을 그린다.    //-----------------------------------------------------------------    public void paintComponent (Graphics page)    {       super.paintComponent (page);       circle1.draw(page);       circle2.draw(page);       circle3.draw(page);       circle4.draw(page);       circle5.draw(page);    } } © 2004 Pearson Addison-Wesley. All rights reserved

Circle.java //******************************************************************** //  특정한 위치, 크기, 색상을 가진 원을 표현한다. import java.awt.*; public class Circle {    private int diameter, x, y;    private Color color;    //-----------------------------------------------------------------    //  구성자: 지정된 값들을 가지고 이 원을 설정한다.    //-----------------------------------------------------------------    public Circle (int size, Color shade, int upperX, int upperY)    {       diameter = size;       color = shade;       x = upperX;       y = upperY;    } © 2004 Pearson Addison-Wesley. All rights reserved

Circle.java // 지정된 그래픽 문맥으로 이 원을 그린다. public void draw (Graphics page)    // 지정된 그래픽 문맥으로 이 원을 그린다.    public void draw (Graphics page)    {       page.setColor (color);       page.fillOval (x, y, diameter, diameter);    }    // 지름 변경자.    public void setDiameter (int size)       diameter = size; // 색상 변경자.    public void setColor (Color shade)       color = shade; © 2004 Pearson Addison-Wesley. All rights reserved

Circle.java // X 변경자. public void setX (int upperX) { x = upperX; }    {       x = upperX;    } // Y 변경자.    public void setY (int upperY)       y = upperY; // 지름 접근자.    public int getDiameter ()       return diameter; © 2004 Pearson Addison-Wesley. All rights reserved

Circle.java // 색상 접근자. public Color getColor () { return color; }    // 색상 접근자.    public Color getColor ()    {       return color;    }    // X 접근자.    public int getX ()       return x;    // Y 접근자.    public int getY ()       return y; } © 2004 Pearson Addison-Wesley. All rights reserved

Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects) 그래픽 사용자 인테페이스 버튼과 텍스트 필드 © 2004 Pearson Addison-Wesley. All rights reserved

그래픽 사용자 인터페이스(Interface) 그래픽 사용자 인테페이스 (GUI) 만들기 컴포넌트 (components) 이벤트 (events) 감청자 (listeners) 스크린의 요소(screen element)를 정의하는 객체 예: 레이블(labels), 버튼(buttons), 텍스트 필드(text fields), 메뉴(menus) 등. 컨테이너(containers) 다른 컴포넌트들을 담고 조직하는데 사용하는 특별한 컴포넌트이다. 프레임(frames), 패널(panels), 애플릿(applets), 대화상자(dialog boxes) © 2004 Pearson Addison-Wesley. All rights reserved

이벤트 (Events) 이벤트 어떤 사건(이벤트)의 발생을 나타내며 프로그램은 대응하는 액션을 취할 수 있다. 사용자의 동작과 연계된 이벤트 예 마우스가 드래그 (drag) 마우스 버튼이 클릭 그래픽 버튼이 클릭 키보드의 키 누름 다른 예 타이머가 끝남 © 2004 Pearson Addison-Wesley. All rights reserved

이벤트(Events) 와 감청자(Listeners) 각 이벤트를 나타내는 클래스 표준 클래스 라이브러리에 정의되어 있음 감청자(listener) 이벤트가 일어나기를 ‘기다리고 있다’ 그것이 발생했을 때 어떤 방식으로 대응하는 객체이다. 어떤 이벤트가 발생했을 때 원하는 일이 수행되도록 감청자를 설계해야 한다. 예 그래픽 버튼이 눌려졌을 때 액션 이벤트(ActionEvent)가 발생된다. 발생된 이벤트에 대해서 감청자에서 필요한 액션을 취할 수 있다. © 2004 Pearson Addison-Wesley. All rights reserved

이벤트(Events) 와 감청자(Listeners) 컴포넌트 Component 컴포넌트 객체가 이벤트를 발생 시킬 수 있다. 감청자 Listener 그 이벤트에 대해 반응하도록 상응하는 감청자(listener) 객체를 디자인 할 수 있다. 이벤트가 발생 했을 때, 컴포넌트는 감청자의 절절한 메쏘드를 호출하고 그 이벤트를 정의하는 객체를 전달한다. © 2004 Pearson Addison-Wesley. All rights reserved

GUI 개발 GUI를 사용하는 Java 프로그램을 만들기 Java 클래스 라이브러리에 정의된 컴포넌트와 이벤트 사용 필요한 컴포넌트들을 실체화시켜서 준비한다. 특정 이벤트가 발생시 대응하는 액션을 정의하는 감청자 클래스를 구현한다. 감청자 등록 이벤트를 발생시킬 컴포넌트에 해당 감청자를 등록한다. © 2004 Pearson Addison-Wesley. All rights reserved

Outline 클래스의 해부 캡슐화(Encapsulation) 메쏘드의 해부 그래픽 객체(Graphical Objects) 그래픽 사용자 인테페이스 버튼과 텍스트 필드 © 2004 Pearson Addison-Wesley. All rights reserved

버튼(Buttons) 누름 버튼(push button) PushCounter 예제 사용자가 마우스를 사용해서 그래픽 버튼을 누름으로써 어떤 동작을 시작시킬 수 있도록 해주는 컴포넌트이다. 누름 버튼 은 JButton 클래스에 의해 정의된다. 누름 버튼은 액션 이벤트(action event) 를 발생 시킨다. PushCounter 예제 누를 때 마다 계수기(counter) 를 증가 시키는 누름 버튼을 보여주고 잇다. PushCounter.java 참조(국문: 192쪽, 영문: 186쪽) PushCounterPanel.java 참조(국문:193쪽, 영문:187쪽) © 2004 Pearson Addison-Wesley. All rights reserved

PushCounter.java //******************************************************************** //  그래픽 사용자 인터페이스와 이벤트 감청자를 보여준다. import javax.swing.*; public class PushCounter {    //  주 프로그램 프레임을 만든다.    public static void main (String[] args)    {       JFrame frame = new JFrame ("Push Counter");       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);       frame.getContentPane().add(new PushCounterPanel());       frame.pack();       frame.setVisible(true);    } } © 2004 Pearson Addison-Wesley. All rights reserved

Push Counter 예제 GUI 컴포넌트: PushCounterPanel 클래스 버튼(button) (버튼이 눌려진) 횟수를 표시하는 레이블(label) 컴포넌트를 조직하는 패널(panel) 패널을 표시하기 위한 프레임(frame) PushCounterPanel 클래스 버튼과 레이블을 포함하는 패널을 나타낸다. Jpanel를 상속(inheritance) 한다. 구성자(constructor)는 이 프로그램의 GUI 요소들을 설정하고 계수기(counter)를 0으로 초기화한다. © 2004 Pearson Addison-Wesley. All rights reserved

PushCounterPanel.java //******************************************************************** //  그래픽 사용자 인터페이스와 이벤트 감청자를 보여준다. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PushCounterPanel extends JPanel {    private int count;    private JButton push;    private JLabel label;    //  구성자: GUI를 설정한다.    public PushCounterPanel ()    {       count = 0;       push = new JButton ("Push Me!");       push.addActionListener (new ButtonListener());     © 2004 Pearson Addison-Wesley. All rights reserved

PushCounterPanel.java (Con’t)   label = new JLabel ("Pushes: " + count); add (push);       add (label);       setPreferredSize (new Dimension(300, 40));       setBackground (Color.cyan);    }    // 버튼의 누름 (동작) 이벤트를 위한 감청자를 나타낸다.    private class ButtonListener implements ActionListener    {       // 버튼이 눌려졌을 때 계수기와 레이블을 갱신한다.       public void actionPerformed (ActionEvent event)       {          count++;          label.setText ("Pushes: " + count);       } } © 2004 Pearson Addison-Wesley. All rights reserved

Push Counter 예제 ButtonListener 클래스 버튼이 발생하는 액션 이벤트(action event)를 위한 감청자(listener)를 정의하는 클래스 다른 클래스 내부에서 정의된 내부 클래스(inner class)로 정의 이러한 구성은 감청자와 GUI 컴포넌트들간의 통신에 용이 두 개의 클래스들 간에 밀접한 관련이 있고 다른 클래스들은 내부 클래스에 접근하지 않는 상황에 적합 © 2004 Pearson Addison-Wesley. All rights reserved

Push Counter 예제 감청자 클래스 인터페이스(interface) ActionListener 인터페이스 감청자 인터페이스(listener interface)를 구현함으로써 작성된다. ButtonListener 클래스는 ActionListener 인터페이스 구현 인터페이스(interface) (인터페이스를) 구현하는 클래스가 정의해야 하는 메쏘드들의 목록이다. ActionListener 인터페이스 유일한 메소드는 actionPerformed 메쏘드 이다. 인터페이스에 대해서는 6장에서 보다 자세히 다룬다. © 2004 Pearson Addison-Wesley. All rights reserved

Push Counter 예제 PushCounterPanel 구성자(constructor): 사용자가 버튼을 눌렀을 때 ButtonListener 객체(object) 실체화 addActionListener 를 호출하여 버튼에 감청자 등록 사용자가 버튼을 눌렀을 때 버튼 컴포넌트는 ActionEvent를 생성하고 감청자의 actionPerformed 메쏘드를 자동 호출한다. actionPerformed 메쏘드 계수기(counter)를 증가시키고 레이블(label)의 텍스트(text)를 초기화 한다. © 2004 Pearson Addison-Wesley. All rights reserved

텍스트 필드(Text Fields) 텍스트 필드(text field) 사용 예제 텍스트 필드(text field) 한 줄의 텍스트를 입력할 수 있는 컴포넌트 커서가 텍스트 필드 안에 있을 때, 키보드의 키가 눌러졌을 때 텍스트 필드 컴포넌트는 액션 이벤트를 발생시킨다. Fahrenheit.java 참조 (국문: 195쪽, 영문: 190쪽) FahrenheitPanel.java 참조 (국문: 197쪽, 영문: 191쪽) © 2004 Pearson Addison-Wesley. All rights reserved

Fahrenheit.java //******************************************************************** //  텍스트 필드의 사용을 보여준다. import javax.swing.JFrame; public class Fahrenheit {    //  온도 변환기 GUI를 생성하고 표시한다.    public static void main (String[] args)    {       JFrame frame = new JFrame ("Fahrenheit");       frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);       FahrenheitPanel panel = new FahrenheitPanel();       frame.getContentPane().add(panel);       frame.pack();       frame.setVisible(true);    } } © 2004 Pearson Addison-Wesley. All rights reserved

FahrenheitPanel.java //******************************************************************** //  텍스트 필드의 사용을 보여준다. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FahrenheitPanel extends JPanel {    private JLabel inputLabel, outputLabel, resultPanel;    private JTextField fahrenheit;    //  구성자: 주 GUI 컴포넌트들을 설정한다.    public FahrenheitPanel ()    {       inputLabel = new JLabel ("Enter Fahrenheit temperature:");       outputLabel = new JLabel ("Temperature in Celsius: ");       resultLabel = new JLabel ("---"); © 2004 Pearson Addison-Wesley. All rights reserved

FahrenheitPanel.java (Con’t)     fahrenheit = new JTextField (5);      fahrenheit.addActionListener (new TempListener());      add (inputLabel);       add (fahrenheit);       add (outputLabel);       add (resultLabel);       setPreferredSize (new Dimension(300, 75));       setBackground (Color.yellow);    } © 2004 Pearson Addison-Wesley. All rights reserved

FahrenheitPanel.java (Con’t)   //-----------------------------------------------------------------    // 온도 입력 필드를 위한 동작 감청자를 나타낸다.    //-----------------------------------------------------------------    private class TempListener implements ActionListener    {       //  텍스트 필드 내에서 입력 키가 눌러졌을 때 (온도) 변환을 수행한다.       public void actionPerformed (ActionEvent event)       {          int fahrenheitTemp, celsiusTemp;          String text = fahrenheit.getText();          fahrenheitTemp = Integer.parseInt (text);          celsiusTemp = (fahrenheitTemp-32) * 5/9;          resultLabel.setText (Integer.toString (celsiusTemp));       }    } } © 2004 Pearson Addison-Wesley. All rights reserved

Fahrenheit 예제 FahrenheitPanel 구성자 TempListener 내부 클래스 감청자를 실체화하고 텍스트 필드에 추가한다. TempListener 내부 클래스 텍스트 필드에서 발생되는 동작 이벤트를 위한 감청자를 정의한다. 사용자가 온도 입력하면 텍스트 필드는 액션 이벤트를 발생하고 감청자의 actionPerformed 메쏘드를 호출한다. actionPerformed 메쏘드 섭씨변환계산을 하여 결과 레이블(resultLabel)을 갱신한다. © 2004 Pearson Addison-Wesley. All rights reserved

요약(Summary) 4장 주요 내용: 클래스 정의 실제 데이터(instance data) 캡슐화와 자바 조정자(Java modifiers) 메쏘드 선언과 매개변수 전달(parameter passing) 구성자(constructors) 그래픽 개체(graphical objects) 이벤트와 감청자(listeners) 버튼 과 텍스트 필드(buttons and text fields) © 2004 Pearson Addison-Wesley. All rights reserved