자바빈즈
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
자바빈즈(JavaBeans)는 자바 플랫폼에서 사용되는 재사용 가능한 소프트웨어 컴포넌트 규약이다. 자바빈즈는 내성(Introspection), 속성(Property), 사용자 정의(Customization), 이벤트(Event), 지속성(Persistence), 메서드(Method) 등의 특징을 가지며, 클래스는 직렬화 가능해야 하고, 기본 생성자를 가져야 하며, 속성은 getter와 setter 메서드를 통해 접근할 수 있어야 하는 관례를 따른다. 자바빈즈는 속성, 이벤트, 메서드를 다른 애플리케이션에 노출할 수 있으며, 자바 GUI 툴킷의 컴포넌트나 MVC 패턴의 모델 역할을 수행하는 등 다양한 실제 적용 사례가 존재한다. 자바빈즈는 `java.beans` 패키지를 통해 API를 제공하며, 인자 없는 생성자를 가진 클래스가 유효하지 않은 상태로 인스턴스화될 수 있다는 단점과, 불변 객체를 제공하지 못하고 많은 보일러플레이트 코드가 발생한다는 단점도 존재한다.
더 읽어볼만한 페이지
- 아키텍처 패턴 - 서비스 지향 아키텍처
서비스 지향 아키텍처(SOA)는 기능들을 독립적인 서비스 단위로 분리하여 느슨하게 결합함으로써, 네트워크를 통해 접근 가능한 서비스를 재사용하고 결합하여 응용 프로그램을 구축하는 소프트웨어 아키텍처이다. - 아키텍처 패턴 - 제어 반전
제어 반전은 프로그램의 제어 흐름을 프레임워크나 컨테이너가 관리하도록 하는 프로그래밍 원칙으로, 코드 결합도를 낮추고 유연성을 높이지만, 복잡성을 증가시킬 수 있다는 비판도 존재한다. - 소프트웨어 디자인 패턴 - 모델-뷰-컨트롤러
모델-뷰-컨트롤러(MVC)는 소프트웨어 디자인 패턴으로, 응용 프로그램을 모델, 뷰, 컨트롤러 세 가지 요소로 분리하여 개발하며, 사용자 인터페이스 개발에서 데이터, 표현 방식, 사용자 입력 처리를 분리해 유지보수성과 확장성을 높이는 데 기여한다. - 소프트웨어 디자인 패턴 - 스케줄링 (컴퓨팅)
스케줄링은 운영 체제가 시스템의 목적과 환경에 맞춰 작업을 관리하는 기법으로, 장기, 중기, 단기 스케줄러를 통해 프로세스를 선택하며, CPU 사용률, 처리량 등을 기준으로 평가하고, FCFS, SJF, RR 등의 알고리즘을 사용한다. - 자바 플랫폼 - 블루레이
블루레이 디스크는 DVD 후속 매체로, 청색 레이저를 사용하여 고화질 영상과 음향을 제공하며 HD DVD와의 경쟁 후 고밀도 광디스크 표준으로 자리 잡았으나 스트리밍 서비스 성장으로 녹화용 디스크 생산이 중단되는 추세이다. - 자바 플랫폼 - 자바 플랫폼, 마이크로 에디션
자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
자바빈즈 | |
---|---|
기본 정보 | |
![]() | |
종류 | 자바 클래스 |
개발자 | 선 마이크로시스템즈 |
첫 출시 | 1996년 12월 |
개요 | |
목적 | 재사용 가능한 소프트웨어 컴포넌트 생성 |
특징 | 직렬화 지원 접근자 메서드를 통한 속성 접근 이벤트 처리 메커니즘 인트로스펙션 API를 통한 컴포넌트 설정 |
주요 특징 | |
직렬화 | 객체의 상태를 저장하고 복원하는 기능 |
속성 | private 필드와 public getter/setter 메서드를 통해 접근 "getXxx", "setXxx", "isXxx" 형태의 메서드 사용 |
이벤트 | 다른 컴포넌트와의 상호 작용을 위한 메커니즘 제공 |
인트로스펙션 | 런타임 시 컴포넌트의 속성, 이벤트, 메서드 검색 및 설정 자바 리플렉션 API 사용 |
활용 예시 | |
GUI 컴포넌트 | 스윙, AWT 등의 자바 GUI 라이브러리에서 사용 |
엔터프라이즈 애플리케이션 | 엔터프라이즈 자바빈즈 (EJB)와 같은 기술에서 사용 |
장점 | |
재사용성 | 컴포넌트 기반 개발을 용이하게 함 |
이식성 | 자바 가상 머신 (JVM)에서 실행 가능 |
확장성 | 새로운 기능을 추가하거나 기존 기능을 수정하기 용이 |
단점 | |
복잡성 | 설정 및 관리가 복잡할 수 있음 |
성능 | 리플렉션 사용으로 인한 성능 저하 가능성 |
2. 특징
내성은 빈(Bean)의 기능을 파악하기 위해 빈을 분석하는 과정이다. 이는 자바 빈즈 명세의 핵심 기능으로, 설계 도구와 같은 다른 애플리케이션이 컴포넌트에 대한 정보를 얻을 수 있도록 한다.
속성은 빈의 상태의 부분 집합이다. 속성에 할당된 값은 해당 컴포넌트의 동작과 모양을 결정한다. 속성은 세터(setter) 메서드를 통해 설정되며, 게터(getter) 메서드를 통해 얻을 수 있다.
자바 빈즈 명세의 사용자 정의 도구는 특정 컨텍스트에서 컴포넌트를 사용하기 위해 따라야 하는 단계별 가이드를 제공할 수 있다.
빈은 이벤트 객체 이벤트 리스너 모델과 상호 작용할 수 있다.
지속성은 빈의 속성 값과 인스턴스 변수를 포함하여 빈의 현재 상태를 비휘발성 저장소에 저장하고 나중에 다시 검색하는 기능이다.
자바빈즈는 속성을 캡슐화하기 위해 접근자 메서드를 사용해야 한다. 빈은 속성 접근과 관련 없는 비즈니스 로직을 위한 다른 메서드를 제공할 수 있다.
2. 1. 내성 (Introspection)
내성은 빈(Bean)의 기능을 파악하기 위해 빈을 분석하는 과정이다. 이는 자바 빈즈 명세의 핵심 기능으로, 설계 도구와 같은 다른 애플리케이션이 컴포넌트에 대한 정보를 얻을 수 있도록 한다.2. 2. 속성 (Property)
속성은 빈의 상태의 부분 집합이다. 속성에 할당된 값은 해당 컴포넌트의 동작과 모양을 결정한다. 속성은 세터(setter) 메서드를 통해 설정되며, 게터(getter) 메서드를 통해 얻을 수 있다.2. 3. 사용자 정의 (Customization)
자바 빈즈 명세의 사용자 정의 도구는 특정 컨텍스트에서 컴포넌트를 사용하기 위해 따라야 하는 단계별 가이드를 제공할 수 있다.2. 4. 이벤트 (Event)
빈은 이벤트 객체 이벤트 리스너 모델과 상호 작용할 수 있다.2. 5. 지속성 (Persistence)
지속성은 빈의 속성 값과 인스턴스 변수를 포함하여 빈의 현재 상태를 비휘발성 저장소에 저장하고 나중에 다시 검색하는 기능이다.2. 6. 메서드 (Method)
자바빈즈는 속성을 캡슐화하기 위해 접근자 메서드를 사용해야 한다. 빈은 속성 접근과 관련 없는 비즈니스 로직을 위한 다른 메서드를 제공할 수 있다.3. 자바빈즈의 관례
자바빈즈 클래스로 작동하기 위해서 객체 클래스는 명명법, 생성법, 그리고 행동에 관련된 일련의 관례를 따라야 한다. 이러한 관례는 개발 도구에서 자바빈즈와의 연결을 통해 클래스의 사용과 재사용, 그리고 클래스의 재배치를 가능하게 한다.
지켜야 할 관례는 다음과 같다:
- 클래스는 직렬화되어야 한다. (클래스의 상태를 지속적으로 저장 혹은 복원시키기 위해)
- 클래스는 기본 생성자를 가지고 있어야 한다.
- 클래스의 속성들은 ''get'', ''set'' 혹은 표준 명명법을 따르는 메서드들을 사용해 접근할 수 있어야 한다.
- 클래스는 필요한 이벤트 처리 메서드들을 포함하고 있어야 한다.
다양한 관례로서 표현된 요구 사항들로 인해 일부 개발자들은 자바빈즈를 확실한 명명법을 따르는 예전의 자바 객체로 보기도 한다. 그렇지만 그러한 관점은 이벤트 처리를 지원하는 자바빈즈에 대한 오해를 낳을 수도 있다. 왜냐하면 메서드 관례와 이벤트 처리를 지원하는 클래스는 상당히 복잡하고, 특정 기반 클래스와 인터페이스를 요구하기 때문이다.
클래스에는 공개 기본 생성자 (인수가 없음)가 있어야 하며, 이를 통해 편집 및 활성화 프레임워크 내에서 쉽게 인스턴스화할 수 있다. 클래스 속성은 표준 명명 규칙에 따라 ''get'', ''set'', ''is'' (get 대신 부울 속성에 사용할 수 있음), ''to'' 및 기타 메서드 (소위 접근자 메서드 및 변경자 메서드)를 사용하여 액세스할 수 있어야 한다. 이를 통해 다양한 유형의 속성에 대한 사용자 지정 편집기를 포함하는 많은 프레임워크 내에서 빈 상태를 쉽게 자동 검사하고 업데이트할 수 있다. 세터는 하나 이상의 인수를 가질 수 있다.
4. 장점
자바빈은 속성, 이벤트 및 메서드를 다른 애플리케이션에 노출할 수 있다. 또한 다른 객체로부터 이벤트를 수신하도록 등록할 수 있으며, 이러한 다른 객체로 전송되는 이벤트를 생성할 수 있다. 자바빈을 구성하는 데 도움이 되는 보조 소프트웨어를 제공할 수 있으며, 구성 설정은 영구 저장소에 저장하고 복원할 수 있다.
5. 단점
자바빈즈는 인자 없는 생성자를 가진 클래스가 유효하지 않은 상태로 인스턴스화될 수 있다는 단점이 있다.[1] 개발자가 수동으로 인스턴스화할 경우, 클래스가 부적절하게 인스턴스화되었음을 인지하지 못할 수 있다.[1] 컴파일러는 이러한 문제를 감지할 수 없으며, 문서화되어 있더라도 개발자가 문서를 확인한다는 보장이 없다.[1]
자바빈즈는 본질적으로 가변적이므로 불변 객체가 제공하는 이점이 없다.[1] 또한, 모든 속성에 대한 getter와 대부분 또는 모든 속성에 대한 setter를 생성해야 하므로 많은 양의 보일러플레이트 코드가 발생할 수 있다.
6. JavaBeans API
wikitext
자바빈즈(JavaBeans) 기능은 `java.beans` 패키지에 있는 클래스와 인터페이스 집합으로 제공된다.
인터페이스 | 설명 |
---|---|
AppletInitializer | 이 인터페이스의 메서드는 애플릿인 빈(Bean)을 초기화하는 데 사용된다. |
BeanInfo | 이 인터페이스를 통해 설계자는 빈의 이벤트, 메서드 및 속성에 대한 정보를 지정할 수 있다. |
Customizer | 이 인터페이스를 통해 설계자는 빈을 구성할 수 있는 그래픽 사용자 인터페이스를 제공할 수 있다. |
DesignMode | 이 인터페이스의 메서드는 빈이 디자인 모드에서 실행되는지 여부를 결정한다. |
ExceptionListener | 이 인터페이스의 메서드는 예외가 발생했을 때 호출된다. |
PropertyChangeListener | 이 인터페이스의 메서드는 바운드 속성이 변경될 때 호출된다. |
PropertyEditor | 이 인터페이스를 구현하는 객체를 통해 설계자는 속성 값을 변경하고 표시할 수 있다. |
VetoableChangeListener | 이 인터페이스의 메서드는 제약된 속성이 변경될 때 호출된다. |
Visibility | 이 인터페이스의 메서드를 통해 빈은 GUI를 사용할 수 없는 환경에서 실행할 수 있다. |
6. 1. 주요 인터페이스
wikitable인터페이스 | 설명 |
---|---|
AppletInitializer | 이 인터페이스의 메서드는 애플릿인 빈(Bean)을 초기화하는 데 사용됩니다. |
BeanInfo | 이 인터페이스를 통해 설계자는 빈의 이벤트, 메서드 및 속성에 대한 정보를 지정할 수 있습니다. |
Customizer | 이 인터페이스를 통해 설계자는 빈을 구성할 수 있는 그래픽 사용자 인터페이스를 제공할 수 있습니다. |
DesignMode | 이 인터페이스의 메서드는 빈이 디자인 모드에서 실행되는지 여부를 결정합니다. |
ExceptionListener | 이 인터페이스의 메서드는 예외가 발생했을 때 호출됩니다. |
PropertyChangeListener | 이 인터페이스의 메서드는 바운드 속성이 변경될 때 호출됩니다. |
PropertyEditor | 이 인터페이스를 구현하는 객체를 통해 설계자는 속성 값을 변경하고 표시할 수 있습니다. |
VetoableChangeListener | 이 인터페이스의 메서드는 제약된 속성이 변경될 때 호출됩니다. |
Visibility | 이 인터페이스의 메서드를 통해 빈은 GUI를 사용할 수 없는 환경에서 실행할 수 있습니다. |
7. 실제 적용 사례
AWT, Swing 그리고 SWT와 같은 자바 GUI 툴킷의 컴포넌트에 자바빈즈 관례들을 사용하고 있다. 위에 언급된 툴킷의 컴포넌트들은 이클립스의 Visual Editor와 같은 GUI 편집기에서 컴포넌트간 계층을 유지하고 'getter'와 'setter' 메서드들을 통해 컴포넌트에 접근하게 한다.
8. 예제 코드
java
/***
- *
- PersonBean.java *
- *
/
public class PersonBean implements java.io.Serializable
{
private String name;
private boolean coding;
// 기본 생성자 (인자가 없는).
public PersonBean()
{
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
// Different semantics for a boolean field (is vs. get)
public boolean isCoding()
{
return this.coding;
}
public void setCoding(boolean coding)
{
this.coding = coding;
}
}
```
```java
package player;
public class PersonBean implements java.io.Serializable {
/ 속성 /
private boolean deceased = false;
private List list;
/** 읽기/쓰기 가능한 속성 "name". */
private String name = null;
/** 인자 없는 생성자(인수를 사용하지 않음). */
public PersonBean() {
}
public List getList() {
return list;
}
public void setList(final List list) {
this.list = list;
}
/**
- 속성 "name"에 대한 Getter.
- /
public String getName() {
return name;
}
/**
- 속성 "name"에 대한 Setter.
- @param value
- /
public void setName(final String value) {
this.name = value;
}
/**
- 속성 "deceased"에 대한 Getter
- boolean 필드에 대한 다른 구문(is vs get)
- /
public boolean isDeceased() {
return deceased;
}
/**
- 속성 "deceased"에 대한 Setter.
- @param value
- /
public void setDeceased(boolean value) {
deceased = value;
}
}
```
`PersonBean` 클래스는 `java.io.Serializable` 인터페이스를 구현한다. `name`과 `coding`이라는 private 속성을 가지고 있으며, 각 속성에 대한 getter (`getName()`, `isCoding()`)와 setter (`setName(String name)`, `setCoding(boolean coding)`) 메서드를 제공한다. `coding` 속성은 boolean 타입이므로 `isCoding()` 메서드를 사용한다.
`player` 패키지 안의 `PersonBean` 클래스는 `deceased` 와 `list` 라는 속성을 추가적으로 가지고 있다. `deceased` 속성또한 boolean 타입이므로, `isDeceased()` 메서드를 사용한다.
==== TestPersonBean.java ====
```java
/***
- *
- TestPersonBean.java *
- *
/
public class TestPersonBean
{
public static void main(String[] args)
{
PersonBean person = new PersonBean();
person.setName("Bob");
person.setCoding(true);
// Output: "Bob [coding]"
System.out.print(person.getName());
System.out.println(person.isCoding() ? " [coding]" : "");
}
}
```
```java
import player.PersonBean;
/**
- 클래스 "TestPersonBean".
- /
public class TestPersonBean {
/**
- 클래스 "PersonBean"에 대한 테스터 메서드 "main".
- @param arguments
- /
public static void main(final String[] arguments) {
final PersonBean person = new PersonBean();
person.setName("Bob");
person.setDeceased(false);
person.setList(new ArrayList());
// 출력: "Bob [alive]"
System.out.print(person.getName());
System.out.println(person.isDeceased() ? " [deceased]" : " [alive]");
}
}
```
```xml
이름:
사망 여부?
8. 1. PersonBean.java
java/***
- *
- PersonBean.java *
- *
/
public class PersonBean implements java.io.Serializable
{
private String name;
private boolean coding;
// 기본 생성자 (인자가 없는).
public PersonBean()
{
}
public String getName()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
// Different semantics for a boolean field (is vs. get)
public boolean isCoding()
{
return this.coding;
}
public void setCoding(boolean coding)
{
this.coding = coding;
}
}
```
```java
package player;
public class PersonBean implements java.io.Serializable {
/ 속성 /
private boolean deceased = false;
private List list;
/** 읽기/쓰기 가능한 속성 "name". */
private String name = null;
/** 인자 없는 생성자(인수를 사용하지 않음). */
public PersonBean() {
}
public List getList() {
return list;
}
public void setList(final List list) {
this.list = list;
}
/**
- 속성 "name"에 대한 Getter.
- /
public String getName() {
return name;
}
/**
- 속성 "name"에 대한 Setter.
- @param value
- /
public void setName(final String value) {
this.name = value;
}
/**
- 속성 "deceased"에 대한 Getter
- boolean 필드에 대한 다른 구문(is vs get)
- /
public boolean isDeceased() {
return deceased;
}
/**
- 속성 "deceased"에 대한 Setter.
- @param value
- /
public void setDeceased(boolean value) {
deceased = value;
}
}
```
`PersonBean` 클래스는 `java.io.Serializable` 인터페이스를 구현한다. `name`과 `coding`이라는 private 속성을 가지고 있으며, 각 속성에 대한 getter (`getName()`, `isCoding()`)와 setter (`setName(String name)`, `setCoding(boolean coding)`) 메서드를 제공한다. `coding` 속성은 boolean 타입이므로 `isCoding()` 메서드를 사용한다.
`player` 패키지 안의 `PersonBean` 클래스는 `deceased` 와 `list` 라는 속성을 추가적으로 가지고 있다. `deceased` 속성또한 boolean 타입이므로, `isDeceased()` 메서드를 사용한다.
8. 2. TestPersonBean.java
이름:
사망 여부?
9. 역할
`java.util.Observable`과 `java.beans.PropertyChangeSupport`를 조합하여 모델-뷰-컨트롤러(MVC)에서 모델에 해당하는 역할을 할 수 있다.
참조
[1]
서적
Effective Java
https://archive.org/[...]
Addison-Wesley
2008
[2]
웹사이트
オラクルの用語集より
http://otndnld.oracl[...]
[3]
웹사이트
https://docs.oracle.[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com