20150912



메서드(method)


메서드 자주 사용되는 내용(특정 기능을 수행)의 코드를 메서드로 작성해 놓고 호출 을 하는 방식으로 코드의 양을 줄이고 메서드 한쪽에서만 관리할 수 있어서 유지보수가 편리해 집니다.


* 메서드는 한 가지 기능만 수행하도록 작성

* 반복적으로 수행 되어야 하는 여러 문장을 하나의 메서드로 정의

* 관련된 여러 문장을 하나의 메서드로 만들어 놓는것이 좋습니다.



함수 작성법

리턴타입 메서드이름 (타입 변수명, 타입 변수명,...) {

//메서드 호출시 수행될 코드

}


직접 코드로 작성하면 아래와 같습니다.

int add (int a, int b){   <- 선언부

int result = a + b;       <- 구현부

return result;

}


int add (int a, int b){
  //구현부
int result = a + b;
return result;
}


메서드 마지막 부분에 return 혹은 { }블럭 마지막 문장까지 수행 했을때 종료되고 호출 했던 부분으로 돌아갑니다.


반환값이 없으면 return;  만 작성하고

있으면              return 반환값;   을 작성 하시면 됩니다.


반환값의 타입은 리턴타입과 일치해야 합니다. 

int add(int a, int b) 선언부에서 리턴 타입 intretrun 반환값타입이 일치해야 합니다.


함수 호출방법

참조변수.메서드이름(); 

static 메서드는 같은 클래스 안에서 인스턴스 메서드를 호출 할 수 없어요.

이유는

클래스 로딩과 객체를 만들고 생성자로 초기화 하는 순서를 생각 하셔야 해요.

클래스 로딩-> 객체 생성

static 은 클래스가 로딩될때 만들어지고 인스턴스 는 코드가 실행이 되어야 객체를 만듭니다. 그런데 인스턴스가 만들기 전에 사용할 수 있는 static 메서드에서 인스턴스 메서드를 사용하는건 아직 만들어지지 않은것호출 하는 것이 되겠죠? 

(그래서 안됩니다.)




재귀 호출

메서드 내부에서 자기 자신의 함수를 호출 하는것

팩토리얼(!) 을 예로 들 수 있습니다.

아래 코드로 설명할게요.


long factorial (int n){
	long result = 1;
	if (n == 1) {
		result = 1 ;
	}else {
		result = n*factorial(n-1);
	}
	return result;
}



함수 파라미터 값인 n이 함수 안에 코드에서 n의 수를 줄여가면서 다시 자신의 함수를 호출 합니다. 그럼 조건 n == 1 이 충족 될때까지 n값을 줄여나가면서 계속 자신의 함수를 호출하겠죠? 이게 재귀 호출입니다. 자신의 함수안에서 또 자신을 호출하는거죠.


오버로딩


메서드 이름이 같아야 한다.

매개변수의 개수 또는 타입이 달라야 한다.

리턴타입이 다른것과는 상관 없다.


void sum();
void sum(int a, long b);
// 변수의 개수가 같고 변수 타입의 순서가 달라도 오버로딩이 된다.
void sum(int a, long b);
void sum(int a);
void sum(String a);


장점

메서드 이름으로 기능을 예측 할 수 있다.

메서드 이름을 절약

오류의 가능성을 줄인다.


생성자


생성자는 클래스의 이름과 같아야 한다.

생성자는 리턴 값이 없다.


객체를 만들때 예) Sum s = new Sum();

Sum(); 에 해당하는 부분이 생성자 이고 앞에 있는 new 가 인스턴스를 만든다.

생성자가 인스턴스를 만드는것이 아니다.

생성자를 만들지 않으면 기본 생성자 아무 내용도 없는 생성자를 만든다.

생성자는 멤버 변수를 초기화 해주기 위해서 사용된다.

Sum() {

a = 1;

hello = "안녕하세요";

}


매개변수가 있는 생성자도 만들 수 있다.

Sum(int c, String d) {

a = c;

hello = d;

}

객체를 만들고 초기에 변수값을 넣어줄때는

car c = new Car();

c.a = 1;

c.hello = "안녕하세요";


보다는


Car c = new Car(1, "안녕하세요");  가 더 간결하고 직관적이다.


