Programming/JAVA2015. 4. 1. 21:20

이번에는 우리가 가지고 있는 객체와 클래스의 기초 지식을 바탕으로 가상 모델링 해보도록 하겠습니다가상 모델링으로 구축 할 시스템은 바로 가상 축구 게임 입니다이제부터 클래스를 정의하고 동작(메서드)을 정의하는 요령을 익혀 보도록 합시다.

1. 일단 게임에 필요한 대상이나 동작 같은 요소들을 모두 적습니다.

사람공격수패스골키퍼펀칭태클축구공전반전선수수비수심판파울경기시간후반전 등등


2. 적어 놓은 요소들 중에는 동사와 명사가 있습니다명사는 바로 클래스가 되는 것이고 동사는 바로 메서드가 되는 것입니다이제 클래스와 메서드를 구분해 봅시다.
 

클래스(명사) - 사람공격수골키퍼축구공전반전선수수비수심판경기시간후반전 등등

메서드(동사) - 패스펀칭태클 등등

3. 다음은 클래스 안의 메서드를 정리 합니다.

4. 설계 된 클래스들의 연관을 살펴 보고상속과 추상 or 다형성의 개념을 도입합니다이번 단계는 앞서 우리가 공부한 객체 지향의 설계 방법을 활용할 수 있는 단계입니다.





처음 단순하게 늘어 놓았던 단어들이 한 단계한 단계 정리 되면서 제법 폼 있는 설계도가 완성 되었습니다클래스 모델링이라고 해서 절대 대단한 것이 있는 것이 아닙니다누구나 쉽게 설계하고 모델링 할 수 있습니다지금 언급한 4가지 단계는 필자의 필살기적 노하우를 정리 해 본 것입니다반드시 기억해 두시기 바랍니다.

우리가 게임이든 어떤 소프트웨어든 프로그래밍 하기 전에 가장 먼저 해야 할 중요한 작업이 클래스 모델링의 과정입니다체계적인 뼈대를 갖추고 프로그래밍을 하는 것과 뼈대를 세워 가면서 프로그래밍을 하는 것은 확연히 차이가 나게 됩니다.


앞서 말했듯이 객체 지향적 사고는 한번에 자신의 머리 속에 정착 되는 것은 아닙니다반드시 직접 설계해보고 토론해보고 또 생각해보는 반복적인 노력을 하시길 바랍니다그럼 어느새 내가 만든 프로그램은 뼈대가 생기게 될 것이고 더욱더 논리적인 프로그램을 만들 수 있을 것입니다.



Posted by 신의물방울
Programming/JAVA2011. 8. 16. 00:22

JAVA 프로그래밍을 하기 위해서는 JAVA SE가 설치되어 있어야 한다.

JDK 파일 다운로드

http://java.sun.com/의 Downloads에서 원하는 버전의 JAVA SE를 다운받는다.

Latest Releases가 선택되어 있기 때문에 JDK 버튼을 누르면 최신버전의 JDK를 다운로드 할 수 있다.

Previous Releases를 선택하면 당연히 예전 버전의 JDK를 다운로드 할 수 있다.

자신의 OS와 License에 동의하는 체크를 하고 Download 버튼을 누른다.

* JDK를 설치하는 방법은 2가지가 있다.

Zip파일을 다운받아 압축을 풀어 원하는 위치에 파일을 놓는 방법과 exe파일을 다운받아 설치하는 방법이 있다.

편한대로 사용하면 된다. 나는 exe파일로 기본 설치경로인 C:\Program Files\Java\jdk1.6.0_13 에 설치.

* JDK 1.6_13 을 설치했더니 eclipse.ini 파일을 수정해도

Eclipse-jee-ganymede-SR2 에서 자꾸 heap memory가 부족하다는 error가 발생해서 JDK 1.5_22로 다시 설치.

JDK 1.5_22 Download Click

JDK 환경변수 설

* WinXP 기준

내컴퓨터 아이콘 위에서 마우스 오른쪽 버튼을 클릭해 속성을 선택.

고급 탭으로 들어가 환경 변수 버튼을 클릭.

나타난 환경 변수 창에서 사용자 변수 쪽에서 새로 만들기 버튼을 클릭해 환경 변수를 설정.

시스템 변수로 만들기도 하는데, 컴퓨터 사용자가 JDK를 설치하는 본인 계정 밖에 없다면 사용자 변수로 JAVA_HOME을 만들어도 무방.

환경 변수 이름

JAVA_HOME

C:\Program Files\Java\jdk1.6.0_13

PATH

C:\Program Files\Java\jdk1.6.0_13\bin; (기존 값에 추가)

CLASSPATH

.;%JAVA_HOME%\lib\tools.jar; (기존 값에 추가)

