레이블이 adapter pattern인 게시물을 표시합니다. 모든 게시물 표시
레이블이 adapter pattern인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 9일 금요일

[오라클자바커뮤니티, 자바닷넷강좌]Object Oriented 객체 지향 이란?(이론)

-------------------
객체 지향 패러다임
------------------- 

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


 
S/W개발을 기능별로 나누는 것이 아니라 객체 단위로 분리하는 것. 객체지향 기법은 data(객체)를 중심으로 system을 바라보고 이를 system 개발에 적용하겠다는 것

객체란 데이터와 그 데이터를 처리하는 여러 개의 기능들을 하나의 단위로 묶은 것으로, 외부에 블랙박스 형태로 보인다. 즉 입력과 출력 부분만이 노출이 되고 내부적인 처리 과정은 완전히 밀폐되어 있으며, 외부에서 알 필요도 없는 것

소프트웨어 공학과 프로그래밍 언어에 관한 이론 중에서 객체지향적 분석(Object-Oriented Analysis)이나 객체지향적 설계(Object-Oriented Design) 그리고 객체지향 프로그래밍 언어(Objected-Oriented Language)와 같이 객체지향에 관련된 모든 것을 통틀어 말한다

기존의 프로시저 기반의 구조적 프로그래밍(C나 Pascal과 같은 명령형 패러다임)에서는 프로그램 내에서 일어나는 모든 변화와 동작, 사건 등을 프로그래머가 직접 기술하는 형태로 프로그램을 기술했지만 객체지향 프로그래밍에서는 똑똑한 객체에게 자신이 원하는 일을 해달라는 메시지를 전달하는 형태로 프로그램을 기술한다

기존 시스템들은 절차 중심적으로 개발되어진 경우가 많아서 유지 보수 단계에서 많은 어려움을 겪고 있는 반면, 객체 지향 패러다임은 재사용성, 확장성 등의 특성을 내포하고 있어 유지 보수 단계를 용이하게 해 준다.

객체들 사이의 인터페이스를 위해 사건(또는 메시지)들을 주고받는데 기존의 방법보다 더 실행 시간을 요할 수 있다. 깊은 클래스 계층 구조가 있는 경우와 system 작동 중 객체에 대한 동적 할당과 제어시 성능에 대한 문제가 제기될 수도 있다.

객체지향 기법은 data보다는 성능을 중요시하며, 많은 계산을 요하는 system에서는 적합지 않을 수 있다. 실시간 반응을 해야하는 system의 경우 객체지향 기법을 적용하는 것이 이를 통해 얻을 수 있는 이점보다 성능 등에 대한 부담이 높아져 허용되는 한계(예: 반응시간) 를 넘을 수도 있다. 군사용 미사일 제어 system이나 병원의 환자 상태 관리 system 등이 그 예가 될 수 있다.

컴포넌트가 21세기 정보기술(IT) 산업의 지각변동을 몰고 올 새로운 패러다임으로 급부상하고 있다.

SW를 이제까지처럼 계획, 설계, 분석, 구현, 테스트하는 순차적인 개발과정으로 보는 것이 아니라 레고블록이나 자동차 부품처럼 조립하는 개념으로 간주하며 컴포넌트 SW는 레고블록을 쌓는 것처럼 일단 표준화된 프레임워크와 규칙을 기반으로 만들어진 기능별 SW를 필요한대로 조립하면 원하는 SW를 만들 수 있다. 개발이나 유지보수에도 특별한 노력이 요구되지 않으며 표준화, 규격화를 지향하기 때문에 SW 품질도 눈에 띄게 좋아진다.

현재 국내 신생업체들을 중심으로 자바 컴포넌트 기술을 이용해 상용 애플리케이션을 개발하는 사례가 늘고 있으며 특히 전사적자원관리(ERP) 시스템에서부터 개발툴, XML 솔루션, 검색엔진, 통신용 SW, 인터넷 구축툴, 언어처리 모듈, 지식관리(KM), 고객관리(CRM) 등의 분야에 이르기까지 다양한 분야에서 개발이 진행되고 있다.

컴포넌트의 특장점은 인터넷이라는 환경의 부상으로 더욱 강력한 위치를 차지하게 됐다. 인터넷은 모든 업무를 빠르게 변화시키고 있으며 표준화할 것을 요구하고 있으며 이러한 업무를 지원하는 SW 및 정보시스템도 표준에 기반해 빠른 변화를 수용해야만 하는데 이러한 요구에 가장 부합하는 것이 바로 컴포넌트 개념이다.

Object : 시스템의 관점에서 본다면 어떤 상태(state)를 나타내는 데이터의 구조와 동작을 수행하는 연산(operation)으로 이루어진 프로그램의 한 요소이다. 여기서의 연산을 객체지향에선 메소드(method)라고 한다. 이렇게 객체의 상태는 데이터에 의해 결정되고 동작은 메소드에 의해 결정된다.

Message : 홀로 존재하는 객체는 아무런 의미가 없다. 대부분의 객체는 무언가를 실행하기 위해서 다른 객체를 필요로 한다. 이러한 상호 작용은 메시지를 통해 이루어진다.

Class : 모든 객체는 반드시 클래스를 통해서만 정의될 수 있다. 클래스는 객체의 타입을 정의하는 템플릿(template)으로서, 여러 객체의 공통적인 속성(attribute)과 메소드(method)를 가지고 있는 클래스가 먼저 정의되면, 이 클래스를 통해서 다시 객체가 정의되는 것이다.한 클래스에 속하는 각각의 객체를 그 클래스의 인스턴스(instance)라고 한다.


클래스(Class)
어떤 종류의 모든 객체들에 대해 일반적으로 적용할수 있는 변수와 메소드를 정의하고 있는 설계도 또는 프로토타입 이다.
사용자 정의 자료형, 객체의 자료형
Field라는 변수와 오퍼레이션을 가하는 method 로 이루어짐
클래스의 이름은 대문자로 시작, 다음 단어의 시작은 대문자

객체(Object)
클래스의 인스턴스는 new 수식에 의해 만들어지며 이것이 객체이다.
타입이 클래스인 변수
이름은 소문자로 시작, 다음 단어의 시작은 대문자


•추상 데이타 타입(ADT;abstract data type)
–클래스를 이용하여 표현

