CustomListView 구현

CustomListview는 아이템을 별도의 xml로 만들고 그것을 Listview에 적용시켜서 사용하는 것이다.

간단한 문장이나 하나의 아이템만 보여주는 Listview와 달리 아이템을 더 추가하여 리스트를 보여주는 장점이 있다.

 

 

 

 

 

우선 xml을 만든다.(res->layout에서 원하는 이름으로 xml을 만든다!)

xml을 한칸의 list를 보여줄 item들로 채운다.(이미지,이름,상세정보 등등)

 

 

 

listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <!-- CustomListView 아이템 각 요소별 항목 배치 -->
    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:id="@+id/imageView1"
        android:layout_weight="0.5" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="4">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/textView1"
            android:textSize="24dp"
            android:textColor="#000000"
            android:gravity="center_vertical"
            android:layout_weight="2" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="New Text"
            android:textColor="#666666"
            android:textSize="16dp" />
    </LinearLayout>
</LinearLayout>

 

 

만든후 총 두개의 java파일을 만들 것이다.

하나는 ListView아이템 요소들과 하나는 그것을 Main에 연결시켜주는 Adapter이다.

 

 

ListViewItem.java

import lombok.Getter;
import lombok.Setter;

// xml 파일에서 생성한 View 객체에 뿌려줄 데이터 클래스를 정의하는 부분
@Setter
@Getter
public class ListViewItem
{
    private Drawable icon ;
    private String title ;
    private String desc ;
    // ? - lombok을 이용하여 getter와 setter 없애기
}

 

여기서 Lombok을 이용하여 getter,setter를 간결화 할 수 있다.

2020/09/22 - [대외 활동/CADI(개발A 보충스터디)] - 룸복(Lombok),제이유닛(Junit),log4j & slf4j 설명!

 

룸복(Lombok),제이유닛(Junit),log4j & slf4j 설명!

룸복(Lombok) 룸복(Lombok)이란 자바에서 model object를 만들때 멤버필드에 대한 Getter,Setter,ToString등 과 같이 불필요하게 반복적으로 만드는 코드를 어노테이션화하여 간결화시키는 라이브러리이

dev-seungwon.tistory.com

 

 

 이 ListViewAdapter에서 만든 addItem함수를 통해 Main에서 list를 추가할 수 있다.

여기서 중요한 것은 @Override가 표시된 부분은 BaseAdapter를 상속할때 반드시 필요한 부분이다!

public class ListViewAdapter extends BaseAdapter
{
    // Adapter에 추가된 데이터를 저장하기 위한 ArrayList
    private ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>() ;

    // 기본 생성자를 통한 초기화
    // ? - lombok을 이용하여 기본 생성자 부분 없애기
    public ListViewAdapter()
    {
    }

    // Adapter에 사용되는 데이터의 개수를 Return함 : Input되는 데이터 항목의 개수
    @Override
    public int getCount()
    {
        return listViewItemList.size();
    }

    @Override
    public Object getItem(int position)
    {
            return listViewItemList.get(position);
    }

    @Override
    public long getItemId(int position) //위치값 리턴
    {
        return position;
    }

    // 지정된 Position에 위치한 데이터를 화면에 출력하는데 사용할 View를 불러와 Return
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        final int pos = position;
        final Context context = parent.getContext();

        // "listview_item" Layout을 inflate하여 convertView 참조 획득.
        if (convertView == null)//틀이 아직 안만들어져있으면
        {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.listview_item, parent, false);
        }

         // 다음주 리사이클러 뷰에서 사용함! (ViewHolder 패턴)
        //할때마다 선언하는 것이 아니라 3개를 하나의Tag로 간주해서 setTag를 통해 효율을 높인다.

        // 화면에 표시될 View(Layout이 inflate된)로부터 위젯에 대한 참조 획득
        ImageView iconImageView = (ImageView) convertView.findViewById(R.id.imageView1) ; //만든 틀에서만 findView한다
        TextView titleTextView = (TextView) convertView.findViewById(R.id.textView1) ;
        TextView descTextView = (TextView) convertView.findViewById(R.id.textView2) ;

        // Data Set(listViewItemList)에서 position에 위치한 데이터 참조 획득
        ListViewItem listViewItem = listViewItemList.get(position);

        // 아이템 내 각 위젯에 데이터 반영
        iconImageView.setImageDrawable(listViewItem.getIcon());
        titleTextView.setText(listViewItem.getTitle());
        descTextView.setText(listViewItem.getDesc());

        return convertView;
    }


    //baseAdapater에 정의된 기능이 아님 별도로 추가
    // 아이템 데이터 추가를 위한 함수. 개발자가 원하는대로 작성 가능.
    public void addItem(Drawable icon, String title, String desc)
    {
        ListViewItem item = new ListViewItem(); // 하나의 리스트 항목을 하나의 객체로 간주함

        item.setIcon(icon);
        item.setTitle(title);
        item.setDesc(desc);

        listViewItemList.add(item);
    }
}

 

