Java03 :: [윤열프]제네릭1
제네릭, 나는 템플릿이란 용어가 더 익숙하다.
일반화란 의미로, 지정해 두면 사용하고자 하는 데이터타입으로 변환시킬 수 있다.
그렇다면 왜 제네릭이 등장한 것일까?
제네릭은 일종에 불편함을 해소하기 위함이다. 가령 이런 생각을 해보자.
특정 인스턴스를 받는 클래스내 메소드가 있다고 하자. 클래스내 메소드는 인스턴스를 담지만 인스턴스화된 메소드에 접근하기 위해서는 각각 다른 인스턴스를 선언하고 알맞게 형변환 해주어야 한다.
그런데, 이때 만일에 문자열을 담는다 하더라도 큰 문제가 발생하지 않는다. 역으로 이를 출력하고자 할때 형변환이 이루어지는데 여기서 ERROR가 발생하게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class boy{
...
"남자아이"
}
class girl{
...
"여자아이"
}
class People{
Object obb;
void set(Object o)
obb = o;
void get()
return obb;
}
|
cs |
이럴 경우 People p1 = new People(), People p2 = new People() 를 만들고,
p1.set(new boy()) 말고 p1.set("boy") 해도 문제가 없다 한다. 하지만,
(boy)p1.get 시에는 치명적인 오류가 발생한다고 한다.
여기서 제네릭은 자료형에 독립적이다. 가 중요하다.
T data 이런걸 본적이 있는가? 혹은 void set(T int)
이런식으로 T에 어느 자료형이든 개발자가 지정한 자료형으로 선언하여 재사용할 수 있다는 점이 크다.
1
2
3
4
|
class boy<T>{
...
"남자아이"
}
|
cs |
이런식으로 말이다. 그럼 위 클래스를 통해서 인스턴스를 생성해 보자.
People<boy> p1 = new People<boy>(); 이런식으로 가능하다.
이때 T는 Type parameter 라고 부른다 카더라. 그리고 예시로 들어온 boy는 Type Argument라 카더라.
그리고 마지막으로 People<boy> 를 Parameterized Type 라고 한다 카더라.
결과적으로 제네릭을 사용함으로써 형변환 의 귀찮음이 없어지고 컴파일 시 에러가 덜 발생할 수 있다는 장점과
코드 측면에서 재사용 할 수 있다는 점에서 제네릭은 정말 훌륭하고,
중요한 문법인듯 하다.
1
2
|
People<girl> p2 = new People<girl>();
|
cs |
익숙하지 않아서 한번 더 써봤다.
* 제네릭의 기본 문법
자바에서 제네릭은 기본 자료형이 제한된다. 하지만, Wapper가 존재한다 카더라!
Wapper란 감싸고 있는거,
boxing 과 unboxing이 존재하는데 일종에 값을 넣었다면 빼는 과정을 생각하면 된다.
1
2
|
Box<Integer> iBox = new Box<Integer> //O
Box<Int> iBox = new Box<Int> //X
|
cs |
다이아몬드라는 표시방법이 있는데 크게 중요하지 않는것 같아 간단히 말하면,
앞에 이미 Integer를 선언했다면 뒤에는 <> 만 써줘도 된다는 것이다.
교재에 문제가 하나 있어 간단하게 소개해 볼까 한다.
하나의 클래스에 제네릭으로 선언된 파라미터가 두개 들어간다. 이때 이 출력 양식은 다음과 같다.
1
|
public String toString() { return left + " & " + right; } 이다.
|
cs |
이때 또다른 클래스가 존재하는데 이 클래스 마찬가지로 위 조건과 같다. 이때
Apple & 25
Orange & 33
을 출력하는 프로그램으로 수정하는 문제였다.
이 구문에서 DBox를 통째로 넣어주기 때문에 처음에 dddbox.toString을 하게 되면
Apple&25&Orange&33 으로 출력된다. 따라서,
각각의 파라미터에 대해서 toString으로 출력해주면 되는데,
이전에는 클래스 내부 메소드를 변경하고 난리쳤는데 생각해보니 무척 간단했다.
'Java' 카테고리의 다른 글
Java06 :: [윤열프]실행 흐름의 컨트롤 (0) | 2019.03.01 |
---|---|
Java05 :: [윤열프] Operators (0) | 2019.02.28 |
Java04 :: [윤열프]제네릭1-2 (0) | 2019.02.28 |
Java02 :: [윤열프]자바의 기본 클래스 (0) | 2019.02.22 |
Java01 :: [윤열프]Java Chapter1~3 (0) | 2019.02.21 |
댓글
이 글 공유하기
다른 글
-
Java05 :: [윤열프] Operators
Java05 :: [윤열프] Operators
2019.02.28본 내용은 윤성우의 열혈 프로그래밍 관련 책에서 학습한 내용을 정리한 것입니다. * 연산자 순위 * / % 모두 같은 순위다. => 진행 방향이다. 그외는 모두 찾아보면 된다. * 나눗셈과 나머지 나눗셈과 나머지는 큰 수에 한 자리씩 catch 할때도 유용하고 여러모로 쓰이는 곳이 많다. % 나머지 / 몫 * 복합 대입 연산자 쉽게 한문장으로 쓸 수 있다. 예를 들면, a = a+b 를 a+=b 로 쓸 수 있다. * 관계 연산자 = 익히면 될듯 하다. * 논리 연산자 && , ||, ! * Short - Circuit Evaluation &&, || 연산자를 쓰면 발생하는 문제로 (num2 -= 10) && (num2+=29) >0 앞에서 이미 false 이면 뒤에는 나가게 된다. 또, (num1+=20… -
Java04 :: [윤열프]제네릭1-2
Java04 :: [윤열프]제네릭1-2
2019.02.28* 제네릭 클래스의 타입 인자 제한하기특정 클래스에서 인스턴스를 참조하게 되면 어떤 클래스 인스턴스를 참조하는것인지 알 수 없다. 그래서 인터페이스로 제한하는 방식이 있다.1234567891011interface function{ public String fun();} class Bo{ T ob; public T get(){ System.out.println(ob.fun); //가능하다. }}Colored by Color Scriptercs* 제네릭 메소드의 정의메소드 뿐만 아니라 클래스 에서도 제네릭 메소드를 정의하는것이 가능하다. 핵심은 타입 매개변수를 표시해주는 것인데1public static Bo makeBox(T o) //는 T가 타입 매개변수임을 알린다.cs12Bo sBo = BoFa.makB… -
Java02 :: [윤열프]자바의 기본 클래스
Java02 :: [윤열프]자바의 기본 클래스
2019.02.22Chapter 20에서 처음으로 알아볼 것은 Wrapper 클래스 이다. 1. 기능에 포커스를 맞춰봐야 하는데, Boxing 과 Unboxing 이다. Boxing은 일종에 인스턴스를 생성할때 그리고 값을 변수에 넣을때의 과정이라 이해하면 좋고, Unboxing은 인스턴스에서 생성한 값을 꺼내오거나 변수에 저장된 값을 다른 변수에 저장하는 과정으로 보면 될것 이다. 1 2 3 4 Integer iObjj = new Integer(10); //Boxing int nnum1 = iObjj.intValue(); //Unboxing //출력값 10 Colored by Color Scripter cs 여기서 , AutoBoxing 과 Autounboxing 이라는것 이 있는데 쉽게 얘기해서 인스턴스를 생성하지 않… -
Java01 :: [윤열프]Java Chapter1~3
Java01 :: [윤열프]Java Chapter1~3
2019.02.211. 자바를 시작해보자 가장 우선으로 JDK를 다운을 받습니다. 최신버전을 찾아보니, Java SE Development Kit 8 Downloads 이니 이부분을 찾아서 다운 받아 본다. 자신의 OS(Windows/Mac/Linux 등)에 맞춰서 잘 다운받아보자! 2. 자바 SE API 문서 앞으로 개발을 위해서는 참조할것이 있다. 공식 문서를 참조하면 Java Version에 따라 API문서를 확인해 볼 수 있다. 여러 API가 있다. 3. 환경변수를 설정해 줘야 한다. JDK만 깐다고 완성 되는 것이 아니라, 환경변수를 설정해야 하는데, path를 입력해 줘야만 운영체제가 찾아갈 수 있는 길을 확보하는것이다 라고 생각 하면 되겠다. 3-1. JDK가 깔린 위치를 알아야 한다. (C:\Program …
댓글을 사용할 수 없습니다.