외부에 대한 접근을 제어하는 문법을 접근 제어자(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 - 동일 클래스
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버튼을 눌러도 토스트 메세지 버그 현상이 이러나지 않는다!!
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에 대해 알아보았다.
코틀린은 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)
}
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 언어 시대는 끝이 났다. 코틀린을 더 공부하고 싶다면