1. 래퍼(Wrapper) 클래스

      - 기본데이터를 감싸고 있는 클래스  (기본데이터 타입을 만들어주는 클래스를 만들자, 포장) 

       

       참고) Object는 최상의 클래스(기본타입은 받을수 없다)

              public void m(Object obj) -> 다 받아준다   근데 m(10)  m(10.5) ... 사용하려면 overloding을 해야된다? 

             

기본타입과 래퍼클래스
래퍼클래스의 메서드

   기본타입 : 프리미티브 타입, 래퍼 타입 ( 서로 호환은 안됨)

             목적:  기본데이터 타입을 래퍼타입으로 바꾸는것 즉 감싸서  (기본 toString이 래퍼클래스에 있다)

             가지비?  수정불가 불변(Immutable)  그러니 new 한다(Boxing UnBoxing이유) p107   

             내용은 동일하지만 Wrapper당

             T rv = 10 ; 올른쪽에 기본데이터가 자동으로 Wrapper가 되는경우는 래퍼타입일때만 함

 

1. 래퍼클래스 등장이유

       외계인(기본타입) 을 지구인(클래스 타입)으로 만들어주는 클래스 

2. 래퍼클래스의 기본 개념

  2.1 래퍼클래스의 종류

    래퍼 클래스 : 메서드를 가지고 있다

기본타입과 래퍼클래스
래퍼클래스의 메서드

  2.2 Boxing & UnBoxing

        Boxing : 래퍼클래스로 기본타입을 감싸 인스턴스 생성 

        UnBoxing : 반대과정

       예시)

       Integer i = new Integer(10)

       java5부터 Integer i = 10 가능하나 인스턴스 생성이 이루어진다.

                        i += 10

      ※ 래퍼로 생성된 인스턴스는 문자열 인스턴스처럼 한번 생성하면 불변(Immutable) 이다

          래퍼런스 타입과 기본타입은 절대 호환안됨(연산안됨)

  2.3 AutoBoxing & AutoUnBoxing

        Integer i = 10;

        i += 10;

2. 제너릭(Generic)

    java5

 1. 제너릭 기본

    데이터 타입의 일반화 

    기타내용) 대문자 아무거나

                     overridng 을 피하기 위해 만들었당~~

 2. 제너릭 클래스

       참고)에러는 컴파일타임, Exception runtime에 발생

       컴파일 타임에 에러 발생하고자 함(타입체크  선행)

 

   2.1 Object 클래스를 이용하여 하나의 클래스로 처리하는 방법

            Object 하나로 파라메터 처리하기 위해

            ex) gs2.boxing("식품")  -> 실행이 된다 : 에러가 발생하지 않는다(컴파일 타입)

          

   2.2 각 배송물건에 대해 개별 배송 클래스로 처리하는 방법

          배송클래스를 두개 Class로 만들때

        -> runtime에서 에러 발생

   2.3 제너릭 클래스

         -  Object가 적용된 자리(데이터 타입)를 T로 치환한다

         -  T로 치환된 자리의 타입은 인스턴스 생성시 결정된다.

          - T자리에 클래스 타입만 들어올수 있다

         ※ 하나의 클래스로 만들수 있고 에러처리가능(데이터의 안전성 보장하기 위해)

     예시)

      Class T goods<T>{

            T goods;

            public void boxing(T goods){

               this.goods = goods;

       생성 

                GoodShip<Electonic> gs1 = enw GoodShip<Electonic>();

        ※ GoodShip이 다양한 클래스 대응(코드 간결), 데이터 타입에 안정성(컴파일 타임 에러)

 

 3. 제너릭 메서드

    파라메터가 다를 때 적용할수 있다  - > 캡슐화도 기능 

  - 메서드 오버로딩을 대체할수 있다

  - 같은 기능을 수행하나 전달되는 파라미터가 다를 때 적용할 수 있다.

  선언방법) public static <T> void seeSmartTV(T param)

   정식) shower.<AAA>gMethod(aaa)

            shower.gMethod(aaa) ==> 캡슐화에 기능이 있다

 4. 제네릭 고급

   일부 제한 기능

   참고)

          -묵시적 형변환원칙

          10 + 10.2 큰것에 반영된다.    = 이라는것은 동일형이여야 된다.

         -명시적 형변환 

           에러가 뜨는자리인데 에러 없게 하기 위해 -> 개발자의 손실을 감당한다.

            타입을 줄이겠다(좁히겠당)

           데이터가 짤리거나 .. 좁히기 위해

4.1 제네릭 메서드에서 파라메터의 데이터 타입의 제한

      모든클래스가 아니라 내가 원하는 클래스 타입으로 제한 하는것

      extends를 사용

     주절이)  블루레이 영상+ 음성 분리

     public static<T> void seeSmartTV(T param){

                         ((Computer)param).runProgram();

 

     public static<T extends Computer> void seeSmartTV(T param){

                         param.runProgram();

                   

 

4.2 제네릭 메서드에서 파라미터로 배열전달

      public static <T> void printArr(T[] arr)  -> 모든테이터 타입의 배열을 찍는다

                 for(int i = 0; i<arr.length;i++){

                 }

     잠깐)  

                int [] arr =new int[5];  -> java는 배열을 instance로 본다

               명시적 선언 -> 인스턴스로 만들때 주소값을 만들고 -> 이항연산자는 같아야 Class로 받야야되는데(주소를 받을?)

      int [] => data type으로 봐야되고 래퍼런스 타입이고 array 타입이다.

     arr는 래퍼변수이고 즉 주소를 가지고 있다.

    모든프로그램에서 배열의 이름은 주소값이다.

    파라메터는 복제되어 전달인데? arr은 서울시 주민번호라 하면 아됨  주소를 전달한다

 

   잠깐) 왜 배열을 쓸까?

           1. 반복문의 사용조건          : 코드는 변하지 않고 값만 바뀐다.  <- 변수가 많음(안됨) a~z

           2. 반복문을 못쓰면 길어짐 

         반복문에 For문의 약점

             1) 반복대상의 갯수를 모르면 안된다. ~~~> length의 태생

             2) 순서가 없는데이터인경우 에러 된다. 

       Collection은 저장소이다  왜 Java는 배열이 있는데 만들었을까? 어떤저장소를 선택해야되는지?

     

4.3 제네릭과 와일드 카드

     제너릭 클래스에서 T를 제한하고 싶을때  즉 Car클래스를 상속받은것만으로 제한할때

   1)  AAA<? extends X> aaa

      X라는 클래스를 포함하여 X의 하위의 클래스는 모두 올수 있다

   2)  AAA<? super X> aaa

      X라는 클래스를 포함하여 X의 상위의 클래스는 모두 올수 있다

    예시)

       public static void drivingCar(Cargo<? extends Car> cg)          ==> 여시서 dirvingCar는 일반메서드

       Cargo의 타입은 Car를 포함하여 하위 클래스는 모두 올수 있다

 

3. 컬렉션 프레임 워크(Collection Framework)

      저장소이다

 

     Warapper 제너릭을 알아야 알수 있다.

     클래스의  공부팁 

        최상클래스(super)의 메서드를 알면  상속받고 overrindg되고 (공통되는 기능이 들어감)

        최상의 클래스가 interface이면 -> 생성할일이 없다(왜 인스턴스를 생성하지 못함)

       목적 : 공부하는 방법 주요콜랙션을 알자 --> 무수히 많다(성능을 잘못잡았을때 성능이 안나옴)

                 성능이안나오는 주범1

더보기

   주절이1)

     D.S : 자료구조 (수학 F 증명하는 수학 목표1-time sort 의 증명 2-메모리를 적게)-> class를 많이 만듬

     < 알고리즘이 상위과정

    자료구조에서 성능이 좋은 알고리즘이 Collection에 있다

    sort : 1) 0번째 방에서 ~~~ 작은수     select소트   

            2) 앞뒤로 바꾸고 맨뒤에서 정렬  버블소트 : 시간복잡도+공간복잡도 크다

    quick sort 를 쓰면 빠르다  node

  주절이2)

    배열의 장점 : 검색속도가 좋다(이름과 index를 알면 한번에 찾는다)

          단점 : 1) size조정이 안된다. 2) 메모리 낭비가 심하다 3) 타입을 하나만 쓸수있다.

                 배열은 첫 마지막을 point를 가지고 address를 쓰는데  빈공간이 있으면 안된다  방의갯수가 크면

               오버로드 발생, 

                  첫번째 공간이 사라질때 shift, 추가될때 shift 가 발생

                 ==> 배열은 삽입할때 안좋다

                

                 ==> java는 Class로 , C는 구조체를 사용한다.

          ※ 보통 사이즈를 잡을때 넉넉히 ~~~ max로 

 

컬렉션에는 인스턴스 만 저장된다