만든후 마지막으로 MainActivity에서 사용하면 끝!(클릭했을때 토스트 메세지도 나오게 함)

public class MainActivity extends AppCompatActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listview ;
        ListViewAdapter adapter;

        // Adapter 생성
        adapter = new ListViewAdapter() ;

        // 리스트뷰 참조 및 Adapter달기
        listview = (ListView) findViewById(R.id.listView_Shape);
        listview.setAdapter(adapter);

        // 첫 번째 아이템 추가.
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.instagram), "instagram", "this is instagram");

        // 두 번째 아이템 추가.
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.youtube), "youtube", "this is youtube");

        // 세 번째 아이템 추가.
        adapter.addItem(ContextCompat.getDrawable(this, R.drawable.facebook), "facebook", "this is facebook");

        // 위에서 생성한 listview에 클릭 이벤트 핸들러 정의.
        // 아이템을 클릭할 때의 이벤트 리스너를 등록함
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            // AdapterView : 카카오톡 화면과 같이 일정한 디자인 패턴을 갖고 있는 항목
            @Override
            public void onItemClick(AdapterView parent, View v, int position, long id)
            {
                // Posistion에 위치한 값을 가져와 변수에 저장하여 사용가능
                ListViewItem item = (ListViewItem) parent.getItemAtPosition(position);

                Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_LONG).show();
            }
        });
    }
}

 

 

 

마지막으로 Main화면의 xml부분은 Listview를 사용하면 된다.

 

 

>>결과물

 

 

빌더 패턴빌더 패턴(Builder Pattern)

 

빌더 패턴이란 동일한 생성 절차에서 생성 과정과 표현 방법을 분리하여 서로 다른 결과를 만들게 하는 패턴이다.

 

 

빌더 패턴이 중요한 이유:
번거로운 생성자 정의(생성 인자가 많을 때 )

 

 

 

생성자가 많을 때 아래 코드처럼 사용할 생성자를 전부 다 만들어야 한다. 또한 인자 순서(?)도 신경써서 작성해야 한다. 

public class Computer{
	private String user;
	private String cpu;
	private String ram;
	
	public Computer(String user){
	this.user =user;
}
	public Computer(String user,String cpu){
	this.user = user;
	this.cpu = cpu;
}

	public Computer(String user,String cpu,String ram){
	this.user =user;
	this.cpu = cpu;
	this.ram = ram;
}
}

 

 

빌더 패턴 : builder.set()으로 원하는 인자나 순서 상관없이 입력가능하다.

 

(순서 : user - ram -cpu 로 반드시 선언할 필요가 없다)

(인자 : user값을 안 넣어도 되고 ram,cpu만 넣어도 된다)

>>생성자로 하게되면 해당 생성 인자에 default값을 넣거나 따로 생성자를 만들어야 함!

 

 

 

생성자를  만드는 것이 아니라 빌더로 따로 정의해서 가독성이 좋아진다.

