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

2013년 10월 13일 일요일

[자바상속컴포지션]Java Inheritance & Composition 상속과 컴포지션

[자바상속컴포지션]Java Inheritance & Composition

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

1. 원은 반지름 값을 갖는 하나의 점이다(a Circle is a Point with a radius.)
   그래서 Circle은 Point를 상속

   
   
class Point {
 private double x, y;
 Point(double x, double y) {
  this.x = x;
  this.y = y;
 }
 double getX() {
  return x;
 }
 double getY() {
  return y;
 }
}
class Circle extends Point {
 private double radius;
 Circle(double x, double y, double radius) {
  super(x, y);
  this.radius = radius;
 }
 double getRadius() {
  return radius;
 }
}
 
2. 원은 한 점과 반지름을 가지고 있다(a circle has a point and a radius)
 
class Point {
 private double x, y;
 Point(double x, double y) {
  this.x = x;
  this.y = y;
 }
 //redundant code 로 인한 유지보수 어려움(코드의 재사용 실패)
 double getX() {
  return x;
 }
 double getY() {
  return y;
 }
}
 
class Circle {
 private Point p;
 private double radius;
 Circle(double x, double y, double radius) {
  p = new Point(x, y);
  this.radius = radius;
 }
 double getX() {
  return p.getX();
 }
 double getY() {
  return p.getY();
 }
 double getRadius() {
  return radius;
 }
}

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

[개강확정강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)




2013년 8월 27일 화요일

JAVA JVM의 메모리 영역 [오라클교육오라클자바교육강의강좌,자바교육,ORACLEJAVA교육강의강좌]

JVM의 실행 메모리 영역에 대해 알아보자구요... JVN의 메모리 구조에 대해 본다는 이야기 입니다.

오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr



JVM 실행 메모리 영역
메쏘드(method) 영역 : 클래스의 메소드에 대한 바이트코드, 전역변수(클래스 변수)
힙(heap) 영역 : 객체를 저장할때 사용하는 메모리
스택(stack) 영역 : 지역변수,함수의 인자,함수의 리턴값,리턴 번지
레지스터(registers) : 가상 머신의 현재 상태를 보여줌, 현재 실행되고 있는 메소드의 실행 포인터를 저장
실행 풀(Runtime Constant Pool) : 숫자 리터럴과 상수 필드 포함, 메소드 영역으로 부터 할당 받는다.


[ JVM 실행 메모리 영역 ]

메소드 내에서 객체 참조형으로 선언된 변수인 경우(String s = new String("abc") 일때의 s) 지역변수로서 스택에 위치하며 힙에 저장되어 있는 객체에 대한 참조값을 가지게 됩니다.
객체 참조형 변수의 값이 null 이라는 의미는 아무것도 참조하고 있지 않다는 의미 입니다.
New 연산자는 힙(heap) 메모리에 객체를 만들고 그 객체의 참조값을 반환 합니다.(Hello h = new Hello()) ---> Memory Heap에 Hello 클래스의 인스턴스(객체)를 만들고 그것을 스택에 있는 h라는 변수가 참조하도록 합니다. C에서의 포인터 변수와 유사 합니다.)
객체 참조 변수의 경우 대입, 메소드 호출시의 인자, 반환형 등으로 사용 될 때 참조 값만 전달 될 뿐, 객체 자체가 복제되어 전달되는 것은 아닙니다.
아래의 예제를 참고하세요

class C
{
public static void
main(String[] args)
{
int i = 3;
f(i);
}
static void f(int arg)
{
int i = 10;
double f = 3.14
}
}
메모리 구조는 아래와 같습니다.

이상 JVN의 메모리 영역에 대해 살펴 보았습니다. 다음 강좌에서는 자바에서의 변수의 종류와 그 쓰임새에 대해 보도록 하겠습니다.

2013년 8월 9일 금요일

[오라클자바커뮤니티, 닷넷교육, ORACLEJAVANEW.KR]닷넷 어셈블리(.NET Assembly)

오늘은 3일차로서 닷넷 어셉블리의 1부를 학습 하도록 합니다. 조금 어렵게 느낄수 있는데 자바를 하신 분들은 자바 프로그램의 배포를 위한 Jar 파일 포맷을 아실 겁니다. 유사하게 생각 하시면 되구요 닷넷 환경의 프로그램이 배포되는 단위라고 정리하시면 됩니다.~
닷넷 어셈블리 (Assembly)란?

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


닷넷에 대해 공부 하시다 보면 닷넷 어셈블리라는 말을 가끔식 보게 되실 겁니다. Low Level 언어인 Assembly는 절대 아니니 착오 없으시기를 바랍니다.어셈블리는 하나의 단일한 단위로 존재 하는 .NET 의 실행 가능한 프로그램 또는 실행 프로그램의 일부 입니다 . 결국 C# 프로그램의 실행 및 배포의 단위라고 할 수 있습니다 . C# 응용 프로그램 작성의 결과로 생긴 .exe 파일이 바로 하나의 어셈블리 이며 클래스 라이브러리 작성의 결과인 DLL(Dynamic Link Library) 도 하나의 어셈블리 입니다 . 하나의 단일한 어셈블리 안의 모든 코드는 하나의 단일한 단위로 빌드 , 배포되며 버전 번호가 부여되는데 각 어셈블리는 다른 프로그램들이 사용 할 수 있는 public class, 속성 , 메소드등을 노출하게 됩니다 . private 으로 선언된 것은 모두 어셈블리 안에 은폐 되는 것 입니다 .

다음은 구성요소 흔히 컴포넌트라고 하는것에 대해 잠시 정리하겠습니다.

MS 는 최초 DLL 을 도입하였는데 DLL 은 코드의 일부를 개별적인 파일로 분리 한 이며 프로그램이 같은 언어로 작성 되었을 때 기본적인 수준에서 동작하는 것 입니다 . 프로그램의 입장에서 자신이 사용하고자 하는 DLL 에 대해 많은 것을 알아야 하며 또한 프로그래머들이 서로의 데이터를 교환하는 용도로 DLL 을 사용 할 수 없습니다 .
데이터 교환의 문제를 해결 하기 위해 개발 된 것이 DDE(Dynamic Data exchange) 로 이것은 한 프로그램에서 다른 프로그램으로 데이터를 전송 하기 위한 형식과 메커니즘을 정의하는데 그리 유연하지는 않습니다 . 그 뒤로 OLE(Object Linkig and Embedding) 등장 하면서 Word 와 같은 문서가 다른 프로그램 (Excel) 을 자신안에 포함 할 수 있게 되었는데 비록 구성요소와 비슷한 개념을 지닌 기술이지만 OLE 1.0 을 진정한 범용적 구성요소로 보기는 어렵습니다 .
MS 최초의 진정한 구성요소의 표준은 1990 년대 중반에 나타난 COM(Component Object Model) 이라고 할 수 있습니다 . OLE 2.0 과 기타 여러 기술들은 COM 으로 통합 되었으며 COM 들이 네트웍 너머로 통신 할 수 있게 하는 DCOM, 다계층 환경에서 구성 요소 사이의 호출에 대해 높은 성능을 보장하는 서비스가 추가된 COM+ 가 등장 했습니다 .
COM 은 잘 동작하는 반면 배우기가 어렵고 사용하기도 어렵습니다 . COM 에서는 구성요소의 정보를 Windows Registry 에 등록해야 하는데 이는 구성요소의 설치와 삭제를 어렵게 하는 요인이 되었습니다 . COM 은 원래 C/C++ 를 위해 설계된 것이며 그 이후 VB 에서도 사용토록 개선 되었고 (“ 자동화 ” 라고 하는 것 ) 실제로 잘 동작 하고 있습니다 . 그 대신 C/C++ 로 VB 와 호환이 되는 구성요소를 만드는 것은 어려워 졌습니다 .( 예를 들어 다른 언어에서 정의된 클래스를 상속하는 것은 여전히 불가능 합니다 .)
또한 사용자가 MS 나 기타 회사들의 DLL 혹은 COM 구성 요소의 여러 버전을 설치하다 보면 문제가 발생 하는데 이는 버전이 다르더라도 DLL 파일의 이름은 동일 한데서 기인하는 것이 많습니다 . 그래서 이미 다른 프로그램에서 사용하는 DLL 을 덮어 씌워 버리는 경우가 자주 나타났으며 또한 시스템에 설치 된 DLL 정보를 관리하는 부담 때문에 구성요소의 업그레이드와 유지 보수가 갈수록 어려워 지는 것 입니다 . 결국 .NET 에서 이러한 문제들을 해결 할 수 있는 새로운 표준이 사용되는 것 입니다 .
다음은 닷넷어셈블리의 자기 서술적인 특징에 대해 알아 보겠습니다.
결국 어셈블리는 자바에서의 배포 단위인 Jar와 비숫하게 생각해 볼 수도 있습니다. Jar 파일에 Menifest 파일이 있어 그속에 JAr 파일의 구조에 대해 정의하고 있는데 이것을 자기 서술(Self Description) 이라고 합니다. 닷넷도 어셈블리 안에 자기서술적인 특징을 가지고 있습니다. 결국 기존의 DLL들 처럼 배포한 후 레지스터리에 등록하여 컴퓨터를 껐다 켜야 인식이 되는 것이 아니라 배포되는 닷넷 어셈블리안에 Self-Descriptiion을 하니까 그럴 필요가 없이 복사만 되면 발로 실행이 가능하다는것이 특징 입니다. 어셈블리에 어떤 것이 있는지가 .NET 어셈블리안에 있으므로 그것을 사용하는 프로그램이나 시스템은 레지스트리와 같은 외부 정보를 참조 할 필요가 없습니다 . 닷넷 어셈블리는 자신이 가지고 있는 개체와 메소드 뿐 아니라 매개변수의 데이터 형식까지 제공 합니다 . 또한 개체들의 버전 정보 , 보안정보도 제공하며 실제로 어셈블리의 설치는 기본적으로 대상 시스템에서 어센블리 파일을 복사하는 것으로도 충분 합니다 . 참고로 한가지 명심할 것은 네임스페이스와 어셈블리가 항상 일대일 대응을 이루는 것은 아니라는 것 입니다 . 예를들어 System.Data.dll 은 System.Data 와 System.Xml 네임스페이스의 일부를 구현하며 System.Xml 의 다른 루틴은 System.Xml.xll 에 구현되어 있습니다 .