* 주의사항

  • C:Program FilesJavajdk1.6.0_13 는 내가 JDK를 설치한 경로이다. 다른 곳에 설치했으면 그 경로가 JAVA_HOME
  • PATH의 값 뒤에는 세미콜론(;)을 꼭 붙여야 한다.
  • CLASSPATH에 원래 지정된 값이 있다면 ex) C:Document and Settings;가 끝이라면 바로 뒤에 %JAVA_HOME%lib\tools.jar;를 붙이면 된다.
  • JAVA_HOME은 위에서 첫번째로 만든 JAVA_HOME 경로를 의미.

환경변수를 설정했으면 확인 버튼을 눌러 환경변수 창을 빠져나오고, 내 컴퓨터의 속성창에서 확인, 적용 버튼을 클릭해야

편집한 환경변수가 적용된다.

* JAVA EE 프로그래밍(JSP 사용)을 하려면

  • JRE_HOME이란 이름, C:\Program Files\Java\jdk1.6.0_13\jre 이란 JRE가 설치된 경로 값을 가진 환경변수를 추가.

JDK 설치 확인

시작 메뉴 > 실행을 누르고 cmd라고 쓴 다음 Enter 키를 누르면

위와 같은 MS Dos 창이 뜬다.

여기에 java -version이라는 명령어를 입력했을 때 설치한 JDK 버전이 나오면 JDK가 제대로 설치된 것이다.

그렇지 않다면!

제어판 > 프로그램 추가 삭제에서 설치한 JDK를 삭제하고 재부팅 한 다음 다시 JDK를 설치해야 한다.

출처 : http://blog.naver.com/ecarooce?Redirect=Log&logNo=140108643464 

Posted by 신의물방울
Programming/JAVA2011. 8. 6. 16:53
제가 알기로 String은 클래스이기때문에.. int로 명시적 다운캐스팅이 불가능합니다..

int a = (int)args[0]; 이 문장은 아마 안돌아갈듯 싶네요..

main의 매개변수로 스트링형 배열(String[] args) 말고 int형으로는 못받구요..

String을 int로 변환하려면 Integer 클래스의 parseInt 메서드를 사용하시면 됩니다..

예를 들어
public class ToInt{
public static void main(String args[]){
int a = Integer.parseInt(args[0]);
System.out.println(a);
}
}
하시면 원하시는 결과가 나오겠네요.
Posted by 신의물방울
Programming/JAVA2011. 6. 19. 13:40

POJO (Plain Old java Object) 를 해석하면 평범 자바 오브젝트라고 한다.
POJO를 이해 하기 전 POJO라는 단어가 만들어진 역사적 배경을 살펴볼 필요가 잇다. POJO는 마틴 파울러가 2000년 가을에 열렸던 어느 컨퍼런스의 발표를 준비하면서 처음 만들어낸 말이다. 마틴 파울러는 EJB(Enterprise JavaBean)보다는 단순한 자바 오브젝트에 도메인 로직을 넣어 사용하는 것이 여러가지 장점이 있는데도 왜 사람들이 그 EJB가 아닌 '평범한자바 오브젝트'를 사용하기를 꺼려 하는지에 대해 의문을 가졌다. 그리고 그는 단순한 오브젝트에는 EJB와 같은 그럴듯한 이름이 없어어서 그 사용을 주저하는 것이라고 결론 내렸다.
그래서 만든 단어가 POJO라는 용어인 것이다. POJO기반의 기술을 사용한다고 말하면 왠지 첨단 기술을 사용하는 앞선 개발자인 듯한 인상을 주기 때문인다.

POJO기반의 프로그래밍 기술이 EJB의 강력한 대안으로 등장했고 ,POJO 기반 프레임워크 ,POJO 애플리케이션을 위한 플랫폼 등이 점점 인기를 끌게 되었고, 결국 POJO가 배제하려고 했던 EJB는 POJO기반의 기술에 밀려 이제 레거시 기술로 사라질 위기에 처했다. 그렇다면 단지 EJB를 사용하지 않으면 모두 POJO라고 할 수 있을까? 그렇지 않다. POJO프로그래밍이라는 개념은 단지 "EJB가 아닌 자바"이상의 특징을 가지고 있는 프로그래밍 모델이다. POJO기반의 개발은 생각보다 단순하지 않다.
POJO를 좀더 이해하려면 EJB의 장단점을 함께 이해해야 한다. 그것은 POJO 프로그래밍이 다시 EJB시대이전으로 돌아 가자는 것이 아니고 ,EJB를 넘어 그보다 더 앞으로 나아가자는 것이기 때문이다.
EJB를 사용하지 말고 POJO를 쓰자는 것은 EJB이전의 방식으로 돌아 가는 것을 의미한다면 또 다른 문제가 발생 할 수 밖에 없다. 여전히 복잡한 로우레벨의 API를 이용해 코드를 작성해야 하고, 많은 기술적인 문제를 애플리케이션 코드에 그대로 노출시켜 개발해야 한다면 기껏 POJO로의 복귀 덕분에 얻는 많은 장점들을 놓칠 수 밖에 없다.