public static class Builder {
	private String user;
	private String cpu;
	private String ram;

public Builder setUser(String user){
	this.user = user;
	return this;
}
public Builder setCpu(String cpu{
	this.cpu = cpu;
	return this;
}
public Builder setRam(String ram{
	this.ram= ram;
	return this;
}
public Builder build(){
	return new Builder(user,cpu,ram);
}
}

 

public class BuilderPattern{
public static void main(String []args){ 	
Builder builder = new Builder();

Computer computer= builder
.setUser("senungwon")
.setRam("8g")
.setCpu("256g ssd")
.build();
	}
}

접근 제어자(access modifier)

 

 

외부에 대한 접근을 제어하는 문법을 접근 제어자(access modifier)라고 한다.
보통 변수나 함수, 클래스앞에 접근 제어자를 붙이고 접근 허용 범위를 관리한다.

 

 

 

 

접근 제어자는 크게 4가지로 분류된다.
private,default,protected,public

 


private

private을 사용할 경우, 그에 해당하는 함수나 변수, 클래스는 해당 클래스에서만
접근할 수 있다. 즉 클래스 외부에서 사용할 수 없고 해당 클래스내에서만 사용할 수 있다.

 

 

  • 같은 패키지, 같은 클래스
public class PrivateClass{
	private int private_num = 10; 	//PrivateClass 내에서만 접근 가능
	private String private_str = "private"; 	//PrivateClass 내에서만 접근 가능  
    
    private String getPirvate(){
    return this.private_str; 	//같은 클래스 내에 있는 변수를 함수로 접근 가능
    }
    
}

 

 

default

이는 같은 패키지 내에서만 접근이 가능하다. default는 따로 
접근 제어자를 입력할 필요가 없다.

 

 

  • 같은 패키지, 다른 클래스
package seungWon.defaultone;

class DefaultClass{
	int year = 2019;
}


public class DefaultTwoClass{
	int month = 9;
    int day = 14;
    public static void main(String []args){
  	System.out.println(year+"."+month+"."+day);
    //같은 패키지,다른 클래스에 있는 변수 호출가능
   }
}

 

 

 

 

protected

default와 같이 같은 패키지에서 접근이 가능하다. 하지만 다른 패키지에서 사용할 수 있는 경우가 있다.
다른 패키지에 상속받는 부모 클래스가 있을 때 접근이 가능하다.

 

 

  • 다른 패키지, 상속받은 클래스
package seungWon.protectedone;

public class ProtectedClass{
	int year = 2019;
}

package seungWon.protectedtwo;
import protectedone.ProtectedClass;

public class MainClass extends ProtectedClass{
	int month = 9;
    int day = 14;
    
    public static void main(String []args){
  	System.out.println(year+"."+month+"."+day);
    //다른 패키지,상속한 클래스에 있는 변수 호출가능
   }
}

 

 

 

 

public

public은 어디에서나 접근이 가능하다.따라서 사용하기 편할 수 있지만
정보가 노출되어 있다는 단점이 있다.

 

 

  • 다른 패키지,다른 클래스
package seungWon.publicone;

public class PublicClass{
	int year = 2019;
}
package seungWon.publictwo;

public class MainClass{
	int month = 9;
    int day = 14;
    
    public static void main(String []args){
  	System.out.println(year+"."+month+"."+day);
    //다른 패키지,다른 클래스에 있는 변수 호출가능
   }
}

 

이처럼 접근 제어자는 각자 장단점이 있고 이를 잘 활용하여 코드를 짜야 한다.

 

 

 

 


public - 모두 다 
protected - 동일 패키지, 상속
default - 동일 패키지
private - 동일 클래스

안드로이드 기초

 

안드로이드에서 자주 사용하는 intent에 대해 알아보자!

 

 

안드로이드의 기초 지식이 궁금하다면

 

2020/09/07 - [대외 활동/CADI(개발A 보충스터디)] - Android 시작 및 기초 다지기!(Button,Toast,ImageView)

 

Android 시작 및 기초 다지기!(Button,Toast,ImageView)

Android 시작 및 기초 다지기 안드로이드 앱 개발을 하고 싶다면 Android Studio부터 설치 해야 한다. 2020/08/25 - [대외 활동/CADI(개발A 보충스터디)] - 안드로이드 스튜디오 설치 안드로이드 스튜디오 설�

dev-seungwon.tistory.com

 

 


인텐트(intent)

 

 

 

인텐트(intent)란 메시징 객체이며 다른 앱으로 부터 작업을 요청할 때 자주 사용된다. 대표적으로 액티비티 간 화면 전환이나 특정 사이트로 링크를 줄 떄 혹은 key값을 받아 그 값을 주고 받을 때 주로 사용한다.

 

 

Intent intent = new Intent();

-괄호 안에 출발지와 도착지를 기술한다

-각각 클래스 명을 기술하면 된다.

 

startActivity()

- 괄호 안에 자신이 선언한 인텐트 객체를 넣는다.

 

finish()

-해당 인텐트가 전달되거나 요청이 이루어진 이후 종료한다.(데이터 낭비 방지 혹은 화면 종료도 가능)

 

 

 btn_intent라는 버튼을 눌렀을 때 intent를 통해 SecondActivity로 화면 전환을 하는 코드다. 

이러한 형태로 Activity간 화면 전환이 이루어진다.

 

 

 

인텐트 활용!

 

인텐트를 활용하기 위해 MainActivity에서 총 3가지의 버튼을 만든다.

 

 

 

1.LayoutActivity로 전환하는 버튼

2.계산(add)하는 화면으로 전환하는 버튼

3. 링크를 통해 특정 사이트로 접속하는 버튼

MainActivity

 

 

 

 

 

LayoutActivity에서는 총 4개의 텍스트 뷰로 나에 대한 간단한 설명이 나오는 화면이다.

 

LayoutActivity

 

 

다시 MainActivity로 가서 링크를 누르게 되면 이렇게 사이트 접속이 가능하다.

 

http://www.naver.com으로 접속

 

 

 

 

MainActivity의 link버튼에 관련 코드

 

 

 

 

 

 

 

 

 

계산기를 누르게 되면 값을 더하는 View들이 있고 GOTO를 누르게 되면 다시 LayoutActivity으로 가게 된다.

이는 MainAcitvity에서만 intent로 화면전환을 하는 것이 아니라 다른 액티비티에서도 가능하다는 점을 보여준다.

그렇기 때문에 GOTO버튼을 누르면 Toast메세지가 나오게 하였다.

 

SecondActivity

 

 

LayoutActivity에 Toast메세지 출력

 

 

ADD버튼을 눌렀을때 계산기 동작

 

 

 


 

 

java코드

 

 

 

MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btn_layout =(Button)findViewById(R.id.btn_layout);
        Button btn_intent = (Button)findViewById(R.id.btn_intent);
        Button btn_link = (Button)findViewById(R.id.btn_link);
        
        btn_link.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com")));
            }
        });

        btn_intent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
                finish();
            }
        });

        btn_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this,LayoutActivity.class));
            }
        });
     }
}

 