같은 크래스 안에서 생성자를 호출 할때는 this() 를 사용한다.

제일 첫 줄에 사용해야함

car(){

this("white", "auto", 4);

}

car(String color, String gearType, int door){...}


this 는 변수를 구별할때도 사용됨

int color;

color(int color) {

this color = color;

}

this 가 붙은건 클래스안에 있는 변수



초기화


초기화 3가지 방법

명시적 초기화

class car {
int door = 4;                     //기본형 변수 초기화
Engine e = new Engine(); //참조현 변수 초기화
}

초기화 블럭

아무것도 없이 블럭만 사용하거나 static을 붙이는 초기화

{  인스턴스 초기화 블럭 }
static{ 클래스 초기화 블럭 }

초기화 생성자보다 먼저 실행된다.


클래스 변수 초기화 순서 : 기본값 -> 명시적 초기화-> 클래스 초기화 블럭
인스턴스변수의 초기화 순서:기본값-> 명시적 초기화-> 인스턴스 초기화 블럭-> 생성자


클래스 초기화 블럭은 처음에 1번
인스턴스 초기화 블럭은 객체가 만들어 질때마다 실행

static 이 붙은 블럭 안에는 인스턴스 변수 , 함수 가 오면 안된다.}







20150912



자바 객체지향 프로그래밍(Java Object-oriented Programming)


변수(Variables)



변수 : 단 하나의 값을 저장할 수 있는 공간

변수 선언 방법

int number;    [변수타입 변수이름;]


기본형 변수와 참조형 변수

기본형(Primitive type) : Boolean, char, byte, short, int, long, float, double
참조형(Reference type): 8개 기본형을 제외한 나머지 타입, 객체의 주소를 저장 
참조형 변수 선언 방법
HelloWorld hw;      [ 클래스 이름 변수명;]
 
* 기본형은 기본형 값이 복사 되지만 참고형은 값을 저장한 곳의 주소를 저장합니다.



형변환(casting)

형변환: 변수의 타입을 다른 타입으로 변환하는 것

(타입)피연산자
int a = (int)85.7;

85.4 double 형 값을 int 형으로 변환하여 a 에 저장
int 형정수형이기 때문에 값은 85로 변경 ( 소수점 값은 무조건 버려진다.)
                            

타입이 작은거에서 큰것으로 갈때는 생략 가능    작은 타입-> 큰 타입 = 생략 가능
타입이 큰것에서 작은것으로 갈때는 생략 불가능 작은 타입<- 큰 타입 = 생략 불가능 




변수에는 3가지 종류가 있습니다.

변수 종류 -클래스변수, 인스턴스변수, 지역변수

변수는 선언된 위치에 따라 종류가 달라지기 때문에 어느 영역에 선언 되었는지를 봐야 합니다. 우선 코드 예시를 보도록 할게요.

public class Variables {
	
	int iv; //인스턴스 변수
	static int cv; // 클래스 변수 (Static 변수)
	
	void method() {
		int lv = 10;   //지역변수
	}	
}

iv 는 인스턴스 변수

cv  는 클래스 변수

lv 는 지역변수

입니다. 

우선 인스턴스변수(instance variable) 설명입니다.

클래스 영역에 선언되고 인스턴스(객체)가 생성할 때 만들어 집니다. 그래서 객체를 만들기 전에는 인스턴스변수를 사용할 수 없죠 사용하기 위해선 먼저 객체를 만들어야 합니다.
인스턴스 변수는 생성될 때 마다 생성되기 때문에 각기 다른 값을 갖습니다.


다음은 클래스 변수(class variable)
클래스 변수를 선언하는 방법은 클래스 변수는 변수 앞에 static 을 붙여주면 됩니다.  클래스 변수는 class가 로딩 될때 만들어져서 프로그램이 종료될때 까지 유지하기  때문에 객체를 만들지 않고도 사용할 수 있습니다. '클래스명.클래스변수' 이런 식으로 사용이 할 수 있죠
또한 클래스 변수는 모든 인스턴스가 하나의 저장공간을 유지합니다. 그래서 항상 공통된 값을 유지합니다.