•상속(inheritance)
–동적 바인딩(dynamic binding) cf) Static binding
–한 클래스를 확장하여 새로운 클래스를 만드는 것을 말한다. 이렇게 새로 만들어지는 클래스를 하위클래스(SubClass)라고 부른다. 그리고 원래의 클래스는 상위클래스(SuperClass)라고 부른다.
–자바의 모든 클래스는 상속의 대상이 되는 상위클래스(SuperClass)가 반드시 하나 존재한다
–프로그램의 재사용성과 확장성을 높인다.
–하위 클래스는 상속된 필드와 메쏘드 중에 private으로 선언된 것이 아닌 것에만 접근할 수 있다.



객체지향의 핵심 내용

연관(Association)
객체 또는 클래스가 다른 객체 또는 클래스와 ‘어떤 의미의’ 관계를 가질 수 있다.

집합연관(Aggregation)
순수 연관(Association)은 두 동료 클래스, 객체간의 구조적 관계
하나의 객체가 다른 객체들의 조합에 의해 만들어 짐
전체/부분 관계를 모델링 하는 경우 한 클래스는 더 큰 것을(“전체”) 대표하고 그것은 더 작은 것들(“부분”)로 이루어져 있다. Ex)회사와 부서의 관계
전체”와 “부분”의 개념적 관계(“whole-part of”)
Component는 집합체와는 별개로 독립적으로 존재 할 수 있다.(nonexclusive ownership )


복합연관(Composition)
단순한 집합연관은 전적으로 개념적이며 “전체” 와 “부분”을 구분 하는 것 이상의 어떤 것도 수행하지 않는다.
일종의 집합연관으로 전체는 강력한 소유권을 가지며  부분/전체는 동시적 일생을 산다.(“cascading delete”)
(Window : Frame, 책상 : 서랍, 책상 : 다리)
전체는 부분에 대한 책임을 진다. 바꿔 말하면 전체는 부분을 생성시키고 소멸시킨다.
“부분”은 어느 시점에 하나의 “전체”에 속한다.
Component는 집합체와는 별개로 독립적으로 존재 할 수 없다.(exclusive ownership )
전체의 다중성은 0 또는 1(0..1), 부분의 경우는  어느것이 와도 관계 없다(0..*)



상속과 Composition
상속과 컴포지션은 동전의 양면과 같이 유사하게 서로에게 관련이 있다.
상속은 마치 양파가 여러 껍질로 이루어진 것과 같이 계층화된 객체
컴포지션은 여러 재료(객체)가 한데 뭉쳐서 만들어진 죽
컴포지션은 개체들간의 'has a' 관계, 상속은 ‘is a’관계
상속과 컴포지션은 상호 배타적이지 않으며 개발자는 이 둘을 같이 사용한다.


다형성
•다형성(polymorphism)
–상속을 받은 것을 그대로 사용하지 않고 입맛에 맞게 바꾸어 줄 수 있도록 하는 것
–다형성을 위해 자바에서는 메소드 overriding 과 메소드 overloading을 제공 한다.
–상속계층 상에서 어떤 객체의 어느 메소드를 호출할 것인지를 결정하는 객체의 능력을 다형성 이라 한다.
–사인곡선을 그리는 함수가 있다고 할 때 사용자는 파라미터로 radian이나 degree값을 넣게 되지만 둘 다 처리할 수 있다. 이것은 sine(int degrees)나 sine(float Radians)와 같이 동일 이름의 함수가 다른 파라미터로 두 번 선언되었기 때문이다.


다형성(polymorphism)
Overloading : 동일한 함수의 이름 사용 가능, 같은 클래스 내에 같은 이름의 생성자나 메소드를 사용하는 행위,매개변수의 개수와 타입이 달라야 한다

Overriding : 상위 클래스에서 정의된 함수를 하위 클래스에서 재 정의, 기존 클래스의 메소드 구현 부분만 약간 변화시켜 새로운 클래스를 생성할 수 있다. 매개변수의 개수와 타입이 같아야 한다.
 
상위 클래스로부터 메소드를 상속받을 때, 서브클래스 내에 같은 이름의 메소드가 있는 경우에 Signature가 다르면 중복(overloading)이 되고 Signature가 같으면 재정의(overriding)가 된다.

Template : 타입을 인자로 하여 새로운 타입을 생성



캡슐화(encapsulation)
객체는 자신이 수행하는 모든 행동과 속성을 다른 객체와 외부 세계에는 보이지 않는다
객체 자신의 Operation을 수행하고 결과를 내놓지만 그 Operation의 동작 원리는 숨기는 것이다.
높은 모듈성과 정보은닉을 제공