=> 클래스로 생성된 인스턴스만 저장 한다 (기본데이터는 ? 래퍼) 생성된 구조 인스턴스 값을 받음

 1. 컬랙션 프레임워크의 개요

  1.1 개요

   컬랙션은 저장소이다  프레임워크로 불린다는것은 개발자가 구현해야될 코드를 미리 구현됨

   - 컬랙션에는 "인스턴스" 만 저장된다.

   => 클래스로 생성된 인스턴스만 저장 한다 (기본데이터는 ? 래퍼) 생성된 구조 인스턴스 값을 받음

  1.2 구조

 

    클래스의 최상클래스(super)의 메서드를 알면  상속받고 overrindg되고 (공통되는 기능이 들어감)

 

    override이면 method name parameter, return type이 안바뀌고 동일함  , map만 다름

 

1.3 List 를 구현한 클래스

  List를 구현한 컬렉션 클래스의 공통 성격

  - 데이터의 저장순서를 유지

  - 중복데이터의 저장을 허용

- > Framework라 부르는게 삽입삭제를 알아서 한다(인스턴스에 따라 저장소가 달라진다 즉 소스코드는 동일하다)

 

  1.3.1 ArrayList

         1차원의 배열

         장점 : 검색속도가 빠름 (인텍스로 데이터를 찾기때문에)

         단점 :  데이터 삽입, 삭제 연산시 부하가 많음

  1.3.2  LinkedList

         하나의 주소에 데이터가 있는구조 

         장점 : 데이터 삽입 삭제가 용이함

         단점 : 데이터 검색속도의 일관된 보장이 어려움

       

        시작:다음주소   주소:다음주소   주소:다음주소...  끝   ==> 즉 중간삽입이 용이

더보기

실시간 검색어(배열) 1등이 먼저나오는 알고리즘 없다 -> 다뒤져봐야지 일관성

 인스턴스 응답속도를 동일하게 만들어준다?

 검색관련 : B, B+ B* tree  크롤링    

     node 

 

1.4 Collection을 사용하는 이유는 무엇인가?

     검색 -> 배열의 자료구조 변경시 

   ※ 저장소가 바뀌면 코드가 달라지는데 Collection을 사용하면 동일하다

    Colleciton을 만든이유 class만 바꾸면 된다

    상속만 잘 설계하면 된다

1.5 Set을 구현한 클래스(집합이다)

    - 데이터의 저장 순서를 유지하지 않는다(집합의 특징)

    - 중복데이터의 저장을 허용하지 않는다(원소나열법-집합의 특징)

        근데 일부에서는 ? HashSetCheck1 참고 

        Hash :검색 찾는데이터가 알고리즘이 없으면 순차

                  10,15,2,6,11,4 ==> %3 균등하게 나눈다  Hash 알고리즘임

   - 단 중복의 기준은 개발자가 정할수 있다 

      hSet.add(new Data(15)) <-> hSet.add(15)

 

1.5.1 Set에서 반복처리

        SDS LG SK LG  -> 3개 

         new로 생성시 4개

  Iterator (반복자) - > for문에는 사용못함(set이 순서가 없어서)

                           list는 쓸수 있다 왜 줄서있어서..

 

 

1.5.2 HashSet

  ※ hasCode, toString을 override를 통하여 중복 제거

     hasCode에 검색 알고리즘이 들어감 Has알고리즘  --> overriding 해야됨

     equal() 메서드는 '==' 연산자를 통해 같음을 오버라이딩 한다.

1.5.3 TreeSet

  Tree가 별거 다쓴다 Java에서는 무조건 정렬 Class이다

  - Tree를 기반으로 자료를 저장하고 데이터를 정렬한다.

  - 정렬의 기준은 개발자가 한다 (정렬은 Iterator가 결정한다 itr=sTree.descendingIterator(), 래퍼클래스는 별도 코딩으로

     해야지~~~compareTo를 쓰고 꼭 Comparable를 구현 Mak Interface)

 

 - TreeSet<E>에 데이터 저장시 반드시 Comparable<T> 인터페이스의 구현이 필요

   compareTo 메서드의 오버라이딩이 필요                ==>VO Class 일때

- 혹은 Compare<T> 인터페이스 구현시

   compare메서드의 오버라이딩이 필요                    ==>VO Class 일때  

- 이따 메서드의 전달된 파라메터기준으로   

  1) 파라메터가 작으면 +(정수)  리턴

  2) 같으면 0 리턴

  3) 파라메터가 크면 -(정수)  리턴  

 

※ add메서드 : compareTo hasCode가 자동으로 되는게 있네

 

1.6 Map을 구현한 클래스

 - 데이터를 저장할때 사용하는 메서드가 add()에서 put()으로 바뀜

- Map<K,V>에 데이터를 저장할때  key,value 구조 저장(열쇠를 꽂아야 나옴  get에 index가 아니라 key임)

- key는 중복이 있으면 안됨

 

    NevigableSet<Integer> navi = tMap.navigableKeySet();

    Iterator itr = navi.iterator();

    or

    Iterator<integer> itr = tMap.keySet().iterator();

 

     

   ※ 정렬은 iterator()  descendingIterator()

   

 

  Collection은 API가 많다 ~~~

더보기

많이 쓰는것~ Map,  Collection 저장소 안에 저장소를 넣는다 Colleciton은 인스턴스만 저장 인스턴스는 클래스로 만들어짐

           cp, sc, tv 등등을 저장하는 Map 즉 Map만 가져오면 다 가져온다.

         spring put? 제일 밖에 Map이 있다

 

 

디자인 패턴 3가지

   ※ 앞으로 collection에서는 for 를 안쓰고 Iterator를 쓴다  --> 다 사용할수 있으니 패턴이라 한다.

1. 추상(Abstract) 클래스

      빼낸다 -> 불안전한 메서드 생성 -> 인스턴스를 생성할수 없다

     상속을 통하여 완전한 메서드로 사용(상속된 메서드는 구현체 일명 Implement 또는 Service)

     1개라도 추상클래스가 있으면 추상클래스 

 

     참고) 메서드 4요소 :  메서드 이름, 파라메터 갯수타입, return value, body

             

 

    1.1 추상클래스의 개념

          - 추상클래스를 상속받은 클래스는 추상클래스가 가지고 있는 모든 추상클래스들 오버라이딩 해야한다.

    1.2 추상클래스 문법

          super가 소유한 추상메서드 

         안보이는거 보이기(생략문구 찾기)

          abstract void bb()  --> public void bb의 추상(즉 public static 생략됨)

     1.3 추상클래스의 사용이유

           일을 동시 진행 협업을 하기 위해   -> 없어도 구현할수 있다  생성만 빼고

package day2.abstractexam;

abstract class Afunction{
	public abstract void searchInform(String name, int phoneNum) ;
	public abstract void runService(int memberId, int request) ;
}

class AfunctionImpl extends Afunction{

	@Override
	public void searchInform(String name, int phoneNum) {
		System.out.println(name + " 고객님의 정보를 찾았습니다");
		
	}

	@Override
	public void runService(int memberId, int request) {
		System.out.println(memberId + " 고객님의 요청하신 서비스를 수행합니다");
	}	
}

public class AbstractExam {

	public static void main(String[] args) {
		Afunction aref = new AfunctionImpl() ;   //Afunction로 임시 넣고 가능 동시진행이유
		
		aref.searchInform("장그래", 0101112222) ;
		aref.runService(100, 1) ;
	}
}

2. 인터페이스(Interface)

   2.1 인터페이스의 개념      

         - 100% 불완전한 메서드로 이루어진 것

         - 열거형(클래스가 아닌것이 클래스.변수로 사용 즉 public static final이 생략됨)

     용어상)  두개의 물체가 만나는 접속면

       java는 다중상속을 지원하지 않음 -> 단일상속이다

  2.2 인터페이스 문법

           - 공식적인 클래스가 아님(Interface로 선언)

           - extends로 선언 불가  -> implements 키워드 사용

           - 메서드 오러라이딩의 원칙 -> 즉 public 만 접근제어 가능(public static final 생략됨)

 

    참고) 메서드 overriding의 접근제어 고찰

            접근제어는 같거나 넓어질수만 있다(Interface는 항상 접근제어는 public이다)

  2.3 인터페이스의 사용이유

          다중상속(x) -> 느슨한 결함(Loose Coupling)관계를 만들기 위해

          Oracle, DB2 등등   회사가 바뀌어도 기능은 동일하게 즉 메서드가 변하지 않는다(코드변화가 없다)

 

  2.4 인터페이스의 기타 사용

     2.4.1 C언어의 열거형(enum type)처럼 사용되는경우

interface Week
{
   int SUN=0, MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6 ;
}

  열거형(클래스가 아닌것이 클래스.변수로 사용 즉 public static final이 생략됨)

 

