어노테이션?

@기호를 사용해서 음 내 생각인데 음 아마,, 어,, 뭔가 유지 관리가 편함

한번에 설정해서 그런지 뭐라지 내 이해로는 표가 있으면 한 행을 다 한번에 설정해서 좋아보임

public static String[] one(){
	return new String[]{"번호", "이름", "가격"};
}
public Object[] getData(){
	return new Object[]{productNo, productName, price};
}

public static int[] getWidth(){
	return new int[]{100, 400, 200};
}

이게 

public class ProductVo{
	@Grid(name = "번호", width = 100, order = 1)
    private String productNo;
    
    @Grid(name = "이름", width = 400, order = 2)
    private String productName;
    
    @Grid(name = "단가", width = 200, order = 3)
    private String price;
}

이렇게 바뀜

 

 

다시 돌아가서, 

(Desc.java)

package object_1;

import java.lang.annotation.*;
/** 
 * toString()을 위한 @Desc어노테이션
 * */

@Retention(RetentionPolicy.RUNTIME)	//	자바 로딩 된 후에도 어노테이션 사용하겠어
@Target(ElementType.FIELD)	//	해당 어노테이션을  전연변수에만 사용하겠다.
public @interface Desc{
	public String name();	// @Desc(name = "속성명")사용 가능하게 타입 정의
}

 

(DefaultVo.java)

package object_1;

import java.lang.reflect.Field;
public class DefaultVo {
	@Override
	public String toString() {
		
		//StringBuffer 클래스 객체 생성 : 문자열 자료 저장하기 위함
		StringBuffer sb = new StringBuffer();
		
		//문자열에 Class 객체생성, 클래스 정보 저장
		Class<? extends DefaultVo> clazz = this.getClass();
		sb.append(clazz.getName() + "정보");
		
		//Field 목록 객체 생성
		Field[] declaredFields = clazz.getDeclaredFields();
		for(Field f : declaredFields) {
			if(f != null) {
				//변수 조회
				String name = f.getName();
				String desc = "";
				
				//@Desc 어노테이션에 명시된 name()값 조회 : 필드 항목명
				Desc anno = f.getDeclaredAnnotation(Desc.class);
				if(anno != null) {desc = anno.name();}
				
				//전역 변수 값 조회
				String value = "";
				try {
					//접근 권한 부여 -> 전역변수 값 조회 -> 접근 권한 복원
					boolean accessible=f.isAccessible();
					f.setAccessible(true);
					Object obj = f.get(this);
					if(obj != null) { value = obj.toString();}
					f.setAccessible(accessible);
				}catch(IllegalArgumentException e) {e.printStackTrace();
				}catch(IllegalAccessException e) {e.printStackTrace();}
				
				
				//앞 문자열에 name, value, desc의 정보를 갖는 문자열 추가
				sb.append("\r\n\t" + name + " = "+ value + " ["+ desc + "]");
				
			}
		}
		return sb.toString();
	}
}
  • @Override : 부모 클래스가 가지고 있는 함수를 재정의 한다. 
    • 재정의 된 로직이 실행됨
  • toString() : Object 클래스가 가지고 있는 함수
    • System.out.println이 실행될 때, 객체 toString()함수를 호출함 -> 객체를 Stirng 타입으로 반환해줌
  • StringBuffer() : 문자열 정보 관리

음 Desc에 저장되어 있는거 String으로 반환하려고 만든 거.

신기한건, <? extends DefaultVo>인데,, 클래스 정보가 저장이 되나봐

<? extend Object> 는 어떤 자료형의 객체도 매개변수로 받겠다는 의미라고 한다.

 

 

(ProductVo.java)

package object_1;

public class ProductVo extends DefaultVo{
	//전역 변수 정의
	@Desc(name = "품목번호")
	private String productNo;
	
	@Desc(name = "품목명")
	private String productName;
	
	@Desc(name = "단가")
	private int price;
	
	//getter setter 함수의 정의
	public String getProductNo() {return productNo;}
	public void setProductNo(String productNo) {
		this.productNo = productNo;
	}
	
	public String getProductName() {return productName;}
	public void setProductname(String productName) {
		this.productName = productName;
	}
	public int getPrice() {return price;}
	public void setPrice(int price) {this.price =price;}	
}

Desc 정보 저장.

 

(MemberVo.java)

package object_1;

public class MemberVo extends DefaultVo{
	
	//전역 변수 정의
	@Desc(name ="회원아이디")
	private String memberld;
	
	@Desc(name = "회원명")
	private String memberName;
	
	
	//getter sater함수 정의
	public String getMemberld() {return memberld;}
	public void setMemberld(String memberld) {this.memberld = memberld;}
	public String getMemberName() {return memberName;}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
}

 

(TestMain.java)

package object_1;

public class TestMain {
	public static void main(String [] args) {
		//prodectVo 객체 생성 -> 속성 설정 -> 객체정보 조회
		ProductVo v1 = new ProductVo();
		v1.setPrice(1000);
		v1.setProductname("아메리카노");
		v1.setProductNo("a001");
		System.out.println(v1);
		
		//MemberVo 객체 생성 -> 속성 설정 -> 객체 정보 조회
		MemberVo v2 = new MemberVo();
		v2.setMemberld("m001");
		v2.setMemberName("홍길동");
		System.out.println(v2);
	}
}

 

결과

 

음 실습 해보니깐 어노테이션 좀 알 것 같기도 하고,,

근데 막상 짜보라고 하면,, 

한번 실습 해보고싶다. 문제 줘서

ㅎㅎㅎ

get, set도 알겠당

 

근데 패키지가 너무 신기하네,, 패키지 안에만 있으면 import안 해도 다 연결이 되나봐,, 

 

 

출처 : 자바 프로그래밍 100% 실전 가이드 세트(애프터스킬 시리즈)(전2권) | 심상원 | 아이콕스 - 교보문고 (kyobobook.co.kr) -> 391~ 397쪽

 

 

'study > java' 카테고리의 다른 글

Error querying database. Cause: java.lang.UnsupportedOperationException  (0) 2022.02.05
[Tomcat] 설치 및 eclipse 설정  (0) 2022.01.01
JAVA 상속  (0) 2021.12.04
[백준] 2750_수 정렬하기 (java)  (0) 2021.11.13
java Ajax 연습하기  (0) 2020.07.25

+ Recent posts