그래서 등장한 것이 POJO 기반의 프레임워크이다. POJO프레임워크는 POJO를 이용한 애플리케이션 개발이 가진 특징과 장점을 그대로 살리면서 EJB에서 제공하는 엔터프라이즈 서비스와 기술을 그대로 사용할 수 있도록 도와주느 프레임워크이다. 나아가 이는 기존의 EJB에서보다 훨씬 더 세련되고 나은 방법이다. 데표적인 프레임웤 스프링 하이버네이트~!

참고로 스프링은 엔터프라이즈 서비스들을 POJO기반으로 만든 비지니스 오브젝트에서 사용할 수 있게 한다. 대표적인 선언적인 트랜잭션 서비스와 보안이다. 또한 EJB와 마찬가지로 오브젝트 컨테이너를 제공해서 인스턴스의 라이프사이클을 과리하고 필요에 따르 스레딩, 풀링 및 서비스 인젝션 등의 기능을 제공한다. 또한 OOP를 더 OOP답게 사용 할 수있게 하는 AOP기술을 적용해서 POJO개발을 더 쉽게 만든다.

POJO프로그램의 진정한 가치는 자바의 객체지향적인 특징을 살려 비지니스 로직에 충실한 개발이 가능 하도록 하는것이기도 하다.

내생각을 적자면
평범한 자바 객체로 프로그래밍 하기라고 부르며, 침략적인 코드를 적지 않은 것이다.
쉽게 말해 implement 와 extends를 사용 하지 않으며
콤포지션과 인터페이스타입으로 프로그래밍 하는것(이건 레디 존슨)

특정 클래스의 concrete class가 되면 안되고, 구현 체도 되면 안된다.
Posted by 신의물방울
Programming/JAVA2011. 6. 19. 12:32

# 1. Beans(강남콩)의 이해
- JSP Page 상에 나열되는 자바 처리 로직은 디자인 코드와 함께 매우 복잡한 코드를 구성합니다.
이로 인해 디자인 변경시 자바코드가 영향을 받아 오류가 자주 발생되며, 코드 수정시 코드를 알아볼 수
없어 유지보수가 매우 힘이 듭니다.
이러한 반복되는 자바 코드들을 JAVA 파일안에 저장하여 사용하는 형태를 빈즈라고 합니다.
- 확장자는 *.java입니다. 컴파일하여 .class 형태로 배포합니다.
- 메모리에 생성된 Beans(DTO)는 다른 자바 클래스(DAO, Business Logic)에 의하여 사용됩니다.
- Beans는 dll과 같은 원리를 가지고 있습니다.
- Beans는 sun에서 제시한 작성 규칙이 존재합니다.

# 2. DTO(Data Transfer Object : 데이터 전송 객체, value Object) Beans
- 폼에서 입력된 데이터들은 하나의 DTO 객체로 변환 될 수 있습니다.
- 하나의 데이터베이스 레코드를 저장하며 레코드와 같은 구조를 가지고 있습니다.
- 하나의 레코드는 Beans 클래스 객체 하나로 매핑됩니다.

1) 필드 선언 (멤버 변수, 인스턴트 변수)
- 하나의 컬럼 값을 저장
- 보안성 및 캡슐화, 데이터 은닉의 목적으로 private를 선언합니다.
ex) private String name;

2) setter
- 필드에 값을 저장하는 기능을 합니다.
- HTML 폼의 INPUT 태그의 값을 빈에 저장하는 역할을 합니다.
- 메소드 명은 set + input 태그의 이름 중 첫자를 반드시 대문자로 사용하는 규칙을 적용해 태그명을 지정
합니다. 따랏 HTML에서 input 태그의 이름은 영문 소문자로 사용하여 태그의 이름에 신중을 기해야
합니다,

예1)
<input type="text" name="id" size="15" value='user1'>
<input type="text" name="addr" size="15" value='user1'>

public void setId(String id) {
this.id = id;
}

public void setAddr(String addr) {
this.addr = addr;
}

3) getter
- 인스턴스 변수의 값을 가져오는 기능을 합니다.

예1) public String getName() {
return name;
}

# 3. DAO(Data Access Object : 데이터 접근 객체t) Beans
- DTO 객체를 만들어 편집 및 조작을 합니다.
- DTO를 데이터베이스 서버에 저장하기도 하고, 데이터 베이스 서버로부터 레코드를 Select해 DTO 객체로
변경해 가져오기도 합니다.
- Insert, delete, upadate, select 등 데이터 처리를 주 목적으로 ㅎ바니다.

# 4. Manager Class(관리 클래스, MGR)
- DTO와 DAO 사이에서 연결 및 처리 역할을 합니다.
DreamWeaver Eclipse DbEdit
(*.html, *.jsp) (*.java) (*.sql)
----------- ------------------------ -------------
JSP <-----> Manager Class <-----> DAO <-----> Oracle
↑ ↑
│ │
└--------------------------------┘
DTO
계층간 데이터 전송 객체