지역변수(local variable)
메서드 안에서 선언되어서 메서드 안에서만 사용이 가능하고 메서드가 종료되면 지역변수는 사용할 수 없습니다.
예를 들면 for 문에서 블럭{} 안에서 선언된 변수는 그 안에서만 사용이 가능합니다.

코드 예시로 변수들을 설명 하겠습니다.
public class Variables {
	
	int iv; //인스턴스 변수
	static int cv; // 클래스 변수 (Static 변수)
	
	void method() {
		int lv = 10;   //지역변수
	}	
	//lv = 20; 이 영역은 method 블럭{} 밖에 있기 때문에 사용 할 수 없습니다.
}
class test {
	public static void main(String[] args) {
		
		Variables.cv = 10; // cv 는 클래스 변수이기 때문에 객체를 만들지 않고 사용 할 수 있습니다.
	//	Variables.iv = 10; 오류 발생 iv 는 클래스 변수이기 때문에 객체를 만들지 않고 사용 할 수 없습니다.
		
		Variables v = new Variables(); // 변수 iv 를 사용하기 위해 객체를 만들고
		v.iv = 20;                     // 객체의 주소가 담긴 변수 v 를 이용해 iv 변수를 사용합니다.
	}
}	

3번 4번 7번 줄은 각각 인스턴스변수, 클래스변수, 지역변수 를 선언한 모습입니다.그리고 9번줄은 method() 함수 블럭{} 밖에서 사용을 해서 오류가 나는 잘못 된 코드 입니다.

14번 줄 처럼 클래스 변수는 객체를 만들지 않고도 '클래스명.변수명' 으로 사용할 수 있지만 15번 줄 처럼 인스턴스 변수를 '클래스명.변수명' 처럼 사용하면 오류가 납니다.

그래서 인스턴스 변수를 사용하기 위해서는 17번 줄 처럼 객체를 만들어서 사용해야 합니다.











 






20150911



자바 객체지향 프로그래밍(Java Object-oriented Programming)


자바 객체지향의 장점 - 재사용성 , 유지보수, 중복제거

자바는 객체지향 언어 입니다. 객체지향 언어는 코드의 중복을 줄이고 재사용성은 높여 프로그램의 개발과 유지보수 시간과 비용을 줄여줍니다. 

앞으로 자바를 공부해 나갈때 재사용성, 유지보수, 중복제거 를 기억하시면 자바를 이해하는데 도움이 되겠죠

자바의 역사나 사전적인 정의는 넘어가도록 할게요.


클래스와 객체

우선 클래스와 객체 입니다.

클래스는 설계도 도면(붕어빵틀, 건물 설계도) 이라고 할 수 있고 객체는 설계도로 만들어진 객체(사물-붕어빵, 자동차, 책상) 라고 할 수 있습니다.

예를 들어 붕어빵틀이 있으면 붕어빵틀 하나로 여러개의 붕어빵을 만들 수 있는 것처럼 하나의 클래스로 여러개의 객체를 만들어 사용하게 됩니다.






자바 JDK(java Development Kit)은 수 많은 다양한 기능을 하는 클래스(Java API)를 제공해주죠 이러한 API 가 가지고 있는 클래스를 이용하면 더 쉽고 빠르게 프로그램을 개발 할 수 있는거죠 - 이미 가지고 있는 붕어빵틀로 바로 붕어빵을 만들고 이미 가지고 있는 아파트 도면으로 바로 아파트를 만들면 되는것 처럼 말이죠



객체와 인스턴스


어떤 클래스로 만들어진 객체를 그 클래스의 인스턴스라고 부르죠 - (인스턴스와 객체는 같은 말이라는걸 기억하세요!)

예를 들어 붕어빵 틀 클래스로 만들어진 객체를 붕어빵틀 클래스의 인스턴스 라고 말합니다.


객체는 여러 속성과 기능을 가지고 있습니다.

우선 속성과 기능이 뭐냐 하면 속성은 명사 라고 생각하시면 돼요. 그리고 기능은 동사라고 생각하세요.

사람을 예로 든다면

속성- 키, 이름 , 주민등록번호, DNA

기능- 일어나기, 앉기 , 밥먹기, 공부하기, 대화하기


프로그래밍에서는

속성-     int a =1 ;         String name="yichi";

