MainActivity.java, itemView.java, CustomAdapter.java 파일을
아래와같이 변경한다
4. MainActivity.java
packagecom.example.myapplication; importandroidx.appcompat.app.AppCompatActivity; importandroid.os.Bundle; importandroid.widget.ListView; importjava.util.ArrayList; public class MainActivityextendsAppCompatActivity {
packagecom.example.myapplication; importandroid.content.Context; importandroid.view.LayoutInflater; importandroid.widget.ImageView; importandroid.widget.LinearLayout; importandroid.widget.TextView; public class itemViewextendsLinearLayout{ privateImageViewmIcon; privateTextViewmTitle; privateTextViewmComment; //생성자 생성 publicitemView(Context context,Data data){ super(context); //인플레이션: 메모리에 올려 객체화하는것 LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.item_style, this, true); //inflate method를 이용해 item_style를 parameter로 불러오고 // root element를 linearlayout으로 설정하고 root를 포함한다에 true값을 설정
//set Icon mIcon= findViewById(R.id.icon); //set Title mTitle= findViewById(R.id.title); //set Comment mComment= findViewById(R.id.comment); //Data class에 getIcon method를 이용해 return값을 받아오고 //Set함수를 이용해 세팅시킨다 } public voidsetIcon(inticon){mIcon.setImageResource(icon);}; public voidsetTitle(String data){mTitle.setText(data);}; public voidsetComment(String data){mComment.setText(data);}; //Data class에 get mothod를 setting하는 작업 }
6. CustomAdapter.jave
packagecom.example.myapplication; importandroid.content.Context; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.BaseAdapter; importandroid.widget.Button; importandroid.widget.ImageView; importandroid.widget.TextView; importjava.util.ArrayList; public class CustomAdapterextendsBaseAdapter { privateContextmContext=null; privateArrayList<Data>mData=newArrayList<Data>(); public CustomAdapter(Context context){ this.mContext= context; }
//data를 불러오기위해 get(key) 을 이용한다 System.out.println(tel.get("seoul")); System.out.println(tel.get("busan")); System.out.println(tel.get("daegu"));
//Map class에 각각의 key,value값을 entry 라고하고 이를 Entry class라고한다
//Map 이란 interface안에 entrySet method를 이용해서
//entry객체로 set을 구성하여 iterator로 접근할수있다
//Entry class에는 Map에 접근하기위해 getKey,getValue method가 존재한다 Set set = tel.entrySet(); //set을 만들면 iterator를 이용할수있다 Iterator it = set.iterator(); while(it.hasNext()) { Map.Entry e = (Map.Entry)it.next(); //entry가 Object type이기때문에 형변환을 해줘야한다 System.out.println(e.getValue()+e.getKey()); //entry에 method를 이용해 정보를 가져온다 }
//generic을 이용해 미리 type을 설정할수있다 Set<Map.Entry<String, String>> set = tel.entrySet(); Iterator<Map.Entry<String, String>> it = set.iterator(); while(it.hasNext()) { Map.Entry e = it.next();
//class Demo public T data; //T type 의 data변수 선언, 꼭 T를 쓸필요는없다. //main Demo<String> d1 = new Demo<String>(); Demo<Integer> d2 = new Demo<Integer>();
//data type이 정해져있지않은 class를 이용해
//객체를 생성하면서 data type을 정한다 -----
//일반적인 class 사용하는 방법 //class Demo public Integer data; public void setData(Integer data) { this.data = data; } public Integer getData() { return data; }
//public class //main Demo d1 = new Demo();
Integer ing = new Integer(100); d1.setData(ing); System.out.println(d1.getData()); ------ //class GenericDemo public T data; public void setData(T data) { this.data = data; } public T getData() { return data; }
//public class //main GenericDemo<Integer> gd = new GenericDemo<Integer>(); gd.setData(new Integer(200)); System.out.println(gd.getData());
//data type을 class가 아닌 여기서 설정할수있다
GenericDemo<String> gd1 = new GenericDemo<String>(); gd1.setData("hello"); System.out.println(gd1.getData());
//하나의 class로 여러 data type을 만들수있어서 효율적이다 ------- //class StudentData public String name; StudentData(String name){ this.name = name; } //생성자 생성 public String toString() { return name; }//주소값이 출력되기때문에 overriding해주거나
//(p1.data.name)형태로 출력해줘야한다 //class Person <T,E> public T data; public E id; Person(T data, E id){ this.data = data; this.id = id; } //생성자 생성
//generic class를 복수의 type으로 사용할경우 참조형을 사용해야한다
//public class
//main Person<StudentData, Integer> p1 =
new Person<StudentData, Integer> (new StudentData("jusung"), new Integer(20150000)); //person의 두개의 유형을 설정하고 객체를 생성한다
//data의 경우 주소값이 출력이되기때문에 toString method를 overriding해줘야한다 -------
//class StudentData public String name; StudentData(String name){ this.name = name; } public String toString() { return name; } //class Person <T,E> public T data; public E id; Person(T data, E id){ this.data = data; this.id = id; }
enumeration class는 열거형 클래스로 연관된 상수들의 집합이다 class 의 일종으로 생성자를 가질수있지만 접근제어자는 private형만 가능하다 enum class도 일반클래스와 마찬가지로 컴파일할때 자동으로 생성자를만들어주지만 private이기때문에 생성자를 통하여 객체를 생성할수는없다 enum class 의 values() method를 호출하면 enum class내에 선언되있는 모든 상수를 리턴한다.
//public class
public static final int PLATINUM_MEMBER = 1; public static final int LOYAL_MEMBER = 2; public static final int GOLD_MEMBER = 3; public static final int SILVER_MEMBER = 4;
//finall로 상수화시켜 더쉽게 이해할수있게한다
//상수가 많아질경우 복잡해질수있다
//main
int grade = GOLD_MEMBER; switch(grade) {
case PLATINUM_MEMBER: System.out.println(30+"% discount"); break; case LOYAL_MEMBER: System.out.println(20+"% discount"); break; case GOLD_MEMBER: System.out.println(10+"% discount"); break; case SILVER_MEMBER: System.out.println(5+"% discount"); break;
//이와같이 개발자 입장에서 이해하기쉽다
----------
interface A{ int PLATINUM_MEMBER = 1,LOYAL_MEMBER = 2,GOLD_MEMBER = 3,SILVER_MEMBER = 4; } //상수가 많을경우 interface를 만들어서 더 단순하게 쓸수있다
//불러올때 앞에 interface명을 붙여줘야한다. ex(A.GOLD_MEMBER;)
//public class
//main int grade = A.GOLD_MEMBER; switch(grade) {
case A.PLATINUM_MEMBER: System.out.println(30+"% discount"); break; case A.LOYAL_MEMBER: System.out.println(20+"% discount"); break; case A.GOLD_MEMBER: System.out.println(10+"% discount"); break; case A.SILVER_MEMBER: System.out.println(5+"% discount"); break;
-------------
interface A{ int PLATINUM_MEMBER = 1,LOYAL_MEMBER = 2,GOLD_MEMBER = 3,SILVER_MEMBER = 4; } //상수가 많을경우 interface를 만들어서 더 단순하게 쓸수있다
interface B{ int PLATINUM_MEMBER = 1,LOYAL_MEMBER = 2,GOLD_MEMBER = 3,SILVER_MEMBER = 4; } //불러올때 앞에 interface명을 붙여줘야한다. ex(B.GOLD_MEMBER;)
//runtime중 error가 발생할수있기 때문에 좋은방법이 아니다. -------------
//interface내의 각각의 상수를 class로 설정할수있다
class A{ public static final A PLATINUM_MEMBER = new A(); public static final A LOYAL_MEMBER = new A(); public static final A GOLD_MEMBER = new A(); public static final A SILVER_MEMBER = new A(); } class B{ public static final B PLATINUM_MEMBER = new B(); public static final B LOYAL_MEMBER = new B(); public static final B GOLD_MEMBER = new B(); public static final B SILVER_MEMBER = new B(); } //각각의 상수를 Class로 설정할경우 코드가 복잡해지고
// class memR{ // public static final memR PLATINUM_MEMBER = new memR(); // public static final memR LOYAL_MEMBER = new memR(); // public static final memR GOLD_MEMBER = new memR(); // public static final memR SILVER_MEMBER = new memR(); // private memR() {} // } //enum class를 만들경우 이와같이 상수의 개수만큼
String str = 100; int ii = Integer.parseInt(str); //Integer.parseInt()는 문자열을 정수형으로 바꿔준다 System.out.println(ii); //100이란 정수 값이 출력된다 int ii2 = ii + 100; //정수형으로 바꿧기때문에 error가 없다 System.out.pintln(ii2);
//String 객체의 Equals method는 overriding된 method여서 내용을 비교한다
value va1 = new Value(10); value va2 = new Value(10); //서로 다른 instance를 가리킨다
if(val1.equals(var2)) { System.out.println("va1과 va2는 서로같다"); }else { System.out.println("va1과 va2는 서로 다르다"); } //Value class는 overriding을 하지 않아서 서로 "다르다"가 출력된다
//va1 = va2;를 입력할경우 "같다"가 출력된다
//Equals method가 Objet class 에 있는경우 주소값을 비교한다
//hashCode는 주소의 값을 반환해주는 method이다
System.out.println(str1.hashCode()); System.out.println(str2.hashCode()); //같은 값이 출력된다 //서로다른주소의 값이 나와야하지만 내용이 같은경우