# 5. Beans의 사용 Scope(범위)
- page : 기본값, page를 벗어나면 자동으로 소멸합니다.(중요)

- request : forward, include에서 사용 가능, 약간 사용됩니다..

- Session : 사용자가 로그인해 있는 동안 계속적으로 살아 있습니다.
메모리 소모가 심함으로 필요한 곳에 적절히 사용해야 됩니다.
쇼핑카드 구현등 객체를 지속적으로 유지해야하는 경우에 사용됩니다.
사용자가 브라우저를 닫으면 고나련 JSP session Bean은 소멸됩니다.(중요)

- Application : 웹 사이트 전체, 모든 사용자에게 영향을 미치는 빈
메모리 소모가 심함으로 많이 사용하지 않고, 서버가 운영되는 동안 객체가 살아있습니다.
모든 사용자가 변수와 객체를 공유하게 됩니다.
서버를 재 시작해야 변수들이 재 설정됩니다.

Posted by 신의물방울
Programming/JAVA2011. 6. 19. 12:27

EJB 아키텍처 개요

1. 자바언어로 분산 객체 형태의 비즈니스 애플리케이션을 개발하기 위한 표준 컴포넌트 아키텍처이다.

2. 자바로 분산 객체 형태의 엔터프라이즈용 비즈니스 애플리케이션을 쉽게 만들기 위해서 EJB 아키텍처가 만들어졌다.

3. 일반적으로 비즈니스 애플리케이션은 크게 프로세스와 데이터 부분으로 나뉜다. 프로세스라는 것은 비즈니스 업무의 단위이며 데이터는 업무를 수행하기 위해 필요한 데이터 및 정보들을 의미하며, EJB 아키텍처는 비즈니스 애플리케이션의 프로세스데이터를 안정적으로 처리하기 위한 모델을 제시한다. EJB 아키텍처에서 프로세스세션 빈(Session Bean)”, “데이터엔티티 빈(Entity Bean)” 이라는 EJB 컴포넌트들이 담당하게 된다.

4. EJB 애플리케이션 서버의 구조

EJB 컴포넌트는 개발자들이 관련 소스 코드를 작성하여 컴파일하고 개발한다.

그 후 EJB 컴포넌트들이 실행될 때 자동으로 관리되어야 할 트랜잭션, 보안, 자원 관리등의 내용을 XML 문서(디플로이먼트 디스크립터)로 작성하여 EJB 애플리케이션 서버에 컴포넌트와 같이 플러그인(plugin) 한다. (플러그인이란 EJB 컴포넌트를 EJB 컨테이너 안에 설치하는 것을 의미하며 다른 말로 이 과정을 디플로이먼트(deployment)”라고 한다.)

출처 :

엔터프라이즈 자바빈즈

JStorm

대청 2001.06.01

출처 : http://blog.naver.com/joonghyune



EJB란

EJB가 생겨난 배경

서버측에서 어플리케이션을 개발할 경우, 이하와 같은 문제가 있다.

・종래의 어플리케이션에서 필요로 하는 비지니스로직 뿐만 아니라, 시스템 서비스를 이용한 데이터베이스처리와 트랜젝션처리의 프로그램이
필요로 하기 때문에 어플리케이션의 개발에 시간이 걸린다.
・각각의 어플리케이션 서버에서는 독자의 API가 제공되고 있기 때문에 각사의 API를 사용해서 작성한 어플리케이션에는 이동성이 아니고 부품화가 곤란함

이같은 문제를 해결해서, 서버 어플리케이션의 생산성의 향상과 이동성을 실현하기 위해서 생겨난 것이 Enterprise JavaBeans(EJB)이다.

EJB의 개요
Enterprise JavaBeans(EJB)는 독립한 부품이 아닌, 미국 Sun Microsystems사가 제창한 규약이다.

EJB는 서버 어플리케이션의 개발을 용이하게해 다중다양한 Platform과 제품간의 이동성을 실현하기 위하여
이하와 같은 비지니스로직과 시스템 서비스를 이용하는 로직을 분산해 그 사이의 규약을 규정하고 있다.

비지니스 로직을 탑제한 부품을 "Enterprise Bean"이라고 불린다. Database처리, Transaction처리등의 시스템 서비스를 이용한
로직을 감추고 있는 부품을 "컨테이너"라고 불린다.

EJB를 이용함으로 인해 개발자는 어플리케이션개발시에 비지니스 로직의 개발만 전념하는 것이 가능하다.

또, EJB의 한가지 특징은 Enterprise Bean의 "Deployment"를 행하는 것이다. Deployment를 행하는 것에는 Enterprise Bean은 컨테이너에
설치된 실행가능한 상태로 된다. Deployment를 행하는 것으로 인해 각사의 여러가지 EJB제품상에서 Enterprise Bean을 동작시키는 것이 가능하게 된다.