기능-    더하기, 빼기, 곱하기 , 평균값 구하기 처럼 어떤 기능을 해주는 행위(behavior), 함수(function), 메서드(method) 라고 합니다.


속성과 기능을 부르는 용어들이 다양합니다.

속성 - 멤버변수(member variable), 특성(attribute) ,필드(field), 상태(state) 

기능 - 메서드(method), 행위(behavior), 함수(function)

이런 다양한 용어들로 속성과 기능을 말하는데 같은 의미라는걸 아시면 됩니다. 그리고 객체가 가지고 있는 속성과 기능을 합쳐서 멤버라고 부릅니다.


그럼 직접 사람 클래스를 만들어 보면 다음과 같습니다.

public class Man {
   //사람의 속성
  int height;  //키
  int age;        //나이

  //Man 기능(함수)
  void growth() {    ++age; }  //성장(growth)함수는 나이가 1증가하는 기능(함수)
  void eat()  { ++height; }    //먹다(eat)함수는 키가 1 증가 하는 기능(함수)
	

}

위 코드에서 처럼 속성은 값 들을 저장하고 함수는 어떤 특정한 기능을 해주죠

클래스를 만들었으니 인스턴스를 생성해 볼게요.


클래스명 변수명; //클래스 객체를 참조하기 위해 참조변수를 선언해 주고

변수명 = new 클래스명(); //래스 객체를 생성 후 객체의 주소를 참조변수에 저장합니다.


Man m;

m = new Man();


위에서 만들었던 코드로 객체를 만들면
 
public class Man {
   //사람의 속성
  int height;  
  int age;        
 
  //Man 기능(함수)
  void growth() {    ++age; }  
  void eat()  { ++height; }  
     
 
}

class ManTest {
	public static void main(String[] args) {
		Man m;            //Man인스턴스(객체)를 참조하기 위해 변수 m을 선언합니다.
		m = new Man();    //Man 인스턴스(객체)를 생성합니다.
		
		m.age = 20;         //Man 인스턴스 멤버변수 age를 20로 합니다.
		m.growth();        //Man 인스턴스 메서드(기능) growth()를 호출 합니다.

        //변수값 입력과 growth() 함수가 잘 실행 되었는지 출력해 본다.
        System.out.println("현재 사람의 나이는" + m.age + "입니다."); 	
       }
}

위에 결과값은 21이 출력 됩니다.

이러한 방식으로 인스턴스(객체)를 만들고 사용 할 수 있습니다.








 

 

'프로그래밍 > java' 카테고리의 다른 글

java 메서드(method)  (0) 2015.09.12
Java 변수(Variables)  (0) 2015.09.12
[Java] 자바 주석 사용법 (java comment)  (0) 2015.09.07
자바(Java Programming Language)  (0) 2015.09.06
Java 시작(Starting Java)  (0) 2015.09.06

2015/09/07



주석(comment)


주석이란건 프로그래밍한 코드를 자신 또는 다른사람들이 보고 쉽게 이해 할 수 있게 설명을 덧붙여 놓은 겁니다. 작성 날짜나 버전 변경이력들을 적어 놓는 공간이기도 하고요. 그런데 정말로 그냥 써버리면 오류가 나버리니깐 이부분은 설명부분이다 라는걸 구별해주는게 주석입니다.(그냥 글을 써버리면 오류로 인식을 하겠죠 개발툴을 사용하고 있을테니깐요 ㅎ)


범위 주석: /* 와 */ 사이 내용은 주석으로 간주 하는겁니다.

/*

 지금 쓰고 있는 내용은 주석입니다.

컴퓨터가 실행될 때 코드로 인식하지 않아요

*/

실제 코드 화면으로 본다면 

ㅁ 


한 줄 주석: // 부터 그 줄 끝까지 입니다.

// 이줄은 주석인데

여기는 주석이 아닙니다. 

실제 코드 화면으로 본다면

ㅁ 


컴퓨터(컴파일러)가 코드를 실행할때 주석을 처리하면 그부분은 코드로 인식안하고 무시하고 넘어갑니다. 그러니깐 주석을 안읽고 넘어 간다는 의미이기 때문에 주석이 길다고 속도가 느려지거나 성능이 떨어지는건 아닙니다.