2.4.2 마크 인터페이스(Mark Inteface 또는 Tag Interface)

    아무런 형태없이 텅 빈상태(분류를 위해 사용)

      Data1 Data2 하나는 상속 아니면 없음

   ~able로 선언된것들이 대부분 Serializable과 Parcelable, Cloneable, Runnable 등등

 

 

2. 내부클래스(Inner Class)

1. 내부클래스 (Inner Class or Instance Class)

    내부클래스는 외부클래스에 대해 변수접근 가능 -> 캡슐화 강도가 최대가 되는 장점이 있다(a 와 b 클래스를 나눌수 없다)

   - 내부클래스에서는 외부클래스의 변수와 메서드를 자유롭게 사용할수 있다

   - 내부 클래스 이름앞에 접근제어는 4종류 모두 사용가능하다

   - 내부 클래스는 외부클래스가 소유하고 있는 변수 , 메서드와 동일하게 취급된다.

 

1.1 내부클래스(Inner Class or Instance Class)

         반드시 외부클래스 생성후 내부클래스 생성해야된다.

         OuterClass out = new OuterClass();

         OuterClass.Inner in = out.new Inner();

   

1.2 정적 내부 클래스(Static Class)

     내부클래스가 static사용하여 

    - 외부클래스를 인스턴스 생성하지 않아도 내부클래스를 사용가능(static은 메모리 생성)

    - 정적 내부 클래스에서는 외부 클래스의 static 변수와 메서드만 접근 가능

 

1.3 지역 클래스(Local Class)

     외부클래스의 메서드 내부에서 선언되는 클래스 

    - 외부클래스가 가지고 있는 모든 인스턴스 변수, static변수, 메서드 접근 가능

    - 지역클래스가 선언된 메서드가 가지고 있는 지역변수 접근가능(단 final로 선언된 변수만 접근가능)

    - 지역변수와 같은 특성으로 메서드 내부에서만 인스턴스 생성가능

    - 지역 클래스는 지역변수처럼 접근제어가 default인 변수만 선언 가능

    - 메서드 종료시 메모리 삭제됨 (중괄호가 닫히기전에 생성과 사용이 끝나야됨 return type은 꼭 상위interface로)

package day2.localclass;

class LocalClassExample{
    private int num1 = 0;
    private static int num2 = 10;
    private static final int num3 = 100;     

    public void outerMethod1() {
          String city1 = "서울";
          final String city2 = "뉴욕";
          System.out.println(city1);
          System.out.println(city2);
          System.out.println("파리");
    } 


    public void outerMethod2() {
          //public int aa= 0; 컴파일 에러
          String hello = "안녕하세요";
          //private final int bb = 1; 컴파일 에러
          //private static int cc = 2; 컴파일 에러
          final int finalNumber = 2015;             

          	class Local {
                 		public void localMethod() {
                     		System.out.println("외부클래스 메서드 접근가능");
                     		outerMethod1();
                    		System.out.println("외부클래스 변수 접근가능");
                     		System.out.println(num1);
                    		System.out.println(num2);
                     		System.out.println(num3);
                 		}

                 		public void localMemberDisplay() {
                     		System.out.println(
                      		"LocalClass를 포함하는 메서드의 변수 : ");
                     		//System.out.println(hello); 컴파일 에러
                     		System.out.println(finalNumber);
                		}
          	}
          Local local = new Local();
          local.localMethod();
          local.localMemberDisplay();
    }
} 

public class LocalClass {

	public static void main(String[] args) {
		LocalClassExample test = new LocalClassExample();
         test.outerMethod2();

	}
}

 

1.4 무명 클래스(Anonymous Class)

 지역클래스하고 유사 다만 클래스 선언이 아에 없는 특이한 구조로 클래스 이름이 없다, 다만 인스턴스생성과 구현만 있음

 - 인터페이스를 구현한 클래스의 사용빈도가 극히 적을 경우

 - 한번만 사용되는 인스턴스인 경우

 ==> 태생이 지역클래스의 일부 생략

        그리고 마지막에 ";"으로 끝난다, interface앞에 new가 있다

package day2.anonymous;

interface Anony 
{
	public void readName();
}

class OuterClass
{
	private String className;
	
	OuterClass(String className)
	{
		this.className=className;
	}
	
	public Anony outerMethod(final String id)
	{		
		return new Anony()
		{
			public void readName()
			{
				System.out.println("Outer ClassName: "+className);
				System.out.println("Local ID: "+id);
			}			
		};
	}
}

class Anonymous
{	
	public static void main(String[] args)
	{
		OuterClass out=new OuterClass("My Outer Class");
		Anony ano1=out.outerMethod("My First Anonymous Class");
		ano1. readName();
		
		Anony ano2=out.outerMethod("My Second Anonymous Class");
		ano2.readName();
	}
}

return new Anony() { body };- > class AnonyLocal implements Anony 와 같다

※ Anony 는 interface이다

3. 기타문법

1. Enum Type

     java5에서 시작

     열거형의 태생은 가독성을 위해 switch하고 같이 사용하려구

1.1 Enum 개념

      Interface에서 사용 예

     

     enum형(메서드 파라메터 타입에 열거형 즉 validation하기 위해 - 잘못됬을때 멈춤)

  사용시 클래스 없이 접근 가능

 

1.2 Enum 메서드와 enum상수에 데이터 입력

   생성자와 동일하게 사용되는데  static 부분과 static 이 아닌부분으로 나누어짐

   열거형 상수가 진화하여 문자열도 사용가능(단 getter, setter를 생성)

     = > Class가 아닌대 대문자, 

    ※ setter는 생성자로, public static final 숨겨있음

package day2.enumparents3;

enum Parents {
	   FATHER("아버지"), MOTHER("어머니");
	   
	   private String call;
	   
	   Parents(String call){
	        this.call = call;
	    }

	    String getCall(){
	        return call;
	    }
}

public class EnumParents3 {
	public static void printParents (Parents p){
		System.out.println(p);
	}

	public static void print(Parents d){
		switch (d) {
		case FATHER: 
			System.out.println("아빠");
			break;
		
		case MOTHER:        
			System.out.println("엄마");
			break;
			
		default:
			System.out.println("부모님 중 한 분만 !!");	
		}
	}

	public static void main(String[] args) {
		printParents(Parents. MOTHER);
		print(Parents.FATHER);
		print(Parents.MOTHER);
//		print(Parents.BROTHER);  컴파일 에러
		
		for(Parents p : Parents.values()){
		    System.out.println("enum 내부 데이터 : " + p);
		}

		System.out.println(Parents.FATHER.getCall());
	}
}

             value관련 메서드는 static, 다른건 non-static변수임 레퍼변수.상수.name.... 

1.3 Enum 실제 클래스 사용

      역컴파일로 풀면 Enum을 상속받은 class로 만들어짐

 

   참고) for each (=enhanced - for)

    두덩어리  1) 저장소에 들어간 타입 

                    2) java저장소 2가지 배열, 클래스만 있고 무조건 처음부터 끝까지

   for(저장소 타입 : 저장소)

2. Variable Argument

    java5에서 시작 

    method overloding을 피하기 위해 생겨남

 

2.1 Vaiable Arguments 개념

  클래스 overloding의 확장 개념이라고 생각됨

- 메서드 호출시 파라미터의 개수를 마음대로 선언할수 있다

- 파라미터 선언시 항상 마지막에 위치(혼합사용)

- 자동으로 1차원 배열처리 해준다

  ex) public static void vArg(String name, int .. gnums){

     for(int s : gnums.values()){

     }

    for(저장소 타입 : 저장소)  

1. OOP 클래스 설계

    1.1 개별클래스 설계 

         

    1.1.1 Object(=객체) 

        객체 : 각 입장에서 바라보는 대상으로 속성 + 기능

         구체화 방법 : Object 모델링 즉 속성 + 기능으로 나눔

   1.1.2 Class

         Class : 객체를 Object 모델링(속성 + 기능)을 프로그램의 언어의 문법을 빌려 표현

                     속성 -> 변수, 상수

                     기능 -> 메서드   표현

    1.1.3 Instance 

          new라는 연산자를 통해 Class를 메모리에 올려 사용 

1.2 각 클래스 사이의 관계

     원칙 : 각 클래스를 코딩 할 때 클래스 내부에서 선언된 변수는클래스 내부의 메서드로만 핸들링한다.

    1.2.1 메시지 패싱(Message Passing)

             클래스간의 관계는 메서드의 호출로 제한한다

             ex) CarSale1 -> CarSel2(객체의 확장 현실반영) ->CarSel3(생성자)

            참고 : getTer setTer

   1.2.2. 객체지향은 현실세계를 반영한다

            한명에서 두명으로 늘어났다는 것은 "객체지향은 현실세계를 반영한다" 

   1.2.3 생성자

           - 클래스이름과 같은 메서드

           - 인스턴스 변수를 초기화하는 기능

           - 유일하게 메서드의 리턴 타입이 없음

           - 생성자 내부에서는 final로 선언된 상수의 초기화가 한번에 가능

 

           참고 :  지역<->전역 : 중괄호 안/밖
                       전역변수가 없음(단 static변수 : 전역변수 대체)

                       this 는 인스턴스 자기 자신을 가리키는 키워드 ==>파라메터는 임시발급임으로

 