EJB에는 "deployment descriptor"에 의한 Enterprise Bean이 갖는 각종의 속성값을 지정하는 것이 가능하다.
deployment descriptor의 내용을 변경하는 것에서 Enterprise Bean의 소스 코드를 변경하는것이 아니고 각각의 환경과 니즈에 의한 운영환경을 카스타마이즈하는 것이 가능하다.

EJB의 도입효과
EJB에는 지금까지 설명한것과 같은 큰 2가지의 특징이 있다.
・어플리케이션 개발이 용이
・어플리케이션에서 이동성이 있다.

이것들의 특징을 활발히 함으로 인해서 서버 어플리케이션을 보다 빠르게 구축하는 것이 가능해 졌다.
이러한 EJB를 도입하는 것에 의해 서버 어플리케이션 개발의 생산성이 향상되어 서버 어플리케이션 개발 비용이 삭감하는 것이 가능하다.

EJB의 기본구성
EJB는 이하의 4개의 요소로 구성되어 있다.

1. Enterprise Bean
2. Container
3. EJB Server
4. Client Application

이 4가지 요소중 어플리케이션 개발자가 용이한 것은 Enterprise Bean과 client application의 2가지이다.

■Enterprise Bean
비지니스 로직을 실장한 서버 컴포넌트이다.
Enterprise Bean에는 이하의 2가지의 모델이 있다.
1. Session Bean
2. Entity Bean

"Session Bean"는 클라이언트의 대화처리를 실현하는 OBject이다.
"Entity Bean"는 Database에 격납된 레코드를 Object로서 뽑아내거나 격밥하기 위하여 이용하는 Object이다.

일반적으로는 클라이언트가 Session Bean을 불러 Session Bean이 Entity Bean을 불르는 것으로 데이터베이스에 접근을 행한다.

■Container
EJB서버와 Enterprise Bean의 중간에 위치해, 클라이언트 어플리케이션은 그 컨테이너를 경유해서 Enterprise Bean에 접근한다.
컨테이너가 데이터베이스처리와 트랜젝션처리등을 숨기기위해 개발자와 그것들을 의미하지 않는 어플리케이션을 개발하는 것이 가능하다.

■EJB Server
EJB서버는 컨테이너를 관리해서 EJB로서 필요한 시스템 레벨의 서비스( 데이터베이스 처리, 트랜젝션 처리등)을 실현한다.

■Client application
EJB에 준거한 클라이언트 어플리케이션이다.
Java Applet, Java Application, Servlet, JavaServer Pages(JSP) 베이스의 어플리케이션등이 있다.

Enterprise Bean의 기본동작

Enterprise Bean의 기본동작을 설명한다.

클라이언트부터 서버의 Enterprise Bean에의 접근은 컨테이너를 경유해서 행한다.
컨테이너는 Enterprise Bean의 대리가 되는 "EJB object"와, EJB object의 생성/삭제를 행하고 "EJB home"을 의미한다.
클라이언트는 컨테이너가 갖는 이 두가지 object를 통해서 Enterprise Bean에 접근한다.

이하의 클라이언트가 컨테이너를 통해서 Enterprise Bean에 접근할 때의 흐름을 나타낸다.

1. JNDI의 lookup메소드에서 EJB home을 검색한다.

2. 클라이언트가 습득한 EJB home에 대해서 create 또는 find메소드를 호출하면 컨테이너가 Enterprise Bean의 대리 object에 있는
EJB object를 생성한다. 이 때, 컨테이너 내부에는 실제로 비지니스 로직이 갖춰져있는 Enterprise Bean의 인스턴스가 생성된다.

3. 클라이언트는 Enterprise Bean의 대리가 되는 EJB object의 비지니스 메소드를 호출한다. 컨테이너가 그것을 중개해서
Enterprise Bean의 메소드를 호출한다.

실현환경
EJB서비스에는 EJB의 컨테이너라고 하는 개념이 포함되어 있다. 컨테이너는 EJB 어플리케이션을 넣기 위한 용기이다.
개발환경에서 작성된 EJB 어플리케이션은 전개된 후 서버에 전송하는 컨테이너에 설치하는 것에 의해 실행가능한 상태로 된다.
EJB어플리케이션을 전개하는 것을 "Deployment"라고 한다.

Posted by 신의물방울
Programming/JAVA2011. 6. 17. 09:56
CalculTest.java
public class CalculTest {
    public static void main(String args[]){
        //calculTest ct= new calculTest();
        CalculModel calModel = new CalculModel();
        CalculControler calCon = new CalculControler(calModel);
    }
}

CalculModel.java
public class CalculModel {
    CalculControler calCon;

    String num1; //기존의 수
    String num2; //새로 받은 수
    String oper; //연산자