다만 " "  사이는 문자열(String)으로 인식해서 그 안에 주석을 쓰면 주석으로 인식하지 못해요.

System.out.println("/* 주석이 아니에요 */");

System.out.println("//주석이 아니에요");

출력문은 

/* 주석이 아니에요 */

//주석이 아니에요


실제 코드 화면으로 본다면

ㅁ 




'프로그래밍 > java' 카테고리의 다른 글

Java 변수(Variables)  (0) 2015.09.12
객체 지향 프로그래밍(java Object-oriented programming)  (0) 2015.09.11
자바(Java Programming Language)  (0) 2015.09.06
Java 시작(Starting Java)  (0) 2015.09.06
indexof() 함수 사용하기  (0) 2015.03.29

2015/09/06



자바소개


자바는 운영체제에 독립적입니다. 쉽게 말해서 한번 코딩하면 윈도우(window)를 사용하던 리눅스(Linux)를 사용 하던 상관없이 실행이 가능하다는 장점이 있어요. 자바가 아닌 다른 언어는 운영체제(window or Linux)에 따라서 코딩을 각자 해줘야 하는 불편함이 있었는데 이걸 해결 했다는 말이죠.


자바는 많은 Java API 를 가지고 있습니다. 이미 코딩이 되어 있는? Java API 가 있어 쉽게 다양한 기능들을 사용 할 수 있습니다. (api는 쉽게 누군가가 기능(예_현재시간 알려주는 기능)들을 구현해 둔걸 그저 쓰기만 한다고 생각하시면 편해요.)


자바는 메모리를 쉽게 관리합니다. 하나하나 사용하지 않는 메모리를 지워주거나 그런 불편한 작업 없이 자바가 가지고 있는 가비지컬렉터(garbage collector)가 사용하지 않는 메모리를 지워주죠 프로그래머가 할일을 줄여 준겁니다. 하지만 비효율적인 부분도 있답니다.


자바는 멀티쓰레드를 지원합니다. 멀티쓰레드는 멀티테스킹이라고 생각하면 됩니다. 컴퓨터는 엄청나게 빠른 속도로 일하지만 하나 하나씩 일을 수행하는데 멀티쓰레드를 사용하면 동시에 2가지 3가지 일을 할 수 있어요. 핸드폰 하면서 친구와 대화 하는것 같은 동시에 여러가지 일을 하는거죠.


자바는 분산처리와 네트워크를 지원합니다. 네트워크는 2번째에서 말한 java API가 네트워크 관련된 부분들을 가지고 있어서 쉽게 네트워크 프로그램을 개발 할 수 있습니다. 분산 처리는 한곳에서 모든것을 처리하는 집중 처리와 대비되는 의미인데

여러개의 처리장치로 분산시켜서 일을 하는것을 분산처리 라고 한답니다.


JVM(Java Virtual Machine)


JVM 은 java를 실행시켜주는 소프트웨어 입니다. java는 오직 JVM 하고만 상호작용 하죠. 자바가 운영체제에 독립적이라고 한 것 기억하시죠? (기억 안나면 다시 읽어보세요 ㅎ) 바로 JVM 때문에 가능한겁니다. java로 이루어진 어플리케이션은 오직 JVM 하고만 상호작용을 하고 그 JVM 은 OS(window or Linux) 와 상호작용을 합니다. 그래서 OS(window or Linux) 에 맞는 JVM만 가져오면 java 어플리케이션은 각각의 OS에 맞게 코딩해줄 필요가 없는거죠. 이런 장점이 바로 한번 작성하면 어디서든 실행된다. "Write once, run anywhere"입니다.


OS 마다 다른 의사소통 방식이 있는데 그거에 맞게 코딩을 해주거나(java 가 아닌 언어들) 중간에서 번역자(JVM)이 필요한거죠.

즉 JVM이 java와 OS 중간에서 통역을 해주는 겁니다.




   참조 그림1 ( Java는 JVM과 상호작용을 하고 / 다른 어플리케이션은 OS와 상호작용한다.)




참조 그림2 (java 어플리케이션은 동일하고 OS에 맞는 JVM으로 똑같은 어플리케이션을 실행 할 수 있다.)