다음은 교차 언어 프로그래밍에 대해 정리 하죠

구성요소는 어떠한 .NET 언어에서도 심지어 구성요소를 작성한 언어가 아닌 다른 언어에서도 호출 될 수 있습니다 . 이것 역시 어셈블리가 주는 장점 입니다 . 닷넷은 교차 언어적 프로그래밍을 가능하게 하는 아래와 같은 특징을 가지고 있습니다 .
• Cmmon language Runtime(CLR) : 모든 .NET 어셈블리의 실행을 관리
• Microsoft Intermediate Language(MSIL) : 모든 .NET 언어 컴파일러는 MSIL 을 생산 하며 이는 컴파일러가 생성하는 이진 코드의 표준으로 CLR 은 이 MSIL 코드에 기반하는 것입니다 . MSIL 은 또한 어셈블리의 메타 데이터를 저장 하는 형식을 정의 하는데 이는 어셈블리가 어떤 언어로 만들어 졌든 간에 공통의 형식으로 자신의 메타 데이터를 저장함을 의미 하는 것입니다 .
• Common Language Specification(CLS) : C#, VB, C++ 등 어떠한 닷넷 언어라도 CLS 를 만족 하기만 하면 언어의 경계를 넘어서 구성 요소들을 공유 할 수 있으며 언어의 경계를 넘어서 완전한 상속이 가능 합니다 .
• Common Type System(CTS) : 모든 .NET 언어들이 사용하는 기본 형식들과 자신의 클래스를 정의하는 규칙을 정의 한다 . 예를들면 어떤 언어가 문자열 형식을 비 호환적 방법으로 구현하는 일을 방지한다 . CLS 사양을 따르면 C# 으로 구성 요소를 작성 했을 때 그것을 담은 어셈블리는 VB.NET 같은 언어에서도 사용 될 수 있으며 마찬가지로 C# 은 VB.NET 이나 C++.NET 으로 작성된 구성요소를 사용 할 수 있습니다 . 또한 .NET Framework 에서는 이전에 만들어진 COM 에 대해서도 사용 할 수 있는 방법을 제공 하는데 이는 이전에 작성된 코드를 감싸는 인터페이스 역할을 하는 wrapper assembly 를 통해서 가능 합니다 . VS .NET 은 COM 구성요소에 대한 참조를 추가하면 자동적으로 래퍼 어셈블리를 만듭니다 .
오늘은 3일차로서 다분히 이론적인 내용 이었습니다. 다음 시간은 그림과 함께 닷넷 어셈블리에 대해 조금 더 깊이 살펴 보도록 하겠습니다.
수고하셨습니다.

2013년 8월 8일 목요일

자바의 연산자

이번 강좌에서는 자바에서의 연산자를 배워보도록 하겠습니다.

대부분 언어를 공부해 보신 분들은 수도 없이 많이 보셨던 부분입니다. 잘 모르셔도 됩니다. 뒤에 공부하시다 보면 저절로 아시는 것도 있을 것이며 나중에 원하는 일을 하시다가 다시 아시게 되는 경우도 있을 겁니다. 그러나 기본이 없으면 오래가지 못합니다. 간단히 공부해 두시기 바랍니다.



자바에서 연산자는

산술연산자(Arithmetic Operator) --> 단항연산자(++,--), 이항연산자(+,-,*,/)

관계연산자(Relational Operator) -->>, >=, <, ><=, ==, != >

논리연산자(Logical Operator) -->&&, ||, &, |, !

비트연산자(Bitwise Operator) -->&, |, ^, ~, >>, >>>, <><

조건연산자(Conditional Operator) --> ?(삼항연산자)

할당연산자(Assignment Operator) --> +=, -=, *=, /=, &=, ^=, |=, <><=, >>=, >>>=

등으로 나누어 볼 수 있습니다.



연산자의 우선 순위는 괄호를 치시면 되니까 별다르게 고려 하지 않겠습니다.



1. ++, --, !, ~, instanceof

단항 연산자이다.
! : 논리형 자료형(boolean)의 부정
~ : 정수형 자료에 대한 보수 연산
++, -- : 단항 연산자, 변수의 앞쪽에 붙는 경우와 뒤쪽에 붙는 경우의 동작 형태가 다르다.
앞에 붙은 경우 : 연산이 수행된 다음 값
뒤에 붙는 경우 : 연산이 수행되기 전의 값



아래의 예제를 실습해 보세요~

[예제]

public class Op1 {
public static void main(String[] args) {
int a = 8;
//이진수 형태로 출력 합니다.(0이 아닌것 부터 출력)
System.out.println(Integer.toBinaryString(a));
a= ~a; //보수 연산, 1은0으로 0은 1로
System.out.println(Integer.toBinaryString(a));

a = 8;
a = a++;
System.out.println("a = " +a);

a = a++ +1;
System.out.println("a++ +1 = " +a);

}
}




[결과]

1000(앞 부분에 있는 0000~ 은 출력하지 않는다...)
11111111111111111111111111110111
a = 8
a++ +1 = 9



2. <><, >>, >>>

비트연산에 관련된 연산자(Shift 연산자) 입니다.
<>< 연산자는 좌측 쉬프트 이므로 2를 곱하는 효과가 있습니다.
>> 연산자는 우측 쉬프트 이므로 2로 나누는 효과가 있습니다.
<><, >> 연산자인 경우 부호를 고려 한다는것을 명심하세요~
당연히 부호를 고려하므로 왼쪽을 해당 부호 비트로 채웁니다.

>>> 연산자인 경우 왼쪽을 0으로 채웁니다. 부호를 고려하지 않습니다.
양수인 경우 >>, >>> 연산자는 같은 효과 이지만 음수인 경우 다른 결과가 나타 납니다.

[예제]

public class ShiftTest {
public static void main(String[] args) {
int a=-64;
System.out.println("<><");
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a<><1));
System.out.println(Integer.toBinaryString(a<><2));
System.out.println(">>");
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>1));
System.out.println(Integer.toBinaryString(a>>2));
System.out.println(">>>");
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toBinaryString(a>>>1));
System.out.println(Integer.toBinaryString(a>>>2));
}
}



[결과]

<><
11111111111111111111111111000000
11111111111111111111111110000000
11111111111111111111111100000000
>>
11111111111111111111111111000000
11111111111111111111111111100000
11111111111111111111111111110000
>>>
11111111111111111111111111000000
1111111111111111111111111100000
111111111111111111111111110000



3.<, >, >=, <=, ==, !=

관계 연산자들 이며 연산의 결과로 boolean 값을 리턴 합니다.
이 연산자의 대상은 기본형 데이터에 한정되며 객체에 대해서는 쓰이지 못 합니다.
예)System.out.println(5 > 7);
==, != 또한 관계 연산자 이나 위의 것 보다 우선 순위가 낮다. 연산자의 두 항이 같은지 다른지에 따라 boolean 값을 돌려 줍니다.
==, != 연산자는 객체에 대해 사용이 가능한데 그 기준은 객체가 같은 메모리 영역에 있는지 아닌지로서 평가 합니다.



4.&, ^, |, &&, ||

& : 비트 AND
^ : 비트 XOR
| : 비트 OR
&& : ‘&’와 같이 AND 연산을 하지만 대상은 boolean
|| : ‘|’와 같이 OR 연산을 하지만 대상은 boolean



5. ?

조건연산자 이며 형식은 아래와 같습니다.
형식 : (조건) ? (참 일때의 식) : (거짓 일때의 식)
if 문등을 몇줄에 걸쳐 써야 하는것을 간략하게 기술 할 수 있도록 해 줍니다.
[예]
int i=2;
int result = i<5 ? i+10 : i/2; >
System.out.println(result);



6. =, op=

할당 연산자 이며 우선 순위가 가장 낮습니다.
Op= 연산자는 다음과 같은 것들이 있습니다.
+=, -=, *=, /=, &=, ^=, |=, <><=, >>=, >>>=

java classpath 클래스패스(ClassPath)란?

-------------
클래스패스
------------- 


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



클래스 패스란 말 그대로 클래스를 찾기 의한 경로를 나타내는 말입니다.
여러 디렉토리에 산재한 클래스들의 위치를 지정해서 패키지(Package)에 따라 클래스를 찾게 해 줄 수 있는 경로를 의미 하는 것입니다.

윈도우즈 200인 경우 PC의 바탕 화면에 있는 시스템에서 등록정보, XP인 경우 제어판--> 성능 및 유지 관리 --> 시스템의 등록정보에서 고급 탭의 환경변수에서 환경변수로 지정을 하지 않는다면, 기본적으로 해당 디렉토리(현재 폴더)부터 검색을 하겠지만 작업을 효율적으로 하기 위해서는 클래스패스를 잡아주는 것이 좋습니다. 물론  자바 파일을 컴파일을 할 때마다 –classpath 옵션을 적어주어도 되겠지만 특정한 경로에 필요한 클래스가 모여 있다면 클래스패스를 주는 것이 훨씬 더 효율적 입니다.