계산기 관련 코드(SecondActivity)

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        final EditText et_num1 = (EditText)findViewById(R.id.et_num1);
        final EditText et_num2 = (EditText)findViewById(R.id.et_num2);
        Button add = (Button) findViewById(R.id.btn_add);
        final TextView tv = (TextView) findViewById(R.id.tv_result);


        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String num1= et_num1.getText().toString();
                String num2= et_num2.getText().toString();

                int num_1 =Integer.parseInt(num1);
                int num_2 =Integer.parseInt(num2);

                tv.setText(num_1+num_2+""); //setText는 string Type
            }
        });


        Button btn_goto =(Button)findViewById(R.id.btn_goto);
        btn_goto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent(SecondActivity.this,LayoutActivity.class);
                i.putExtra("key","hi");
                startActivity(i);
                finish();
            }
        });
    }
}

 

LayoutActivity

public class LayoutActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        Intent j = getIntent();
        String test = j.getStringExtra("key");
        if(test != null)
        Toast.makeText(getApplicationContext(),test,Toast.LENGTH_LONG).show();

    }
}

 

 

 

 


 

 

의문점

코드를 짜면서 SecondActivity의 GOTO버튼을 누를경우에만 Toast메세지를 띄우게 설정해놨는데 처음 MainActivity에서

Layout을 누르면 Toast 메세지가 버그가 걸린 것처럼 메세지 없이 뜬다.

 

해결

 LayoutActivity에서 if(test != null) 을 넣어서 만약 SecondActivity에서 해당 인텐트를 받지 않는다면 Toast메세지가 뜨지않게 설정해 두었다. 그렇게 한다면 메인 엑티비티에서 바로 Layout버튼을 눌러도 토스트 메세지 버그 현상이 이러나지 않는다!!

 

 

 

 

 

참조

developer.android.com/guide/components/intents-filters?hl=ko

 

인텐트 및 인텐트 필터  |  Android 개발자  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

developer.android.com

 

Git Bash 설치

 

 

깃 설치하기

>>git-scm.com/

 

Git

 

git-scm.com

 

 

 

 

설치 방법 및 git bash시작

 

 

1 다운로드 클릭!

 

 

2. 자동으로 다운로드된다.

 

 

3.설치를 시작한다.

 

4. git bash를 시작하면 끝!

 

 

 


 

 

 

github 주요 명령어 정리! 

 

git을 사용하여 원격 저장소와 로컬과의 관계를 살펴보자.

 

 

 

git config

깃을 설치한 후 git bash에 들어가 가장 먼저 해야 할 일이다. 사용자 이름과 이메일 주소를 입력한다.

 

 

 

git init

 저장소를 생성하여 깃을 초기화 시키는 과정이다. 이 과정은 초기화하는 과정이기 때문에 처음 깃 폴더를 만들때에만 사용한다.

