제네릭이란 ? 
: 클래스 내부에서 사용할 변수들의 데이터 타입을 외부에서 지정하는 기법, 자바 1.5버전부터 도입된 개념이다


제네릭을 사용하는 이유?

: 비슷한 코드를 중복을 줄이면 코드수도 줄어들고 그만 큼 유지보수가 쉬워진다.

가령 Info라는 변수를 가진 person이라는 클레스가 있다고 생각해보자

class Person{

...
StudentInfo info = new StudentInfo();
or
EmployeeInfo info = new EmployeeInfo(); 

...

}


위와같은 형식으로 Person의 info가 학생(학번,학년,이름,담당교수 등의 정보를 가지고있음)에 대한것 일 수도 있고 직장인(직원ID, 부서, 사무실위치 등의 정보를 가지고있음)에 대한 것일 수도 있다.
때문에 다음과 같이 표현해 보았다.

Object info ;

public void setInfo(Object info){
    info = this.info

}

위와같이 모든 클레스의 조상인 Object를 사용하므로서 StudentIfo와 EmployeeInfo 둘다 받을 수 있게 작성하였다. 하지만 info 자리에 사용자의 부주의에 따라 "부장" 이라는 String이 들어올수도 있고 123이라는 Integer형식이 들어올 수도 있다. 즉 원치않는 데이터타입이 들오게 되지만 이는 컴파일 타임에러에서 검출할 수 없다.

자바는 컴파일 언어이다. 실제로 코드가 프로그램이 되기 전에 사용자의 착오를 미리 검출해주는 기능을 제공한다. 모든 에러가 컴파일 타임수준에서 검출될 수 있도록 코드를 작성해야 자바가 제공해주는 혜택을 누릴 수 있다는 것이다.

쉽게말해 저 코드는 사용자가 원치 않는 데이터타입이 들어가도 오류없이 진행되기 때문에 버그를 찾아내기가 힘들다는 말이다.


실제로 1.4버전까지 다양한 콜렉션들이 데이터를 저장하기위해 Object 형을 썻고 의도치 않는 다른 데이터타입의 삽입/삭제로 인해 일어나는 런타임 에러로 고생한 경험이 많다고 한다.


하지만 제네릭을 사용한다면

class Person<T>{

T info;

public void setInfo(T info extends Info_Interface){

this.info = new Info;

}

}

그리고 StudentInfo와 EmployeeInfo가 Info_interface를 확장하고 있다면 제너럴 T가 받을 수 있는 데이터 타입은 개발자가 의도한 이 두가지 타입밖에 없을것이다. 만약 그 외의 데이터 타입을 넣으려고 시도한다면 컴파일러가 컴파일 에러를 검출 할 것이다.

다시말해 코드의 중복을 없에고 데이터 타입의 안정화를 위해 제네릭을 사용한다. 라고 이해하면 되겠다.

제네릭의 제한

<T extends Info>
// 다음과 같은 제네릭에서 제네릭에 올수있는 데이터 타입은 Info의 자식 클레스만 올 수 있다.
=> 제네릭 범위 안에서 extends키워드는 "부모가 누구다"라는 것을 명시해 주기때문에 Info가 인터페이스라도implements 대신 expends를 쓴다.


제네릭의 중복
한 클래스 안에 복수의 변수타입을 외부에서 지정하고 싶을 경우가 있을 것이다. <T,S,U>와 같은 형식으로 사용하면 된다. 제네릭은 따로 그 모양세의 규정은 없지만 암묵적으로 TSU..순으로 대문자 알파벳을 사용하는 것 같다.(찾아보시길..)

제네릭이 받을 수 없는 변수타입, 기본 데이터타입
제목 그대로 int, double, boolean 과 같은 기본 데이터타입은 제네릭의 인자로 들어갈 수 없다. 떄문에 레퍼클레스(wrapper class)를 사용해야한다. Integer, Double 과 같은 클래스를 이용해 인스턴스화 해서 사용하자

객체명.intValue(); 와 같은 함수를 이용하여 원시 데이터타입의 데이터를 얻을 수 있다.

제네릭의 생략
매개변수를 통해 변수의 타입을 알수 있는 경우 제네릭을 생략할 수 있다.


참고

http://civan.tistory.com/170

http://opentutorials.org/module/516/6237 (비중있게 참고)

vector : 구버전 호환용. 
           무조건 동기화 => 다른객체들보다 무거움


밑에껀 선택적으로 동기화 가능

Collection.synchronizedCollection(Collection c) 이용

ArrayList : 배열의 삽입 삭제에 대한 인덱스 정렬등의 처리를 내부적으로 실행함
              인덱스를 이용한 검색은 매우 빠름
              많은 데이터의 삽입/삭제시 성능저하 우려


LinkedList : 다음자료의 위치정보를 가지며 내부적인 인덱스는 없음
                데이터의 삽입/삭제는 위치정보의 수정만으로 가능하기 때문에
                많은양의 데이터 삽입/삭제가 있을 때 유용
                 다만 데이터의 수가 많은 경우 순차적으로 찾아나가야 하기때문에
                 성능저하 우려