1.2.4 인스턴스 변수의 직접접근 

          레퍼런스 변수. 변수  또는 레퍼런스변수.메서드()

 

1.2.5 정보의 은닉(Infomation Hiding)

           클래스 간의 관계는 메서드의 호출로 제한한다 = 클래스간의 관계를 메서드 호출로 강제한다 

            관련 : 접근제어  

 1.2.6 접근제어(Access Control Idenifier)

           private -> default(같은패키지) -> protected(같은패키지 + 다른패키지 속에 sub클래스) - > public 

 1.2.7 캡슐화(Encapsulation)

          연관성 있는 변수와 메서드를 하나의 클래스로 묶는거(입력과 출력이 고정, 코드변화를 최소화) 

          예제) 우주선

 

1.3 Static      

      정적 -> 공유

      - 프로그램 실행시 선언문은 한번만 실행

      - 소속되어 있는 클래스의 인스턴스 생성여부와 상관없이 스스로 메모리에 들어감

      - 레버변수 없이 클래스 변수로 접근  클래스변수.변수 또는 클래스 변수.메서드

   1.3.1 Statc 변수

   1.3.2 Static 클래스     

           스스로 메모리에 들어감. -> 인스턴스 생성이 없어서 코드 간결

           new 연산자를 사용하지 않음 - > 실행속도 빠름

           static 은 가비지 컬렉션(Garbage Collection) 대상이 아니므로 메모리 낭비가 있을수 있음

           static 메서드 사용시 메서드 내부에는 인스턴스 변수와 인스턴스 메서드의 호출을 할수 없음

 

    1.3.3 Static으로 만든 클래스 

          참고 :  100% static 변수 및 메서드로 사용  -> System, Math 클래스 대표(즉 라이브러리 성)

 

2. String 클래스

    1. String 클래스 

    1.1. String 클래스의 기본

            문자열은 인스턴스(new 없이 사용), 문자열은 상수 (같은값은 메모리가 동일)

            - "" 로 생성된 문자열 인스턴스의 주소를 레퍼런스 변수가 받는다 

            - 같은값이면 인스턴스의 주소를 복사한다.

            - 이는 문자열의 내용이 바뀔수 없기 때문에 문자열의 인스턴스는 상수이고 불변)

           참고) c언어는 시작pointer로 무한데 null까지 

        1.1.3 문자열 메서드 

                 substring : 주소값으로 시작부터

                 compareTo : 문자열 비교로 길이를 비교하지 않음

        1.1.4 클래스 현장에서 String 클래스 사용을 지양하자( 성능속도에 주범2-불변Immutable)

                  A + B                new + new 
                  AB + C                new + new
                     ABC + D           new + new 

               참고 : 가장느린 연산자 new    -> 가비지 컬렉션을 유발한다

               용어 : 가비지 콜렉션이란 메모리에는 떠있는데 사용(호출)하지 않는  주소를 말함

       1.2 StringBuilder & StringBuffer            

               StringBuilder -> Thread UnSafe
               StringBuffer  -> Thread Safe

               new 1번 생성후 출력시 String으로 new 1번

             ※  Thread의 정의 : 동시실행

 

3. Console Input & OutPut

      Console의 탄생 : 중앙시스템을 시분할방식으로 연결 더미 시스템이 모니터와 키보드만을 가지고 있을때

     참고 :  T(time)DMA - > C(code)DMA

         입출력의 태생    

구분 C Java 비고
입력 scanf Scanner Java는 Class로 시작
출력 printf printf(Java5)
println
printf 늦게 나옴

예제) System.out.println(class)  classpath@주소값 나옴

        주절이) public int chkID(int key1, int key2){   -> 지양 : 파라메터 해킹

                     VO(Value Object)  DTO(Data transfer Object)  태생 

        생성자 및 toString은 이클립스 도구를 사용하자

1. ConsoleOutput

   1.1 printf() && println() 

      println() : 해당 주소값에 toString() 메서드를 호출한다

 

  2. Console input      

    2.1 과거버전 콘솔출력  

package day1.pastconsole;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PastConsoleInput {

	public static void main(String[] args)
	{
		try {
			InputStreamReader isr=new InputStreamReader(System.in);
			BufferedReader br=new BufferedReader(isr);
			System.out.print("정수를 입력하세요: ");
			String str=br.readLine();
			int num=Integer.parseInt(str);
			System.out.println("입력된 정수는: "+num+"입니다");
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}

 

   2.2 Scanner 클래스 

        간결하고 입력 장치에 영향을 주지 않음 -->  java가 class로 만든원인임

         Scanner 클래스에서 지원하는 장치에 대해 동일한 방법으로 사용하겠다

 

4. 상속(Inheritance)

     1. 개념정리 

      1.1 내용

             상속이란 상위(super) 클래스가 가지고 있는 변수와 메서드를 하위(sub)클래스에게 그대로 물려주는것을 의미

             상속이 코드 재활용?  ->CBD(Component Base Development) 

              UML관계표시 super <- sub 

       1.2 상속의 룰

              extends라는 키워드 사용              

            1.2.1 IS-A 관계

                   Truck is a Car  (O)   Car is a Truck(X)

            1.2.2 Has-A관계

                          1개까지는 어떻게

             1.2.3 Composite 관계 

                         Has-A 관계 보완 합성관계

                        참고 com.school 같은 클래스의 묶음

 

2. 다형성(Polymorphism)

            

            Overloading   :  1개의 클래스에서 여러개의 호출 파라메터 타입 갯수를 다르게

                                 Overloading 정의 : 그랜저 예시 2.4 3.0 X 생산년도별로  x 세대

                                  1개의 클래스에서 여러개 호출 파라메터 객체의 타입과 갯수 다르게

            Overridng : Super class것을 재정의 (메소드 이름, 파라메터 갯수타입, return 값 은 그대로 사용)

 

 2.1 메서드 오버라이딩(Overridng)  2개이상 클래스

        Overridng : Super class것을 재정의 (메소드 이름, 파라메터 갯수타입, return 값)

               1) 겹치는 소스사용가능

               2) 명시적 형번환 가능 super class 래퍼변수는 sub instance를 사용가능

               3) overridng된 메소는 형변환에서 제외된다.(body 재정의)

 

 2.2 상위 클래스의 레퍼런스 변수는 하위 클래스의 인스턴스를 참조할수 있다

       

상위클래스 레퍼런스 변수는 하위클레스의 인스턴스를 참조방법 예시

                       단. 오버라이딩 된 메서드는 형변환에서 제외가 된다

         ※  앞으로 super class로 레퍼변수를 사용하자

             장점 : 코드가 간결(메소드 하나), 라인수가 많아짐(함수증가), 메소드 이름 변경없음

  2.3 다형성(Polymorphism)

           클래스간의 관계에서는 메서드의 호출로 제한한다

          -> 상위클래스의 레퍼런스 변수로 하위클래스 인스턴스 참조가 가능하다.

          

           ==> 코드의 변화가 없다(동일하다) 

             다형성의 의미이미 사용법은 메서드 오로라이딩

                                            상위클래스의 레퍼런스 변수는 하위 클래스의 인스턴스를 참조 가능(상속으로)

           레퍼런스변수.메서드 했을때 결과가 다르게 나옴(상위클래스로 처리시)

 

        - 메서드 오버라이딩

        - 오버라이딩된 메서드는 형변환 대상에서 제외된다.

        - 상속을 통해 연관된 클래스들을 동일한 방식으로 접근한다.

        

 

  

보통 sftp만 설정하면 된다고했어 했는데 이제야 겨우 다시 설정할수 있었다(중요한건 마지막에 계정별 허용프로그램)

 

1) 파일서비스 -> SFTP 서비스 활성

 

2) 터미널 서비스 SFTP 활성

3) 계정별 허용프로그램 설정(이것때문에 이클립스 및 다른 응용프로그램에서 접속이 안되었음)

 

'IT > 시놀로지' 카테고리의 다른 글

Web Station  (0) 2021.12.20
다운로드 스테이션 및 토렌토 처리  (0) 2021.12.20
인증서 등록 및 https 접속시 안전하지 않음 설정  (0) 2021.12.20
DSM 버전확인  (0) 2021.12.20

이전에 늘 무식하게 날짜  변경을 한듯 

 

1) 과거 처리 방법(무식하게 짜르고 하이픈(-) 붙이고 해서 날짜 타입을 만듬)

 