git remote add origin (repository이름)

 이것은 깃허브에 있는 주소를 가져와 내가 원하는 로컬 디렉토리에서 사용하려고 할때 쓴다. 이 과정을 통해 내 로컬과 원격 저장소와의 동기화를 시킨다.

 

 

 

git pull 

 원격저장소에 있는 파일을 내 로컬에 내려받는 과정이다. 즉 깃허브에 있는 파일들을 내 로컬에 다운받을 수 있다.

(git pull origin master)

 

 

 

 

git status

현재 디렉토리에서 변경되거나 삭제된 파일들이 있는지 확인하는 과정이다. 만약 있다면 빨간색으로 Untracted 파일들이 타난다.

 

 

 

 

git add 

위에서 나타난 Untracted 파일들을 저장한다.(commit을 하기위한 전 단계) 또한 . 을 붙이면 전부다 저장가능(git add .)

 

 

 

 

git commit 

 내 로컬에 있는 파일 및 폴더의 추가 변경 사항들에 대해 기록해 놓은것인데 보통 메세지와 함꼐 기록한다. 이는 push를 하기 위한 전 단계이다. (git commit -m " 메세지")

 

 

 

 

git push

원격 저장소로 변경된 파일을 업로드 하는 과정이다. 이 단계가 끝나면 내 로컬에 있는 디렉토리나 파일들이 원격 저장소(github)에 올라가는 것을 볼 수 있다. (git push origin master)

 

 

 

 

자기소개 앱 만들기

 

간단한 자기소개 어플을 만들기 위해 Button,Toast,ImageView 에 대한 지식이 필요하다.

 

2020/09/07 - [대외 활동/CADI(개발A 보충스터디)] - Android 시작 및 기초 다지기!(Button,Toast,ImageView)

 

Android 시작 및 기초 다지기!(Button,Toast,ImageView)

Android 시작 및 기초 다지기 안드로이드 앱 개발을 하고 싶다면 Android Studio부터 설치 해야 한다. 2020/08/25 - [대외 활동/CADI(개발A 보충스터디)] - 안드로이드 스튜디오 설치 안드로이드 스튜디오 설�

dev-seungwon.tistory.com

 

 

 

 


 

 

 

 

 

xml에는 두개의 버튼과 두개의 이미지 뷰를 나타내었다.

 

 

java파일에서는  (프로필보기)버튼을 누르면 화면에 사진이 보여지고 토스트 메세지를 띄운다. 또한 자기소개를 누르면

토스트 메세지만 띄운다.

 

 

 

 


 

 

 

 

 

캡쳐화면 1

캡쳐화면 2

 

 

 

캡쳐화면 3

Android 6.0 버전 이후 달라진 접근 권한

 

 

 

 

Android 6.0버전은 API LEVEL 23 이후의 버전을 말한다.

 

 

 

 

안드로이드 6.0 전 후 비교
Android 6.0 전에는 사용자가 앱을 설치할 때 권한을 부여하도록 요청하지만
Android 6.0 이후에는 runtime에 사용자에게 요청하게 된다.

 

 

 

아래의 그림은 6.0버전 이후의 접근 권한 형태이다.

 

 

 

권한은 크게 필수적 접근 권한과 선택적 접근 권한이 있다.
필수적 접근 권한은 이 앱을 사용하기 위해 반드시 필요한 권한을 말하고 선택적 접근 권한
없어도 앱에 큰 영향을 미치지 않는 권한을 말한다.

 

 

이와 같은 형태로 각 앱마다 권한이 나뉘어져 있다.

 

 

 

 

필수 권한은 그룹으로 나뉘어져 있는데 아래의 표와 같이 나타낸다.

CALENDAR  READ_CALENDAR
WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPOHNE RECORD_AUDIO
PHONE READ_PHONE_STAGE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS
RECEIVE_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE

 

 

 

만약 SMS 권한을 허용한다면 그에 해당되는 권한들 SEND_SMS,RECEIVE_SMS 등의 모든 권한에 접근이 가능하다.

 

 

 

 

위의 접근 권한을 허용시키기 위해 app->manifests-> AndroidManifest.xml에 들어가 입력하여 접근 권한을 허용시킨다.

 

 

안드로이드 6.0 버전 이전에는 다소 권한에 제약이 어려움이 있었지만

안드로이드 6.0 버전 이후 부터는 이와 같이 권한 접근을  Runtime시 허용할 수 있게 되어 그 문제들이 사라졌다.

 

 

 

 

 

 

 

 


 

 

 

 