2015/09/06



자바 시작


오늘부터 자바공부 를 다시 시작했습니다. 


제가 공부하는 책은 자바의 정석 2nd Edition 와 Head First 입니다. 이 책들에 대해 공부해 나가면서 Chapter 별로 공부한것들을 정리 하려고 합니다. 필요하신 부분이 있으면 링크Chapter 를 클릭하셔서 필요한 부분 얻어 가셨으면 좋겠어요.ㅎ 



준비_자바개발 환경 구축(Installing Java)



Chapter 1_

자바(Java Programming Language):자바 소개


Chapter 2_

변수(Variable)


Chapter 3_

연산자(Operator)

Chapter 4_
조건문과 반복문(Conditionals, Loop)

Chapter 5_

배열(Array)


Chapter 6_

객체지향 프로그래밍1


Chapter 7_

객체지향 프로그래밍2


Chapter 8_

예외처리(Exception Handling)


Chapter 9_

java.lang 패키지


Chapter 10_

내부 클래스


Chapter 11_

컬렉션 프레임웍과 유용한 클래스


Chapter 12_

쓰레드(thread)


Chapter 13_

AWT(Abstract Window Toolkit)


Chapter 14_

입출력(I/O)


Chapter 15_

네트워킹(Networking)


기타

향상된 for문

오토박싱

타입에 안전한 열거형

가변인수

static import문 

StringBuilder




콘트롤 서블릿클래스와 DAO 클래스에서 매번 database 연동 Connection 객체나 DAO 객체를 생성하면 많은 가비지(garbage)가 생성되서 반응시간이 길어지는 단점이 있습니다.


그래서 DAO 처럼 여러 서블릿에서 사용하는 객체는 서로 공유하게 하는것이 좋습니다.

그래서  웹 어플리케이션이 시작될때 이러한 객체들을 미리 준비하고 공유할 수 있게 하는것을 설명하겠습니다. 





1

서블릿 컨테이너는 웹 애플리케이션에서 사건(웹 애플리케이션 시작or 종료)이 발생하면

웹 애플리케이션에 등록된 이벤트 리스너에서 아래와 같은 관련된 메소드를 호출합니다.


웹 애플리케이션이

시작되면 contextInitialized() 함수가 실행되고

종료되면 contextDestroyed() 함수가 실행됩니다.

이런 호출되는 함수의 규칙을 정의한게 ServletContextListener 인터페이스 입니다.

그래서 아래와 같이 








3번

ContextLoaderListener 클래스를 만들고 ServletContextListener 인터페이스를 구현합니다.


그럼 애플리케이션이 시작(사건발생)될때 처리해주고 싶은 부분을

ContextLoaderListener 클래스에서 contextInitialized() 함수가 실행될거고

그 함수 안에서 원하는 처리를 해주면 애플리케이션이 실행될때마다 원하는 처리가 실행되겠죠

원하는 처리는Dao 객체와 같은 서블릿들이 공유하는 객체를 준비해 할겁니다.


리스너를 컨테이너에 배치 해야 하는데 방법은 

아래 이미지처럼 


<listener>

 <listener-class>페키지명.클래스명</listener-class>

<listener>

처럼 선언해 주거나


ContextLoaderListener 클래스에서 애노테이션 @WebListener 를 사용해도 됩니다.




우선 ContextLoaderListener 클래스를 만들고 servletContextListener 인터페이스를 구현합니다.


------------------------------------------

 @Override

  public void contextInitialized(ServletContextEvent event) {

    try {

      ServletContext sc = event.getServletContext();


      Class.forName(sc.getInitParameter("driver"));

      conn = DriverManager.getConnection(

          sc.getInitParameter("url"),

          sc.getInitParameter("username"),

          sc.getInitParameter("password"));


      MemberDao memberDao = new MemberDao();

      memberDao.setConnection(conn);


      sc.setAttribute("memberDao", memberDao);


    } catch(Throwable e) {

      e.printStackTrace();

    }

  }

--------------------------------
오버라이드 받은 contextInitialized() 함수안에 위 코드처럼 데이터베이스 연동과 DAO 객체를 준비합니다. 
servletContext 저장소인 sc 객체에 저장을 하면 서블릿 클래스에서 사용할 수 있습니다.

