728x90

JDK 1.5 이전에서는 여러 타입을 사용하는 대부분의 클래스나 메소드에서 인수나 반환값으로 Object 타입을 사용했다.
이 경우에는 반환된 Object 객체를 다시 원하는 타입으로 타입 변환해야 한다.

그리고 원하지 않는 자료형이 입력되었을 때의 오류를 컴파일 시점에서 잡아낼 수 없다.

(Object 클래스는 모든 클래스의 조상(부모)이므로 모든 타입이 들어갈 수 있다.)


자바에서 제네릭(Generic)이란 데이터의 타입(Data Type)을 일반화한다(Generalize)는 것을 의미한다.
제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.
이렇게 컴파일 시에 미리 타입 검사(Type Check)를 수행하면 다음과 같은 장점을 가진다.


1. 프로그램 성능저하를 유발하는 캐스팅(강제 데이터타입 변환)을 제거한다.

   - 매번 데이터 타입을 강제로 캐스팅하면, 프로그램 성능 저하가 발생한다.

2. 코드절약 및 코드 재사용성을 증진시켜 유지보수를 편하게 한다.

   - Generic 이 없다면, 매번 필요한 데이터 타입에 맞는 새로운 클래스 또는 메소드를 작성해야 한다.

3. 컴파일시 타입오류를 체크하여, 사전에 엄격한 데이터타입 체크를 가능케한다.



예제 1 

package ex_Generic;
//Object 타입을 사용하면 모든 종류의 자바 객체를 저장할 수 있다는 장점은 있지만
//저장할 때 타입 변환이 발생하고, 읽어올 때도 타입 변환이 발생한다.
//이러한 캐스팅이 빈번해지면 전체 프로그램 성능에 좋지 못한 결과가 발생할 수 있다.
// 제네릭은 클래스를 설계할 때 구체적인 타입을 명시하지 않고,
// 타입 파라미터로 대체했다가, 실제 클래스가 사용될 때 구체적인 타입을 지정함으로써 타입 변환을 최소화한다.
public class Box<T> { // T라는 이름이 매개변수화된 자료형임을 나타냄.
    private T item; // T에 해당하는 자료형의 이름은 인스턴스를 생성하는 순간에 결정된다.
    // T는 상징적인 문자
   
    public Box() { // 생성자
       
    }
   
    public Box(T item) { // 매개변수가 있는 생성자
        this.item = item;
    }
   
    public void setData(T item) { // T[] arr
        this.item = item;
    }
    public T getData() {
        return item;
    }
}

package ex_Generic;

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

abstract class Animal {
    public void go() {
        System.out.println("Animal");
    }
}
class Dog extends Animal {
    public void go() {
        System.out.println("Dog");
    }
}
class Cat extends Animal {
    public void go() {
        System.out.println("Cat");
    }
}

public class Main {
    @SuppressWarnings("unchecked")
    public static <T extends Animal> void doAction(List<T> animals) {
        animals.add((T) new Cat());
        for (Animal animal: animals) {
            animal.go();
        }
    }
       
    public static void main(String[] args) {
        // 한정된 타입을 사용하도록 유도함으로써 타입 안전성 보장
        // 인스턴스 생성시 자료형을 지정한다. Integer
        Box<Integer> box1 = new Box<>();
        box1.setData(10);
        System.out.println(box1.getData());
       
        // 인스턴스 생성시 자료형을 지정한다. String
        Box<String> box2 = new Box<>();
        box2.setData("오랜지");
        System.out.println(box2.getData());
       
        // 컬렉션 프레임워크(Collections Framework)
        // Collection : 객체를 수집해서 저장하는 역할
        // Framework : 사용방법을 미리 정해 놓은 라이브러리
        // List, Set, Map 인터페이스 구현 클래스가 존재
        // List : ArrayList, Vector, LinkedList
        // Set : HashSet, TreeSet
        // Map : HashMap, Hashtable, TreeMap, Properties
        List<String> list = new ArrayList<String>();
        list.add("사과");
       
        String str = list.get(0); // Type 을 변환하지 않는다.
        System.out.println(str);
       
        List<Dog> animals = new ArrayList<Dog>();
        animals.add(new Dog());
        animals.add(new Dog());
        //animals.add(new Cat()); // Cat을 넣으려고 하면 컴파일 시점에 타입 체크를 해주기 때문에 에러 발생
        doAction(animals);
   
    }

}