    boolean inputNumberAbleStatus;  // 화면에 숫자가 새로 받아지는걸 허용/비허용
    boolean selectedOperStatus;     // 연산자 버튼을 눌럿는지 안 눌렀는지
    boolean pointExist;             // .을 눌럿는지 안 눌럿는지
    //생성자
    CalculModel(){
        num1="0";
        num2="0";
        oper="";
        inputNumberAbleStatus=true;
        selectedOperStatus=false;
        pointExist=false;
    }
    //숫자 입력 받앗을때
    public void inputNumber(String num){
        if(!num.equals("Number not divide 0")){
            if(num.equals(".")){
                if(pointExist) num="";
                if(inputNumberAbleStatus){
                    inputNumberAbleStatus=false;
                    calCon.setView("0"+num);
                }else{
                    calCon.setView(getView()+num);
                }
                pointExist=true;
            }else{
                if(inputNumberAbleStatus){
                    inputNumberAbleStatus=false;
                    setView(num);
                }else{
                    setView(getView()+num);
                }
            }
        }
    }
    //기호 입력 받앗을때
    public void inputOper(String oper){
        if(selectedOperStatus){
            num2=getView();
            if(!num2.equals("Number not divide 0")){
                num1=operation(this.oper, num1, num2);
                this.oper=oper;
                setView(num1);
                inputNumberAbleStatus=true;
                pointExist=false;
            }
        }else{
            this.oper=oper;
            num2=getView();
            num1=operation(oper, num2, num1);
            selectedOperStatus=true;
            inputNumberAbleStatus=true;
            pointExist=false;
        }
    }
    // Clear버튼  눌럿을때
    public void inputClear(){
        num1="0";
        num2="0";
        oper="";
        setView("0");
        inputNumberAbleStatus=true;
        selectedOperStatus=false;

    }
    // 연산자 처리 부분 로직
    public String operation(String oper, String num1, String num2){
        switch(oper.charAt(0)){
        case '+': 
            num1=""+(Double.parseDouble(num1)+Double.parseDouble(num2));
            return num1;
        case '-': 
            num1=""+(Double.parseDouble(num1)-Double.parseDouble(num2));
            return num1;
        case '*':
            if(selectedOperStatus)
                num1=""+(Double.parseDouble(num1)*Double.parseDouble(num2));
            return num1;
        case '/':
            if(selectedOperStatus&&num2.equals("0")){
                num1="Number not divide 0";
                oper="";
            }
            if(!num2.equals("0"))
                num1=""+(Double.parseDouble(num1)/Double.parseDouble(num2));
            return num1;
        case '=':
            num1=num2;
            oper="";
            return num1;
        default:
            return num1;
        }
    }
    //소수점이 .0일때 뒤에 .0을 제거하여 정수형으로 나타냄
    public String removePointZero(String numWithPoint){
        String newNum="";
        int pointIdx=0;
        int zeroIdx=0;
        if(numWithPoint.equals("-0")) return "0";
        if(numWithPoint.length()<3) return numWithPoint;
        if(numWithPoint.charAt(numWithPoint.length()-2)
                =='.'&&numWithPoint.charAt(numWithPoint.length()-1)=='0'){
            for(int i=0;i<numWithPoint.length()-2;i++){
                newNum+=numWithPoint.charAt(i);
            }
            return newNum;
        }else
            return numWithPoint;


    }
    //뷰의 필드값 세팅/게팅
    public void setView(String s){calCon.setView(removePointZero(s));}
    public String getView(){return calCon.getView();}
}

CalculControler.java
public class CalculControler {
    CalculView calView;
    CalculModel calModel;
    public CalculControler(CalculModel calModel) {
        this.calModel=calModel;
        calModel.calCon=this;
        calView = new CalculView(this);
        calView.setBounds(600,400,300,200);
        calView.setResizable(false);
        calView.setVisible(true);
    }
    // 숫자버튼.기호버튼,Clear버튼을 구분
    public void inputNumber(String num){calModel.inputNumber(num);}
    public void inputOper(String oper){calModel.inputOper(oper);}
    public void inputClear(){calModel.inputClear();}
    // 계산기창 필드의 값을 setting / getting
    public void setView(String s){calView.setView(s);}
    public String getView(){return calView.getView();}
}