그럼 사용할 서블릿 클래스에서

ServletContext sc = this.getServletContext();

MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");


를 사용하여 리스너에서 Connection 객체를 Dao(MemberDao)에 담은 Dao 객체를

꺼내 쓸 수 있습니다.


하지만 리스너에서 만든 공유객체는 하나의 Connection 객체에서 롤백해줘야 하기 때문에
한곳에서 롤백이 일어나면 다른 모든 작업도 롤백이 되는 문제가 있습니다.

이런 문제를 해결하기 위한것이 DB 커넥션풀입니다.















MVC 모델패턴에서 Model 부분 만들기


Model : 컨트롤러(서블릿)에서 database(mysql) 와 관련된 입출력 처리기능을 분리한 개념이다.


우선 MVC 구조를 보자



Model, View, Controller 형태인 MVC 패턴을


 서블릿, DAO, JSP 페이지로 매핑을 하면 아래와 같다.



  다시 책 예제와 매핑을 하면 아래와 같다.


      




흐름에 대한 설명은 책 378 page 참고




DAO 클래스를 만들고 데이터베이스 연동코드를 옮겨둡니다.

[예시) 회원목록 열람기능]

 public List selectList() throws Exception {
    Statement stmt = null;
    ResultSet rs = null;

    try {
      stmt = connection.createStatement();
      rs = stmt.executeQuery(
          "SELECT MNO,MNAME,EMAIL,CRE_DATE" + 
              " FROM MEMBERS" +
          " ORDER BY MNO ASC");

      ArrayList members = new ArrayList();

      while(rs.next()) {
        members.add(new Member()
        .setNo(rs.getInt("MNO"))
        .setName(rs.getString("MNAME"))
        .setEmail(rs.getString("EMAIL"))
        .setCreatedDate(rs.getDate("CRE_DATE"))	);
      }
      return members;
    } 
  }


위 코딩과 같이 DAO클래스 selectList() 함수 호출을 함으로써

데이터베이스 입출력 기능을 구현합니다.


12번째 줄에서 ArrayList 저장공간 [members] 에 


14번~9번 코드에서 값을 저장한후

21번 코드에서 쿼리 결과가 담긴 members 객체를 return 합니다.



그럼 서블릿에서는

request.setAttribute("members", memberDao.selectList());
RequestDispatcher rd = request.getRequestDispatcher("/member/MemberList.jsp");
rd.include(request, response);



1번 라인에서 2번째 파라미터 결과값이

DAO에서 처리결과물이다. 이 결과물을

members 이름으로 request 에 다시 저장합니다.

(view 에서 이 결과값을 사용하기 위해)


그후 페이지 출력을 위해 2,3번 라인에서

include를 request와 response를 인자로 보내고

페이지 결과값을 브라우저에게 보냅니다.
















GET과 POST 방식이 조금 달라요ㅎ

(방식이 다른이유는  GET방식의 경우 파라미터값을 URL 주소와 함께 오기 때문에 조금 달라요) 


POST 방식 인코딩 처리


POST방식은 URL 뒷부분이 아닌 몸통(데이터 영역)에서 파라미터값이 전달 되기 때문에 

setCharacterEncoding 함수로 처리해 주면 됩니다ㅎ

request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");




GET 방식 인코딩처리  


우선  GET방식에서 속성(파라미터)값이 전달 될때는 URL 과 함께 전달 되기 때문에


POST 방식처럼 바로 인코딩 함수로 처리가 힘들어요ㅎ 

GET 방식은 2가지 방법으로 인코딩 처리를 할 수 있어요.


1방법

톰캣설치디렉터리/conf/seraver.xml 파일 또는 아래 화면과 같이 개발도구에서 [빨간네모] 부분인

server.xml 에서 

 
<Connector port="8080" protocol="HTTP/1.1"
  				ConnectionTimeout="20000"
  				redirectPort="8443"/>






<Connector>태그에서 useBodyEncodingForURI 속성값을  true 로 추가해주세요.



<Connector port="8080" protocol="HTTP/1.1"
  				ConnectionTimeout="20000"
  				redirectPort="8443"
      useBodyEncodingForURI="true" />



