일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- C#
- 데이터베이스
- 메소드 지정자
- request
- unity 오브젝트
- DROP
- Create
- c#상속
- response
- Database
- http
- java
- final
- 타입 변수 표기법
- ForignKey
- spring
- 메소드 정의
- MariaDB
- JDBC
- 평면좌표상에서 두점 거리 구하기
- select
- static
- @ Builder
- 요청
- WriteLine
- unity 레이아웃
- 타입이 서로 다른 두 데이터 제네릭
- static을 왜사용할까?
- db
- unity 간단 설정
- Today
- Total
이론을 싫어!
제네릭 이 뭐지?? 너 진짜 편하더라?? 본문
제네릭은 무엇인가?
- 제네릭은 일반적이라는 의미로 코드를 여러 타입을 동시에 처리하는 기술이다.
- 다양한 종류의 데이터를 처리 할 수 있는 클래스와 메소드를 작성하는 기법이다.
- 클래스를 정의할때 클래스 안에서 사용하는 자료형을 구체척으로 명시하지 않고 T와 같은 기호를 쓴다.
주절주절 공식(?)적인 설명이 적혀 있지만 좀더 간결하게 정리를 하자면
내가 내가 미리 자료형을 명시하지 않더라도 많은 데이터를 받아줄수 있는 녀석이 제네릭이다.
이상하게 컴퓨터언어는 이론으로 이해하는것 보다는 실습으로 이해하는것이 더 쉽게 느껴질것이다.
(Box.java)
1
2
3
4
5
6
7
8
9
|
public class Box {
private String data;
public void setData(String data){
this.data=data;
}
public String getData(){
return data;
}
}
|
cs |
(BoxTest.java)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class BoxTest {
public static void main(String[] args) {
Box box1=new Box();
box1.setData("홍길동");
String name=box1.getData();
System.out.println(name);
Box box2=new Box();
box2.setData(25);
Integer age=(Integer)box2.getData();
System.out.println(age);
}
}
|
cs |
위에 Box 클래스는 어떠한 데이터를 담을수 있는 클래스이다.
BoxTest 클래스에서 박스에 "홍길동"의 데이터를 담았다.
실행이 가능하다. 왜냐하면 Box클래스에서 String으로 명시했기 때문에 Box에 담기게 된다.
그러면 box2의 객체에서 25를 Box에 넣어보자. 그러면 빨간색으로 에러가 발생하게 된다.
이유는 간단하다. Box 클래스에서 String 즉, 문자열만 담을거다 라고 명시를 했기 때문이다.
그러면 25의 데이터를 넣기 위해서 int를 명시해줘야하고 메소드를 만들어줘야하는 일이 발생한다.
이러한 문제를 해결하기 위해서 제네릭이 탄생하게 되었다.
(Box2.java)
1
2
3
4
5
6
7
8
9
10
11
|
public class Box2<T> {
private T data;
public void setBox(T data){
this.data=data;
}
public T getBox(){
return data;
}
}
|
cs |
(BoxTest2.java)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class BoxTest2 {
public static void main(String[] args) {
Box2<String> box=new Box2<>();
box.setBox("홍길동");
String name= box.getBox();
System.out.println(name);
Box2<Integer> box1=new Box2<>();
box1.setBox(25);
Integer age= box1.getBox();
System.out.println(age);
}
}
|
cs |
Box2,BoxTest2 클래스가 제네릭의 사용법 또는 사용예시 이다. (제네릭 사용법(T))
이렇게 제네릭을 사용하게 추가적으로 필드와 메소드 또는 클래스를 만들 필요가 없어진다.
조금 흐름에 대해 설명을 하자면
mian 메소드에서 Box2 객체를 생성할때 < > 안에 넘겨줄 데이터 자료형또는 타입을 넣고 생성이 되면
Box2 클래스에서는 제네릭으로 인해 T 부분에 String으로 변경이 된다.
그러다보니 "홍길동"이 box의 객체에 담기게 되는것이다.
그다음 25의 데이터를 넣기 위해서 < > 에 넘겨줄 데이터 Integer로 생성이 되면
Box2 클래스는 제네릭으로 인해 T 부분에 Integer로 변경이 된다.
그러다보니 내가 억지로 또는 강제로 형변환을 해줄 필요없이 원하는 데이터를 마음대로 넣을수있다는 것이다.
그러면 T만 쓰는것인가??? 타입 변수 표기법이 있다. 한번 보자.
타입 변수 표기법
- 제네릭 클래스는 여러개의 타입 매개 변수를 가질 수 있으나 타입의 이름은 클래스나 인터페이스 내에서 유일해야 한다.
- 변수의 이름과 구분하기 위해서 한개의 대문자를 사용하며 타입 매개 변수는 기초 자료형으로 객체화될 수 없다.
예) E - Element / K - Key / N - Number / T - Type / V - Value 등등
결국 타입의 이름 즉, N 이라고 제네릭을 선언하게 되면 N의 이름을 클래스나 인터페이스에서 존재 할수 없다는 소리이다.
조금 이해가 안되면 int a= 10; 이라고 선언했을때 그 클래스 안에서 a의 변수이름을 사용을 하지 못하는것이랑 같은 소리이다.
제네릭 메소드
(GetMethodTest.java)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class GeMethodTest {
public static void main(String[] args) {
String names[]={"자바", "파이썬", "씨플플"," 자바스트립트"};
Double sores[]={100D,98D,95D,90D,100D};
GeMethod geMethod=new GeMethod();
geMethod.print(names);
geMethod.print(sores);
}
}
|
cs |
제네릭을 사용하지 않은 (Gemethod.java)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class GeMethod {
public void print(String[] item){
for (int i = 0; i <item.length ; i++) {
System.out.println(item[i]);
}
}
public void print(Double[] item){
for (int i = 0; i <item.length ; i++) {
System.out.println(item[i]);
}
}
}
|
cs |
우리가 기존에 제네릭을 배우지 않았을때 코드가 사람마다 다르게 겠지만 두 메소드(오버로딩) 가 필요하다.
제네릭을 쓴 (GeMethod.java)
1
2
3
4
5
6
7
8
|
public class GeMethod {
public <T> void print(T[] item){
for (int i = 0; i <item.length ; i++) {
System.out.println(item[i]);
}
}
}
|
cs |
제네릭을 쓴 메소드를 사용하게 된다면 메소드 하나로 에러없이 해결할수 있다는 것이다.
타입이 서로 다른 두 데이터 제네릭
(Box3.java)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Box3<K ,V> {
private K name;
private V age;
public void setData (K name, V age){
this.name=name;
this.age=age;
}
public K getName(){
return name;
}
public V getAge(){
return age;
}
}
|
cs |
(BoxTest3.java)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class BoxTest3 {
public static void main(String[] args) {
Box3<String, Integer> box=new Box3<>();
box.setData("홍길동",35);
String name=box.getName();
Integer age=box.getAge();
System.out.println("이름: "+name +", 나이 : "+age);
}
}
|
cs |
개인적으로 이정도 까지 읽었고 앞에 내용을 이해를 어느정도 했다면 이정도는 이제 그냥 이해를 할것이다.
만약에 이해를 못하겠다면 댓글 남겨주세여!
'java' 카테고리의 다른 글
[java]Math클래스를 사용해서 편리하게 계산하자 (0) | 2023.03.31 |
---|---|
[java]인터페이스 it에서 말하는 인터페이스 과연 똑같은것일까? (0) | 2023.03.31 |
[Java] Getter / Setter 메소드 이미그레이션 역할을 한다..? (0) | 2023.02.28 |
[java] 조건문?? 조건은 또 뭐야?? (0) | 2023.02.28 |
[java] 상수는 또 무엇인가? (0) | 2023.02.28 |