CalculView.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CalculView extends JFrame {
    CalculControler calCon;
    JPanel pCalView, pCalButton;
    JLabel vCalView;
    JButton numButton[], operButton[];
    JButton bZero, bOne, bTwo, bThree, bFour, bFive, bSix, bSeven, bEight, bNine, bPoint; 
    JButton bPlus, bMinus, bMultiply, bDivide, bEquals; 
    JButton bClear;

    GridBagConstraints gbc;
    GridBagLayout gbl;

    CalculView(CalculControler calCon){
        this.calCon=calCon;
        //this.calModel=calModel;
        

        //타이틀과 배치관리자를 설정
        Container con = getContentPane(); 
        this.setTitle("이상한 계산기");
        con.setLayout(new BorderLayout());
        //뷰 패널 생성 및 배치관리자 설정
        pCalView = new JPanel();
        pCalView.setLayout(new BorderLayout());
        //계산 뷰 텍스트창 생성
        vCalView = new JLabel("0");
        vCalView.setHorizontalAlignment(JLabel.RIGHT);
        vCalView.setBackground(Color.WHITE);
        vCalView.setFocusable(false);
        //뷰 패널에 계산 텍스트 창 합치기
        pCalView.add(vCalView);

        //프레임에 부착
        this.add(pCalView, "North");

        //계산 패널 생성
        pCalButton = new JPanel();
        //숫자 버튼 생성
        bZero = new JButton("0");
        bOne = new JButton("1");
        bTwo = new JButton("2");
        bThree = new JButton("3");
        bFour = new JButton("4");
        bFive = new JButton("5");
        bSix = new JButton("6");
        bSeven = new JButton("7");
        bEight = new JButton("8");
        bNine = new JButton("9");
        bPoint = new JButton(".");
        //리스너 부착
        setNumberButton(bZero, bOne, bTwo, bThree, bFour, bFive, bSix, bSeven, bEight, bNine, bPoint);

        //연산자 버튼 생성
        bPlus = new JButton("+");
        bMinus = new JButton("-");
        bMultiply = new JButton("*");
        bDivide = new JButton("/");
        bEquals = new JButton("=");
        //리스너 부착
        setOperButton(bPlus, bMinus, bMultiply, bDivide, bEquals);
        
        //Clear버튼 생성
        bClear = new JButton("C");
        setClearButton(bClear);
        //리스너부착
        setPanelButton();
        
        //배치관리자 버튼 부착
        this.add(pCalButton, "Center");

        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent evt){
                dispose();
                System.exit(0);
            }
        });
    }
    //리스너 부착 메소드
    public void setNumberButton(JButton ...numButtonArr){
        numButton=numButtonArr;
        for(JButton numB : numButton)
            numB.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    calCon.inputNumber(ae.getActionCommand());
                }
            });

    }
    //    리스너 부착 메소드
    public void setOperButton(JButton ...operButtonArr){
        operButton=operButtonArr;
        for(JButton operB : operButton)
            operB.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae) {
                    calCon.inputOper(ae.getActionCommand());
                }
            });
    }
    //    리스너 부착 메소드
    public void setClearButton(JButton clearButton){
        clearButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                calCon.inputClear();
                
            }
        });        
    }
    // 레이아웃 메소드    
    public void setPanelButton(){
        gbl = new GridBagLayout();
        pCalButton.setLayout(gbl);
        gbc=new GridBagConstraints();
        gbc.weightx=1.0;
        gbc.weighty=1.0;
        gbc.fill=GridBagConstraints.BOTH;

        layout(bClear, 0, 0, 1, 1);
        layout(bDivide, 1, 0, 1, 1);
        layout(bMultiply, 2, 0, 1, 1);
        layout(bMinus, 3, 0, 1, 1);

        layout(bSeven, 0, 1, 1, 1);
        layout(bEight, 1, 1, 1, 1);
        layout(bNine, 2, 1, 1, 1);
        layout(bPlus, 3, 1, 1, 2);

        layout(bFour, 0, 2, 1, 1);
        layout(bFive, 1, 2, 1, 1);
        layout(bSix, 2, 2, 1, 1);

        layout(bOne, 0, 3, 1, 1);
        layout(bTwo, 1, 3, 1, 1);
        layout(bThree, 2, 3, 1, 1);
        layout(bEquals, 3, 3, 1, 2);

        layout(bZero, 0, 4, 2, 1);
        layout(bPoint, 2, 4, 1, 1);

    }
    public void layout(Component obj, int x, int y, int width, int height){
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.gridwidth = width;
        gbc.gridheight = height;
        pCalButton.add(obj, gbc);
    }
    //필드값을 세팅,게팅
    public void setView(String s){vCalView.setText(s);}
    public String getView(){return vCalView.getText();}
}

//분석하자!! 
Posted by 신의물방울
Programming/JAVA2011. 6. 16. 15:48

제네릭 ver 5.0부터 지원

제네릭은 데이터형을 정하지 않는것을 의미하고 데이터형은  값을 넘겨준후 데이터형이 결정된다.

 

 


package com.test0518;

class Demo2<T>{ //<T> 제네릭클래스 : 자료형이 결정되지 않은것이 있다.
 private T n;
 public void set(T t){
  this.n = t;
 }
 
 public T get(){
  return n;
 }
}

public class Test2 {
 public static void main(String[] args){
  Demo2 ob1 = new Demo2();   //Object이용 : 오브젝트이용시 가져와 대입할때는 반드시 캐스팅
  ob1.set("자바");
  //ob1.set(200);//아래에서 런타임 오류
  String s = (String)ob1.get(); //ob1.set(200); 의 경우 Integer형을 String로 캐스팅하려고 했기때문에...
  System.out.println(s);
  
  Demo2<Integer> ob2 = new Demo2<Integer>();  //제네릭이용
  ob2.set(100);
  Integer i = ob2.get();
  System.out.println(i);
  
  Demo2<Double> ob3 = new Demo2<Double>();
  ob3.set(10.0);
  Double d = ob3.get();
  System.out.println(d);
 }

}