2) 현재 사용방법(텍스트 나누기 방법으로 사용)

    ※ 단계는 좀 있긴 한데 열별로 변환시 유용함

   - 데이터열을 선택 ->텍스트 나누기(한열씩 작업하여 다음열에 영향을 주지 않도록 해야됨 아니면 나눌때부터 처리) 

 

- 다음 후 텍스트 마법사  3단계중 3단계에서 -> 날짜를 선택하면 됨

- 최종 변경후 모습

ㅁ 시작프로그램 띄우기

     shell:startup    

 

ㅁ 도스에서 연결프로그램 변경

    1) 도스모드 실행

    2) 확장자 연결명 보기

         - 전체 볼때

            assoc

         - 특정확장자만 볼때  ex) .txt

            assoc .txt

          => 조회하면 

          .txt=txtfile    => 확장자 연결명이 txtfile로 되어 있음(1번더 확장자 연결명조회로 해당 연결 프로그램을 찾음)

   3) 확장자 연결명으로 연결프로그램 

       - 전체 조회

         ftype 

       - 특정확장자만 조회 (ex txtfile)

          ftype txtfile 

     4) 연결프로그램 변경

          txtfile="C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\Uedit32.exe" "%1"

         ※ 프로그램명 + %1(이건 해당파일경로가 들어갈 자리임 

         ex) NotePad로 변경시

          txtfile="NOTEPAD" "%1"

       ※ 참고로 NotePad는 경로가 이미지정되어 있으므로 생략 가능함

 

 

'IT > 윈도우 일반' 카테고리의 다른 글

울트라에디터 한글편집오류  (0) 2023.03.11
윈도우 숨겨진 창 보이기  (0) 2022.06.18
명령줄로 연결프로그램 변경  (0) 2022.05.25

1) Alt + 텝으로 선택 ->  윈도우 키 + 방향키로 이동해본다

 

그래도 안되면

 

Alt+탭으로 선택하고 -> Alt+텝을 누르면 창크기 조정 메뉴가 나올때 전체 창후 크기조정

'IT > 윈도우 일반' 카테고리의 다른 글

울트라에디터 한글편집오류  (0) 2023.03.11
도스 커멘드 정리  (0) 2022.06.18
명령줄로 연결프로그램 변경  (0) 2022.05.25

run.vbs 파일  생성 

 

Dim Arg, var1, var2
Set Arg = WScript.arguments
var1 = Arg(0)
'var2 = Arg(1)  ==> 주석
msgbox var1

Set WshShell = CreateObject("WScript.Shell")
'WshShell.Run chr(34) & "C:\Windows\notepad.exe"  "D:\aaa.txt" & Chr(34),1     ==>주석 
WshShell.Run "notepad.exe " & var1       ==> chr(34)를 빼고 하니 됨
Set WshShell = Nothing

ㅁ 파일형식명 찾기 
    assoc .txt              ==> .txt형식명 찾기

ㅁ 신규 파일타입  형식명을 변경
    assoc .txt=txtfile

ㅁ 신규 파일타입명에 연결
   ftype txtfile="C:\Windows\notepad.exe" "%1" 
   ftype txtfile="C:\Program Files (x86)\IDM Computer Solutions\UltraEdit\Uedit32.exe" "%1"

 

ㅁ 파일타입명에 연결프로그램 확인 

    ftype txtfile

'IT > 윈도우 일반' 카테고리의 다른 글

울트라에디터 한글편집오류  (0) 2023.03.11
도스 커멘드 정리  (0) 2022.06.18
윈도우 숨겨진 창 보이기  (0) 2022.06.18

ㅁ 개요 

   개발을 하다보면 이것저것 봐야되는것들이 많은데 정리가 잘안되는듯 해서 뭔가 하나의 툴로 연결하여 사용할까 하는 생각하고 개발시 노가다를 줄이자는 의도에 의해 만들게 되었습니다.

 

 

ㅁ 사용기술

     RCP(Rich Client Platform)을 기반으로 Plug-in을 기반으로 개발되었습니다.

 

ㅁ 이클립스 추가 뷰어

     테이블뷰어,   링크뷰어,   메타뷰어,  외부 메타뷰어, 기능뷰어 기능을 제공합니다.

 

ㅁ 특장점

    - 여러가지 DBMS 또는 여러 개정관리를 하나에서 처리가능합니다.(테이블뷰어)

    - 테이블의 ERD같은 상하위 구조 관계로 구성 관리하여 연관정보들을 유연하게 가져올수 있습니다.(링크뷰어)

    - 별도 추가 툴없이 대용량 Query를 처리 가능 합니다.

    - 발시 많은 양의 자료들을 정리해주고 각 자료별 나름 정리할수 있는 게시판,메모등을 제공함니다.(링크뷰어)

    - 자주 특히 관리해야되는 정보들(자주쓰는 SQL)을 쉽게 조회화면 자동생성을통해 사용할수 있게 되어 있습니다.

      (링크뷰어)

    - 스템에서 관리하고 있지 않은 메타정보를 자체적으로 관리할수 있도록 구성되어 있습니다.(내부메타,외부메타)

    - 개발자가 HTML을 가지고 해당시스템정보를 별도 개발가능할수 있도록 Open Api형식의 Html을 커스터마이징

      개발 상용가능토록 구성(기능뷰어)

 

 ㅁ 주요기능 시연 

     1) 테이블뷰어  시연

         

         여러개 DATABASE를 연결하여 목록조회, 테이블 CRUD 를 제공 쉽고 빠르게 테스트시 변경가능토록함

                   ※ 메타뷰어연결을 통하여 메타조회 가능하며, 링크뷰어에 자주사용하는 테이블에 대해 ERD와 같은 상하

                       위 구조를 표시 가능합니다. 

    -  링크뷰어 : 각종정보를 링크하고 정규식을통하여 다중조회 및 내부 게시판을 가지고  이력관리, 메모관리등 가능함

            ~ 주요링크관리 : 각종 웹브라우저에 주소링크관리

                                 : 폴더 및 파일관리(파일버전도 가능)

            ~ 테이블뷰어  : 주의 테이블의  ERD와 같은 상하구조 관리

            ~ 사용자SQL  :  자주사용하는 SQL을 가지고 조회화면 생성

            ~ 모듈관리 : 기능뷰어와 함께 내부웹과 연결, 각종 API를 웹으로 제공함으로 HTML만으로 여러가지 처리 함.

 

 

 

    - 메타뷰어 : 외부DB메타, 내부DB메타, 사용자메타 3가지로 구성

            ~ 외부DB메타 : DATABASE가 메타를 가지고 있는경우 외부DB메타하고 연결하여 조회가능

            ~ 내부DB메타 : DATABASE가 메타를 가지고 있지 않을떄 소규모로 메타관리토록 함

            ~ 사용자메타 :  DATABASE하고 별도로 프로그램 입출력과 같이 DB속성이 아닌 메타관리토록 구성함.

 

    - 기능뷰어 : 이클립스 RCP를 통하여 각종 API를 웹으로 제공함으로 HTML에서 기능을 쉽게 추가가능토록함

        ※ 사용자 API제공 

 

ㅁ 테이블뷰어 주요기능

   - 1)기본  컬럼정의서 조회,  PK SELECT  및  및 링크뷰어 연결, 링크뷰어로 컬럼정의서 조회

테이블 뷰어 컬럼정의서 조회,  PK SELECT  및  및 링크뷰어 연결, 링크뷰어로 컬럼정의서 조회

  ※ 하단 복사, 파일 ,엑셀 처리가능 선택행을 누르고 마우스 오른쪽 누르면 선택한 행만도 복사, 파일 ,엑셀 처리가능

 

  - 테이블 뷰어 2)사용자조회 생성

   자주사용하는 SQL을 조회화면으로 생성가능

 

자주사용하는 SQL을 조회화면으로 생성가능

  - 테이블 뷰어 3)ERD와 같은 상하위 트리구조 구성

 

 

ㅁ 링크뷰어 주요기능

 

  - 1)기본은 각종 링크 간능, 한개의 링크로 버전파일 관리가능 

 

  - 2) 웹주소관리 및 브라우저 기본 설정변경 

 

  - 3) 내장뷰어의 조회중 즐겨찾기 및 각종브라우저 연결

 

  - 4) 카테고리별 게시판, 메모등록 및 메모게시판 조회

 

 

ㅁ 메타뷰어 주요기능

  - 1) 외부메타조회

 

  - 2) 내부메타관리

 

'RCP정리(DevOne프로젝트)' 카테고리의 다른 글

RCP 정리부터다시  (0) 2023.06.04
이클립스 팁  (0) 2023.06.04

좀 메뉴부터 많이 변경된듯 함

일단 설치후 왼쪽 메뉴 및 내용이 변경됨

1) 가상호스트가 사라짐 웹서비스 포털에서 생성 -> 서비스포털 선택시  3가지 메뉴가 나옴

가상호스트 선택하면 사용자가 임의 폴더를 가상호스트 할수 있고