출처

 

mixup.tistory.com/20

 

안드로이드 6.0 (Marshmallow) 권한 획득하기!

안드로이드 6.0 (Marshmallow)에서 권한 획득 하는 방법에 대해서 소개하려 합니다. 안드로이드 6.0 은 API Level이 23 이므로 이후 표기 버전은 API 23 이라고 하도록 하겠습니다. 권한 획득이란? API 22 이

mixup.tistory.com

 

developer.android.com/guide/topics/security/permissions.html?hl=ko#normal-dangerous)

 

시스템 권한  |  Android 개발자  |  Android Developers

Permissions Google I/O 2015—Android M Permissions: Best Practices for Developers Android is a privilege-separated operating system, in which each application runs with a distinct system identity (Linux user ID and group ID). Parts of the system are…

developer.android.com

 

Android 시작 및 기초 다지기

 

 

안드로이드 앱 개발을 하고 싶다면 Android Studio부터 설치 해야 한다.

 

2020/08/25 - [대외 활동/CADI(개발A 보충스터디)] - 안드로이드 스튜디오 설치

 

안드로이드 스튜디오 설치

가장 빠른 안드로이드 스튜디오 설치 !! 안드로이드 설치 전 JDK 설치 및 환경 변수 설정을 했는지 확인해 보자 ! https://dev-seungwon.tistory.com/2 JDK 설치 및 환경 변수 설정 (1) JDK 설치 및 환경 변수 설.

dev-seungwon.tistory.com

 

 

 

 

 


 

 

 

안드로이드 시작

 

 

 

1. start a new Android Studio project 클릭

 

 

 

 

2. Empty Activity 클릭

 

 

 

 

3. 자신이 원하는 프로젝트 이름과 패키지 이름을 작성한 후 
 폴더의 경로 명과  언어,최소 SDK를 설정하면 시작

 

 

 

 

 

 

 

 

안드로이드 기초 다지기

 

 

 

1.Button

 

 

 

 

안드로이드는 크게 xml과 java파일로 나뉜다. 먼저 지금 보이는 화면은 xml이고

 

 

 

 

이 화면은 java코드로 이루어진 .java파일들이다.

xml파일은 app -> res -> layout에 있고  java파일은 app -> java -> (package이름.프로젝트이름)에 있다.

 

  

 

 

 

xml부터 살펴보면


기본(default)이 ConstraintLayout으로 되어 있고 위의 Palette에서 찾아 꾸밀 수 있다.
Paltte에는 view가 있고 view에 대한 자세한 내용은 아래 링크를 통해 보면 된다.

 

 

 

 

 

 

view중 가장 기본적인 Button을 xml화면에 놓게되면 ConstraintLayout이기 때문에 이런 오류가 생긴다. 

 

 

 

 


이 오류는 위에 봉같이 생긴 모양을 클릭하게 되면 해결이 된다. 이는 이 버튼의 정확한
위치가 정해지지 않아 생기는 오류인데 자세한 내용은 차후 Layout에서 설명하겠다.

 

 

 

 


이후 이 버튼이 눌렸을 때 발생하는 이벤트를 처리하기 위한 함수를 다루겠다.
setOnClickListener()함수 인데 이를 사용하게 되면 원하는 메세지나 전달하고 싶은 객체 등 
여러가지 부분들이 표현 가능하다.

 

 

 

 


 

 

2.Toast Message

 

여기서 우리가 button을 눌렀을때 토스트 메세지를 띄울 것이다.
Toast 메세지는 화면에 잠깐 보여주고 없어지는 메세지를 말한다.
Toast를 객체로 사용하는 방법도 있지만 지금 단계에선 어렵기 때문에 간단한 함수를 사용하겠다.
Toast.makeText()를 통해 사용한다.

 

즉 버튼을 누르게 되면 SeungWon Blog!! 메세지를 잠깐 띄웠다가 없어지게 된다. 

 

 

 

 


 

 

 

3.ImageView

 

 

 

다음은 이미지 추가 및 효과를 알아보겠다.

 

먼저 원하는 그림을 다운받은 후 res-> drawble에 붙여넣기를 한다.

 

 

 

 

여기에서 app안에 내가 복사한 그림을 불러온다.

 

 

 

 

이러한 형태의 이미지가 보이게 된다.

 

 

 

 

 

 

이미지 뷰를 눌렀을때 발생하는 이벤트를 처리하기 위해 이와 같이 코드를 작성하면 된다.