참고 : http://seeit.kr/36#.U6FJP_l_s04


추가 

hash table 역시 vector 와 함께 옛날꺼, 무조건동기화, 무거움
hash map : hash계의 ArrayList랄까

코드의 확장성과 재사용성을 높이기위해...

당신은 인쇄공장 사장의 의뢰를 받고있는 회사의 소속 개발자야
명함 클래스 하나로 고객의 다양한 주문을 출력하고 싶어
명함 클래스는 print 기능이 있어

손님 1 : name
손님 2 : name , brand , phoneNumber
손님 3 : name , email

음...

또 훨씬 많은 다양한 손님들이 있겠지?
클래스에서 객체를 만들어서 객체.print()를 하기위해서
저 많은 속성과 손님 성향에 따른 메소드를 다 구현해놓는건 굉장히 쓰레기같은 짓이야

새로운 타입의 고객이 생길때마다 나는 이 클래스를 수정하고 경우에 따라 print213()과 같은 메소드를
추가하고 그것을 [출력] 버튼과 몇백줄의 switch문을 연결시켜야 하거든

class NameCard{
    String name;
    String email;
    String brand;
        ....
    void print1(){ // 이름만 출력 }'
    void print2(){ // 이름과 회사, 폰번호 출력 };
    void print3(){ // 이름과 이메일 출력 };
         ...
}

이처럼 쓰레기같은 클래스를 만들어야 할꺼야
몇백명의 요구를 들어주기 위해 여려명의 개발자들이 코딩을 할꺼야(분명 저정도의 코드가 아니겠지...)
그런데 저따위 쓰레기코드를 한번 수정할때마다 모두에게 알리고 클레스파일을 넘기고 
대학교 1학년때 프로그램짜듯 넘기고 넘기고 넘기고 ....


하지만 인터페이스를 쓴다면

public interface PrintNameCard {
    public void print( NameCard nc );
}

음... 이것을 쓴다면...


class NameCard{

PrintNameCard pnc;

setNameCard(printNameCard pnc){
    this.pnc = pnc;
}

void print(){
    pnc.print();
}

}

그리고 상상해봐. 인터페이스를 확장(impliment)한 클래스를 그때그때(고객의 주문에 따라) 구현하고 그 객체를
NameCard 객체를 생성할때 인자로 넣어주면 깔끔...

그리고 몇백의 수요를 위해 다수의 개발자가 투입된다면 인터페이스를 상속받는 클래스 하나만 작성해서 모아두면 되기때문에 수정이나 관리 및 사용이 용이하다는거지..
또 나중에 비슷한 작업을 하기위해 전체를 다 만들 필요 없이 클래스 하나만 구현해서 그대로 써먹을수가 있을꺼야..


아 머리는 이해한다고 생각하는데 표현하기가 어렵다.. 주저리주저리 써놓긴 했는데
http://dante2k.egloos.com/199169 이곳으로 가보자

사실 이런 예를 들지 않아도 명확하게 이해하고싶다...


'~ 2014 > JAVA & ANDROID' 카테고리의 다른 글

java :: 제네릭  (0) 2014.06.19
java :; LinkedList ArrayList Vector  (0) 2014.06.18
JAVA :: 예약종료  (0) 2013.09.03
ANDROID :: 액티비티 투명처리  (0) 2013.07.19
ANDROID :: 환경설정창 만들기 preferenceScreen  (0) 2013.07.16

import java.io.IOException;

import java.io.OutputStream;


public class TestShutDown {

public static void main(String[] args) throws InterruptedException {

Runtime runtime = Runtime.getRuntime();

try {

Process process = runtime.exec("C:\\WINDOWS\\system32\\cmd.exe");

OutputStream os = process.getOutputStream();

os.write("shutdown -s -f -t 90 \n\r".getBytes());

os.close();

process.waitFor();

} catch (IOException e) {

e.printStackTrace();

}

}

}


사용법:

shutdown [-l | -s | -r | -a] [-f] [-m \\컴퓨터 이름] [-t xx] [-c "설명"] [-d up:xx:yy]

 

No args                       이 메시지를 표시합니다.(-?와 동일) 
-i                                 GUI 인터페이스 표시합니다.(처음 옵션이어야 합니다.)로그오프합니다.
                                    (-m 옵션과 함께 사용될 수 없음) 
-s                                시스템을 종료합니다. 
-r                                 시스템을 종료한 후 다시 시작합니다. 
-a                                시스템 종료를 중단합니다. 
-m \\컴퓨터 이름       원격 컴퓨터를 종료/다시 시작/중단합니다. 
-t xx                            시스템 종료의 만료 시간을 xx초로 설정합니다. 
-c "설명"                     시스템 종료 설명을 지정합니다. (최대 127 문자) 
-f                              실행 중인 응용 프로그램을 경고 없이 강제로 종료합니다.

-d [u][p]:xx:yy        종료에 대한 이유코드를 지정합니다.

                                   u : 사용자 코드, p: 계획된 종료 코드, xx : 주 이유 코드, yy" 부 이유 코드

 

사용 예제)

1. 한시간 후에 컴퓨터 강제로 종료하기
shutdown -s -f -t 3600  (-t 옵션뒤의 시간은 초를 기준으로 한다.)

 

2. 종료계획 해제하기

shutdown -a

[출처] [cmd] shutdown 명령어|작성자 수야



 <activity 
      android:name=".CustomProgressDialog" android:theme="@android:style/Theme.Translucent"
 </activity>

'~ 2014 > JAVA & ANDROID' 카테고리의 다른 글

JAVA :: 예약종료  (0) 2013.09.03
ANDROID :: 액티비티 투명처리  (0) 2013.07.19
JAVA :: 모니터 해상도에 따른 중앙값 얻기  (0) 2013.07.13
JAVA:: 파일목록 가져오기  (0) 2013.07.12
JAVA:: JsonObject, JsonArray  (0) 2013.07.12

 Dimension screen =Toolkit.getDefaultToolkit().getScreenSize(); // 모니터화면의 해상도 얻기
 Dimension f1_size = super.getSize(); // 프레임크기
  
  // 프레임이 화면 중앙에 위치하도록 left, top 계산
  int left = (screen.width / 2) - (f1_size.width / 2);
  int top = (screen.height / 2) - (f1_size.height /2 );


cf) 해당 클래스는 Frame을 상속받습니다 !!!


출처 http://sugame.tistory.com/617

import java.io.File;


public class GetFileList {

