4장. 자바의 객체 지향 프로그래밍
■ 객체 선언/사용/소멸
■ 클래스 선언
■ 멤버 변수 선언
■ 멤버 메소드의 선언과 작성
■ 멤버에 대한 접금 권한 설정
■ 서브 클래스와 슈퍼 클래스
■ 인터페이스의 선언과 구현
■ 패키지
4.1. Object
■ Object 선언 -> Object 생성 -> Object 사용
(1) 객체 선언
① 문법
클래스 이름 객체이름 ; |
② 예제
Date today ; |
(2) 객체 생성(instantiating an object) : 메모리 할당
① 문법
클래스 이름 객체이름 = new 클래스 이름( ) ; |
② 예제
Date today = new Date( ) ; |
③ new 연산자가 메모리 할당 역할
(3) 객체 초기화
① 클래스와 생성자는 같은 이름을 가진다.
클래스이름 객체이름 = new 생성자 ; Date today = new Date ( ) ; |
② 생성자는 반환형이 없다. void도 안됨.
생성자중 일부는 인수를 필요로 하기도 한다.
인수를 필요로 하지 않는 생성자 = 기본 생성자(default constructor)
③ Date MyBirthDay = new Date(1998 , 9 , 23);
인수
4.2 객체의 사용
■ 객체내 변수 사용
■ 객체내 메소드 호출
(1) 객체의 변수 이용 : Object.변수 이름
Rectangle rect = new Rectangle(0, 0, 150, 110); rect.x = 25; rect.y = 30; |
//예제프로그램 import java.applet.*; import java.awt.*; public class Rect extends Applet{ public void paint(Graphics g){ Rectangle rect = new Rectangle( 0, 0, 150, 110); int x1 = rect.x, y1 = rect.y; int x2 = rect.x + rect.width, y2 = rect.y + rect.height; g.drawLine(x1, y1, x2, y1); g.drawLine(x1, y1, x1, y2); g.drawLine(x2, y1, x2, y2); g.drawLine(x1, y2, x2, y2); rect.x = 25; rect.y = 30; x1 = rect.x; x2 = rect.x + rect.x + rect.width y1 = rect.y y2 = rect.y + rect.y + rect.height g.drawLine(x1, y1, x2, y1); g.drawLine(x1, y1, x1, y2); g.drawLine(x2, y1, x2, y2); g.drawLine(x1, y2, x2, y2); } } |
// HTML문서 <HTML> <HEAD> <TITLE> Rectangle Mode </TITLE> </HEAD> <BODY> <APPLET Code = "rect.class" width = 300 height = 300> </APPLET> </BODY> </HTML> |
(2) 객체의 메소드 호출 : Object.method( ) / Object.method(argument)
예 rect.move(25 , 30) |
4.3 객체의 소멸
■ 자바는 사용되지 않는 객체를 스스로 제거.
(1) 불필요한 객체 수집기(Garbage Collector)
① 객체에 할당한 메모리 주기 적으로 검사
② system이 한가할 때 수행
③ 강제 수행 : system.gc( ) 메소드 호출
(2) finalize( ) 메소드
① 자바에 의해 강제적으로 제거 당하는 것이 아니라, 객체 스스로 자신을 정상적으로 소멸 시키게 만들수
② finalize( )
-. 파일이나 네트워크 소켓과 같은 시스템 자원을 정상적으로 제거하는 코드제공
-. java.lang.Object 클래스의 한 멤버 메소드
-. 각각의 클래스 내부에서 finalize( ) 메소드를 override해야 한다.
4.4 클래스 선언
(1) 문법
class 클래스 이름{ 멤버변수 선언; 멤버함수 선언; } |
(2) 클래스 상태 <- 멤버변수
(3) 클래스 범위 <- 멤버함수
(4) 예제
class TicketoutHere{ Float price; String destination; Date departure Date; void signMeUp(Float ForPrice, String ForDest, Date ForDate){ price = ForPrice; destination = ForDest; departure = ForDate; } } |
4.5 멤버 변수 선언
(1) 문법
Date 형 변수이름 |
(2) 지역변수 / 멤버변수
① 지역 변수 : 메소드 내부에 선언
② 클래스 내부 : 메소드 바깥에 선언
(3) 동일한 이름의 멤버변수 / 멤버 메소드를 한 클래스 내에 선언 할 수 있다.
(4) 예제
class Farther{ int age; int age( ){ ... } } |
4.6 메소드 구현
■ 메소드 = 멤버 메소드
■ 변수 = 지역변수? / 멤버변수?
(1) 메소드 선언
① 문법
반환형 메소드 이름(인수 list){ 메소드 몸체 } |
② 예제
class Testmethod{ int a; boolean IsLarger( ){ if(a>10) return true else return false } } |
③ overloading
자바는 같은 이름의 메소드가 같은 클래스 내에 여러 존재하는 것을 허용한다
④ 클래스 이름과 메소드 이름이 같으면, 그 메소드를 생성자(constructor) 메소드라 한다.
⑤ 클래스는 자신의 슈퍼 클래스의 메소드를 오버라이딩(overriding)할 수 있다.
오버라이딩 메소드는 반드시 오버라이드하는 메소드와 동일한 이름의 인수형, 반환형을 가져야 한다.
(2) 인수(parameter)
//달의 날짜수 구하기(MonthSample.class) 예제 프로그램 class Month{ int Day(int month){ switch(month){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: return 28; } return -1; } |
class MonthSample{ static Month month_of_day = new Month( ); public static void main(String args[ ]){ int month = 10; System.out.print("Month : " + month + "==>" + month_of_day.Day(month)); } |
(3) 오버로딩(Overloading)
① 오버로딩 / 오버라이딩
② 메소드가 하는 일은 같지만, 인수의 데이터형이 다르면 각 데이터 형 마다 매번 다른 이름의 메소드를 만들어 사용하는 것은 비효율적.
③ 오버로딩 사용 않는 경우
class OverloadingClass{ void drawStr(String s){ } void drawInt(int I){ } ... } |
④ 오버로딩 사용하는 경우
class OverloadingClass{ void draw(String s){ } void draw(int I){ } ... } |
⑤ 오버로딩되는 메소드들은 반드시 반환형이 같아야
(4) 지역변수
① 메소드 내부에 선언된 변수
② 선언된 메소드가 수행 중인 동안에만 존재
③ 엄밀히 말하면 인수도 지역변수
(5) This
① 메소드의 인수와 멤버변수의 이름이 같아 혼동이 발생할 가능성이 있을 때, 객체의 멤버변수를 가리키기위한 this를 사용한다.
② 멤버변수 사용 1.
class Testmethod{ int a; boolean IsLarger( ){ if(a>10) return true else return false } } |
③ this 의 사용
class Testmethod{ int a; boolean IsLarger( ){ if(a>10) return true else return false } } class thisSample{ static Sample sam = new Sample( ); public static void main(String[ ] args){ sam.a = 5; if(sam.isLarger(10)System.out.print("Larger"); else System.out.print("Smaller or equal"); } } |
4.7 인스턴스 멤버와 클래스 멤버
(1) 인스턴스 변수와 클래스 변수
// 예제 프로그램 class Myclass{ int a; static int b; } class Member{ public static void main(String args[ ]){ MyClass first = new MyClass( ) ; MyClass second = newMyClass( ) ; first.a = 10; second = 20; System.out.print("Instance Variable"); System.out.print("First : " + first.a + "Second : " + second.a); first.b = 10; second.b = 20; |
System.out.print("Class Variable"); System.out.print("First : " + first.b + "Second : " + second.b); } } |
① 클래스의인스턴스를 생성할 때마다 그 객체 인스턴스 변수가 매번 생성
② 클래스 변수는 객체나 클래스 자신을 통해서만 사용 가능
③ Static 제한자가 붙지 않은 것은 기본적으로(default) 인스턴스 변수로 선언된 것
(2) 인스턴스 메소드와 클래스 메소드
4.8 클래스 멤버와 접근 제한
(1) specifier(제한자)
제한자 | 클래스 | 서브 클래스 | 패키지 | 모든 클래스 |
private | O | |||
protected | O | O | O | |
public | O | O | O | O |
package | O | O |
(2) 특정 specifier를 쓰지 않으면 package로 설정
4.9 생성자와 finalize()
(1) 생성자(constructor)
① 매소드
② 클래스 생성자의 이름은 클래스이름과 동일
③ 오버로딩(overloading) 허용
④ 예제 : Rectangle 객체의 생성자
public Rectangle () public Rectangle (int width, int height) public Rectangle (int x, int y, int width, int feight) public Rectangle (Dimension size) public Rectangle (Point location) public Rectangle (Point location, Dimension size) |
(2) finalize()
① 사용자가 선언한 class내에 작성하면 된다.
② 문법 : finalize() 선언
protected void finalize() throws throwable |
③ java.lang.Object 클래스에 이미 선언되어 있으므로 오버라이딩(Overriding)시키게 된다.
④ 상속받은 상위 class의 자원도 해제해야 하므로 상위 클래스의 finalize() 메소드를 호출해야 한다.
protected void finalize() throws throwable { // 현재 클래스가 점유하고 있는 자원 해제 ..... // 상위 클래스의 finalize() 호출 super.finalize() ; } |
4.10 서브 클래스 생성
(1) 문법
class Child extends Parent { ..... } |
Child란 이름의 새로운 클래스를 Parent 클래스의 서브 클래스로 생성
(2) 서브 클래스 만들기
Parent super class of "Child" class
Child sub class of "Parent" class
② 동시에 2개 이상의 슈퍼 클래스를 가질 수 없다.
③ 슈퍼 클래스의 변수와 메소드 상속
-. public이나 protected로 선언한 변수와 메소드만 상속받는다.
-. 접근 제한자가 선언되어 있지 않거나 package 로 선언된 경우 서브 클래스는 슈퍼클래스와 같은 패키지 안에 선언된 경우에만 변수와 메소드를 상속받을 수 있다.
④ 상속 불허
-. 서브 클래스의 변수나 메소드가 슈퍼클래스의 변수나 메소드와 같은 이름으로 선언된 경우에는 상속받을 수 없다.
-. 슈퍼 클래스의 변수나 매소드가 private로 선언된 경우 상속받지 못한다.
⑤ 오버라이드(Override) : 덮기
서브 클래스의 메소드와 슈퍼 클래스의 메소드 이름이 같을 때 슈퍼 클래스의 메소드를 오버라이딩한다고 함.
⑥ hide : 숨기기
서브 클래스와 슈퍼 클래스의 변수가 이름이 같을 때 슈퍼 클래스의 변수를 숨긴다(hide)고 함.
(3) 메소드 오버라이딩
① 서브 클래스는 슈퍼클래스로부터 상속받은 메소드를 완전히 무시하고 같은 이름의 새로운 메소드를 생성할 수 있다.
-> overriding(오버라이딩)
② 메소드 이름 뿐 아니라, 인수형과 반환형까지 동일하게 만들면 상속된 기존의 메소드는 없는 것처럼 완전히 무시
(4) super
① 서브 클래스 메소드가 슈퍼 클래스의 변수나 메소드를 사용할 때 사용
② 예제
class Parent { int a = 10 ; } class Child extends Parent { float a = 2.0 ; void TestMothod() { System.out.print("Child : " + a) ; System.out.print("Parent : " + super.a) ; } } class SuperSample { public static void main (String args[]) { Child child = new Child() ; child.TestMain() ; } } |
4.11 final 클래스, final 메소드, final 변수
(1) final 클래스
① 다른 클래스의 슈퍼 클래스가 될 필요가 없는 클래스
② 문법
final class FinalClass { ...... } |
③ final class로 선언하는 이유
-. 보안상
-. 완벽하기 때문에 더 이상 서브 클래스를 만들 필요가 없기 때문
④ 예 : java.lang 패키지에 있는 String 클래스
(2) final 메소드
① 서브 클래스다 오버라이딩(overriding)하는 것을 방지하기 위해 사용
② 문법
class NonFinalClass { final void finalMethod () { ...... } ...... } |
③ final 클래스가 아닌 클래스에서도 정의할 수
(3) final 변수
① 주로 상수(constant) 용도로 사용
② 프로그램을 통해 절대 변하지 않고 변해서도 안되는 상수를 선언할 때 사용
③ 이름은 보통 대문자로 구성됨
④ 문법
class NonFinalClass { final double PI = 3.14.15 ...... } |
⑤ final 클래스가 아닌 클래스에서도 정의할 수
4.12 abstract 클래스와 메소드
(1) abstract 클래스
① final 클래스와 반대
② 반드시 서브 클래스로만 사요되어져야 하는 클래스
③ 객체 생성 가능
④ 예 : 자동자 abstract class
-. 자동차 : abtract class
-. 프라이드, 티코, 그랜저 : 자동차 클래스의 서브 클래스
⑤ 문법
abstract class AbstractClass { ....... } |
(2) abstract 메소드
① abstract class에 정의된 아무 내용도 없는 메소드
② 반드시 abstract class 안에서만 선언되어야
③ 단순히 슈퍼클래스는 필요한 메소드 선언만 해두고 실제 구현(implement)은 서브 클래스에서 담당
④ 문법
abstract class GraphicObject { ..... void moveTo (int newX, int newY) { ..... } abstract void draw () ; } class Circle extends GraphicObject { void draw () { ..... } } |
⑤ 모든 abstract 클래스가 abstract 메소드를 가지는 것은 아니다.
4.13 Object 클래스
■ 바바 클래스 계층 구조의 맨 위
■ 자바에서 모든 클래스는 Object 클래스의 직간접적인 계승자
■ Object 클래스에 모든 객체가 반드시 가져야 하는 기본적인 상태(state)와 행위(behavior)가 정의되어 있다.
■ 기본적인 메소드
: equals(), toString(), getClass(), finalize(), notify(), notifyall(), wait()
(1) equals() 메소드
① 두 개의 객체가 동일한지 비교
② 예제
class equalsSample { public static void main (String args[]) { Integer one = new Integer(1) ; Integer two = new Integer(2) ; Integer another = new Integer(1) ; if (one.equals(two)) { System.out.print("Equal") ; } else { System.out.print("Not Equal") ; } if (one.equals(another)) { System.out.print("Equal") ; } else { System.out.print("Not Equal") ; } } } |
③ 동일한 객체가 아니라, 객체가 가지는 값이 동일하다는 의미
(2) toStrinf() 메소드
① 객체의 문자열 표기를 반환
② 예제
class toStringSample { public static void main (String args[]) { System.out.print(Thread.currentTread().toString()) ; System.out.print(new Integer(44).toString()) ; } } |
③ 디버깅으로 매우 유용
(3) getClass() 메소드
① final 메소드로 overriding이 안 됨.
② 현재 실행 중인 객체의 클래스 형 객체를 반환
-. 반환된 객체를 이용하면 그 클래스에 대한 다양한 정보를 얻을 수 있다.
-. 클래스 이름
-. 클래스의 슈퍼클래스
-. 클래스가 구현한 인터페이스 이름
③ 예제
void PrintClassName(Object obj) { System.out.print("Object's Class Name : " + obj.getClass().getName()) ; } |
4.14 인터페이스(Interface)
(1) 인터페이스 선언
① 문법
[public] interface InterfaceName [extends listOfSuperInterface] { 인터페이스 몸체 } |
② public
: 다른 패키지에 속한 다른 클래스가 사용할 수 있도록 한다.
③ extends
-. 다른 인퍼이스를 확장할 때 사용한다.
-. 슈퍼 인터페이스 / 서브 인터페이스
-. 슈퍼인터페이스의 리스트는 콤마(,)로 연결되어진다.
-. 인터페이스의 extends 확장이란?
: 슈퍼인터페이스들의 모든 메소드와 상수를 상속받는다.
: 단, 동일한 이름의 상수나 메소드는 현재 인터페이스에서 재정의된다.
-. 인터페이스의 extends와 클래스의 extendds의 차이
④ 인터페이스 몸체
-. 메소드 선언 / 상수 선언
-. 예
interface Baseball { int PLAYER = 9 ; void homerun(Object Player) ; void hitrate(Object Player) ; void steal(Object Player) ; } |
-. 상수 : 묵시적으로 public, static, final
-. 메소드 : 묵시적으로 public, abtract
-. 상수 메소드는 transient, volatile, synchronized로 선언할 수 없다.
-. private, protected 접근 제한자를 붙일 수 없다.
(2) 인터페이스 구현
① 인터페이스에서 선언된 메소드들의 구현은 클래스에서
② class 선언
[modifier] class ClassName [extends SuperClass] [implements Interfacelist] { 클래스 몸체 } |
③ 클래스를 선언할 때 구현할 인터페이스를 함께 기술한다.
-. 구현할 인터페이스는 여러개일 수 있다.
-. 인터페이스가 여러개 일 경우에는 그 인터페이스들의 이름을 콤마(,)로 구분해 표기한다.
④ 일반적으로 extends 뒤에 implements를 표기한다.
⑤ 예제
class BaseballClass implements Baseball { void homerun (Object Player) { .... } void hitrate (Object Player) { .... } void steal (Object Player) { .... } } |
(3) 데이터 형으로의 인터페이스
① 자바에서 지원하는 데이터형
-. 기본 데이터형
-. 레퍼런스 데이터형
② 인터페이스가 데이터형으로 사용
③ 예제
class Payment { private Baseball [] Player ; .... void Clac_Pay (Baseball man, int index) { .... } } |
-. Player 배열 변수는 Baseball 인터페이스가 구현(implement)할 모든 클래스를 포함 가능
-. Baseball 인터페이스를 구현한 모든 클래스가 Calc_Pay메소드의 첫 번째 인수가 될 수
4.15 패키지(Package)
■ 숙련된 프로그래머들은 서로 관련이 있는 객체들을 클래스 라리브러리의 형태로 함께 묶어 관리한다.
■ 클래스 라이브러리 in Java = Package
■ 패키지를 만드는 방법 / 패키지에 있는 클래스를 사용하는 방법
■ 자바에서 기본적으로 제공하는 패키지
(1) 패키지
① 그래픽 객체 : 원(Circle), 사각형(Rectangle), 선(Line), 점(Point)
② interface : Draggable
③ graphics 패키지 : 그래픽 객체 + 인터페이스
(2) 패키지 생성
① 클래스의 이름이 같아질 수 있다.
② graphics.Line
: 패키지 이름을 앞에 붙이므로 동일 이름에 의한 충돌 위험이 없어진다.
③ 문법
package 패키지 이름 ; |
④ 예제
package graphics ; interface Draggable { ..... } class Circle { .... } class Rectangle { .... } class Line { .... } class Point { .... } |
(3) 패키지 사용
① import
② import 문은 반드시 소스 코드 맨 처음에
③ 문법
import 패키지이름.class이름 import 패키지이름.* ; |
④ public으로 선언된 클래스만 패키지 외부 클래스에서 사용할 수 있다.
⑤ 동일 이름의 클래스가 여러 패키지에 존재할 수 있으므로 클래스에 패키지 이름을 반드시 명시
import java.awt.* ; import java.graphics.* ; // 두 패키지 안에 Rectangle이 들어 있다. Rectangle ret ; // 어느 package의 class인지 모호 graphics.Rectangle rect ; |
4.15 자바 패키지(Package)
(1) 자바 언어 패키지(java.lang)
① 핵심적인 패키지
② 기본 데이터형처럼 가장 기본적인 객체를 포함
(2) 자바 입출력 패키지(java.io)
① 파일, 키보드 등 디바이스에 독립적인 입출력을 담당
② java.lang과 java.io는 명시하지 않아도 자동적으로 import됨
(3) 자바 유틸리티(java.util)
① 유틸리티 클래스 포함
② 시스템 날짜 유틸리티, 난수 발생 유틸리티
(4) 자바 네트워킹 패키지(java.net)
① 네트워크 기능 포함
② WWW의 URL에 연결하는 기능. 다른 컴퓨터와 통신 세션을 여는 기능
③ 자바는 네트워크 통신을 위해 TCP/IP 프로토콜을 사용
(5) 애플릿 패키지(java.applet)
애플릿에 필요한 기본적인 기능을 제공하는 클래스 포함
(6) Abtract Window Toolkit 패키지(java.awt, java.awt.image, java.awt.peer)
① java.awt
-. 디바이스에 독립적인 방법으로 그래픽 윈도를 생성, 조작하는 클래스 제공
-. 윈도우, 버튼, 스크롤바 등과 같이 그래픽과 관련된 클래스
② java.awt.image
: 이미지 처리에 필요한 클래스와 인터페이스 제공
③ java.awt.perr
: 모티프(Motif), MS 윈도(MS Window)와 같은 기계 종속적인 윈도 시스템을 기계 독립적인 윈도 시스템과 연결해 주는 클래스와 인터페이스 제공
오늘의 예제 프로그램1. 0.05초마다 녹색공이 왼쪽에서 오른쪽으로 이동(Ball. class)
impont java.awt.*; impont java.applet.*; public class Ball Exends Applet implements Runnable { Thread MyThread = null; int x = 10; public void init() { resize (800, 100); } public void start(){ iF (MyThread == null) { MyThread = new Thread(this); MyThread.start(); } } public void stop () { iF( MyThread !=null) { MyThread.stop(); MyThread =null; } } public void run() { while (true) { if (x<800> x +=8; else x =10; repaint (); try { Thread.sleep (50); } Catch (java.lang.InterruptedEx-ception e) {} } } public void paint (Graphics g) { g. setColor (Color.green); g. fill)Oval (x, 15, 50, 50); } } |
<HTML> <BODY> <APPLET CODE = "Ball.class" WIDTH=283 HZIGHT=190> </APPLET> </BODY> </HTML> |
오늘의 예제 프로그램2 Ball 에플릿에 버튼을 추가하여 Basll의 색을 변경
impont java.awt.*; impont java.applet.*; public class BallButton Exends Applet implements Runnable { Thread MyThread = null; int x = 10; Button button1, button2, button3 ; int select_button = 0 ; public void init() { resize (800, 100); button1 = new Button("red") ; button1.setFont ( new Font ("Dialog", Font.BOLD, 14)) ; button1.addActionListener(this) ; add(button1) ; button2 = new Button("Yrllow") ; button2.setFont ( new Font ("Dialog", Font.BOLD, 14)) ; button2.addActionListener(this) ; add(button2) ; button3 = new Button("red") ; button3.setFont ( new Font ("Dialog", Font.BOLD, 14)) ; button3.addActionListener(this) ; add(button3) ; } public void actionPerformed (ActionEvent e) { String arg = e.getActionCommand() ; if ("Red".equals(arg)) { RedButton() ; } else if ("Blue".equals(arg)) { BlueButton() ; } else { YellowButton() ; } } public void RedButton () { select_button = 1 ; Setbackground (Color.red) ; repaint() ; } public void BlueButton () { select_button = 2 ; Setbackground (Color.Blue) ; repaint() ; } public void YellowButton () { select_button = 3 ; Setbackground (Color.Yellow) ; repaint() ; } |
public void start(){ iF (MyThread == null) { MyThread = new Thread(this); MyThread.start(); } } public void stop () { iF( MyThread !=null) { MyThread.stop(); MyThread =null; } } public void run() { while (true) { if (x<800> x +=8; else x =10; repaint (); try { Thread.sleep (50); } Catch (java.lang.InterruptedEx-ception e) {} } } public void paint (Graphics g) { g. setColor (Color.green); g. fill)Oval (x, 15, 50, 50); } } |
4.16 과제 : 용어 조사
마감 : 10월 9일 (금) 오후 10시까지
과제 작성 요령 : 지난번 UNIX System 용어 조사 과제와 동일
API applet AWT break point buffer cast check box core loader clipping rectangle constructor container control critical section data hiding debugger destructor event exception finaliizer frame HTTP HTML IDE(Integrated Development Environment) imge map inheritance instance instantiation ISP(Internet Service provider) JDBC | JDK(Java Development Kit) JPEG/JPG Java Virtual Machine layout member member variable member function thread threading multi-thread multi-threading nesting ODBC(Open DataBase Connectivity) signature SQL throuwable thumb trusted applet untrusted applet URL(Uniform Resource Locator) SPAM SPAM mail wizard overload override package panel project RAD(Rapid Application Development) redering |
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.