패키지 서버 포털이라고 File Station에 보면 web_pageage가 있는데 추가 워드프로세스, 줌라등 기본제공 패키지 설치로 사용시 사용하는듯. 

 

MobaXterm

 

MobaXterm의 Home Edition은 무료입니다. 고급 기능을 사용하거나 MobaXterm을 전문적으로 사용하려면 Professional 에디션에 가입 할 수 있습니다. Professional Edition은 사용자 당 $ 69입니다.

MobaXterm은 휴대용 및 가벼운 응용 프로그램입니다. 즉, USB 스틱에서 시작할 수 있습니다. 하나의 휴대용 .exe 파일에서 SSH, X11, RDP 등과 같은 원격 네트워크 도구와 bash 및 ls와 같은 UNIX 명령을 Windows 데스크톱으로 가져옵니다. MobaXterm은 텍스트 편집기를 제공합니다.

풍모:

  • MobaXterm에는 내장 X 서버, X11 포워딩 및 SSH가있는 탭 터미널이 있습니다.
  • Windows에 UNIX 명령을 가져 왔습니다.
  • 플러그인을 통해 확장 가능한 플랫폼입니다.
  • 보안 SSH 연결을 사용하여 암호화를 통해 그래픽 애플리케이션 및 파일 전송에 네트워크 보안을 제공합니다.
 

일단 패키지 센터에서 Download Station을 설치합니다.

 

그리고 사용밥법 하단 톱니바뀌 설정 기본대상폴더와  토렌토감시폴더를 만든다

토렌토 감시폴더는 토렌토 파일을 올렸을때 알아서 토렌토 실행해줌

 

토렌토파일 검색파일을 파일스테이션에 감시폴더에 넣으면 바로 토렌토 실행

'IT > 시놀로지' 카테고리의 다른 글

시놀로지 SFTP 접속 설정방법  (0) 2022.06.18
Web Station  (0) 2021.12.20
인증서 등록 및 https 접속시 안전하지 않음 설정  (0) 2021.12.20
DSM 버전확인  (0) 2021.12.20

 

  • [제어판 - 보안 - 인증서]에서 [추가]를 클릭합니다.

  • [새 인증서 추가]가 선택된 상태에서 [다음]을 클릭합니다. (기존 인증서 교체를 하는 게 편하기는 하지만, 문제가 발생할 것을 대비해서 인증서를 추가하고 난 후 설정하는 방법을 택했습니다.)

  • [Let’s Encrypt에서 인증서 얻기]를 선택하고 [다음]을 클릭합니다.

  • 도메인 이름과 이메일 주소를 입력하고 [적용]을 클릭하면 인증서가 추가됩니다.

 

인증서 설정하기

  • 추가된 인증서를 선택하고 [편집]을 클릭합니다.

  • [기본 인증서로 설정]에 체크하고 [확인]을 클릭합니다.

  • 인증서를 선택하고 [구성]을 클릭합니다.

 

 

그리고 인증서 구성을 해야됨

'IT > 시놀로지' 카테고리의 다른 글

시놀로지 SFTP 접속 설정방법  (0) 2022.06.18
Web Station  (0) 2021.12.20
다운로드 스테이션 및 토렌토 처리  (0) 2021.12.20
DSM 버전확인  (0) 2021.12.20

 

babel 설치 한글판 설치후 영문버전 실행

 바로가기로 만들고 속성에 실행파일 경로에 옵션을 두면 됨

  ex) eclipse.exe -nl en_us

'IT > Tip' 카테고리의 다른 글

윈도우 아이콘 캐시 새로고침하기  (0) 2023.02.13

서론

Windows 64bit 운영체제에서 웹 시스템을 32bit로 운영해야 하는 경우가 발생하여,
아래와 같이 32bit의 오라클 클라이언트(인스턴트 버전)를 설치하여 운영하였다.

 

내용

1. 오라클 공식 홈페이지에서 32bit 설치파일을 다운로드한다.

   instantclient-basic-nt-{version} 다운로드

   instantclient-odbc-nt-{version} 다운로드

 

2. 압축을 풀어 한 폴더에 복사한다.

   ex) d:\oracle_odbc

 

3. 환경변수를 설정한다.

  TNS_ADMIN = d:\oracle_odbc

  PATH += d:\oracle_odbc

 

4. Install 파일을 실행한다.

   ex) d:\oracle_odbc\odbc_install.exe

 

5. odbc를 설정한다.

   아래와 같이 64bit Windows에는 32bit버전의 odbc 관리자와 64bit버전의 odbc 관리자를 제공한다.

   오라클 클라이언트를 32bit용으로 설치했기 때문에 32bit버전의 odbc 관리자를 통해 설정해야 한다.

 

   ※ odbc 설정시 오류코드 14001로 인한 에러가 발생하면,

     "Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package ATL Security Update" 설치하면 해결된다.

 

 

뷰어 프레임워크는 MVC(모델-뷰-컨트롤)로 알려진 디자인 패턴으로 구현된다.

Viewer의 하위 클래스인 ContentVier와 StructuredViewer가 있다.

 

ContentViewer는 다양한 인터페이스를 활용해서 도메인 객체 형태를 유지하면서 데이터를 다룬다. 

StructuredViewer는 ContentViewer에게 제공하는 데이터를 구조화 한다. 구조화는 필터링, 정렬 기능 같은 일반적인 작업을 실행하는 메도드들이 이 계층에서 구현된다.

 

각 위젯인 Tree, List, Table 등은 이에 맞는 Viewer의 하위 클래스로 ListViewer나 tableViewer 등이 있다.

 

ㅁ ContentViewer의 프로 바이더

   프로바이더에는 두 개가 존재한다. ContentProvider, LabelProvider

 

   ▶ LabelProvider,TableLabelProvider 보여줄 텍스트랑 이미지를 설정

   ▶ ContentProvider 레이블 프로바이더로 관여하기도 하지만 컨텐트 프로바이더로도 역할을 한다.

     레이블 프로바이더가 요소를 보이기 위한 텍스트이미지를 제공하는 반면에 컨텐츠 프로바이더는 실제적으로 요소를 보이게끔 해준다.

 

※ 내용정리 참고: https://wedul.site/70

 

JFace TreeViewer설명

Viewer Viewer는 MVC 패턴을 가지고 있다. Viewer의 하위 클래스인 ContentVier와 StructuredViewer가 있다. ContentViewer는 다양한 인터페이스를 활용해서 도메인 객체 형태를 유지하면서 데이터를 다룬다. 이들..

wedul.site

 

ㅁ TableViewer의 예제

   1) 일단 모델부터  

package com.dicws.mydays.model;

import java.util.ArrayList;
import java.util.List;

public class MyDaysModel {
	
	//모델요소
	String part;
	String title;
	String conetents;
	String writer;
	String wDate;

	//table모델시
	public MyDaysModel(String part, String title, String conetents, String writer, String wDate) {
        super();
        this.part = part;
        this.title = title;
        this.conetents = conetents;
        this.writer = writer;
        this.wDate = wDate;
    }

	/*Getter/Setter 정의*/
	public String getPart() {
		return part;
	}

	public void setPart(String part) {
		this.part = part;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getConetents() {
		return conetents;
	}

	public void setConetents(String conetents) {
		this.conetents = conetents;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getwDate() {
		return wDate;
	}

	public void setwDate(String wDate) {
		this.wDate = wDate;
	}
}

   2) 실행모듈정의 및 설명 

package com.dicws.mydays.test;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

import com.dicws.mydays.model.MyDaysModel;

public class TableSnippet extends ApplicationWindow {

	List<MyDaysModel> input = new ArrayList<MyDaysModel>();
	
	public TableSnippet() {
		super(null);
	}

	public void run() {
		// Don't return from open() until window closes
		setBlockOnOpen(true);
		// Open the main window
		open();
		// Dispose the display
		Display.getCurrent().dispose();
	}

	/**
	 * Configures the shell
	 * 
	 * @param shell
	 *            the shell
	 */
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		shell.setText("Team Tree");
	}

	/**
	 * Creates the main window's contents
	 * 
	 * @param parent
	 *            the main window
	 * @return Control
	 */
	protected Control createContents(Composite parent) {

		//table data 생성
		for (int i = 1; i < 10; i++) {
			input.add(new MyDaysModel("상환전화 i:" + i, "입금상환", "내용", "나야나1", "aa"));
		}

		TableViewer tableViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
		Table table = tableViewer.getTable();
		
		/*
		 * Header Column 생성
		 */
		String[] COLUMN_HEADER = new String[]{"타이틀","제목","내용","작성자","작성일"};
		for(String header : COLUMN_HEADER ) {
			new TableColumn(tableViewer.getTable(), SWT.NONE).setText(header);
		}
		
		//table.layout(); // 레이아웃을 수동으로 갱신해야할 경우에 사용
		table.setLinesVisible(true);
		table.setHeaderVisible(true);
		tableViewer.setUseHashlookup(true);    // table 렌더링 속도 향상
		
		
        // Column Properties 지정 : ICellModifier 동작시 필수
        tableViewer.setColumnProperties(COLUMN_HEADER);
        tableViewer.setContentProvider(new IStructuredContentProvider() {
			
			@Override
			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
				// TODO 자동 생성된 메소드 스텁
			}
			
			@Override
			public void dispose() {
				// TODO 자동 생성된 메소드 스텁
			}
			
			@Override
			public Object[] getElements(Object inputElement) {
				return ((ArrayList<MyDaysModel>)input).toArray();
			}
		});
        