ToastMessage를 띄우는 코드와 이미지를 안보이게 하는 코드를 넣었다.

 

 

 

여기까지 Button과  Toast Message 그리고 ImageView에 대해 알아보았다.

Kotlin  vs  Java

 

 

코틀린은 JetBrains에서 만든 언어로 자바를 대체할 수 있는 정적 타입의 언어이다.
자바와 같이 JVM에서 동작하고 서로 100% 호환이 가능하다.
2017년 5월 18일 구글은 코틀린을 안드로이드의 공식 언어로 채택하였다.
안드로이드의 대표 언어인 JAVA 대신 코틀린이 채택된 이유는 무엇일까

 

 

 

객체의 간결화, Null의 안정성, 값 및 변수 선언, 간결한 view 생성, 접근제한자, 생성자 순으로 설명하겠다.

 

 

 

 


 

 

 

 

1.객체의 간결화

 

 

--Java--

객체를 new로 초기화 한 후 객체를 사용한다.(각각의 데이터를 putExtra를 통해 전달한다)

   Intent intent = new Intent(this,JavaActivity.class); //객체 초기화 및 생성
    intent.putExtra("Java",1); 
    intent.putExtra("Kotlin",2);

 

 

 

--Kotlin--

객체를 new로 초기화 하지 않아도 객체를 선언할 수 있다.  apply block 을 사용하여 전달할 데이터까지 묶어서 간결하게 선언할 수 있다.  block 안에서는 아래와 같이 사용할 수 있으므로 가독성과 코드가 깔끔해진다. 복잡할수록 더 효과가 있다.

  val intent = Intent(this,MenuActivity::class.java).apply{ //apply block
        putExtra("java",1)
        putExtra("Kotlin",2)
    }

 

 

 

 


 

 

 

 

2. Null의 안정성

 

--Java--

@(Annotation)을 이용하여 구분할 수 있다.

@Nullable은 null이 가능하고, @NonNull은 null이 불가하다.

 

  
    @Nullable String str1 = null;   //null 허용
    @NonNull String str2 = "notNULL"; // null 불허


    str1.substr(2); // error
    if(str1 != null)
        str1.substr(2); //ok

 

 

 

--Kotlin--

Null의 안정성을 추구하기 위해 기본적으로 변수 값은 Null이 될 수 없다.

만약 null을 사용하게 된다면 변수 뒤에 ? 를 붙이면 된다. 하지만 Java와 큰 차이는 지금부터다. 그 변수를 아래에서와 같이 str1.substr(2)로 부른다면 애초에 null값을 호출한 것이기 때문에 빨간밑줄이 생긴다. 이는 사전에 에러를 막기 위해서다.

 

    var str1:String? =null // ?를 붙이면 허용
    var str2:String = "notNULL" // default 값
    
    
    str1.substr(2)  // 빨간밑줄이 생김 --> 실행하기 전 오류 탐색 가능

 

 

 


 

 

 

 

3. 값 및 변수 선언

 

--Java--

타입을 항상 명시해야 하고 final을 붙여 강제성을 추가할 수 있다.

    String name = "SeungWon";// 가변
    final int age = 24;// 불변
    Student st = new Student(name); //new 객체 생성

 

 

 

--Kotlin--

 타입추론을 통해 자동지정됨으로 타입을 명시하지 않아도 된다.

변수가 가변일 경우 var,변수가 불변일 경우 val을 사용하면 된다.

    var name ="SeungWon" //가변
    val age = 24 //불변
    val st = Student(name) //new 없이 객체 생성

 

 

 


 

 

 

 

4. 간결한 VIEW

 

--Java--

 findViewById() 로 객체에 할당한 후 view를 사용한다.

    Button bt = findViewById(R.id.bt);
    bt.setOnClickListner(new View.OnClickListner(){
        public void onClick(View view){
            System.out.println("Java Button");
        }
    });

 

 

 

 

--Kotlin--

Java와 달리 id를 함수로 찾지 않고 바로 사용한다.  훨씬 더 간결하고 쉽게 쉽게 사용할 수 있다.

 bt.setOnClickListner(new View.OnClickListner(){
        public void onClick(View view){
           print("Kotlin Button")
        }
   })

 

 

 


 

 

 

5. 접근 제한자

 

--Java--

총 3가지 접근 제한자가 있다.( public, private, protected)

    public int a=0; // 모두 접근 가능
    private String b="JAVA"; // 현재 객체에서만 접근 가능
    protected char c='j'; // 같은 패키지에 있는 객체 & 상속관계인 객체에서 접근 가능
    int num = 1024; // default 값 --> 같은 패키지에서만 접근 가능

 

 

 