클래스패스를 환경변수에서 잡아주게 되면, 그 디렉토리를 기준으로 클래스 파일을 검사하게 되는 것입니다. 예를 들어 C:\class 라고 클래스패스를 잡아주었고 그런다음 C:\java\A.class 라는 파일이 존재하고, C:\java\B.java이 있다고 할때 B.java에서 A라는 클래스를 상속했거나, 객체를 생성하는 코드가 있다(즉 B에서 A를 참조 할때)면 다음과 같이 컴파일할 것 입니다.
C:\java>javac B.java
하지만 이러한 경우에는 에러가 발생 합니다. (클래스패스를 환경 변수에서 잡으면 현재 폴더에서는 클래스를 찾지 않습니다. 물론 환경변수를 지정하지 않은 상태라면 현재 폴더에서 클래스를 찾습니다.) 이유는 C:\classes 아래에서 A.class 을 찾지만 그 곳에는 A.class라는 파일이 없기 때문 입니다.

하지만 클래스패스 환경 변수를 설정 할때 C:\classes;. 로 클래스패스를 잡아주게 되면 ; 앞의 디렉토리를 먼저 검색하고 찾는 파일이 없을경우 .(현재 디렉토리)부터 파일을 검색하게 되는 것이므로 이렇게 클래스패스를 정하게 되면 에러가 없어지게 되는 것 입니다.

클래스패스로 지정한 기준에서 하위 디렉토리가 많아질 경우 파일용량이 커지게 되므로 .jar로 압축하여 놓는 경우도 많이 있습니다.

-----------------------------------------------
Java Launcher의 클래스 찾기(클래스 검색 방식)
-----------------------------------------------
우선 부트스트랩 클래스에서 기본 자바 플랫폼에 있는 API 클래스들을 찾아 메모리에 로딩하며 여기에서 찾지 못할 경우 확장 클래스에서 찾으며 거기에서도 찾지 못한다면 사용자가 정의한 클래스패스에서 클래스를 찾아 메모리에 로딩 합니다.

Bootstrap classes(부트스트랩 클래스) 찾기
- 자바 플랫폼을 구성하는 클래스들이며 rt.jar와 i18n.jar에 포함되어 있는 클래스 입니다.
- jar 압축 파일들은 bootstrap class path에 의해 sun.boot.class.path 시스템 프로퍼티에 저장 됩니다.

extension classes(확장 클래스) 찾기
- 자바 플랫폼을 확장한 클래스들 입니다.
- jre/lib/ext 확장 디렉토리에서 모든 jar 파일들을 자바2 확장 클래스로 가정합니다.

user classes(사용자 클래스) 찾기
- -cp 또는 –classpath 명령행 옵션은 기본 환경 설정과 클래스 패스 환경변수 설정을 재정의 합니다. 즉 명령행에서의 클래스패스를 우선적으로 처리 합니다.
- jar 압축 파일은 다른 환경 설정을 압축 파일 내에 포함 하고 있습니다.

[오라클교육,자바교육,오라클자바커뮤니티]JAVA AWT 배치관리자(Layout Manager)

-----------------------------
배치관리자(Layout Manager)
-----------------------------

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



Component가 컨테이너에 배열되는 방식을 결정 합니다.
모든 컨테이너는 기본 Layout Manager를 가집니다.
Container는 다른 Component를 포함할 수 있는 최소의 클래스이고 java.awt.container 클래스를 상속해야 합니다.
Container를 상속하지 않은 일반 Component에는 Layout Manager가 등록될 수 없습니다.
Frame, Window, Panel등은 Layout Manager를 설정할 수 있으며 이렇게 설정된 Layout Manager는 화면의 크기가 바뀌거나, Component가 추가 되거나 제거 되었을 경우에 호출 됩니다.(이경우 즉시 다시 배치하지 않으며 Layout을 다시 그릴 필요가 있다는것을 표시한 후 validate함수가 호출되거나 화면이 다시 그려지는 경우에 다시 배치 작업을 수행 합니다. 따라서 Layout Manager를 설치후 즉시 효과를 볼려면 validate를 호출해야 합니다. Invalidate 함수는 특정 Component가 화면에 다시 배치해야 된다고 표시하는 것 입니다.
Layout Manager를 이용하는 경우에 수동으로 Component를 배치하는것이 소용 없습니다. 화면에 표시 될때 Layout Manager가 다시 위치, 크기등을 결정하기 때문 입니다. 수동으로 Layout을 설정하는 경우엔 위치, 크기등을 정해 주어야 하며 그렇지 않은 경우엔 초기 위치, 쿠기등이 정해지지 않으며 보통 화면에 나타나지 않습니다.
Layout Manager를 이용할 경우 크기지정이 유효한 경우는 Window, Frame등과 같은 최상위 Container 입니다.

수동으로 Component 배치하기
주로 소량의 정보를 보이거나 간단한 사용자 입력을 받는 Container에 사용 됩니다.
컨테이너에 설정해야 하는것들…
- 컨테이너의 크기를 고정 시킵니다.(Frame의 경우 setResizable)
- 컨테이너의 Layout Manager를 null로 한다. setLatout을 이용하며 Frame, Panel과 같은 기본 Layout Manager를 가지기 때문에 반드시 이과정을 수행해야 합니다.
- 컨테이너의 크기를 지정 합니다. (자식 컴포넌트의 크기, 위치를 수동으로 주는 경우 상의 컨테이너의 크기도 수동으로 지정해야 합니다. setSize, setBounds 등이용)

[예제]
import java.awt.*;
public class LayoutNull {
public static void main(String[] args) {
Button btn1, btn2, btn3;
Frame myWindow = new Frame("Null Layout");
myWindow.setResizable(false);
myWindow.setLayout(null);
myWindow.setSize(300, 300);
btn1 = new Button("버튼1"); btn1.setBounds(40,50,50,20);
btn2 = new Button("버튼2"); btn2.setBounds(100,50,50,20);
btn3 = new Button("버튼3"); btn3.setBounds(160,50,50,20);
myWindow.add(btn1); myWindow.add(btn2); myWindow.add(btn3);
myWindow.setVisible(true);
}
}

[결과]


인터페이스 java.awt.LayoutManager
컨테이너를 배치하는 클래스의 인터페이스를 정의 합니다.
addLayoutComponent(String, Component) : 지정된 이름을 가진 지정된 컴포넌트를 배치에 추가
layoutContainer(Container) : 지정된 패널에 컨테이너를 배치
minimumLayoutSize(Container) : 지정된 상위 컨테이너에서 컴포넌트를 받은 지정된 패널의 최소 크기를 계산
preferredLayoutSize(Container) : 지정된 상위 컨테이너에서 컴포넌트를 받은 지정된 패널의 환경설정된 크기를 계산
removeLayoutComponent(Component) : 배치에서 지정된 컴포넌트를 제거
LayoutManager2를 구현하는 java.awt의 클래스 - BorderLayout, CardLayout, GridBagLayout, GridLayout, FlowLayout

인터페이스 java.awt.LayoutManager2
LayoutManager2 인터페이스는 LayoutManager 인터페이스를 확장하여 배치에 컴포넌트를 추가하는 방식 및 위치를 지정하는 제약 조건 객체에 따라 배치를 명시적으로 처리 합니다.
addLayoutComponent(Component, Object) : 지정된 제약 조건 객체를 사용하여 지정된 컴포넌트를 배치에 추가 합니다.
getLayoutAlignmentX(Container) : x 축 정렬을 리턴 합니다.
getLayoutAlignmentY(Container) : y 축 정렬을 리턴 합니다.
invalidateLayout(Container) : 배치 관리 프로그램이 버려야 할 정보를 캐시에 넣은 경우 그 사실을 나타내고 배치를 무효화 합니다.
maximumLayoutSize(Container) : 컴포넌트의 최대 크기를 리턴 합니다.
LayoutManager2를 구현하는 java.awt의 클래스 - BorderLayout, CardLayout, GridBagLayout

FlowLayout
컴포넌트를 컨테이너에 연속된 행으로 위치 시킨다. 각 행에 많은 컴포넌트를 채우고 행이 다차면 다음으로 넘어간다. 주로 버튼등을 배열하기 위한 것
컴포넘트의 기본 위치는 행의 한가운데 입니다.
다음과 같은 행의 기본위치를 지정할수 있는 상수가 있습니다.
FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER,
[예제]
import java.awt.*;
class FlowLayoutTest extends Frame {
public FlowLayoutTest() {
setLayout(new FlowLayout());
add(new Button("Button1"));
add(new Button("Button2"));
add(new MyButton("새로운 버튼"));
Panel p = new Panel();
p.add(new Button("Panel Button1"));
p.add(new Button("Panel Button2"));
add(p);
}
public static void main(String[] args) {
Frame f1 = new FlowLayoutTest();
f1.setTitle("Flow Layout Test : default");
f1.setBounds(0, 0, 200, 300);
f1.setVisible(true);
Frame f2 = new FlowLayoutTest();
//((FlowLayout)f2.getLayout()).setAlignment(FlowLayout.LEFT);
FlowLayout flow = new FlowLayout(FlowLayout.LEFT);
flow.setVgap(50);
f2.setLayout(flow);
f2.setTitle("Flow Layout Test : left");
f2.setBounds(200, 0, 200, 300);
f2.setVisible(true);
}
}
class MyButton extends Button {
public MyButton(String text) {
super(text);
}
public Dimension getPreferredSize() {
return new Dimension(super.getPreferredSize().width+30, super.getPreferredSize().height+30);
}
}

GridLayout
각 격자끼리의 width, height는 동일 합니다.
GridLay() : 행이 하나인 GridLayout을 만듭니다.
GridLayout(int row, int col) : 주어진 행과 열의 GridLayout을 만듭니다.
GridLayout(int row, int col, int hgap, int vgap)

[예제]
import java.awt.*;
class GridLayoutTest extends Frame {
public GridLayoutTest(String t, LayoutManager m, int x, int y) {
setTitle("GridLAyout Test " + t);
setLayout(m);
add(new Button("Button1"));
add(new Button("Button2"));
add(new Button("Button3"));
add(new Button("Button4"));
add(new Button("Button5"));
add(new Button("Button6"));
add(new Button("Button7"));
setBounds(x, y, 300, 300);
setVisible(true);
}
public static void main(String[] args) {
new GridLayoutTest("디폴트", new GridLayout(), 0, 0);
new GridLayoutTest("2, 0", new GridLayout(2, 0), 300, 0);
new GridLayoutTest("0, 2", new GridLayout(0, 2), 0, 300);
new GridLayoutTest("3, 3", new GridLayout(3, 3), 300, 300);
}
}

GridBagLayout
Layout Manager중에서 가장 복잡하며, 보통 하나의 GridBagLayout을 사용하여 모든 종류의 폼을 구성할 수 있습니다.
융통성있는 배치 관리 프로그램으로 동일 크기의 컴포넌트를 요구하지 않으면서 컴포넌트를 수직 및 수평으로 정렬 합니다.
각 컴포넌트가 하나 이상의 셀을 차지하는 표시 영역이라 부르는 셀의 사각형 격자를 동적으로 유지 관리 합니다.
GridBagLayout으로 관리하는 각 컴포넌트는 표시 영역에서 컴포넌트 배치 방식을 지정하는 GridBagConstraints의 인스턴와 관련 됩니다
GridBagLayout을 효율적으로 사용하려면 해당 컴포넌트와 관련된 GridBagConstraints 객체를 하나 이상 조정해야 합니다. 그렇게 함으로서 컴포넌트를 원하는 크기와 위치로 배치합니다.
실제 GridBagLayout을 사용하는것 보다 여러 개의 컨테이너와 Layout Manager를 계층적으로 사용하는것이 훨씬 효율적 입니다.
GridBagConstraints
- gridx, gridy : 해당 컴포넌트가 들어가게될 격자의 x번째, y번째 값, 가장 왼쪽 셀의 주소는 gridx=0, gridy=0 입니다.
- gridwidth, gridheight : 해당 열에 존재할수 있는 최대 컴포넌트의 개수, int값 사용, GridBagConstraints.RELATIVE는 컴포넌트들이 이어져서 들어갈수 있게 해주며,GridBagConstraints.REMAINDER는 마지막 자리에 위치해서 더 이상 컴포넌트가 들어갈수 없게 합니다.
- fill : 컴포넌트를 채울때 특정 방향으로 컴포넌트를 늘여 격자를 채울수 있게 합니다. GridBagConstraints.BOTH, GridBagConstraints.HORIZONTAL, GridBagConstraints.VERTICAL등이 있다.
- ipadx, ipady : 컴포넌트가 가지는 내부적 간격, int값 사용 합니다.
- insets : 컴포넌트와 격자와의 외부적인 간격, java.awt.inset 객체가 사용 됩니다.
- anchor : 격자내에서 컴포넌트가 위치하게 되는 격자내의 절대적인 위치, GridBagConstraints.CENTER(기본값), GridBagConstraints.NORTH, GridBagConstraints.NORTHEAST, GridBagConstraints.EAST, GridBagConstraints.SOUTHEAST, GridBagConstraints.SOUTH, GridBagConstraints.SOUTHWEST, GridBagConstraints.NORTHWEST등이 있습니다.
- weightx, weighty : 컴포넌트가 차지할수 있는 가로와 세로의 영역비율, double 값이 사용 됩니다.

[예제]
import java.awt.*;
public class GridBagLayoutTest extends Frame{
public GridBagLayoutTest(String t) {
super(t);
GridBagLayout gbag = new GridBagLayout();
GridBagConstraints con = new GridBagConstraints();
setLayout(gbag);
con.fill=GridBagConstraints.BOTH;
add(new Button("버튼1"), con);
add(new Button("버튼2"), con);
con.gridwidth = GridBagConstraints.REMAINDER;
add(new Button("버튼3"), con);
add(new Button("버튼4"), con);

con.gridwidth = GridBagConstraints.RELATIVE;
add(new Button("버튼5"), con);
con.gridwidth = GridBagConstraints.REMAINDER;
add(new Button("버튼6"), con);
con.gridwidth = 1;
con.gridheight = 2;
add(new Button("버튼7"), con);
con.gridwidth = GridBagConstraints.REMAINDER;
con.gridheight = 1;
add(new Button("버튼8"), con);
add(new Button("버튼9"), con);
}
public static void main(String[] args) {
Frame f = new GridBagLayoutTest("GridBagLayout");
f.setSize(300, 200);
f.setVisible(true);
}
}

CardLayout
여러화면을 겹쳐 두었다가 특정한 화면만 보이도록 할 경우 사용 합니다.
여러 장의 카드가 있으나 보이는 카드는 하나만 있다는 개념에서 나온 이름 입니다
first(), last(), next(), previous() 등의 도구를 사용하여 카드 간에 순차적으로 이동할 수도 있습니다.
CardLayout() : 간격 크기가 제로(0)인 새로운 카드를 작성 합니다.
CardLayout(int, int) : 지정된 수평 간격 및 수직 간격으로 새로운 카드 배치를 작성 합니다.

[예제] //닫기 기능 추가
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
((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);
}
}