		tableViewer.setLabelProvider(new ITableLabelProvider() {
			
			@Override
			public void removeListener(ILabelProviderListener listener) {
				// TODO 자동 생성된 메소드 스텁
			}
			
			@Override
			public boolean isLabelProperty(Object element, String property) {
				// TODO 자동 생성된 메소드 스텁
				return false;
			}
			
			@Override
			public void dispose() {
				// TODO 자동 생성된 메소드 스텁
			}
			
			@Override
			public void addListener(ILabelProviderListener listener) {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public String getColumnText(Object element, int columnIndex) {
				MyDaysModel myDays = (MyDaysModel)element;
		        switch (columnIndex) {
		        case 0:
		            return myDays.getPart();
		        case 1:
		            return myDays.getTitle();
		        case 2:
		            return myDays.getConetents();
		        case 3:
		            return myDays.getWriter();
		        case 4:
		            return myDays.getwDate();
		        }
		        return "";
		    }
			
			@Override
			public Image getColumnImage(Object element, int columnIndex) {
				// TODO 자동 생성된 메소드 스텁
				return null;
			}
		});
		
		tableViewer.setInput(input);
		tableViewer.refresh();
		
		for (int i = 0, n = table.getColumnCount(); i < n; i++) {
		  table.getColumn(i).pack();
		}
		table.pack();
	
        /*
         * Cell Modify 기능추가
         */
//        // Column Properties 지정 : ICellModifier 동작시 필수
//        tableViewer.setColumnProperties(COLUMN_HEADER);
//        
//        // CellEditor 생성 
//        CellEditor[] CELL_EDITORS = new CellEditor[COLUMN_HEADER.length];
//        for(int i=0; i < CELL_EDITORS.length ; i++) {
//            CELL_EDITORS[i] = new TextCellEditor(tableViewer.getTable());
//            // or CheckboxCellEditor, ComboBoxCellEditor 등 사용
//        }        
//        tableViewer.setCellEditors(CELL_EDITORS);
        
		return table;
	}
	
	  /**
	   * The application entry point
	   * 
	   * @param args
	   *            the command line arguments
	   */
	  public static void main(String[] args) {
	    new TableSnippet().run();
	  }	

}

 

ㅁ TreeViewer의 예제

   1) 일단 모델부터  

package com.dicws.mydays.model;

import java.util.ArrayList;
import java.util.List;

public class MyDaysModel {
	
	
	String part;
	String title;
	String conetents;
	String writer;
	String wDate;
	
	//tree모델시
	public MyDaysModel parent; // 부모노드
	public List<MyDaysModel> child = new ArrayList(); // 자식노드
	public int counter;
	
	//tree모델시
	public MyDaysModel(int counter, MyDaysModel parent) {
        this.parent = parent;
        this.counter = counter;
    }
	
	//tree모델시 : 데이터만 set
	public void setTreeData(String part, String title, String conetents, String writer, String wDate) {
        
        this.part = part;
        this.title = title;
        this.conetents = conetents;
        this.writer = writer;
        this.wDate = wDate;
    }

    public String getPart() {
		return part;
	}

	public void setPart(String part) {
		this.part = part;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getConetents() {
		return conetents;
	}

	public void setConetents(String conetents) {
		this.conetents = conetents;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getwDate() {
		return wDate;
	}

	public void setwDate(String wDate) {
		this.wDate = wDate;
	}


}


   2) 실행모듈정의 및 설명 

package com.dicws.mydays.test;

import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;

import com.dicws.mydays.model.MyDaysModel;
import com.dicws.mydays.provider.MyDaysTreeContentProvider;
import com.dicws.mydays.provider.MyDaysTreeLblProvider;

public class TreeSnippet1 extends ApplicationWindow {

	MyDaysModel input;
	
	public TreeSnippet1() {
		super(null);
	}

	public void run() {
		// Don't return from open() until window closes
		setBlockOnOpen(true);
		// Open the main window
		open();
		// Dispose the display
		Display.getCurrent().dispose();
	}

	/**
	 * Configures the shell
	 * 
	 * @param shell
	 *            the shell
	 */
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		shell.setText("Team Tree");
	}

