mybatis의 xml에서 아래와 같은 에러가 났을 경우, xml 자체에 등호가 존재하여 났을 경우가 대부분입니다.

The content of elements must consist of well-formed character data or markup.


등호나 쿼리문 부분에 아래와 같이 <![CDATA[]>을 넣어주면 됩니다.

<select id="getItems" parameterType="map"  resultType="hashmap"> 
<![CDATA[ 
select * 
from item
where date < #{date}
]]> 
</select>


'언어 > Java' 카테고리의 다른 글

[Java] mybatis 비교 및 범위 쿼리 사용시 주의할 점  (0) 2017.02.22
[Java] static 사용 예제  (0) 2017.02.10
[Java] 자바 용어 정리  (0) 2017.02.10

스타크래프트의 마린(유닛)을 예로 들었습니다.

마린의 최고체력은 static을 붙여야겠죠. 현재체력은 붙이면 안되고요. 모든 마린들의 최고체력은 같으니까요. 현재체력은 마린(인스턴스)마다 다르겠죠. 마린의 공격력 역시 static을 붙여야겠죠? 모든 마린의 공격력은 같아야하니까요. 마린의 공격력을 향상시키는 upgradeWeapon()함수가 있다면 이 함수는 static변수인 마린의 공격력을 향상시키는 일을 한다고 가정하고요. 이 함수에는 static을 붙여야 합니다. 이 함수는 static변수에 대한 작업을 하니까요. 만일 마린의 체력을 소모시키는 steamPack()메서드에는 static을 붙일 수 있을까요? 붙일 수 없습니다. 현재체력을 감소시키는 일을 해야하니까... 인스턴스 변수에 대한 작업을 해야하니까요.

인스턴스라는 것 자체가, 별개의 것이라는 뜻이라고 이해하세요. static은 예외적으로 공통적이라는 의미를 갖습니다. 원칙적으로는 인스턴스들은 서로 개별적인 것이므로 서로 달라야하는데... 공통적으로 관리되어야하는 것에는 static을 붙입니다. 공통적으로 관리되어야하는 값을 static을 붙이지 않고 놔둔다면, 인스턴스마다 다른 값을 가질 가능성(오류의 가능성)이 있죠. 관리도 힘들고요.

클래스는 변수와 함수의 집합입니다. 같은 클래스에 있는 변수와 함수라면, 서로 깊은 관계가 있기 마련이죠... 같은 클래스의 함수는 보통 같은 클래스의 변수를 가지고 작업하는 경우가 많습니다.  여러분이 작성한 메서드가 인스턴스 변수에 대한 작업만을 한다면, 인스턴스 메서드(static이 안붙은 메서드)로 작성하시면 되고요. 메서드가 인스턴스 변수에 대한 작업을 하지 않거나, 인스턴스 메서드를 호출하는 경우가 아니라면, static으로 하는 것이 좋습니다. 반드시 그렇게 해야하는 것은 아닙니다. 인스턴스 메서드가 인스턴스를 생성해야만 사용할 수 있는 이유는 바로 이 때문입니다. 인스턴스 변수에 대한 작업을 해야하는데 인스턴스를 만들어야만 비로서 인스턴스 변수를 가지고 작업할 수 있기 때문에 인스턴스를 만들기 전에는 인스턴스 메서드를 호출할 수 없는 겁니다. 반면에 static메서드는 지역변수만으로 작업을 하거나 static변수(필요한 즉시 자동 생성)를 가지고 작업을 하기 때문에 인스턴스 생성없이도 호출이 가능한 것이지요. 쓰다보니 함수라는 용어와 메서드라는 용어를 섞어서 썼는데 둘다 같은 뜻으로 보시면 됩니다.

 결론... 여러분들이 클래스를 작성하실때... 멤버변수 중에 인스턴스마다 같은 값을 유지해야하는 경우 (위에서 말하는 마린의 최대체력)에는 static을 붙여서 모든 인스턴스가 같은 값을 공유하도록 합니다. 함수(메서드)의 경우... 함수내에서의 작업에 인스턴스 변수가 필요하다면(또는 인스턴스메서드를 호출하는경우) static을 붙이면 안됩니다. 그 외에는 static을 붙이시는 것이 좋습니다. 

static메서드는 컴파일시에 연결(early-binding)되기 때문에, 실행 시에 연결(late-binding)되는 인스턴스 메서드보다 더 빠릅니다. early-binding은 컴파일시에 이미 호출될 함수가 결정되기 때문에 실행시에 어떤 함수를 호출할 것인지 결정하는 시간을 줄일 수 있습니다. late-binding은 실행 시에 클래스 타입 체크(RTTI, Run-Time Type Identification)를 통해서 호출될 함수를 결정하기 때문에, 호출된 함수를 찾는 시간이 더 걸립니다. 실행 시 타입을 체크하는 것이 이러한 단점이 있기는 하지만 객체 지향 언어의 가장 큰 장점 중의 하나인 다형성을 가능하게 한다는 점에서 큰 의미를 가집니다.

클래스변수(static 변수)와 인스턴스 변수의 차이를 이해하기 위한 예로 카드 게임에 사용되는 카드를 클래스로 정의해보자. 

 

카드 클래스를 작성하기 위해서는 먼저 카드를 분석해서 속성과 기능을 알아 내야한다. 속성으로는 카드의 무늬, 숫자, 폭, 높이 정도를 생각할 수 있을 것이다. 이 중에서 어떤 속성을 클래스 변수로 선언할 것이며, 또 어떤 속성들을 인스턴스 변수로 선언할 것인지 생각해보자.

class Card { 
         String kind ; // 카드의 무늬 - 인스턴스 변수 
         int number; // 카드의 숫자 - 인스턴스 변수 
         static int width = 100 ; // 카드의 폭 - 클래스 변수 (static 변수) 
         static int height = 250 ; // 카드의 높이 - 클래스 변수 (static 변수)
  } 

각 Card인스턴스는 자신만의 무늬(kind)와 숫자(number)를 유지하고 있어야 하므로 이들을 인스턴스변수로 선언하였고, 각 카드들의 폭(width)과 높이(height)는 모든 인스턴스가 공통적으로 같은 값을 유지해야하므로 클래스변수로 선언하였다. 만일 카드의 폭을 변경해야할 필요가 있을 때는 모든 카드의 width값을 변경하지 않고, 한 카드의 width값만 변경해도 모든 카드의 width값이 변경되는 셈이다. 


출처: 자바의정석

'언어 > Java' 카테고리의 다른 글

[Java] mybatis 비교 및 범위 쿼리 사용시 주의할 점  (0) 2017.02.22
[Java] static 사용 예제  (0) 2017.02.10
[Java] 자바 용어 정리  (0) 2017.02.10

클래스(Class)

클래스란 어떤 특정 종류의 모든 객체들에 대해 일반적으로 적용할 수 있는 변수와 메소드를 정의하고 있는 소프트웨어적인 설계도(blueprint) 또는 프로토타입(prototype). 실세계에 존재하는 객체들이 가질 수 있는 상태와 행동들에 대해 소프트웨어적으로 추상화(abstraction)한 것

추상클래스

추상 클래스는 객체가 가지는 특성들을 추상화시켜 놓았을 뿐 아직 구체화 시키지 못한 클래스이므로, 이 추상클래스를 상속하는 하위 클래스에서 좀 더 구체화 시키도록 하는 것입니다. 따라서, 추상클래스를 상위 클래스로 하여 상속하는 하위 클래스는 추상클래스인 상위 클래스에서 완전히 구현하지 못한 부분들을 완전하게 구현해 주어야만 하위 클래스에 대한 객체 생성이 가능하고, 그렇지 못할 경우 하위 클래스는 상위 클래스인 추상 클래스와 같이 미완성이므로 자체적으로 객체를 생성할 수 없고, 이 하위 클래스는 다시 추상 클래스가 됩니다.

추상 메소드의 특징

추상메소드는 추상클래스와 마찬가지로 아직 구현이 이루어지지 않고 단지 그 프로토입만 가지고 있는 메소드.

  1. 추상메소드는 미완성 메소드이어야 하므로, 메소드의 몸체(body)를 가질수 없음
  2. 추상메소드는 클래스가 가져야 할 인터페이스에 대한 프로토타입(메소드의 형태)을 정의하고 있음
  3. 추상메소드는 하위클래스가 가져야 할 인터페이스를 정의
  4. 추상메소드를 포함하는 클래스는 반드시 추상클래스로 선언되어야 함

추상클래스(메소드) 선언 시 주의사항

  1. abstract 메소드를 하나라도 가지고 있다면 그 클래스는 반드시 abstract 클래스로 선언되어야 함
  2. abstract 클래스는 직접 객체를 생성할 수 없음
  3. abstract 클래스를 사용하기 위해서는 이 클래스를 상속한 클래스에서 abstract 메소드를 구현해 주어야만 함
  4. 만약 abstract 클래스를 상속했는 데 abstract 메소드를 구현해 주지 않았다면 이 클래스 역시 abstract 클래스로 선언되어야 함
  5. abstact 한 메소드가 없어도 abstract class로 선언할 수 있음( 상속을 통해서만 접근 가능)

상속(Inheritance)

객체지향 개념은 클래스를 이용하여 다른 클래스를 생성 또는 정의할 수 있습니다. 다시 말해서, 하위클래스는 상위클래스가 갖고 있는 모든 특성들을 상속하여 사용할 수 있습니다. 이러한 상속 관계를 트리로 나타낼 수 있고, 이 상속관계 트리를 클래스 계층도(class hierarchy)라 합니다. 상속의 장점을 살펴보면, 상위클래스는 하위클래스들이 가질 수 있는 일반적인 상태와 행동을 정의하고 있고, 하위클래스는 하위클래스 만이 갖는 특별한 상태와 행동을 정의하도록 함으로써 상위클래스를 여러 하위클래스들이 재사용할 수 있고 소프트웨어 개발에 드는 비용을 감소할 수 있습니다. 프로그램 개발자는 상위클래스를 일반적인 행동(genericbehavior)을 정의하도록 할 수 있고, 이러한 클래스를 추상 클래스(abstract class)라 합니다. 이러한 추상 클래스는 부분적으로 구현되거나 구현이나 정의가 이루어지지 않을 수 있는데, 이는 하위클래스를 정의하면서 완성할 수 있도록 가이드라인을 제공해 주는 역할을 합니다.

인터페이스

추상메소드와 파이널 변수로만 이루어진 클래스. 따라서, 인터페이스 내에 정의된 메소드는 자바에 의해 자동으로 ‘public abstract’로 변수는 자동으로 ‘public static final’로 선언됩니다. 구현이 이루어지지 않은 추상메소드를 포함하고 있는 인터페이스는 객체 생성을 할 수 없습니다. 클래스가 인터페이스를 구현해주어야 상속이 가능합니다. 이 때, 클래스는 인터페이스의 모든 메소드 및 변수들을 상속하게 되며, 인터페이스에 정의되어 있는 모든 메소드를 구현해 주지 않을 경우 이 클래스는 추상메소드를 포함하고 있으므로 추상클래스로 선언되어야 합니다.

다음은 인터페이스의 일반적인 형태입니다.

접근제어자 interface 인터페이스이름 [extends 상위인터페이스] {
   상수선언;
   메소드선언;
}

인터페이스의 용도

  1. 강제적인 클래스 관계를 만들지 않으면서 서로 관련없는 클래스들 상이의 유사성을 나타내야 할 경우 
  2. 하나 이상의 클래스들이 구현하기를 원하는 메소드를 선언할 경우
  3. 클래스를 보여주지 않고서 객체의 프로그래밍 인터페이스를 보여주어야 할 경우

인터페이스와 다중상속의 차이

자바에서 인터페이스가 다중 상속을 할 수 있도록 해준다고 하는데, 인터페이스는 다중 상속을 할 수 있도록 해 주는 것이 아니라 다중 상속을 하는 것처럼 해 주는 것

  1. 클래스는 인터페이스로부터 단지 상수만을 상속
  2. 클래스는 인터페이스로부터 메소드의 구현(몸체)에 대해서는 상속할 수 없음 
  3. 인터페이스의 계층 구조는 클래스의 계층 구조와 서로 무관
    1. 같은 인터페이스를 구현하는 클래스들은 클래스 계층 구조 상에서 서로 관련이 있을 수도 없을 수도 있음. 이러한 특성 때문에 진정한 다중 상속이라 할 수 없음. 그러나 자바에서는 하나의 인터페이스가 여러 개의 상위 인터페이스를 가질 수 있도록 함으로써, 다중 인터페이스 상속을 할 수 있도록 함.

인터페이스의 구현

클래스가 이 인터페이스를 상속(implements)하여 인터페이스에 정의된 모든 메소드를 구현해 주어야 객체 생성이 가능합니다. 그리고, 클래스의 상속에서 하나의 클래스는 하나의 클래스만을 직속으로 상속할 수 있는 것과는 달리, 하나의 클래스는 여러 개의 인터페이스를 구현해 줄 수 있습니다.

인터페이스도 클래스와 마찬가지로 인터페이스를 상속할 수 있습니다. 그러나, 클래스 상속과 한 가지 차이점은 클래스는 오직 하나의 클래스만 상속 가능한테 비해, 인터페이스는 여러 개의 인터페이스를 상속할 수 있습니다. 인터페이스가 상속하는 상위 인터페이스들은 ‘,’로 구분하고, 상위 인터페이스가 가지는 모든 상수와 메소드들을 상속하게 됩니다.

다음은 인터페이스 구현의 일반적인 형태입니다.


접근제어자 class [extends 클래스이름]  implements 상위인터페이스리스트 {
   // 인터페이스에 선언된 메소드 구현
}

Connection Pool (커넥션 풀)

커넥션 풀 기법이란 데이터베이스와 연결된 커넥션을 미리 만들어서 풀(pool)속에 저장해 두고 있다가 필요 할때에 커넥션을 풀에서 가져다 쓰고 다시 풀에 반환하는 기법을 의미합니다. 동시 접속자가 사용하는곳에 많이 사용하는 기법입니다.

Overloading Method

하나의 이름으로 여러 개의 메서드를 가지고 있습니다. 같은 이름을 가진 여러 개의 메서드를 말합니다. 보통 다중 정의, 중복 메서드라고 부르며 일반적으로는 Overloading이라고 합니다. 이것은 하나의 이름으로 여러 개의 메서드를 가지고 있다는 뜻을 내포하고 있습니다.

Overloading Method의 규칙

  1. n매개변수의 개수가 달라야 함
  2. n매개변수의 타입이 달라야 함

위의 개수와 타입 중 하나만 달라도 중복메서드의 조건이 성립 됩니다.

메서드의 리턴타입은 중복메서드 구분할 때 사용하지 않습니다.

오버라이딩

상속관계에서 상위 클래스와 하위 클래스에 동일한 이름의 메서드가 있는 것을 보고 이야기 하는 것

오버로딩와 오버라이딩의 공통점

오버로드와 오버라이드는 메소드의 이름이 같지만 때에 따라 다른 기능을 가지므로 다형성을 구현한 것

인스턴스(Instance)

클래스를 실제로 사용할 수 있도록 선언하는 것, 다시 말해서 클래스에 대한 변수를 선언하는 것을 “인스턴스를 생성한다(instantiate)”라 하고, 이렇게 생성된 변수를 인스턴스라 하며, 이 인스턴스는 메모리 공간을 차지하게 됩니다. 그리고 인스턴스의 메소드를 이용하여 변수들의 값을 설정 및 변경할 수 있습니다.

객체(Object)

클래스를 실제 사용할 수 있도록 변수 선언한 것을 인스턴스이며, 이 인스턴스를 객체라 할 수 있습니다. 객체는 높은 모듈성(modularity)과 정보은닉(information hiding)의 장점을 제공합니다.

다형성(Polymorphism)

다형성의 기본 개념은 여러 개의 클래스가 같은 메시지에 대해서 각자의 방법으로 작용할 수 있는 능력이라고 볼 수 있습니다. 다형성은 같은 이름을 갖는 여러 가지 형태가 존재합니다. 다형성을 제공해 주기 위해 C++에서는 연산자 다중 정의(overloading), 함수 다중 정의, 그리고 함수 재정의(overriding) 등을 제공해 주고 있지만, 자바에서는 메소드(함수) 다중 정의와 메소드 재정의를 제공해 주고 있습니다.

static

  1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙임.
    1. 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적기 때문에 서로 다른 값을 유지. 경우에 따라서는 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙임.
  2. static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있음.
    1. static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문.
  3. static이 붙은 메서드(함수)에서는 인스턴스 변수를 사용할 수 없음.
    1. static 메서드는 인스턴스 생성 없이 호출가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재하기 때문에 static이 붙은 메서드(클래스 메서드)를 호출할 때 인스턴스가 생성 되어있을 수도 그렇지 않을 수도 있어서 static이 붙은 메서드에서 인스턴스변수의 사용을 허용하지 않음. (반대로, 인스턴스 변수나 인스턴스 메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스 변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문.)
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려.
    1. 메서드의 작업 내용 중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없음. 반대로 인스턴스 변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋음. 메서드 호출시간이 짧아지기 때문에 효율이 높아짐. (static을 안붙인 메서드는 실행시 호출되어야 할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸림)
  5. 클래스 설계시 static의 사용지침
    1. 먼저 클래스의 멤버 변수중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 살펴보고 있으면, static을 붙임.
    2. 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을 붙일 것을 고려.
    3. 일반적으로 인스턴스 변수와 관련된 작업을 하는 메서드는 인스턴스 메서드(static이 안붙은 메서드)이고 static변수(클래스 변수)와 관련된 작업을 하는 메서드는 클래스 메서드(static이 붙은 메서드)라고 보면 됨


'언어 > Java' 카테고리의 다른 글

[Java] mybatis 비교 및 범위 쿼리 사용시 주의할 점  (0) 2017.02.22
[Java] static 사용 예제  (0) 2017.02.10
[Java] 자바 용어 정리  (0) 2017.02.10

+ Recent posts