[오라클교육,자바교육,오라클자바교육,오라클자바커뮤니티]JAVA AWT 프로그래밍-Toolkit

이번 강좌에서는 Java.awt.Toolkit 에 대해 알아 보겠습니다.


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

 

-------------------
Java.awt.Toolkit
-------------------

그래픽 자원관련 시스템 정보 제공 합니다.
new 명령으로 만들수 없으며 Component의 Method인 getToolkit()이나 Toolkit.getDefaultToolkit을 사용해야 합니다.( Toolkit 객체가 하나만 존재해야 하므로…)

beep() : beep 음 출력

createimage(), getImage() : 이미지를 만들거나 Network 경로를 통해얻을 사용 합니다.

getPrintJob() : 프린터와 연결된 객체인 java.awt.PrintJob을 얻게 해 줍니다.

getScreenSoze() : 실제 화면의 크기를 구해주며 스플레쉬(Splash) 윈도우를 만들때 유용 합니다.

getScreenResolution() : 현재 화면이 인치당 몇 개의 점이 들어가는 해상도인지 알려줌.

getSystemClipboard() : 클립보드 객체를 리턴해준다. 이 객체에 내용을 넣어 다른 프로그램등에 전달 해줄때 사용 합니다.



[예제]

/* 화면 한 가운데 width, height가 반인 윈도우 그리기 */
import java.awt.*;

