JAVA 상속(2)

JAVA 상속(2)

어노테이션?

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

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

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 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

\t" + name + " = "+ value + " ["+ desc + "]"); } } return sb.toString(); } }

@Override : 부모 클래스가 가지고 있는 함수를 재정의 한다. 재정의 된 로직이 실행됨

toString() : Object 클래스가 가지고 있는 함수 System.out.println이 실행될 때, 객체 toString()함수를 호출함 -> 객체를 Stirng 타입으로 반환해줌

StringBuffer() : 문자열 정보 관리

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

신기한건, 인데,, 클래스 정보가 저장이 되나봐

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

(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쪽

from http://v-ridescent.tistory.com/113 by ccl(A) rewrite - 2021-12-04 18:01:43