  public static void main(String[] args) {

    

    File myDir = new File("C:/Users/lssang/Desktop/이미지"); // 디렉토리의 객체생성

    System.out.println(myDir.getAbsolutePath());     // 디렉토리의 절대경로

    System.out.println(myDir.getParent()); // 부모디렉토리

    String fileName = myDir.getName();                                    // 파일 이름

    String fileExtention = fileName.substring(fileName.lastIndexOf(".")+1,fileName.length());

    // 파일 확장자

    

    

    File[] contents = myDir.listFiles(); // 디렉토리의 내용을 가져온다

    

    // 디렉토리의 내용 목록출력

    if (contents != null) {    // contents가 null값이 아닐경우(디렉토리에 내용이 있을경우)디렉토리의 내용출력 

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

     System.out.println(contents[i].getName());

      }

    } else {                     // contents가 null일 경우(디렉토리에 내용이 없을경우)

      System.out.println(myDir.getName() + " is not a directory");

    }

    System.exit(0);

  }

}

Boolean / Charactor / Number / String 형의 배열을 String 타입으로 지원해주는 라이브러리가 있더라 !!

소케송신이나 엑티비티통신간 이런 String 묶음들을 한번에 전송할때 유용하게 쓸 수 있을 것이다.


gson-2.2.4.jar

이 아이는 google에서 만든 json인데 지금 작성할 내용은 gson이나 json이나 별반 다를게 없다.


<JsonObject> 

<JsonObject 생성>

JsonObject jsonObject = new JsonObject();

<엔트리 추가>

jsonObject.addProperty("type", "test");

jsonObject.addProperty("data", "안녕하세요");

<JsonObject 출력>

String str = jsonObject.toString();

System.out.println(str);

<결과>

{"type":"test","data":"안녕하세요"} 

<사용하기 >

//String 형을 Json오브젝트로 변환

String str = "{"type":"test","data":"안녕하세요"}";

JsonParser parser = new JsonParser();

JsonElement element = parser.parse(str);

JsonObject json = element.getAsJsonObject();

//JsonObject에서 문자열을 추출

String type = json.get("type"); //type 에는 "test"라는 문자열이 저장된다

String hello = json.get("data") // hello 에는 "안녕하세요"라는 문자열이 저장된다.


<JsonArray>

//두 JsonObejct 객체가 아래와 같다면...

jsonObject1 = {"type":"test","data":"안녕하세요"

jsonObject2 = {"type":"test","data":"반갑습니다"}  


<JsonArray 생성>

 JsonArray jArray = new JsonArray();

<엔트리 추가>

 jArray.add(jsonObject1);

 jArray.add(jsonObject2);

<JsonArray 출력>

String str = jArray.toString();

System.out.println(str);

<결과>

[{"type":"test","data":"안녕하세요"},{"type":"test","data":"반갑습니다"}]

<사용하기>

//String 형을 JsonArray로 변환

String str = "[{"type":"test","data":"안녕하세요"},{"type":"test","data":"반갑습니다"}]"

JsonParser parser = new JsonParser();

JsonElement element = parser.parse(str);

JsonArray jArray = element.getAsJsonArray();

//JsonArray에서 문자열 추출

String hello = jArray.get(0).get("data");

String hello2 = jArray.get(2).get("data");


하... 포스팅 능력이 딸리다보니 이렇게밖에 표현을 못하겠네요...

web에선 자주 등장하는 json이라는 객체가 그것인데 자바코드에서 직접 사용하니 신세계이지 아니한가



InetAddress local = InetAddress.getLocalHost();

String ip = local.getHostAddress();


이렇게 쉬울수가 !!!

+ Recent posts