public class ToolkitExam extends Frame {
public ToolkitExam(String title) {
super(title);
}
public static void main(String[] args) {
ToolkitExam halfWindow = new ToolkitExam("Toolkit Sample");
Toolkit toolkit = halfWindow.getToolkit();
Dimension size = toolkit.getScreenSize();

halfWindow.setBounds(size.width/4, size.height/4,
size.width/2, size.height/2);
halfWindow.setVisible(true);

[프리랜서] 자바, 스프링, xplatform 중급 이상 개발자 모집

[프리랜서] 중급 이상 개발자 모집


㈜오엔제이시스템즈에서 공공기관 SI프로젝트 중급이상 개발자 모집하고 있습니다.

경력 : 중급이상(KOSA기준)

위치 : 서울 강남

투입일시 : 8월중

기간 : 7 or 8개월(연장될 수 있으니 참고하세요)

필수조건 : Xplatform

우대조건 : Proframe, 회계업무경험자

경력기술서(skill inventory)를 아래의 이메일로 보내주시면 전화드리겠습니다.

manager@onjprogramming.co.kr


역량있는 개발자분들의 많은 지원 바랍니다.

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터, iPhone 하이브리드 앱 개발 실무과정(평일야간) 개강확정

iPhone 하이브리드 앱 개발 실무과정

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

강좌명iPhone 하이브리드 앱 개발 실무과정(평일야간)
교재본원 자체교재 무료지원
강좌 일정08월21일(수) ~ 09월09일(월)((평일야간) 19:00~22:00, 14일) 총 42시간
강의 장소[B강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차- 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료580,000원
- 맥북무료지원
고용보험 환급(50~80% 환급)
[고용주환급]대기업:17만원 전후,중소기업:216,968원
[개인수강지원(개인환급)]정규직 464,000원 ,비정규직:전액환급

재직자 내일배움카드 : 정부지원금 80% 자기부담금 20%
(구 능력개발카드 명칭이 내일배움카드로 변경 / 연간 총한도 200만원)

* 휴강 :법정공휴일
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항02-851-4790 번으로 연락 부탁 드립니다.
교육개요본강좌는 아이폰과 아이팟 터치용 앱 개발을 위한 실용적인 경험을 제공하며. 쉽게 따라 해 볼 수 있도록 구성된 여러 샘플 예제를 통해서 Xcode 도구 사용법, 오브젝티브-C, 코어 프레임워크 등을 배우게 된다. 자신도 모르는 사이에 앱 개발에 필요한 기술은 물론이고 아이튠즈 앱스토어에 앱을 제출하는 과정도 알게 된다. 아이폰 프로그래밍에 첫 발을 내딛는 입문자 혹은 랭귀지 개발자에게 적합한 교육이다.

Xcode와 인터페이스 빌더 사용법, 오브젝티브-C를 이용한 모델-뷰-컨트롤러 구조, 데이터 입력 인터페이스 구현 및 입력 데이터 핸들링, 다양한 예제를 빌드를 통해 일반적으로 발생하는 문제 해결법, 앱스토어와 임시 배포에 필요한 요구 사항, 아이폰 가속도계, 근접 센서, 아이폰의 설정 앱 핸들링,이후 아이폰에서의 SQLite 활용, SQLite 관리 도구 활용, 실전에서 활용 가능한 최적화 기법 등의 내용을 배우게 됩니다.
교육목표- MAC 사용방법 실습
- Objective-C 프로그램 언어 이해
- Xcode와 인터페이스 빌더 사용법
- 오브젝티브-C를 이용한 모델-뷰-컨트롤러 구조 이해
- 데이터 입력 인터페이스 구현 및 입력 이헤
- 데이터 핸들링 이해
- 앱스토어와 임시 배포에 필요한 요구 사항
- UIKit프레임웍 이해
- 프로토콜, 델리게이트의 이해
- NSXMLParser
- 웹서버와 GET, POST 방식의 통신
- 임베디드 기기를 위한 SQLite 최적화
- SQLite 활용, SQLite 관리 도구 활용 이해
- SQLite 실전에서 활용 가능한 최적화 기법 이해
- 하이브리드앱 개발
교육대상-Objective-C 활용분야에 관심이 있는 자
-Cocoa / Xcode / iPhone 기반 애플리케이션/스마트폰 개발자
-SQLite 개발자
-SDK APP 개발자 
선수학습- c, c++
-프로그래밍 초보자
 



아이폰 개발 준비- MAC에 대한 개요와 이해
- MAC 사용방법 실습
- 개발자 라이센스 등록 절차 및 인증서 등록
- 앱의 다양한 배포방법(adHoc, Appstore, OTA)
objective-c- objective-c의 개요
- 콘솔창에서 클래스 만들고 gcc로 컴파일하기
- iPhone에 대한 개요과 구조 설명, Xcode 사용방법
- 메모리 관리(수동메모리관리)
- Foundation 프레임웍 개요
- UIKit프레임웍의 개요
- 세터와 게터 만들기
- 프로퍼티에 대한 이해, 점연산자
- 프로퍼티 속성
- 메시지 전달 방식에 대한 이해
- 프로토콜, 델리게이트의 이해 및 실습
iPhone SDK- Xcode에서 프로젝트 설정
- NSLog 및 출력 서식 사용하기
- 인터페이스 빌더, IBOutlet, IBAction에 대해 이해하기
- Immutable, Mutable 클래스의 차이
- MVC, Delegate, SingleTon, Target Action 패턴 이해
- 아이폰의 샌드박스구조에 대한 이해 및 파일처리
- UIButton, UILabel, UIImmageView 실습
- UISwitch, Webkit, UISegmetedControl 실습
- UITextField, UITextView, UISlider 실습
- main 구조파헤치기
- UIApplication 라이프 사이클 이해하기
- UIViewController , UIView 라이프 사이클 이해하기
- UIAlertView, UIActionSheet 실습
- UIPickerView 커스터마이징
- TableView 커스터마이징
- TableView Cell 커스터마이징
- UIKit Frameowork 와 Interface builder의 개연성 이해하기
- NSXMLParser
- 웹서버와 GET, POST 방식의 통신 구현
- Navigation Template 구현하기
- NSConnection을 이용한 ASynchronous 통신
SQLite3- Sqlite3 사용실습
- Sqlite3 사용실습
실무 하이브리드앱 개발- 하이브리드앱 개발
- 하이브리드앱 개발
- 하이브리드앱 개발
 

[스프링프레임워크, iBATIS, 자바교육]Spring3.X, MyBatis, Hibernate실무과정


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












Spring3.X, MyBatis, Hibernate실무과정(주말주간(토/일))
교재 자체교재 or PDF 파일제공
강좌 일정 08월17일(토) ~ 08월31일(토)((주말주간(토/일)) 10:00~18:00, 5일) 총 35시간
강의 장소 [A강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 - 580,000원
[고용주환급]대기업:17만원 전후,중소기업:216,968원
[개인수강지원(개인환급)]정규직:440,000원 환급, 비정규직:전액환급

대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.



* 휴강 :법정공휴일
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 본과정은 자바 웹개발에서 가장 많이 사용되고 있는 자바기반 프레임워크인 Spring3.2를 학습하는데 스프링이 왜 도입되어야 하는지부터, 기본모듈구성, 아키텍처 DI, DL, IoC, 최근 개발모델의 핵심인 Spring AOP, AspectJ Annotation, 표현언어인 SpEL, Spring MVC, Spring MVC TEST Framework, Spring WebFlow, Spring JDBC, Spring Transaction등 개발에 필요한 부분을 체계적으로 실습을 통해 학습하며 SQLMapper인 MyBatis, Hibernate 까지 학습하는 Spring 최고의 교육 입니다.

[특징]
- 실무/실습에 근거한 이론 취득
- 단기간에 스프링 개발자로 양성
- 문답씩 수업으로 수강 효과 극대화
- 이론/실습 과제로 인한 개발력 UP
교육목표 - Spring의 도입배경 및 아키텍처에 대해 이해한다.
(자바빈의 태동부터 EJB, 그리고 현재까지)
- Eclipse, Maven, STS 플러그인에 대한 이해
(개발환경 설정의 이해)
- Spring IoC(DI, DL)의 이해
(실습을 통한 setter,getter,constructor injection의 이해)
- Spring AOP의 이해
(실습을 통한 Spring AOP의 이해, AOP어렵지 않습니다)
- AspectJ Annotation에 대한 이해
(Spring의 AspectJ 지원 및 Annotation 대한 이해 by 실습)
- Spring Web MVC, JDBC의 이해
(실습을 통한 Spring MVC, JDBC의 이해)
- Spring Controller에 대한 이해
(간단한 Controller의 구현을 통한 MVC Font Contrller의 이해)
- Spring Web Flow에 대한 이해
(실습을 통한 Spring Web Flow 및 JSF에 대한 이해)
- SpEL에 대한 이해
(실습을 통한 Spring SpEL의 이해)
- Servlet3 비동기 요청에 대해 이해한다.
(실습을 통한 비동기 서블릿에 대한 이해)
- MyBatis Mapper에 대해 이해한다.
(실습을 통한 MyBatis 구성, 작동원리 이해)
- Hibernate Mapper에 대해 이해한다.
(실습을 통한 Hibernate 구성, 작동원리 이해)
- 실무 개발 환경에 적응력 UP
(Spring, MyBATIS 기반 게시판 작성)
교육대상 - JAVA, JSP 개발자
- 자바개발은 오래 했지만 프레임워크에 대해 자신이 없는 개발자
- 단기간에 스프링을 박살 내고 싶은 개발자.
(스프링 혼자 공부하기는 어렵습니다!!)
선수학습 - JAVA, JSP
 


Spring3.2 J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.2, Tomcat7, Spring3.2 다운로드 및 설치)
Maven, STS 플러그인 설치
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
Dependency Pull, CDL(Contaxtualized Lookup)
Setter/Constructor/Mathod Injection
Spring 설정
Spring AOP 란 ?Code, Advice, JoinPoint, PointCut, Aspect, WeavingProxyFactoryBean
Annotation기반 AOP(AspectJ)
기타 Spring의 선언적 AOP 선언
Spring JDBC
Spring MVC
Spring Controller
Spring Webflow, JSF
Spring 표현언어 SpEL
Servlet3 비동기 요청처리
Spring3.2 Transaction 관리
Spring MVC TEST Framework
MyBatis/hibernate [MyBatis]
개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
고급 쿼리 사용방법의 이해와 실습
Spring MyBatis 응용예제 작성

[Hibernate]
Hibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성
 

[ORACLEJAVANEW.KR]Struts DispacthAction 클래스

Struts DispacthAction 클래스 DispacthAction 클래스


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


액션의 경우 하나의 클래스에 관련된 action이 정의 되어 있는 것이 좋은 방법인데  DispacthAction 클래스는 관련된 action은 하나의 클래스에 관리하는 방법을 제공 합니다.

DispacthAction 클래스는 추상 클래스 이므로 사용하기 위해서는 액션 클래스에서 오버라이드 해야 하며 DispacthAction 클래스에서는 어느 action이 불리어져야 하는지를 관리 하기 위해 hidden request parameter를 관리 합니다.

DispacthAction 을 상속 받은 하위 클래스로 넘어오는 hidden parameter는 스트럿츠 설정 파일에 있는 <action> 요소의 parameter 라는 속성의 값이 넘어 오게 됩니다.

결국 DispacthAction 클래스를 상속 받은 하위 클래스는 execute() 메소드와 signature가 같은 많은 메소드(각각의 Action이 수행 해야 하는 메소드)를 정의해야 합니다.


=================================================================

1. Action 처리를 위한 DispatchAction클래스의 하위 클래스를 작성

public class UserRegistrationMultiAction extends DispatchAction {
...
}

2. 관계된 action을 구현 합니다.

public ActionForward processPage1( ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
}

public ActionForward processPage2(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
}


3. Action Mapping을 작성 합니다. 이때 paramter라는 속성에 “action” 이라고 줍니다. 이 action이라는 파라미터와 그 값(이건 JSP에서 넘어 옵니다)이 위에서 구현한 DispatchAction 클래스를 상속한 UserRegistrationMultiAction 클래스에 넘어 가게 됩니다.
즉 paramter인 action의 값이 수행 하고자 하는 action이 되는 것 입니다.

<action path="/userRegistrationMultiPage1"
type="strutsTutorial.UserRegistrationMultiAction"
name="userRegistrationForm"
attribute="user"
parameter="action"
input="/userRegistrationPage1.jsp">
...
</action>

<action path="/userRegistrationMultiPage2"
type="strutsTutorial.UserRegistrationMultiAction"
name="userRegistrationForm"
attribute="user"
parameter="action"
input="/userRegistrationPage2.jsp">
...
</action>

4. 이젠 JSP에서 action이라는 히든 텍스트를 만들어 Action이 일어 날 때 Action을 처리하는  클래스(UserRegistrationMultiAction ) 로 넘기게 됩니다.

userRegistrationPage1.jsp 에 포함된 히든 태그

<html:hidden property="action" value="processPage1"/>

userRegistrationPage2.jsp 에 포함된 히든 태그

<html:hidden property="action" value="processPage2"/> 

[ORACLEJAVA커뮤티니, oraclejavanew.kr]Struts Bean 커스텀 태그

Struts Bean 커스텀 태그

자바 빈과 관련된 프로퍼티에 접근 하는데 이용되며 페이지 scope 속성들과 변수의 기술을 통해 페이지의 나머지 부분에서 쉽게 접근 할 수 있도록 자바 빈을 정의하는데 사용 됩니다.

또한 Bean 태그 라이브러리의 태그들에서는 요청 쿠키, 헤더 그리고 파라미터 값을 기반으로 하는 새로운 빈을 생성 해야 하는 경우 편리하게 이용 할 수 있는 메커니즘도 제공 합니다.

아래는 Bean 태그 라이브러리의 커스텀 태그들 입니다.


Custom tags within the Bean tag library

cookie : 지정한 요청 쿠키의 값에 근거해 변수를 정의
define : 지정한 빈 프로퍼티에 값에 근거해 변수를 정의
header : 지정한 요청 헤더의 값에 근거해 변수를 정의
include : 동적인 애플리케이션 요청의 응답을 로드해 빈으로 이용 할 수 있게 함
message  : 국제화된 메시지를 표시
page : 지정한 아이템을 빈으로써 페이지 문맥에서 꺼냄
parameter : 지정한 요청 파라미터에 근거해 변수를 정의
resource : 웹애플리케이션의 자원을 로드해 빈으로 이용 할 있게 함
size : Collection 또는 Map 요소의 개수를 포함한 빈을 정의
struts : 지정한 스트럿츠 내부 설정 객체를 빈으로
write : 지정한 빈 프로퍼티의 값을 표시


1.define 태그

지정한 빈의 프로퍼티 값을 꺼내 현재 페이지의 나머지 부분에서 접근 할  수 있도록 정의 합니다.반환되는 프로퍼티 값이 자바 원시 데이터 타입인 경우를 제외하고는 형 변환이 일어 나지 않습니다. 단 자바 원시데이터 타입인 경우엔 이 원시 데이터 타입의 래퍼형으로 변환 됩니다. (int 형이면 Integer로…)


[예:게시판의 VIEW 구현 시 이용]

<td width=490 style= "padding-left:10 ">
<bean:define id="content” name="boardForm" property="boardValue.content"/ >
<%= BoardUtils.convertHtmlBr((String)content) %>
< / t d >

2.header 태그

name으로 지정된 요청 헤더 값을 꺼내 String 타입의 페이지 scope 속성으로 정의

multiple 속성에 null이 아닌 값을 설정 한 경우 id 속성은 HttpServletRequest.getHeader() 대신 HttpServletRequest.getHeaders()를 호출하여 얻은 결과값을 포함 합니다.

[예제: 아래 예제는 요청 헤더와 헤더 값을 출력 합니다.]

<%@ page pageEncoding="euc-kr" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<body>
<%
java.util.Enumeration names =
((HttpServletRequest) request).getHeaderNames();

while (names.hasMoreElements()) {
String name = (String) names.nextElement();
%>

<bean:header id="head" name="<%= name %>"/>
 <br>Header Name : <%= name %> = <%= head %>
 
<%
}
%>
</body>
</html>

[결과]

Header Name : accept = */*
Header Name : accept-language = ko,en;q=0.5
Header Name : accept-encoding = gzip, deflate
Header Name : user-agent = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
Header Name : host = localhost
Header Name : connection = Keep-Alive
Header Name : cookie = JSESSIONID=EF8A4D1130ADFD06F6E78BE2A7BA9801

3.include 태그

지정한 애플리케이션 컴포넌트(또는 외부의URL)에 내부적으로 요청을 보내 수행 하고 이때 얻은 응답을 String 타입의 빈으로 만듭니다. 이때 생성된 빈은 id 속성의 값을 변수 명으로 가지며 페이지 scope에 저장 됩니다.

이 태그는 <jsp:include>와 비슷합니다. 그러나 표준 <jsp:include>에서는 해당 컴포넌트를 수행해서 얻은 응답을 직접 출력 스트림에 쓰는 반면 Bean 태그라이브러리의 include 태그에서는 페이지 범위를 가지는 빈으로 저장하는 것이 차이가 있습니다.

아래 처럼 include 태그를 이용해서 페이지 범위의 빈에 저장

<bean:include id="footerSpacer" page="/long/path/footerSpacer.jsp"/>

이제 페이지의 적절한 곳에서 <bean:write>를  이용하여 출력 할 수 있습니다.

<bean:write name="footerSpacer" />

[예제-test.jsp]
<%@page pageEncoding="euc-kr" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<body>
<bean:include id="inc" page="/include.jsp"/>
<br>
원래 페이지의 내용...<br>
<bean:write name="inc"/>
<br>========================<br>
<bean:write name="inc"/>
</body>
</html>

[include.jsp]
include되는 페이지의 출력...


4.message 태그

스트럿츠 태그 라이브러리에서 가장 널리 이용되는 태그 중 하나이며 지정된 메시지 키를 이용하여 국제화된 메시지를 꺼내와 출력 스트림에 출력 합니다. “{0}”와  같은 파라미터 치환을 5개까지 허용 합니다.

메시지를 꺼내오기 위해서는 key 속성을 사용하여 직접 지정 할 수도 있으며 name과 property 속성을 사용하여 빈에서 간접적으로 꺼내 올 수도 있습니다. 그리고 bundle 속성에는 MessageResources 객체를 얻어 올 수 있는 애플리케이션 범위의 빈의 이름을 지정 할 수도 있습니다. Locale 속성을 지정하지 않은 경우 필요한 locale은 세션에서 키 Action.LOCALE_KEY를 사용하여 얻습니다.

아래는 간단한 예 입니다.

<head>
<html:base/>
<title><bean:message key="title.login"/></title>
    </head>

5.parameter 태그

지정된 요청 파라미터의 값을 꺼내 String 타입의 페이지 범위의 속성으로 정의 합니다. 만약 multiple 속성에 null 이 아닌 값이 설정 될 경우에는 getParamter() 대신 getParameters() 메소드를 호출하고 String[] 타입의 페이지 범위 속성을 정의 합니다. 


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


<bean:parameter id="param1" name="param1"/>
<bean:parameter id="param2" name="param2" multiple="true"/>
<bean:parameter id="param3" name="param3" value="UNKNOWN VALUE"/>


6.resource 태그

지정된 웹 에플리케이션 자원의 값을 꺼내 input 속성의 값에 따라 InputStream이나 String 타입의 한 형태로 사용 할 수 있게 합니다. input 속성의 값이 null이 아닌 값인 경우 InputStream을 생성하며 그 외에는 String으로 로딩 합니다.

<bean:resource id="webxml" name="/WEB-INF/web.xml"/>

얻어진 정보를 JSP 페이지에서 보기 위해서는 아래처럼 하면 됩니다.

<pre>
<bean:write name="webxml" filter=”true” />
</pre>

[예제]
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html>
<body>
<bean:resource id="webxml" name="/WEB-INF/web.xml"/>
<pre>
<bean:write name="webxml" filter=”true” />
</pre>
</body>
</html>

7.write 태그

빈 프로퍼티의 값을 꺼내 String 형태로 출력하는 태그로써 자주 사용되는 것입니다. 즉 자바 빈에서 속성 값을 get 하는 것 입니다. 만약 filter 속성이 “true” 이면 “<” 인 경우 <로 변환 됩니다. 

[오라클자바닷넷강좌]JAVA AWT Component 클래스

이번 강좌에서는 중요한 Component 클래스에 대해 알아 보겠습니다. 자바 클래스의 최상위 클래스가 Object인 것처럼, AWT의 GUI콤포넌트의 최상위 클래스는java.awt.Component입니다. Component의 하위클래스에는 다시 Button, Canvas, Checkbox, Choic, Label, List, Scrollbar, TextComponent 과 Container가 존재합니다. 그리고, 그중에서, Container콤포넌트는 Button, Canvas..와 같은 일반 콤포넌트와 달리, 다른 Component와 Container를 포함할수 있습니다.


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




Component Class(Abstract)
- 자바의 모든 Component가 상속을 받는 클래스 -
- 이 클래스를 상속 받는 클래스가 적절히 Method 들을 Overriding 해줘야 함
- Component로서의 기본적인 기능들을 정의및 선언, 하위 클래스에 대한 공통적인 요소(Attribute)아 행동(Behavior, method)을 정의
- 이들 Component는 다른 Component를 자신안에 둘수 있는 컨테이너 콤 포넌트이고, 다른 하나는 컨테이너 역할을 할수 없는 단순한 Component
- 기존 OS 기반 위에서 만들어 지므로 OS가 가지고 있는 Component만을 지원
- Java.awt Package안에 포함되어 있습니다.

배치/위치와 관련된 Method
doLayout() : 이 컴포넌트를 배치하도록 배치 관리 프로그램에 프롬프트 합니다.
validate() : 컨테이너와 모든 부속 컴포넌트가 Valid Layout을 가짐을 확인 합니다. 컨테이너와 하부 컴포넌트를 다시 배치 합니다.
invalidate() : 컨테이너와 모든 부속 컴포넌트가 다시 그려져야 한다고 표시
setVisible(boolean?b) : b 가 true인 경우 Component를 보이게 설정, false인 경우 안보이게 설정
getLocation() : Component의 위치를 x,y형태의 Point 유형의 객체로 Return 합니다.
getLocation(Point ?rv) : Component의 위치를 x,y형태의 Point 유형의 객체로 Return 한다.
getLocationOnScreen() : 화면의 좌표 공간에 컴포넌트의 왼쪽 상단을 지정하여, 점 형식으로 이 컴포넌트의 위치를 가져 옵니다.
setLocation(int?x, int?y) : Component의 위치를 x ,y에 대응시킵니다.
setLocation(Point?p) : Component의 위치를 점 p에 대응시킵니다.
getBounds() : 객체의 위치와 크기를 Rectangle 유형의 객체로 Return 합니다.
getBounds(Rectangle ?rv) : 객체의 위치와 크기를 Rectangle rv로 Return 합니다.
setBounds(int?x, int?y, int?width, int?height) : Component 객체의 위치를 x,y에 위치시키고 그 크기는 width, height 로 합니다.
setBounds(Rectangle ?r) : Component 객체의 위치및 크기를 Rectabgle r로 합니다.
getX(), getY()


크기와 관련된 Method
getSize() : Component의 크기를 Dimension 객체(width, height)로 Return 합니다.
getSize(Dimension ?rv):Component크기를 Dimension객체 rv로 Return 합니다.
setSize(int?width, int?height) : component의 크기를 width와 height로 설정합니다.
setSize(Dimension ?d) : Component의 크기를 Dimention 객체의 width와 height로 설정 합니다.
getPreferredSize() : 이 컴포넌트의 선호 크기를 가져옵니다.
getWidth() : getHeight() :
getMaximumSize() : 이 컴포넌트의 최대 크기를 가져 옵니다.
getMinimumSize() : 이 컴포넌트의 최소 크기를 가져 옵니다.

Graphic과 관련된 메소드
getForeground() : 현재 전경색을 읽어 Color유형의 객체로 Return 합니다.
setForeground(Color c) : 현재 전경색을 Color유형의 객체 c 로 설정 합니다.
getBackground() : 현재 배경색을 읽어 Color 유형의 객체로 Return 합니다.
setBackground(Color c) : 현재 배경색을 Color 유형의 객체c로 설정 합니다.
getFont() : Component 객체의 글꼴을 Font 객체 형태로 Return 합니다.
setFont(Font f) : Component 객체의 글꼴을 설정한다.
getFontMetrics(Font font) : 지정된 글꼴의 글꼴 행렬을 가져 옵니다.
setCursor(Cursor cursor) : 커서 이미지를 사전 정의된 커서로 설정 합니다.
getCursor() : 커서가 이 컴포넌트상에 설정되도록 합니다.
paint(Graphics g) : 이 컴포넌트의 색상을 표시 합니다.
paintAll(Graphics g) : 이 컴포넌트와 모든 서브컴포넌트의 색상을 표시 합니다.
repaint() : 이 컴포넌트의 색상을 표시 합니다.
repaint(long tm) : 이 컴포넌트의 색을 다시 표시 합니다.
repaint(int x, int y, int width, int height) : 이 컴포넌트의 지정된 사각형 색상을 표시 합니다.
repaint(long tm, int x, int y, int width, int height) : tm 밀리쎄컨드 내에 이 컴포넌트의 지정된 사각형 색상을 표시 합니다.
print(Graphics g) : 이 컴포넌트의 색상을 표시 합니다.
printAll(Graphics g) : 이 컴포넌트와 모든 서브컴포넌트의 색상을 표시 합니다.
update(Graphics g) : 이 컴포넌트를 갱신 합니다.

Event와 관련된 메소드
processEvent(AWTEvent e) : 이 컴포넌트에서 발생하는 이벤트를 처리 합니다.
processComponentEvent(ComponentEvent e) : 등록된 ComponentListener 객체로 보내어, 이 컴포넌트에서 발생하는 컴포넌트 이벤트들을 처리 합니다.
processFocusEvent(FocusEvent e):등록된FocusListener객체로 보내어, 컴포넌트에서 발생하는 초점이벤트들을 처리
processKeyEvent(KeyEvent?e) : 등록된 KEYLISTENER객체로 보내어, 이 컴포넌트에서 발생하는 키 이벤트들을 처리.
processMouseEvent(MouseEvent e):등록된 MouseListener 객체로 보내어, 이 컴포넌트에서 발생하는 마우스이벤 처리
processMouseMotionEvent(MouseEvent e) : 등록된 MouseMotionListener 객체로 보내어, 이 컴포넌트에서 발생하는 마우스 모션 이벤트들을 처리 합니다.
processInputMethodEvent(InputMethodEvent e) : 등록된 InputMethodListener 객체로 보내어, 이 컴포넌트에서 발생하는 InputMethod 이벤트들을 처리 합니다.
addComponentListener(ComponentListener?l) : 이 컴포넌트로부터 컴포넌트 이벤트를 받기 위해 지정된 컴포넌트 수신기(listener)를 추가합니다.
removeComponentListener(ComponentListener l) :
addFocusListener(FocusListener l) :이 컴포넌트로부터 초점 이벤트를 받기 위해 지정된 초점 수신기를 추가 합니다.
removeFocusListener(FocusListener l)
addKeyListener(KeyListener l) : 이 컴포넌트로부터 키 이벤트를 받기 위해 지정된 키 수신기를 추가.
removeKeyListener(KeyListener l) :
addMouseListener(MouseListener l) : 이 컴포넌트로부터 마우스 이벤트를 받기 위해 지정된 마우스 수신기를 추가 합니다.
removeMouseListener(MouseListener l)
addMouseMotionListener(MouseMotionListener l) : 이 컴포넌트로부터 마우스 모션 이벤트를 받기 위해 지정된 마우스 모션 수신기를 추가 합니다.
removeMouseMotionListener(MouseMotionListener l) addInputMethodListener(InputMethodListener l) : 이 컴포넌트로부터 Input Method 이벤트를 받기 위해 지정된 Input Method 수신기를 추가 합니다.
removeInputMethodListener(InputMethodListener l)

addPropertyChangeListener(PropertyChangeListener listener) : 이 컴포넌트로부터 Property Change 이벤트를 받기 위해 지정된 Input Method 수신기를 추가 합니다.
removePropertyChangeListener(PropertyChangeListener listener)

getListeners(Class listenerType) : addXXXListener()로 추가된 리스너 들을 리스너 배열로 Return 합니다.
기타 메소드
addNotify() : 이 컴포넌트가 컨테이너에 추가되었고, 피어(peer)가 필요하면 작성해야 한다는 것을 이 컴포넌트에 알립니다.
removeNotify() : 이 컴포넌트가 컨테이너에서 제거되었고, 피어(peer)가 있으면 피어가 제거된다는 것을 이 컴포넌트에 알립니다.
add(PopupMenu popup) : 지정된 팝업 메뉴를 컴포넌트에 추가 합니다.
contains(Point p) : 이 컴포넌트에 지정된 점이 "포함"되어 있는지 점검합니다. 이 점의 x 및 y 좌표는 이 컴포넌트의 좌표 체계에 비례하여 정의 됩니다.
contains(int x, int y) : 이 컴포넌트에 지정된 점이 "포함"되어 있는지 점검합니다. 여기서 x와 y는 이 컴포넌트의 좌표 체계에 비례하여 정의 됩니다.
isEnabled() : 이 컴포넌트가 작동 가능한지 판별 합니다.
setEnabled(boolean b) : 매개변수 b 값에 따라 이 컴포넌트를 작동시키거나 작동 불가능하게 합니다.
getComponentAt(int x, int y) : 이 컴포넌트 또는 바로 아래 부속 컴포넌트 중 하나에 (x,?y) 위치가 있는지 판별 합니다. 있으면 포함된 컴포넌트를 리턴 합니다. .
getComponentAt(Point p) : 지정된 지점이 속해 있는 서브컴포넌트 또는 컴포넌트를 리턴 합니다.
getName() : 컴포넌트의 이름을 가져옵니다.
setName(String name) : 지정된 문자열로 컴포넌트 이름을 설정 합니다.
getParent() : 이 컴포넌트의 상위 컴포넌트를 가져 옵니다.
getToolkit() : 이 컴포넌트의 도구 킷을 가져 옵니다.
hasFocus() : 컴포넌트가 KeyBoard Focus를 가지고 있는지 boolean형 Return
isVisible() : 이 컴포넌트가 가시적인지 판별 합니다.
list() : 표준 시스템 출력 스트림 System.out으로 이 컴포넌트의 목록을 인쇄 합니다.
list(PrintStream out) : 지정된 출력 스트림으로 이 컴포넌트의 목록을 인쇄 합니다.
list(PrintStream out, int indent) : 지정된 들여쓰기 위치에서 시작하여 지정된 인쇄 스트림으로 목록을 인쇄 출력 합니다.
list(PrintWriter out) : 지정된 인쇄 작성자로 목록을 인쇄합니다.
list(PrintWriter out, int indent) : 지정된 들여쓰기 위치에서 시작하여 지정된 인쇄 작성자로 목록을 인쇄 합니다.
isShowing() : 이 컴포넌트가 화면에 표시되고 있는지 판별합니다. isValid() : 이 컴포넌트가 유효한지 판별 합니다.
isDisplayable() : 이 컴포넌트가 displayable 인지 판별
isLightweight() : native Peer Component를 가지지 않는 Component인지 판별 true if this component has a lightweight peer; false if it has a native peer or no peer. Component나 Container의 하위클래스중 Button이나 Scollbar 같은 것이외의 것들은 lightweight Component, 스윙 컴포넌트는 lightWeight Component 컴포넌트가 displayabke 이 아니면 false

아래의 예제를 참고 하세요~

import java.awt.*;
public class AwtTest extends Frame {
Button btn; Label lbl ; TextArea ta; TextField tf; Checkbox cb1, cb2;
Choice choice; List list;
AwtTest () {
btn = new Button("버튼");
lbl = new Label("라벨");
ta = new TextArea("TextArea", 5, 20); // 5행, 20열
tf = new TextField("TextField", 20); // 20칸
cb1 = new Checkbox("체크박스1");
cb2 = new Checkbox("체크박스2");
choice = new Choice();
list = new List(3,true); // 보여지는것은 2개이고 다중선택은 true로 지정
}
void display() {
setLayout(new FlowLayout()); // 컴포넌트 배치 설정
add(btn);
add(lbl);
add(ta);
add(tf);
add(cb1);
add(cb2);

choice.add("초록"); // 콤보박스에 항목 추가
choice.add("빨강");
choice.add("파랑");
add(choice);
list.add("봄"); // 리스트박스에 항목 추가
list.add("여름");
list.add("가을");
list.add("겨울");
add(list);
pack();
setVisible(true);
}
public static void main(String args[]) {
AwtTest myFrame = new AwtTest();
myFrame.display();
}
}








2013년 8월 4일 일요일

(오라클 테이블스페이스)oracle tablespace

ORACLE TableSpace 개념


소개
- Oracle은 논리적으로는 TableSpace에 , 물리적으로는  DataFile에  Data를 저장한다.
- Oracle DataBase는 TableSpace라는 하나 이상의 논리적인 저장 단위로 구성되며,
또한 각TableSpace는 DataFile이라는 하나 이상의 OS File로 구성된다.
- Table이나 Index 같은 Schema Object가 생성되면 DB내의 지정된 TableSpace에 해당
  Segment가 생성된다. Create Table 명령에 TableSpace Option을 사용하여 특정
  TsableSpace에 Table을 저장한다.

1. DBA는 TableSpace를 이용하여 다음과 같은 작업을 수행한다.
- DataBAse의 Data를 저장하기 위한 Disk 영역 할당제어
- DataBAse 사용자에게 특정 영역 할당
- 각 TableSpace를 Online또는 OffLine으로 설정하여 Data의 가용성 제어
- 부분적인 DataBase BackUp또는 Recovery 수행
- 성능 향상을 위해 Data 저장영역을 여러 장치에 나누어 할당

2. SYSTEM TableSpace
- DB가 생성될때 자동으로 생성되며, 전체 DB에 대한 Dictionary를 포함하고, 항상 Online
으로 유지되어야 한다.
- 크기가 작은 DB는 SYSTEM TableSpace만을 필요로 할수도 있으나 일반적으로는
적어도 하나이상의 TableSpace를 추가로 생성하여 사용자 Data를 Dictionary와 별개로
저장해야 한다.이렇게 함으로서 Dictionary Data와 Schema 개체간의 경합을 줄일수 있다.
- Procedure/Function/Package/Package Body등의 내장 PL?SQL단위로 저장된 자료는
SYSTEM TableSpace안에 저장되어야 한다.

3. DataBase 확장 방법
- 기존 TableSpace에 하나의 DataFile을 추가하는 방법
  (alter tablespace users add datafile ‘/usr2/oradata/users02.dbf’ size 500m;)
 - 새로운 TableSpace를 생성(DataFile도 당연히 추가되어야 한다.)
  (create tablespace users2 datafile ‘/usr2/oradata/users02.dbf’ size 500m
    default storage (initial 300k next 300k);
    default storage (initial 100k next 100k pctincrease 0);)
 - 추가 영역이 필요할 때 마다 DataFile의 Size를 늘여주는 방법
  (alter database datafile ‘/usr2/oradata/users01.dbf’ autoextend on next 20m
maxsize 1000m;)

4.  TableSpace의 Offline
- DBA는 DB가 Open되었을때 SYSTEM TableSpace를 제외한 다른 TableSpace에 대하여 Online
또는 OffLine으로 설정할수 있다.
OffLine으로 설정하는 이유는 다음과 같다.
a. DB의 일부분의 사용을 제한할 때
b. Offline TableSpace BackUp을 수행할때(DB가 Archive Mode로 운용중일때는 OnLine 상황
에서도 TableSpace의 BAckUp이 가능함)
c. .응용프로그램을 갱신또는 유지보수 하는 동안 응용프로그램과 해당 Table Group을 임시로
사용 못하게 함
 - TableSapce의 Offline
a. 만약 TableSpace에 사용하는 RollBack  Segment가 있다면 Offline으로 설정이 불가
 함
b. TableSpace가 Offline 상태가 되거나 다시 Online상태가 될때 이러한 상태 변화는
SYSTEM TableSpace의 Dictionary에 기록되며,DB를 종료할때 TableSpace가 OffLine
이었다면 DB를 Mount하여  Open하여도 역시 해당 TableSpace는 Offline이다.
c. DB의 DBWR는 TableSpace의 DataFile에 기록할때 오류가 발생하면 해당 
TableSpace를 Offline 시킨다.
d. 만약 Index와 Data를 서로다른 TableSpace에 분리하였을 경우
인덱스를 포함하는 TableSpace가 Offline인 경우에는 Query에서 여전히 Data를 Access할수
있다.그러나 Data를 포함하는 TableSpace가 Offline인 경우에는 Data Access불가함

5. 읽기 전용 TableSpace
- 기본목적은 DB의 정적부분의 백업 및 복구를 수행하지 않기위해
- 새로운 TableSpace를 생성하면 항상 읽기/쓰기 가능모드로 생성되면, 읽기 전용으로 설정할
경우에는 read only Option을 이용한다. 물론 이후에 read write Option을 사용하여 다시
쓸수있게 만들수 있다.

- Offline된 DataFile은 Access할수 없으며 읽기전용 TableSpace의 DataFile을 Online으로
설정하면 file을 읽을수 있게 되며, 연관된 TableSpace가 read write Option으로 설정되어야만
기록할수 있다. 읽기전용 TableSpace의 DataFile은 alter database 명령어에 datafile Option을
사용하여 독립적으로 onlin이나 Offline될수 있다.

- TableSpace를 Offlin으로 설정한 경우에도 읽기전용 TableSpace에 DataFile을 추가할수
없습니다. 즉 읽기전용 TableSpace를 갱신하려면 먼저 TableSpace를 read write로 만들어야
합니다.그런후 다시 read only로 설정합니다.




2013년 8월 3일 토요일

[oracle hint]ACCESS 경로를 변경하는 힌트(INDEX) , 오라클,자바,교육,강좌

ACCESS 경로를 변경하는 힌트(INDEX)


구로디지털 오엔제이프로그래밍실무교육센터


이 힌트는 생긴 그대로 테이블에 있는 인덱스를 사용할 수 있도록 해주는 구문 입니다. 비트맵 인덱스에 대해서는 사용이 가능하지만 INDEX_COMBINE 힌트를 쓰는 것이 맞구요

사용법은 다음과 같습니다.

[형식]

[]

SQL> select index_name, table_name from user_indexes
  2  where table_name = 'MYEMP1';

INDEX_NAME                     TABLE_NAME
------------------------------ ------------------------------
IDX_MYEMP1_DEPTNO              MYEMP1
SYS_C0011302                   MYEMP1


인덱스가 있는 경우 where 절에 인덱스 컬럼이 보이면 오라클이 알아서 인덱스를 경유하여 데이터를 추출 한다.

SQL> select count(*) from myemp1
  2  where deptno = 2;

  COUNT(*)
----------
   2000000

   : 00:00:00.75
--------------------------------------------------------------------|   0 | SELECT STATEMENT  |                   |     1 |     2 |  3867   (1)|
|   1 |  SORT AGGREGATE   |                   |     1 |     2 |            |
|*  2 |   INDEX RANGE SCAN| IDX_MYEMP1_DEPTNO |  2000K|  3906K|  3867  


이번에는 인덱스를 숨겨보자. 숨긴 후 실행하면 9초 정도 걸린다.

SQL> alter index IDX_MYEMP1_DEPTNO invisible;

인덱스가 변경되었습니다.

SQL> select count(*) from myemp1
  2  where deptno = 2;

  COUNT(*)
----------
   2000000

   : 00:00:09.93

Execution Plan
----------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |     2 | 16966   (1)| 00:03:24 |
|   1 |  SORT AGGREGATE    |        |     1 |     2 |            |          |
|*  2 |   TABLE ACCESS FULL| MYEMP1 |  2000K|  3906K| 16966   (1)|


다시 인덱스 보이도록 설정.

SQL> alter index IDX_MYEMP1_DEPTNO visible;

인덱스가 변경되었습니다.


Index 힌트만 사용한다면 오라클은 적절한 인덱스를 알아서 찾아 경유한다.
SQL>  select /*+ index */
  2          count(*)
  3    from myemp1
  4   where deptno = 2;

  COUNT(*)
----------
   2000000

   : 00:00:00.11

Execution Plan
----------------------------------------------------------
|   0 | SELECT STATEMENT  |                   |     1 |     2 |  3867   (1)|
|   1 |  SORT AGGREGATE   |                   |     1 |     2 |            |
|*  2 |   INDEX RANGE SCAN| IDX_MYEMP1_DEPTNO |  2000K|  3906K|  3867  


만약 테이블 명 다음에 인덱스 명을 여러 개 나열한다면 오라클 서버의 Optimizer는 적정한 인덱스를 찾아 실행 계획을 수립합니다.