useBodyEncodingForURI 속성값이 true 가 되면 GET방식으로 값을 가져올때 request.setCaharacterEncoding() 메서드로 케릭터 셋이 적용할 수 있어요ㅎ



그후 GET방식으로 파라미터값을 가져올때

request.setCharacterEncoding("utf-8");

String name = request.getParameter("name");   


이런식으로 읽어올 수 있어요 ㅎ


2번째 방식

server.xml 파일에서  useBodyEncodingForURI 속성 대신

URIEncoding 속성을 사용 할 수 있어요

<Connector port="8080" protocol="HTTP/1.1"
  				ConnectionTimeout="20000"
  				redirectPort="8443"
      URIEncoding="true" />



 

URIEncoding 속성을 사용할 경우 GET방식으로 파라미터 값을 읽을때 항상 이 속성에서 지정한

값으로 처리를 해주죠 대신 2번째 방법을 하시면 setCharacterEncoding 은 적용되지 않아요

  String name = request.getParameter("name");


바로 이런식으로 사용하시면 되는거죠











indexof() 함수를 설명할게요 ㅎ


예)

 String str = "인덱스오브함수란";

    String n = str.indexOf("오브");


n 의값은 3 이 나오게 되죠 ㅎ


indexOf() 함수 파라미터 값인 오브 라는 글자가 처음 나오는 인덱스 번호를 return 해 주죠


인덱스오브함수란

 0 1 2 3 4 5 6 7   <- 각 문자열의 인덱스 값


오브 라는 단어에 맨처음 인덱스는 3입니다.

바로 이것을 반환해 주는거죠 ㅎ

         

 




substirng() 함수 인자가 하나인것과 두개인것을 설명할게요ㅎ 



문자열 "일이삼사오" 를 예로 든다면 

  (문자 하나당 인덱스 번호가 0 1 2 3 4 순입니다 ㅎ)


"일이삼사오".substring(2)를 하면 "삼사오"가 return 되죠

"일이삼사오".substring(3)를 하면 "사오"가 return 되죠


감이 잡힐거예요 ㅎ 

문자열 첫번째부터 인덱스 0, 1, 2 숫자가 붙는다고 생각하면

substring(int index)     index에 들어갈 숫자 이후 문자열을 반환(return)해 주는것이죠



substring(int startIndex , int endIndex)  의 경우  (substring 함수에 파라미터 인자가 2개인 경우)


이번엔 예시 문자열을 "abcdefg" 로 해보겠습니다 ㅎ

"abcdefg".substring(4,6)를 하면 "ef" 가 return 되죠

 0123456   <- 인덱스 번호

4, 5 인덱스 문자열이 반환 되는거죠


startIndex 첫번째 파라미터 값에서 이 값을 포함하면서 가져옵니다 ㅎ


endIndex 종료 인덱스에서 이 값 바로 전까지 가져오는것이죠 (endIndex는 가져오지 않아요!)


JSP 자바 코딩에서 다양한 url 주소 가져오는 함수를정리할게요 ㅎ

 

프로젝트 Path만 가져옵니다.

request.getContextPath() 

예)  http://localhost:8080/project/list.jsp

[return]/project 

 

프로젝트 + 파일경로까지 가져옵니다.

request.getRequestURI() 

예)  http://localhost:8080/project/list.jsp

[return]        /project/list.jsp  

String url = request.getRequestURI.split("/");

String Name = url[url.length -1];       // list.jsp

 

전체 경로를 가져옵니다. 

request.getRequestURL()

예) http://localhost:8080/project/list.jsp

[return]   http://localhost:8080/project/list.jsp

 

파일명만 가져옵니다.

request.ServletPath() 

예) http://localhost:8080/project/list.jsp

[return] /list.jsp

 

서버 or 로컬 웹 애플리케이션 절대결로 가져옵니다. 

request.getRealPath() 

예) http://localhost:8080/projectname/list.jsp

[return]         c:\project\webapps\projectname\

 
 

 

 
 

'프로그래밍 > JSP' 카테고리의 다른 글

servletContextListener 만들기  (0) 2015.05.21
DAO 만들기  (0) 2015.05.21
GET방식 POST방식 인코딩 처리하기  (2) 2015.04.05

+ Recent posts