Posted by 신의물방울
Programming/JAVA2011. 5. 27. 14:16

@1. Servlet은 Java 소스에 HTML 코드가 삽입된다.

      JSP는 반대로 HTML코드에 Java코드가 삽입된다.

 

@2. Servlet class는 컴파일과정과 등록 과정이 필요하지 하지만 JSP는 필요 없다.

 

@3. Servlet 보다는 JSP 디자인과 로직에 대한 구분이 명확해서 유지보수가 용이하다.

 

@4. 간단한 로직을 구현할 때는 JSP가 더 간편하다.

      하지만 복잡한 로직을 구현할 때에 HTML 중심의 코드가 이해하기 어렵게 만들수 있고, 프로그래밍 언어를 모르는 사람이 실수로 중요한 코드를 건들 우려도 있다. 그리고 힘들게 개발한 로직의 유출을 막기 위해서도 Servlet 기술이 필요하게 된다.

  => 그래서 요즘은 JSP 기술과 Servlet 기술을 혼용한 새로운 프로그래밍 방법이 권장되고 있다. 프로그램의 기능을 구현하는 복잡한 로직은 서블릿 클래스 안에 기술하고, 그 결과를 가져다가 출력하는 일만 JSP 페이지가 담당하도록 만드는 방법이다.(아래의 예제 참고)

 

 

 

@ JSP와 Servlet 기술을 혼합해서 작성한 웹 애플리케이션

 

// ch01.Ex02_SumServlet.java 파일

 

package ch01;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Ex02_SumServlet extends HttpServlet {  
 private static final long serialVersionUID = 1L;

 public void doGet(HttpServletRequest request, HttpServletResponse response) 
   throws ServletException, IOException {  
  
  int total = 0;
  for (int cnt=1; cnt<=100; cnt++)
   total += cnt;  
  request.setAttribute("result", total);  // 위의 total 변수의 값을 "result"에 넣어서 jsp파일에서 사용할 수 있도록 한다.
  RequestDispatcher rd = request.getRequestDispatcher("ch01/ex02_sum.jsp");  // jsp 페이지 호출 // RequestDispatcher : 요청을 보내주는 인터페이스 (참고 : http://famlilia.blog.me/100092297572)
  rd.forward(request, response);  
  // forward : forward는 request, response객체를 모두 다 전달하기 때문에 이동된 페이지(또는 서블릿)에서도 request와 response객체를 이용해서 파리미터를 받아서 처리할 수 있다.
  // 참고 http://blog.naver.com/seektruthyb/150109008317
 }
}

 

 

 

 

// WebContent/WEB-INF/web.xml 파일에 servlet 등록

 

  <!-- Ex02_SumServlet.java 등록 -->
  <servlet>
   <servlet-name>ch01_ex02</servlet-name>
   <servlet-class>ch01.Ex02_SumServlet</servlet-class>
  </servlet>
  <servlet-mapping>
   <servlet-name>ch01_ex02</servlet-name>
   <url-pattern>/ch01_ex02</url-pattern>
  </servlet-mapping>
  
 

 

 

 

// WebContent/ch01/ex02_sum.jsp

 

<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
1부터 100까지의 합은? ${result }
</body>
</html>

 

 

 

 

// 실행화면

 

http://localhost:9090/hanb_jsp_servlet/ch01_ex02

 

 

 

출처 : 한빛미디어 - 뇌를 자극하는 JSP & Servlet p24~30 

Posted by 신의물방울
Programming/JAVA2011. 5. 25. 14:17

이클립스 ctrl+space를 눌렀을때...어시스트 내용이 안보입니다.     




그림같이 치고 ctrl+space를 눌렀을때 str시작되는 내용이 창에 보여야 하는데 보이지 않네요.

No Default Proposals, No Template Proposals 이라고만 뜨네요.

어떻게 해야 해결이 되나요?

 

답변

re: 이클립스 ctrl+space를 눌렀을때...어시스트 내용이 안보입니다.

waitto
답변채택률 0%
2008.07.29 15:47
 

이클립스 메뉴바에서 Window 를 클릭하면 맨 아래에 preferences ...이 있습니다.

그걸 클릭하면 popup창이 하나 뜹니다.

거기서 왼쪽 맨 위 텍스트창에 type filter text 라고 써있는데 그걸 지우고

advenced라고 써보세요

그러면 아래 그림처럼 나옵니다

왼편 맨아래 파란색으로 보이는 Advaced를 클릭하면 그림처럼 오른편에 체크박스가 나옵니다.

필요한 부분을 체크해주면 됩니다. 저는 모두 체크 했습니다.

그럼 ctl+space 하면 asist가 잘 나옵니다.

 

 

 

출처 : 네이버지식인 

Posted by 신의물방울