--Kotlin--

Java에서와 달리 같은 모듈내에서만 사용할 수 있는 internal이 있다. 나머지는 Java와 같다.

    val a=0  //default 는 public
    protected val b=1
    private val c=2
    internal val d =3  // 같은 모듈 내에서만 가능

 

 

 


 

 

 

 

6. 생성자 & 클라스

 

--Java--

생성자의 형태에 따라 별도로 생성해 주어야 한다. DTO(Data Transfer Object)를 사용하기 위해

getter,setter함수를 선언해야 한다.

   public class Java{
        private int a;
        int b;
        public Java(int a, int b){
            this.a=a; this.b=b;
        }
        public Java(int a){
            this(a,0); // a 값만 인자로 받는 생성자
        }
        
       public int getA(){return a;} // getter 함수
       public void setA(int a){this.a=a;} // setter 함수
    }

 

 

 

 

--Kotlin--

기본 생성자를 선언하지 않고 init으로 대체한다.

   public class Kotlin(a:Int, b:Int){
        init{
            //기본 생성자          
        }
    }

 

var로 변수 선언하게 되면 DTO를 사용하기 위해 별도로 getter,setter를 선언하지 않아도 된다. 

    public class(val a:Int, val b:Int) //주 생성자 간결화
    constructor(a: Int) : this(a,0) // 다른 형태의 생성자

 

 

 

 

 


 

 

 

지금까지 Kotlin과 Java의 차이점을 살펴 보았다. Kotlin이 아직 생소하지만 자주 사용하게 된다면 Java보다 훨씬 편리하고 간결한 코드들을 작성할 수 있다. 안드로이드의 Java 언어 시대는 끝이 났다. 코틀린을 더 공부하고 싶다면 

 

https://github.com/SeungWonU/kotlin-study/tree/master/kotlin%20programming

 

SeungWonU/kotlin-study

Contribute to SeungWonU/kotlin-study development by creating an account on GitHub.

github.com

 

D2 Coding 폰트 적용

 

 

D2 Coding 폰트 적용하기!!

 

 

D2 Coding 폰트를 적용하기 위해서는 Eclipse,Visual Studio, VS Code 등 IDE가 있어야 한다.

 

만약 아직까지 개발 툴이 없다면 Eclipse부터 설치해 보자!

 

https://dev-seungwon.tistory.com/5

 

이클립스(Eclipse) 설치

이클립스 설치하기!! 이클립스 공식 홈페이지에 들어가서 다운받자! https://www.eclipse.org/에 접속한다. 1. 오른쪽 위에 Download를 클릭한다. 2. Download 64 bit를 클릭한다. 3. Download를 누르면 설치가..

dev-seungwon.tistory.com


 

 

 

D2 폰트 다운로드하는 방법!

 

 

 

 

1. 아래의 링크를 타고 들어가 Ver 1.3.2를 클릭한다(버전이 바뀌었을 경우 기존 파일을 삭제하고 새롭게 깔아야 한다)

 

 

 

 

D2 Coding 폰트는 네이버에서 제공하는 폰트이며 여기에서 다운받을 수 있다.

https://github.com/naver/d2codingfont/

 

naver/d2codingfont

D2 Coding 글꼴. Contribute to naver/d2codingfont development by creating an account on GitHub.

github.com

 


 

 

 

 

2. 체크 표시 된 zip파일을 다운로드 받는다.

 

 

 

 

 

 

 

3. 다운로드가 완료되면 3개의 파일이 나타난다.

 

 

 

 

 

 

4. 압축을 풀면 3개의 폴더가 나타나게 되고 그 안에 있는 .ttf파일들을 전부 설치한다.

 

 

 

 

 

 

 

5. ttf파일을 열면 이러한 화면이 나타나게 되고 설치(I)를 클릭하여 진행하면 된다.

 

 

 

 

 

 

 

6.폰트는 다운받았으니 이제 적용하는 방법을 찾아보자. 먼저 이클립스를 실행하고 Window -> Preferences를 클릭한다.

 

 

 

 

 

 

 

 

7. Preferences->General->Appearence->Colors and Fonts -> Text Font 로 경로를 찾아간다. Edit버튼을 누르게 되면

 

 

 

 

 

8. 글꼴이 나오게 되고 D2Coding을 찾아서 적용시키면 끝이다!

 

 

+ Recent posts