	/**
	 * Creates the main window's contents
	 * 
	 * @param parent
	 *            the main window
	 * @return Control
	 */
	protected Control createContents(Composite parent) {

		TreeViewer treeViewer = new TreeViewer(parent, SWT.BORDER);
		Tree tree = treeViewer.getTree();
		tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 6, 1));
		// tree.setLayout(new TreeColumnLayout());
		tree.setHeaderVisible(true);
		tree.setLinesVisible(true);

		treeViewer.setContentProvider(new ITreeContentProvider() {
			
			@Override
			public void inputChanged(Viewer viewer, Object obj, Object obj1) {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public void dispose() {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public boolean hasChildren(Object obj) {
				// TODO 자동 생성된 메소드 스텁
				return false;
			}
			
			@Override
			public Object getParent(Object obj) {
				// TODO 자동 생성된 메소드 스텁
				return null;
			}
			
			@Override
			public Object[] getElements(Object inputElement) {
				return ((MyDaysModel)inputElement).child.toArray();
			}
			
			@Override
			public Object[] getChildren(Object parentElement) {
				return getElements(parentElement);
			}
		});
		
		treeViewer.setLabelProvider(new ILabelProvider() {
			
			@Override
			public void removeListener(ILabelProviderListener ilabelproviderlistener) {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public boolean isLabelProperty(Object obj, String s) {
				// TODO 자동 생성된 메소드 스텁
				return false;
			}
			
			@Override
			public void dispose() {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public void addListener(ILabelProviderListener ilabelproviderlistener) {
				// TODO 자동 생성된 메소드 스텁
				
			}
			
			@Override
			public String getText(Object element) {
				return ((MyDaysModel)element).getPart();
			}
			
			@Override
			public Image getImage(Object obj) {
				// TODO 자동 생성된 메소드 스텁
				return null;
			}
		});

		TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
		column1.setText("Column 1");
		TreeColumn column2 = new TreeColumn(tree, SWT.LEFT);
		column2.setText("Column 1");

		setTree();
		treeViewer.setInput(input);
		treeViewer.refresh();
		
		
		for (int i = 0, n = tree.getColumnCount(); i < n; i++) {
			tree.getColumn(i).pack();
		}
		tree.pack();
		return treeViewer.getTree();
	}
	
	private void setTree() {

		// new LabelView();
		MyDaysModel root = new MyDaysModel(0, null);
		MyDaysModel tmp;
		for (int i = 1; i < 10; i++) {
			tmp = new MyDaysModel(i, root);
			tmp.setTreeData("상환전화 i:" + i, "입금상환", "내용", "나야나1", "aa");
			root.child.add(tmp);

			for (int j = 1; j < i; j++) {
				MyDaysModel tmp1 = new MyDaysModel(j, tmp);
				tmp1.setTreeData("상환전화 j:" + j, "입금상환", "내용", "나야나1", "aa");
				tmp.child.add(tmp1);
			}
		}

		input = root;

	}	

	/**
	 * The application entry point
	 * 
	 * @param args
	 *            the command line arguments
	 */
	public static void main(String[] args) {
		new TreeSnippet1().run();
	}

}

 

 

 

 

참고 사이트 : wiki.eclipse.org/JFaceSnippets#Snippet002_-_Tree_Viewer

 

JFaceSnippets - Eclipsepedia

JFace-Snippets are small and easy understandable programming examples of how to use the JFace API. To browse the examples, navigate to the examples GIT repository. Copy Paste The header section of each snippet is a link to the plain source. You can copy th

wiki.eclipse.org

참고 사이트 : www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm

 

SWT JFace Eclipse « Java

java2s.com  | © Demo Source and Support. All rights reserved.

www.java2s.com

 

 

'IT > RCP' 카테고리의 다른 글

RCP 배포관련 문제  (0) 2022.12.26
[RCP] RCP 기본생성 방법  (0) 2020.12.20
[RCP] 개발 환경설정  (0) 2020.12.20
[RCP] 사전 준비 및 주요 용어  (0) 2020.12.20
[SWT] 윈도우 레지스트리  (0) 2020.12.19

이클립스 Java 프로젝트에서 외부 라이브러리를 Jar로 만들경우 내부 에 포함시키는 방법

com.dicws.db   : 배포할 프로젝트

외부라이브러리 : db2jcc4.jar, jdbc.jar, mysql-connector-java-5.1.28-bin.jar, ojdbc14.jar, sqlite-jdbc-3.7.2.jar

 

ㅁ Jar로 배포(Runnable JAR File) 

    배포할 프로젝트 선택후 파일(F)->내보내기

 

 

▶ 실행구성(Launch configuration Main) : Main Class 지정

 대상내보내기(Export destination) :  생성할 JAR 파일의 위치와 이름 설정

 Library handling 에서 옵션 설정

   - Extract required libraries into generated JAR    : 필수 라이브러리들을 추출해서 내부로 포함.

   - Package required libraries into generated JAR : 필수 라이브러리들을 전부 패키지로 Jar 내부로 포함

   - Copy required libraries into sub-folder next to the generated JAR : 필수 라이브러리들을 전부 Jar 외부의 하위 경로 로 복사하고 class-path로 참조한다. 필수 라이브러리들은 생성할 JAR파일명_lib에 저장한다.

(사용하지 않는 라이브러리가 포함될 수 있다)

 

 

예) Extract required libraries into generated JAR로 실행Jar배포 하고 다른프로젝트에서 가져왔을때

가져왔을때 참조 라이브러리

원래 프로젝트 패키지 com.dicws.db 외 라이브러리가 내부처럼 Jar안에 들어가 있음

ㅁ 객체지향 프로그래밍

객체지향 프로그래밍(Object-Oriented Programming)은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을 상태(state)행위(behave)로 이루어진 객체로 만드것

 

   좋은 객체를 만드는 법이다. 이것을 다른 말로는 설계를 잘하는 법이라고 할 수 있다. 좋은 설계는 현실을 잘 반영해야 한다. 

 

ㅁ 부품화

   정신적인 것은 실체가 없고, 무한하고, 유연하다. 이러한 특성은 정신이 가진 장점이면서  소프트웨어의 극치다. 하지만 정신의 이러한 특성은 때로 오해나 모순 같은 문제점을 유발한다. 소프트웨어도 이러한 문제점을 그대로 상속받는다. 이러한 문제점을 극복하기 위한 노력 중의 하나가 부품화라고 할 수 있다

 

ㅁ은닉화 캡슐화

  제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다. 이를테면 모니터가 어떻게 동작하는지 몰라도 컴퓨터와 모니터를 연결하는 방법만 알면 화면을 표시 할 수 있는 것과 같은 이치다. 즉 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것이다. 이러한 컨셉을 정보의 은닉화(Information Hiding), 또는 캡슐화(Encapsulation)라고 부른다 

 

ㅁ 인터페이스 

   컴퓨터와 모니터를 만드는 업체들은 위와 같은 케이블의 규격을 공유한다. 모니터 입장에서는 컴퓨터가, 컴퓨터 입장에서는 모니터가 어떤 식으로 만들어졌는지는 신경쓰지 않는다. 각각의 부품은 미리 정해진 약속에 따라서 신호를 입, 출력하고, 연결점의 모양을 표준에 맞게 만들면 된다. 이러한 연결점을 인터페이스(interface)라고 한다.

   - 인터페이스에 정의된 모든 메소드는 상속받는 클래스에서 전부 오버라이딩해야 한다.

   - 인터페이스로부터 상속 받을 때 implements키워드 사용

 

ㅁ 클래스와 인스턴스

    클래스는 연관되어 있는 변수와 메소드의 집합

    new 키워드를 통하여, 이렇게 만들어진 구체적인 제품을 인스턴스(instance)라고 부른다. 아래의 관계를 기억하자.

   

   맴버(member)는 영어로 구성원이라는 뜻이다. 객체도 구성원이 있는데 아래와 같다.

  • 변수
  • 메소드

  ※ 클래스도 인스턴스도 맴버를 가질수 있지만 인스턴세는 맴버값이 다르다

 

  인스턴스 변수와 클래스 변수는 아래와 같이 부르기도 한다.

  • 인스턴스 변수 -> Non-Static Field
  • 클래스 변수 -> Static Field
더보기

Class         : 객체를 만들어 내기 위한 설계도

Constructor : new  Instance 통하여 초기화담당   ==>초기화시 이름, 나이, 출생지 받는 것

Instance     : 구현된 구체적인 실체(메모리사용)        == 생성자라고 함

ㅁ 상속(Inheritance)

    상속(Inheritance)이란 물려준다는 의미다. 어떤 객체가 있을 때 그 객체의 필드(변수)와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속

※ 부모 클래스와 자식 클래스의 관계를 상위(super) 클래스와 하위(sub) 클래스라고 표현하기도 한다. 또한 기초 클래스(base class), 유도 클래스(derived class)라고도 부른다

Animal이란 공통성격을 만들어 Cat, Mouse, Duck등 상속 관계

ㅁ 생성자 

     기본생성자, 즉 매개변수가 없으면 start 

 

ㅁ Overriding

   상속은 상위 클래스의 기능을 하위 클래스에게 물려주는 기능

 

ㅁ Overloading

   이름은 같지만 시그니처는 다른 메소드를 중복으로 선언 할 수 있는 방법을 메소드 오버로딩(overloading)이라고 한다.

 

※ Overriding vs Overloding

    riding(올라탄다)을 이용해서 부모 클래스의 메소드의 동작방법을 변경하고

    loading을 이용해서 같은 이름, 다른 매개변수의 메소드들을 여러개 만들 수 있다는 사실을 아는 것이 중요

    ※ 참고로 overriding는 재정의라는 사전적인 의미

 

ㅁ abstract 

    abstract란 한국어로는 추상으로 번역된다. 이에 대한 정의는 뒤에서 내리도록 하고 지금 단계에서는 abstract라는 것이 상속을 강제하는 일종의 규제라고 생각하자. 즉 abstract 클래스나 메소드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것이 abstract다. 

   - 추상 메소드는 선언만 되어 있고 구현 부분이 없는 메소드로 메서드의 결과형 앞에 abstract를 기재해서 생성

   - 추상 메소드는 반드시 하위 클래스에서 오버라이딩 되어서 구현되어야 한다.

   - 추상 메소드는 일반적인 멤버 변수와 메소드를 가질 수 있습니다.

   - 하지만 객체를 생성하지 못하여 상속을 통해서만 사용되어 집니다.

 

ㅁ polymorphism(다형성)

    다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것

    - overloging 과 다형성

    - 클래스와 다형성

    - 인터페이스와 다형성

 

ㅁ 참조

    - 복제

public class Test {

	public static void runValue() {
		int a = 1;
		int b = a;
		b = 2;
		System.out.println("runValue a " + a);
		System.out.println("runValue b " + b);
	}

	public static void main(String[] args) {
		runValue();
	}

}

   a= 1, b = 2값이다

 

   - 참조

public class Test {

	public static void runReference() {
		A a = new A(1);
		A b = a;
		b.id = 2;
		System.out.println("runReference, " + a.id);
		System.out.println("runReference, " + b.id);
	}

	public static void main(String[] args) {
		runReference();
	}
}

class A{
    public int id;
    A(int id){
        this.id = id;
    }
}

    ※ 만일 b에 담긴 인스턴스의 id 값을 2로 변경했을 뿐인데 a.id의 값도 2가 된 것이다

 

ㅁ제네릭

   제네릭(Generic)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 말이 어렵다. 아래 그림을 보자.

※ 제네릭으로 올 수 있는 데이터 타입을 특정 클래스의 자식으로 제한할 수 있다

 

ㅁ 컬렉션즈 프레임워크(Collections FrameWork) 

    배열의 불편한 점이 있었는데 그 중의 하나가 한번 정해진 배열의 크기를 변경할 수 없다는 점이다. 이러한 불편함을 컬렉션즈 프래임워크을 해결함

 그럼 이제부터 컬렉션즈 프래임워크가 무엇인가 본격적으로 알아보자. 컬렉션즈 프래임워크라는 것은 다른 말로는 컨테이너라고도 부른다. 즉 값을 담는 그릇이라는 의미이다. 그런데 그 값의 성격에 따라서 컨테이너의 성격이 조금씩 달라진다. 자바에서는 다양한 상황에서 사용할 수 있는 다양한 컨테이너를 제공하는데 이것을 컬렉션즈 프래임워크라고 부른다. ArrayList는 그중의 하나다.

위의 그림은 컬렉션즈 프래임워크의 구성을 보여준다. Collection과 Map이라는 최상위 카테고리가 있고, 그 아래에 다양한 컬렉션들이 존재한다. 그럼 구체적인 컬렉션즈 프래임워크 클래스들을 살펴보자.

 

참고 사이트 : opentutorials.org/course/1223/6088opentutorials.org/course/1223/6446

+ Recent posts