여러 블로그 자료를 참조하고 동영상 강좌를 들으면서 정리하고 있는데 아직 완벽한 이해는 못한 상태다.

기본 개념은 이 자료로 이해는 된다. 하지만 깊이 있게 들어가는 사항은 좀 더 테스트를 하고 이해해야 한다.

'안드로이드 > Java 문법' 카테고리의 다른 글

자바 null 비교, String 비교, 정수 비교  (0) 2019.09.20
공백으로 문자열 분리  (0) 2019.09.11
Java 추상 클래스  (0) 2019.08.19
[Java] 다형성  (0) 2019.06.30
How to validate IP address with regular expression  (0) 2019.06.17
블로그 이미지

Link2Me

,
728x90

Eclipse 에서 PHP 개발 테스트를 하기 위해서 PHP Development Tools 를 설치했다.

구글 검색해서 4.1 버전 이미지를 보면서 설치를 했다.




검색어 php 를 입력하고 Go를 누르면 아래와 같이 PHP Development Tools 최신 버전이 나온다.

현재 그림은 이미 Installed 된 것이라 이렇게 보이지만 설치하지 않았으면 Install 이라고 나온다.


이후에 나온 그림은 캡처를 하지 않아서 게재할 수가 없다.

다른 블로그에 나온 이미지를 참조해도 되고 순서대로 진행하면 된다.

설치를 하고 나면 프로그램 재실행을 해준다.


이후에 PHP 파일에서 APM 과 연결하여 PHP 파일을 직접 실행하는 방법이다.


먼저 Preferences 를 눌러서 아래 화면이 나오면 PHP 항목을 선택한 다음에

Servers 를 선택하고 Default PHP Web Server 경로를 수정해줘야 한다.

APM(Apache + PHP + MySQL) 이 설치된 Autoset9 의 설치경로의 web root 경로(httpd.conf 에서 설정한 경로)를 지정해준다.



이제 PHP Project 를 생성할 때 아래와 같이 1번 항목이 보이게 된다.

2번 항목에는 이미 만들어놓은 PHP 경로를 적어주면 된다.


실제 파일에서 아래와 같이 한번만 실행하면 다음부터는 1번만 누르면 마지막 설정한 걸 실행한다.




사족을 달자면...

맥북 2010 프로에는 윈도우10 설치가 안되어 윈도우 8.1 을 설치해서 사용하고 있는데 Aptana 를 설치하면 에러가 발생하면서 설치가 안되어서 Eclipse Java 설치한 것에 PHP 모듈을 추가해 본 것이다.

여러가지 PHP 툴을 설치하지만 딱 마음에 드는게 별로 없다.

Eclipse PDT 를 사용해 보고 장점이 발견되면 추가로 적어둘려고 한다.


블로그 이미지

Link2Me

,
728x90

자바 강좌를 들으면서 실습용으로 Eclipse를 설치해서 사용중인데 기본 인코딩 모드가 UTF-8 이 아니었다.

PHP 모듈을 추가 설치하면서 PHP 파일을 읽어오는데 한글이 깨져 보여서 기본 인코딩 모드를 변경했다.



Visual Studio Code 에서 자바 실습하는 걸 해보려고 했지만 영~~ 아니다.

PHP 코드를 정렬하고자 Visual Studio Code 를 실행해서 해봤지만 확장자가 PHP 인것은 제대로 못하는 가 보다.

그래서 Eclipse 에서 PHP 모듈을 추가 설치했다.

블로그 이미지

Link2Me

,