추상클래스
추상클래스는 어떠한 클래스를 만들기 위해 미리 정의해 둔 클래스의 틀을 의미한다. 앞에서 작성한 Employee(직원)클래스와 직원의 하위 클래스를 예로 든다면 직원이라는 클래스는 프로그래머(Programmer), 디자이너(Designer), 프로그램팀장(ProgrammerChief)등을 만들기 위해 작성된 클래스라고 할 수 있다. 사실 직원이라는 클래스는 실제 회사의 프로그램을 개발한다고 했을 때 사용해서는 안되는 클래스라고 할 수 있다. 왜냐하면 A라는 회사에 직원 중 어느 부서에 해당되지 않고 자기 마음대로 회사를 출근하고 퇴근하는 직원은 존재하지 않을 것이기 때문이다. 하지만 Employee 라는 클래스가 존재하는 이상 일반 사용자에게 메뉴얼을 작성해 “Employee 클래스는 다른 특정직원 클래스를 만들기 위한 클래스입니다.”라고 하기 전에는 Employee의 본래의미를 모르고 Employee 의 객체를 생성하여 사용할 수 있다. 물론 이 것은 원래 개발을 한 개발자의 의도와는 상관이 없는 잘못된 사용이지만 이를 막을 수 없는 것이다. 즉 다음과 같은 소스 코딩을 막을 수 없다.
        Employee s1 = new Employee("홍길동", “12345");     
        s1.gotoTheOffice();

만약 Employee 클래스는 사용하기 보다는 다른 클래스에 상속되여 새로운 직원 클래스를 만드는 것이 바람직하다는 의미를 소스 코드에 부여한다면 개발자의 Employee 클래스 개발 의도를 사용자가 쉽게 알 수 있게 될 것이다. 이 때 사용되는 키워드가 abstract 키워드이다. 이 키워드가 클래스에 붙으면 이 클래스는 추상클래스라는 의미이다.


앞서 작성한 Emplopyee 클래스에는 없지만 이를 상속받은 모든 클래스에서 정의하고 재정의하여 사용하고 있는 startJob 이라는 메소드를 Employee에서 추상메소드로 선언하여 정의할 수 있다
       
상속의 개념으로만 본다면 이러한 추상클래스는 굳이 만들 필요가 없다. 추상클래스가 아니더라도 위와 같은 상속과 메소드의 재정의는 얼마든지 가능하기 때문이다. 하지만 수퍼타입(super type)을 이용한 다형성(Polymorphism)의 측면에서 추상클래스(Abstract Class)는 유용하게 쓰일 수 있다.
       
A라는 직원이 회사에 입사했는데 처음에는 디자인팀에 있다가 얼마 후 프로그램개발팀로 소속을 옮기게 되었다. 그러다가 경력을 쌓아 프로그램개발팀장으로 까지 진급하게 되었다. 이렇게 한 사람의 직원은 시간에 따라 때로는 상황에 따라 여러가지 모습으로, 여러가지 업무를 담당하게 된다. 바로 이런 것을 가능하도록 객체를 설계하는 것이 바로 다형성의 구현이다. 즉 실생활의 회사 직원처럼 상황과 시간에 따라 여러가지 모습을 지니는 다형성을 구현할 수 있게 되는 것이다. 모든 직원의 하위클래스들을 수퍼 타입(상위클래스)로 형변환하면 가능하다.

클래스는 필드로 기본자료형, 클래스 등이 올 수 있지만 인터페이스는 int, double 등의 기본 자료형만이 필드로 사용될 수 있다. 또한 각 필드는 반드시 초기화가 되어야 한다. 초기화가 되어야 하는 이유는 인터페이스의 필드는 암시적으로 final과 static이 설정되어 있기 때문이다.

        int maxSmall = 5  à static final int maxSmall = 5;

인터페이스는 메소드를 선언만 하고 구현하지는 않는다. 그리고 인터페이스의 모든 메소드는 접근지정이 기본적으로 public으로 설정된다. 그리고 모든 메소드는 추상메소드이다. 즉 아래의 void driveSmallCar();라는 선언은 암시적으로 설정되는 public과 abstract 키워드를 추가하면 다음과. 같이 선언되어 있는 것과 같다.

                public abstract void driveSmallCar();

인터페이스
추상메소드로 이루어진 클래스라 할 수있다.
Interface와 구현(implementation)의 분리
다중상속의 일부 기능 지원(한가지 인터페이스로 여러 구현을 실행할 수 있다)
인터페이스의 모든 메소드는 자동적으로 public abstract이다
인터페이스의 모든 변수는 자동적으로 public static final이다.
객체의 Instance를 생성할 수 없음
메소드의 구현을 갖지 않으며, 몸체부분은 세미콜론으로 대체된다.
클래스가 인터페이스를 구현하게 되면 인터페이스 내에 정의된 상수는 상속된 것 처럼 직접 사용할 수 있다.


인터페이스와 추상 클래스
추상메소드를 가지고 있고 이를 상속받거나 구현하는 클래스는 이 추상 메소드를 재정의하고 구현해야 한다는 점, 그리고 다형성을 구현하는 방법이라는 점, 메소드들이 동적으로 바인딩 된다는 점들은 비슷하다.
       
차이점
- 인터페이스는 서로 연관성이 없는 클래스들에 의해 구현될 수 있고 따라서 수평적인 구현이 가능하지만 추상클래스의 경우 단일 상속 개념 하에 수직적인 구조로 상속을 해야만 한다.

- 인터페이스에서는 메소드를 선언만 할 수 있으며 구현할 수 없다. 그리고 이 구현은 인터페이스를 구현하도록 설정된 클래스에서 가능하다. 하지만 추상클래스의 경우에는 추상 클래스 내부에서 메소드의 선언과 구현이 모두 가능하며 또한 이를 상속 받은 클래스에서도 재정의가 가능하다.

[OracleJava Community, 오라클자바커뮤니티닷넷교육].NET Framework CTS

이번 강좌에서는 C#에서의 변수에 대해 알아 보자구요~ 크게 두가지 정도로 구분 합니다. 실제 그값을 가지고 있는 Value-Type , 가지고 있는것이 값이 아니고 무언가를 참조하는(포인터 변수처럼) 변수인 Reference-Type 두가지로 구분 합니다. 먼저 그러한 데이터 타입을 제공하는 닷넷 프레임웍의 CTS(Common Type System) 에 대해 알아 보도록 하겠습니다.



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




----------------------------
CTS(Common Type System
----------------------------

• CTS supports object-oriented and Procedural languages.
• CTS supports both value and reference types

좀더 알아보면 CTS 는 닷넷 프레임워크에서 동작하는 모든 프로그래밍 언어(C#, VB.Net, J#)들이 쪽같은 데이터형식을 사용하도록 해주는 것입니다.
(System.Int32라는 클래스는 CTS에서 제공하는 int 형입니다. 이것은 닷넷에서의 어떠한 개발언어에서도 사용이 가능 합니다.)
모든 데이터형식들은 기본적으로 객체에서 파생되었으며 Value type 은 객체 형식을 포장 (sealing) 해 놓은 개념 입니다.


-----------------------------
Value-Type, Reference-Type
-----------------------------

Value-Type
CTS 에서는 value type 과 reference type 을 지원하는데 Value type 변수들은 데이터를 직접 가지고 있습니다 .예를들어 int i=10 이라고 쓰면 i 변수에는 10 이 직접 들어 있는 것입니다. int j=i 라고 하면 i 의 값이 j에 복사되어 들어 가는 것입니다.(다아시는거죠^^), 자바에서의 기본 자료형과 같은 겁니다. Value-Type은 Built-in Type과 User-Defined Type 두가지가 있습니다. int, long, float, double 등은 Built-in Type 이고 struct, enum등은 User-Defined Type 입니다.

Reference-Type
데이터를 직접 저장하는 것이 아니라 레퍼런스(참조값)을 저장 합니다.(Store references to their data) 그러므로 두개의 레퍼런스형 변수는 같은 데이터(오브젝트)를 지칭하는 것이 가능 합니다.( Two reference variables can reference same object) 물론 같은 것을 서로 쳐다 볼수 있으므로 한쪽에서 변경을 하면 다른쪽은 스스로 변경을 안했어도 나중에 값을 꺼내 보면 당연히 바뀌어져 있겠죠^^;(Operations on one can affect another)

-------------------------------
Built-in Data Type
-------------------------------
정수형
예약어구조체형식크기 (Bit)범위
sbyteSystem.Sbyte8-128~127
byteSystem.Byte80~255
shortSystem.Int1616-32,768~32,767
ushortSystem.UInt16160~65,535
intSystem.Int3232-2,147,483,648 ~2,147,483,647
uintSysten.UInt32320~4,294,967,295
longSystem.Int6464-(2^63) ~ 2^63-1
ulongSystem.UInt64640~ 2^64-1

실수형, 기타
예약어구조체형식크기 (Bit)범위
실수형
floatSystem.Single321.5x10^-46 ~3.4x10^38 
doubleSystem.Double645.0x10^-324 ~1.7x10^308
decimalSystem.Decimal1281.0x10^-28 ~7.9x10^28 
기타
charSystem.UInt1616유니코드 1 자
boolSystem.Int3210 또는 1

Boolean 
boolean type 이 가질 수 있는 값은 true 와 false 입니다. 예 ) bool b = true --> true 는 1 과는 다르며 , 마찬가지로 false 는 0 과는 다릅니다. (C 에서는 TRUE, FALSE 를 #define 을 통해 정의하여 사용 했었습니다.. 정수를 암묵적으로 boolean 형으로 사용한 것이죠.), true 와 false 로 산술 연산을 할 수 없으며 오로지 논리 연산자를 가진 수식에 대해서만 사용가능 합니다.

변수 선언 하는 방법
int itemCount;
int itemCount , employeNumber; ( Possible to declare Multiple variables in one)
int employeeNumber; employeeNumber = 23;
int employeeNumber= 23;
또한 Charater형은 다음과 같이 선언 합니다. char middleInitial= ‘J'; C#은 유니코드를 사용하며 char형은 한 문자를 저장하는데 사용 합니다.
Itemcount = Itemcount + 40; --> ItemCount += 40; --> 이건 다아시죠...

연산자(Operator)
구분연산자
기본 연산자(x), ., f(x), a[x], x++, x--, new, typeof, sizeof, checked, unchecked
단항 연산자+, -, !, ~, ++x, --x
산술 연산자+, -, *, /, %
쉬프트 연산자<><, >>
비교 연산자<, >, <=, >=, is
비트 연산자&, ^, |
논리 연산자&&, ||
조건 연산자?:
할당 연산자=, *=, /=, %=, +=, -=, <><=, >>=, &=, ^=, |=

[isOperator 예제] is연산자는 런타임시 주어진 타입과 객체가 서로 호환이 되는지를 검사하는 연산자 입니다. 또한 as 연산자는 Type을 변환하는데 변환이 되면 변환 시키고 변환이 안되면 NULL을 돌려 줍니다...(참고하세요~)
//is 연산자 예제
using System;
class isOperator {
static void Main() {
//C#은 모든 타입을 객체로 처리한다.
//System.Int32의 BaseType은 System.ValueType이다.
//System.Object > System.ValueType > System.Int32
int i=0;
object o;
Console.WriteLine("i is int? {0}", i is int);
Console.WriteLine("i is long? {0}", i is long);
if (i is object) {
o = i;
Console.WriteLine("o의 Base Type은 " + o.GetType().BaseType);
}
}
}

---------------------------------------------
모든 Object(객체)들이 가지는 메소드
---------------------------------------------
객체 지향 프로그래밍을 하는것은 객체를 많이 다른다는 이야기 입니다. 이번에는 참고로 모든 객체들이 가지고 있는 기본적인 메소드가 어떤것이 있는지 필요한것만 보도록 하겠습니다. 닷넷에서는 System.Object가 모든 객체의 최상위 클래스 입니다. (물론 자바에선 java.lang.Object 입니다.)
메소드명설명
bool Equals()같은 객체인지 비교, 동일한 메모리 공간을 차지해야...
int GetHashCode()해쉬값을 얻음
Type GetType()Type 에 관한 정보(형식 정보)를 돌려 줍니다.
string ToString()객체를 대표하는 문자열 반환, 일반적으로 문자열로 변환한다고 보면 됩니다.

CTS(Common Type System)와 C#의 자료형(Value-Type, Reference-Type), 오라클자바커뮤니티닷넷교육, 자바교육

이번 강좌에서는 C#에서의 변수에 대해 알아 보자구요~ 크게 두가지 정도로 구분 합니다. 실제 그값을 가지고 있는 Value-Type , 가지고 있는것이 값이 아니고 무언가를 참조하는(포인터 변수처럼) 변수인 Reference-Type 두가지로 구분 합니다. 먼저 그러한 데이터 타입을 제공하는 닷넷 프레임웍의 CTS(Common Type System) 에 대해 알아 보도록 하겠습니다.



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




----------------------------
CTS(Common Type System
----------------------------

• CTS supports object-oriented and Procedural languages.
• CTS supports both value and reference types

좀더 알아보면 CTS 는 닷넷 프레임워크에서 동작하는 모든 프로그래밍 언어(C#, VB.Net, J#)들이 쪽같은 데이터형식을 사용하도록 해주는 것입니다.
(System.Int32라는 클래스는 CTS에서 제공하는 int 형입니다. 이것은 닷넷에서의 어떠한 개발언어에서도 사용이 가능 합니다.)
모든 데이터형식들은 기본적으로 객체에서 파생되었으며 Value type 은 객체 형식을 포장 (sealing) 해 놓은 개념 입니다.


-----------------------------
Value-Type, Reference-Type
-----------------------------

Value-Type
CTS 에서는 value type 과 reference type 을 지원하는데 Value type 변수들은 데이터를 직접 가지고 있습니다 .예를들어 int i=10 이라고 쓰면 i 변수에는 10 이 직접 들어 있는 것입니다. int j=i 라고 하면 i 의 값이 j에 복사되어 들어 가는 것입니다.(다아시는거죠^^), 자바에서의 기본 자료형과 같은 겁니다. Value-Type은 Built-in Type과 User-Defined Type 두가지가 있습니다. int, long, float, double 등은 Built-in Type 이고 struct, enum등은 User-Defined Type 입니다.

Reference-Type
데이터를 직접 저장하는 것이 아니라 레퍼런스(참조값)을 저장 합니다.(Store references to their data) 그러므로 두개의 레퍼런스형 변수는 같은 데이터(오브젝트)를 지칭하는 것이 가능 합니다.( Two reference variables can reference same object) 물론 같은 것을 서로 쳐다 볼수 있으므로 한쪽에서 변경을 하면 다른쪽은 스스로 변경을 안했어도 나중에 값을 꺼내 보면 당연히 바뀌어져 있겠죠^^;(Operations on one can affect another)

-------------------------------
Built-in Data Type
-------------------------------
정수형
예약어 구조체형식 크기 (Bit) 범위
sbyte System.Sbyte 8 -128~127
byte System.Byte 8 0~255
short System.Int16 16 -32,768~32,767
ushort System.UInt16 16 0~65,535
int System.Int32 32 -2,147,483,648 ~2,147,483,647
uint Systen.UInt32 32 0~4,294,967,295
long System.Int64 64 -(2^63) ~ 2^63-1
ulong System.UInt64 64 0~ 2^64-1

실수형, 기타
예약어 구조체형식 크기 (Bit) 범위
실수형
float System.Single 32 1.5x10^-46 ~3.4x10^38
double System.Double 64 5.0x10^-324 ~1.7x10^308
decimal System.Decimal 128 1.0x10^-28 ~7.9x10^28
기타
char System.UInt16 16 유니코드 1 자
bool System.Int32 1 0 또는 1

Boolean
boolean type 이 가질 수 있는 값은 true 와 false 입니다. 예 ) bool b = true --> true 는 1 과는 다르며 , 마찬가지로 false 는 0 과는 다릅니다. (C 에서는 TRUE, FALSE 를 #define 을 통해 정의하여 사용 했었습니다.. 정수를 암묵적으로 boolean 형으로 사용한 것이죠.), true 와 false 로 산술 연산을 할 수 없으며 오로지 논리 연산자를 가진 수식에 대해서만 사용가능 합니다.

변수 선언 하는 방법
int itemCount;
int itemCount , employeNumber; ( Possible to declare Multiple variables in one)
int employeeNumber; employeeNumber = 23;
int employeeNumber= 23;
또한 Charater형은 다음과 같이 선언 합니다. char middleInitial= ‘J'; C#은 유니코드를 사용하며 char형은 한 문자를 저장하는데 사용 합니다.
Itemcount = Itemcount + 40; --> ItemCount += 40; --> 이건 다아시죠...

연산자(Operator)
구분 연산자
기본 연산자 (x), ., f(x), a[x], x++, x--, new, typeof, sizeof, checked, unchecked
단항 연산자 +, -, !, ~, ++x, --x
산술 연산자 +, -, *, /, %
쉬프트 연산자 <><, >>
비교 연산자 <, >, <=, >=, is
비트 연산자 &, ^, |
논리 연산자 &&, ||
조건 연산자 ?:
할당 연산자 =, *=, /=, %=, +=, -=, <><=, >>=, &=, ^=, |=

[isOperator 예제] is연산자는 런타임시 주어진 타입과 객체가 서로 호환이 되는지를 검사하는 연산자 입니다. 또한 as 연산자는 Type을 변환하는데 변환이 되면 변환 시키고 변환이 안되면 NULL을 돌려 줍니다...(참고하세요~)
//is 연산자 예제
using System;
class isOperator {
static void Main() {
//C#은 모든 타입을 객체로 처리한다.
//System.Int32의 BaseType은 System.ValueType이다.
//System.Object > System.ValueType > System.Int32
int i=0;
object o;
Console.WriteLine("i is int? {0}", i is int);
Console.WriteLine("i is long? {0}", i is long);
if (i is object) {
o = i;
Console.WriteLine("o의 Base Type은 " + o.GetType().BaseType);
}
}
}

---------------------------------------------
모든 Object(객체)들이 가지는 메소드
---------------------------------------------
객체 지향 프로그래밍을 하는것은 객체를 많이 다른다는 이야기 입니다. 이번에는 참고로 모든 객체들이 가지고 있는 기본적인 메소드가 어떤것이 있는지 필요한것만 보도록 하겠습니다. 닷넷에서는 System.Object가 모든 객체의 최상위 클래스 입니다. (물론 자바에선 java.lang.Object 입니다.)
메소드명 설명
bool Equals() 같은 객체인지 비교, 동일한 메모리 공간을 차지해야...
int GetHashCode() 해쉬값을 얻음
Type GetType() Type 에 관한 정보(형식 정보)를 돌려 줍니다.
string ToString() 객체를 대표하는 문자열 반환, 일반적으로 문자열로 변환한다고 보면 됩니다.

(오라클자바커뮤니티 닷넷전문교육)C# HelloWorld

오늘 부턴 본격적으로 C#을 배워 보도록 하겠습니다.  닷넷 어셈블리는 조금 어려웠죠? 많이 어려우시면 잠시 Skip 한 후 나중에 보시구요, 이제부터 배우는 되는 언어의 특성과 C# 객체 지향 프로그래밍은 잘 배워 두시기 바랍니다.

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




using System; //BCL(Base Class Library)System NameSpace 안에 정의된 클래스를 사용 하겠다는
class Hello
{
public static int Main()
{
Console.WriteLine(“Hello , world “); return 0;
}
}

? C# 응용 프로그램은 클래스(Class), 스트럭쳐(Strutures), 형(Type)의 집합으로 생각 할 수 있습니다. 여기서 클래스는 데이터와 메소드의 결합으로 보시면 되구요... 그리고 C# 클래스가 여러 파일에 걸쳐서 존재 할 수 없다는 것은 다아실 거구요, 클래스 정의의 기본적인 Syntax는
class 클래스이름
{
}
의 형태 입니다. 자바 처럼 클래스명과 실제 파일명(.cs 파일)이 같을 필요는 없습니다.
가장 기본이 되는 구조로 확장 하면 다음과 같이 되죠...
(C#은 기본적으로 대소문자를 구분 합니다. 기억하세요~)

using System; ...) //해당 네임스페이스(자바로 보면 패키지)를 사용 한다는것, 자바같으면 import java.lang.*; (자바 프로그램 개발시 반드시 사용되는 클래스를 이곳에 위치 시키죠
namespace 네임스페이스 이름 //자바의 패키지 처럼 비슷한 역할을 하는 클래스를 묶어 놓을때 사용 됩니다. 관련된 클래스를 하나의 폴더에 묶는 개념으로 보셔도 되구요...
{
class class_name
{
public static void Main(string[] args) //Main의 'M' 이 대문자인것 주의!!!!!!!
{
명령들...
}
}
}
그런 이번엔 간단한 콘솔 응용 프로그램을 만들어 볼까요~
d:\C#Test라는 폴더에 Hello.cs라고 저장 하죠....
using System; //Syste,이라는 네임스페이스가 닷넷 네임스페이스의 최상위에 있으며 C# 개발을 하기 위한 가장 기본적인 클랴스 들이 있습니다.(Console, Sring 등, 자바로 보면 java.lang 정도겠죠^^;)
namespace first{ //딸랑 파일 하나면 만들때는 네임스페이스를 정의 할 필요가 없으며 파일이 여러개이며 나중에 가져다 쓰기 위해서 분류가 필요한 경우에 이용 하시면 됩니다.
class HelloWorld //클래스 이름이죠...
{
public static void Main(string[] args) //
{
Console.WriteLine("Hello World!");
Console.ReadLine();
}
}
}

콘솔에서 컴파일을 해 보도록 하겠습니다. 콘솔창은 Visual Studio .Net 2003 아래의 Visual Studio .Net 도구안에 있는 Visual Studio .Net 2003 명령프롬프트를 실행 하시기 바랍니다.그런다음 파일을 만드신 폴더인 D:\C#Test로 이동하셔서 csc Hello.cs 라고 입력 하시면 컴파일을 마치고 Hello.exe 파일이 만들어 질겁니다. 실행 할려면 Hello 라고 입력 하시면 되겠죠.

이번에는 Main함수의 형태에 대해 보기로 하죠.

자바와 달리 Main 안의 args는 필요에 따라 사용 할 수가 있습니다. 즉 메인함수가 아규멘트를 받는 경우에 사용하시면 되겠죠.
? static void Main()
? static void Main(string[] args)
? static int Main()
? static int Main(string[] args)
args는 Main 메소드로 인자를 넘겨 줄 때 사용합니다. VS를 사용하는 경우에는 프로젝트 속성의 구성요소, 디버깅, 명령줄 인수에서 작성하며 명령프롬프트를 통해 실행 하는 경 우엔 직접 매개변수를 기술하구요, Main 이 static 인 이유는 … staic인 경우엔 new에 의 해 메모리 공간을 할당 받는 것이 아니라 실행과 동시에 메모리 공간을 할당 받습니다. 결국 Process의 종료 시 까지 존재하는 것 입니다. 그리고 static은 객체와 관련이 있는 것이 아니고 클래스와 관련이 있습니다. 변수인 경우에도 초기화가 하번만 되는 전역변 수인 경우엔 static을 붙입니다.
다음은 Console 클래스와 Write Method에 대한 사용법 입니다.

Console 클래스는 System 네임스페이스에 있으며 출력을 위해 Write 메소드와 WriteLine 메소드를 사용합니다.WriteLine 메소드가 줄을 넘기는 것이 Write 메소드와의 차이점 입니다.. 나머지 기능은 동일하며 Write 메소드의 기본 형태는 WriteLine( 객체 ) --> 객체 하나를 출력할때 , WriteLine( 양식문자열 , 객체 , 객체 , …); --> 여러 개의 객체를 양식에 맞춰 출력 할 때 사용합니다.양식 문자열의 사용은 별도로 공부하지 마시고 나타날때 마다 하나식 사례를 보면서 학습 하도록 하죠...
이번엔 using 지시자에 대해서 알아보기로 하죠, 아래의 예를 먼저 보자구요~
System.Console.WriteLine(“Hello, world”);

using System;
Console.WriteLine(“Hello,World”);
느낌이 오시죠, 거의 자바와 똑같으니까요... 결국 using을 쓰는 것은 해당 네임스페이스의 클래스를 사용하겠다라고 정의하니까 클래스 앞에 점을 찍어 소속을 밝히지 않아도 알아서 System이라는 네임스페이스에 가서 Console이라는 클래스를 찾는 거죠...
이번예제는 메인 함수에 아규먼트를 주는 겁니다.
// Args.cs
using System; class Hello
{
public static void Main(string[] args) // Main 함수에서 인자를 받을려면 인자를 넣어야 한다,자바의 경우엔 여부에 관계없이 인자필요
{
Console.WriteLine("Hello, ");
for(int arg=0; arg < args.Length; arg++) >
{ // args.length는 메인을 실행시 아큐먼트가 있다면 그 수(길이) 만큼 반복을 하겠다는 의미 입니다.
Console.WriteLine("Arg{0}: {1}", arg, args[arg]); //중괄호 {} 안의 지정된 번호에 대응하는 인자가 삽입 , 0과 1의 의미는 0번째 인덱스, 1번째 인덱스의 의미죠, 대부분 인덱스는 0부터 시작하죠.
}
}
}

컴파일 : csc Args.cs
실행 : Args 이종철 김태양 이승환

2013년 8월 6일 화요일

[오라클자바닷넷커뮤니티, ORACLEJAVA]환영인사(Welcome)를 struts의 Action으로 설정하기 , 스트럿츠 교육

환영인사(Welcome)를 struts의 Action으로 설정하기 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




web.xml에서 welcome-file-list는 사용자가 URI의 일부만 입력을 했을 때 기본적으로 보여 줄 자원을 정하기 위해 사용 합니다.

예를들어 다음과 같이 설정 했다면…(Login 이라는 웹 애플리케이션을 만들었다고 가정)

<welcome-file-list>
            <welcome-file>main.jsp</welcome-file>
    </welcome-file-list>

브라우저에서 http://localhost/Login/ 이라고 입력하면 main.jsp 가 로딩 된다는 이야기 입니다. 즉 http://localhost/Login/main.jsp 와 같은 기능을 수행 하는 것 입니다.

몰론 welcome-file-list에 여러 개의 welcome-file을 선언 하는 것 역시 가능 합니다.

이렇게 하면 컨테이너는 사용자가 요청한 URI와 일치하는 환영파일을 찾을 때 까지(기술된 순서대로) 찾는 과정을 반복 합니다.

Welcome-file의 속성 값은 ‘/’로 시작하거나 뒤쪽에 ‘/’이 붙을 수 없으니 주의 하세요~

----------------------------------------------------------
환영 파일 내에서 struts의 Action을 사용 하기
----------------------------------------------------------

컨테이너는 welcome-file-list 요소 내에 서블릿 매핑을 지원하지 않으므로 struts의 Action을 사용하기 위해 welcome-file 요소를 직접 만질 수는 없습니다.

그대신 다음과 같은 방법을 이용하면 가능 합니다.

1.        web.xml에서 welcome-file을 설정 합니다.

<welcome-file-list>
            <welcome-file>welcome.jsp</welcome-file>
    </welcome-file-list>

2.        welcome.jsp를 만듭니다.

<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html>
        <body>
                <logic:forward name="welcome"/>
        </body>
</html>

3.        welcome.jsp에서 사용한 global-forward를 만듭니다.(struts-config.xml)

<global-forwards>
<forward name="welcome" path="welcome.do"/>
    </global-forwards>

4.        global-forward에서 정의 한 Action에 대한 매핑을 합니다.(struts-config.xml)

<action-mappings>                   
        <!-- welcome Action정의 -->
        <action
                path="/welcome"
                type="login2.Welcome"
                validate="false"
        />           
    </action-mappings>

5.        테스트를 위해 간단한 Action 파일을 만듭니다.

package login2;

import org.apache.struts.action.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import login2.Constants;

public class Welcome extends Action {       
       
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
                               
                //성공적으로 처리 되었음을 알림, main.jsp로 보내버림...
                //결국 환영인사를 하게 되면 main.jsp가 불리는 것입니다.
                return (mapping.findForward(Constants.SUCCESS));
               
        }
}


결과를 확인 하기 위해 http://localhost/Login/ 이라고 입력 하면 main.jsp가 실행 됩니다. 혹시 main.jsp를 만들지 않으신 분은 이전 강좌에 있는 main.jsp를 이용하세요~

2013년 8월 5일 월요일

(자바스윈, 오라클자바교육, ORACLEJAVA EDU)JAVA Swing이란

이번 강좌에서는 전강좌에 이어 스윙에 대해 살펴 보도록 하겠습니다.



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 

 www.onjprogramming.co.kr




컴포넌트와 컨테이너

Container로 부터 파생된 클래스는 다른 Component를 담을수 있으며, 컨테이너라고 부릅니다. 컨테이너는 다른 컨테이너를 포함할수도 있습니다(Window및 그하위 클래스는 예외) JFrame객체는 Application용 메인 윈도우를 나타내며, Window 객체는 그렇지않습니다. 윈도우를 만들기위해서는 항상 JFrame이 필요 합니다. 스윙의 독립 윈도우 컨테이너들은 AWT가 제공해주지 못하는 능력을 제공하기 위해 JFrame에 이미 JRootPane이라는것을 만들어 두었는데 여기에 프로그래머가 만든 컴포넌트는 JRootPane이 관리하고 있는 contantPane이라는것에 넣도록 하고 있습니다.. JFrame, JApplet, JWindow, JDialog등은 JComponent를 상속하지 않으므로 스윙의 능력을 직접 쓸수 없는 대신 JComponent를 상속받은 JRootPane을 미리 넣어 두는것 입니다. 그렇게 함으로서 독립적인 윈도우로 표시되는 컨테이너도 스윙의 기능을 사용할수 있으며 그렇게 하기위해서는 프로그래머가 만든 컴포넌트를 contentPane에 넣는 것 입니다.

JRootPane
- AWT의 경우 Frame에 직접 add를 사용하여 컴포넌트를 추가하였으나 JFrame의 경우엔 getContentPane()을 이용하여 contentPane을 얻은후 거기에 컴포넌트를 추가 합니다.
- JFrame, JApplet, JDialog, JWindow등은 RootPaneContainer 인터페이스를 구현하고 있으며 getXXXPane() 함수등으로 pane(창)을 얻은후 작업을 합니다. 이 인터페이스에는 setXXXPane메소드도 존재 합니다.
- glasspane(투명창) : 기본적으로 보여지지 않게 설정되었으며 보여지게 한다면 어떤 컴포넌트 등의 위에 그림을 그릴 수 있다. 또한 마우스 이벤트등을 가로채 반응을 안하게 할수있습니다.-
- layeredPane(다중창) : contentPane과 JMenuBar(생략가능)등을 담으며 다층레이어로 이루어져 팜업메뉴, ToolTip과 같은 컴포넌트가 contentPane위에 오도록 보장 합니다. 즉 서로다른 레이어를 가지는 컴포넌트를 담을수 있습니다.
- contentPane(내용창) : 루트창의 가시적인컴포넌트들(메뉴창 제외)을 담은 개체
- JMenuBar(메뉴바) : 컨테이너의 메뉴를 담습니다.
- JRootPane 개체는 직계 부속 컴포넌트를 가질 수 없으므로 JRootPane 에 컴포넌트를 직접 부착 할 수 없고 , 그에 따라 다음 표현은 틀린 것이다 . rootPane.add(child); 그 대신 JRootPane 의 contentPane 을 구해 여기에 컴포넌트를 부착 합니다 . rootPane.getContentPane().add(child);

 



2013년 8월 3일 토요일

[JAVA AWT CARDLAYOUT교육]자바 AWT 카드레이아웃 (cardlayout) 예제

지금은 많이 쓰이지 않지만 JAVA AWT(Abstract Window ToolKit)은 자바 윈도우 프로그래밍의 중요한 부분 입니다.  참고하세요~~~

JAVA AWT 카드레이아웃 (cardlayout) 예제 .  
 
 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



 
import java.awt.*;
import java.awt.event.*;
public class CardLayoutTest1 extends Frame {
 public static void main(String[] args) {
   Frame f = new Frame("CardLayoutTest");

   final Panel tabs = new Panel();
 
   tabs.add(new Button("<<"));
     tabs.add(new Button("<"));
   tabs.add(new Button("Options"));
   tabs.add(new Button("Settings"));
   tabs.add(new Button("Preferences"));
   tabs.add(new Button(">"));
   tabs.add(new Button(">>"));
   f.add(tabs, "North");
  
   final CardLayout layout = new CardLayout();
   final Panel cards = new Panel(layout);
   cards.add(new CardPanel("Options"), "Options");
   cards.add(new CardPanel("Settings"), "Settings");
   cards.add(new CardPanel("Preferences"), "Preferences");
   f.add(cards, "Center");
  
  
   ActionListener al = new ActionListener() {
    public void actionPerformed(ActionEvent ev) {
     String cmd = ev.getActionCommand();
     if (cmd.equals("<<")) layout.first(cards);
     else if (cmd.equals("<")) layout.previous(cards);
     else if (cmd.equals(">")) layout.next(cards);
   else if (cmd.equals(">>")) layout.last(cards);
   else layout.show(cards, cmd);
       }
   };
  
   for(int i=0; i<tabs.getComponentCount();i++) {
    ((Button)tabs.getComponent(i)).addActionListener(al);
   }
   f.setSize(400, 300);
   f.setVisible(true);  
   f.addWindowListener(new WindowListenerProcessing() );
 }
}
class CardPanel extends Panel {
 CardPanel(String name) {
  setLayout(new BorderLayout());
  add(new Label("CardPanel : " + name, Label.CENTER),"Center");
  Panel p = new Panel();
  add(p, "South");
  Button btn = new Button("Close");
  ActionListener a1 = new ActionListener() {
   public void actionPerformed(ActionEvent ev) {
    String cmd = ev.getActionCommand();
    if (cmd.equals("Close")) {
     System.exit(0);
    }
   }
  };
  btn.addActionListener(a1);
  p.add(btn); 
 }
}
class WindowListenerProcessing extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
             System.exit(0);
    }
}
 

2013년 8월 2일 금요일

자바의클래스 초기화에 대해서... (class initialize)

클래스가 어떻게 초기화 되는지 잘 알고 있어야 합니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



클래스가 메모리로 적재된 후  클래스가 사용 되기 전 한번 초기화 된다.

초기화 순서
-  모든 클래스변수는 Default 초기치(0, ‘\u0000’,false, null)로 초기화 된다.
- 클래스변수 초기화수식(Static initializers)과 클래스 초기화 블럭이 실행된다.
      예) public static int PI=3.14;
          public static int facs[] = new int[10];
          static { facs[0]=1;
          for(int I=1;I<10;I++) { facs[I] = facs[I-1]*I; }


New 연산자에 의한 작업 순서

-  객체를 위한 메모리 공간 할당
-  모든 인스턴스 변수는 Default 초기치(0, ‘\u0000’,false, null)로 초기화 된다.
- 인스턴스 변수 초기화수식(instance initializers)과 초기화 블럭이 실행된다.
- 생성자의 첫문장에서 다른 생성자를 호출하는 경우엔 이를 먼저 처리(서브클래스인 경우 명시적인 상위클래스 생성자에 대한 호출이 없으면 super()를 삽입하고 이를 실행한다.)
- 생성자의 나머지 부분을 실행한다. 

자바 위임을 이용한 Adapter 패턴 예제 (java adapter pattern, java design pattern

안녕하세요~ oraclejavacommunity 입니다. 위임을 이용한 Adapter 패턴 예제 입니다.
 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



위임이란 어떤 메소드의 처리를 다른 인스턴스의 메소드에 맡긴다는 의미 


Banner.java및 Main.java는 앞 예제와 동일함

//Print.java
public abstract class  Print {
public abstract String printString();
}


//PrintBanner.java
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner (String str) {
this.banner = new Banner(str);
}
public String  printString() {
return "(" + banner.showString() + ")";
}
}
 
  

자바 상속을 이용한 Adapter 패턴 예제 (java adapter pattern)


안녕하세요~ 오라클자바커뮤니티(www.oraclejavacommunity.co.kr) 입니다.
<"자바 디자인 패턴에 입문" 에 나와 있는 사례소개 합니다.>
 
 오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 


상속을 이용한 Adapter 패턴 예제

이미 제공 되는것과  필요로 하는것과의 사이에서 그 사이를 메꾸어 주는것이  Adapter의 역할
 Adapter 패턴은 Wrapper 패턴이라고도 한다.
 Adapter 패턴은 기존의 클래스를 이용해서 필요한 클래스를 만든다.  기존의 것과 필요한 클래스가 기능이 차이가 많은 경우에는 Adapter 패턴을 이용할수 없다. 물론 기존 클래스의 소스는 필요없다.
 Adapter 패턴은 기존버전과 새버전을 공존시키면서 S/W의 유지보수를 가능하게 해 준다.
 Adapter 패턴에는 Class에 위한 Adapter 패턴(상속이용)과 인스턴스에 의한 Adapter 패턴(위임이용) 두가지 형태가 있다.




이 예제는 기존에 제공되는 Class의 기능(주어진 문자열을 출력)을 이용하여 양쪽으로 괄호를 붙여 출력하는 간단한 예제이다.
 이미 제공되는것은 Banner Class이며 필요한것은 Print 인터페이스이고 교환장치(Adpater)는 PrintBanner Class이다.


//Banner.java
public class Banner {
private String str;
public Banner (String str) {
this.str = str;
}
public String  showString() {
return str ;
}
}
//Print.java
public interface Print {
public abstract String printString();
}
//PrintBanner.java
public class PrintBanner extends Banner implements Print {
public PrintBanner (String str) {  super(str);  }
public String  printString() {
return "(" + showString() + ")";
}
}
//Main.java
public class Main {
public static void main(String args[]) {
//PrintBanner p = new PrintBanner("hello"); ?
//만약 PrintBanner의 고유의 메소드가 있다면 
//이를 사용하기 위해서는 어떻게?
Print p = new PrintBanner("hello");
System.out.println(p.printString());
}