본문 바로가기
카테고리 없음

[Java] 10. Object ( 오브젝트 ) - 2

by 슈퍼닷 2015. 1. 21.
반응형

7장에서 Object에 대해 언급한 바가 있다.

그곳에서 Object의 개념을 이해시켰다면 , 이번 Object는 심화된 내용이다.

 

우리는 하나의 Object를 만들때 이런 방법을 사용했다.

 

class Obj{

내용

}

 

Obj var = new Obj();

 

이제 Object Obj 에 여러 modifiers ( 수식어 ) 를 가진 변수를 넣어보자.

 

public : 어느 class에서나 참조가 가능하다.

 

protected : 같은 package 내의 class 에서만 참조가 가능하고 , 자식 class가 다른경우 그 자식class도 참조가 가능하다.

 

default : 같은 package 내의 class에서만 참조가 가능하다.

 

private : 같은 class 에서만 참조가 가능하다.

 

[modifiers]

 

예로들어 default 는 말그대로 default다. 기본값이다.

우리가 변수에 수식어를 설정하지않아도 이 수식어가 붙는다고 생각하면된다.

많이 쓰이는수식어는 아마도 public과 private 일것이다.

public은 공개를 시켜주는 변수로 어디서나 참조가 가능하다.

private는 보안을 위하여 사용한다.

그래서 private를 참조하기위해서는 public의 힘을 빌려 참조할 수밖에 없다.

 

class Obj{

private data;

 

public void setdata(boolean check,String str)

{

if (check == true)

data = str;
}

 

public String getdata(boolean check)

{

if (check == true)

return data;

}

}

 

위의 예제는 private와 public의 예제이다.

private는 같은 class내에서만 참조가 가능하다.

그러므로 다른 class에서 참조를 하려면 공개된 method를 사용하여 참조해야한다.

그때 쓰이는 수식어가 바로 public이다.

public method에서 권한이 있는지 판단해서 중요한 data를 지킬 수있다.

 

자바에는 상속 이라는 개념이 있다. 부모가 자식에게 부모의 것을 물려주는 것이다.

 

class Parents{

int var = 3;

}
class Child extends Parents

{

int a=0;

public void childPrint()

{

System.out.println("부모의 변수 var : " + super.var + " 자식의 변수 a : " + this.a);

}
}

 

 

이 예제는 많은 것을 알려준다.

Parents라는 부모 class가 있고 Child라는 class는 Parents를 상속 받았다.

Parents를 상속받으면서 Child는 Parents의 변수와 메소드 둘다 사용할수 있게됬다.

childPrint() 메소드를 사용하여 Child는 부모의 변수와 자신의 변수를 출력한다.

 

여기서 상속을 받을때는 

자식 extends 부모

인것을 알 수있다.

또 , extends는 단일 상속이지 다중상속이 아니다. 주의하자.

 

그리고 , 부모의 변수를 나타낼때 super.var  자식의 변수를 나타낼때 this.a 를 사용했다.

super 는 부모를 가리키는 변수다. 일종의 지시대명사다.

this 는 자신을 가리키는 지시대명사다.

만약에 Parents 내에서 this를 사용했다면 이 this 는 Parents를 가리켰을것이다.

 

Object를 만들때 우리는 이런방법을 쓴다.

 

Obj var = new Obj();

 

Obj var 은 Obj type의 변수를 선언한거니 이해가 간다.

그런데 new Obj()는 무엇을 뜻하는 것일까??
이 Obj() 는 Obj class의 constructor ( 제작자 ) 이다.

 

class Obj

{

Obj()

{

}

Obj(String str)

{

System.out.println(str);
}
}

 

public class ObjectTest

{

public static void main(String args[])
{

Obj var = new Obj("Hi");
}
}

 

이 스크립트는 constructor 의 좋은 예제이다.

여기서 아무내용이 없는 Obj() 는 default constructor 이다. 기본적으로 있는것이라서 내용이 없다면 적지 않아도된다.

내용을 추가하고 싶다면 Obj() 안에 추가하면 된다.

 

Obj(String str) 은  오브젝트를 만들때 이렇게 인자를 줄수도 있다.

여기서는 str을 인자로 받아 그것을 출력한다.

 

constructor에는 Object를 만듦과 동시에 해야되는 일을 적어놓으면 좋다.

 

이제 자바의 다형성에 대해 공부해보자.

 

자바는 하나의 형태가 여러가지의 형태를 가질수있다.

하나의 형태는 당연히 여러가지의 형태보다 크거나 같아야 한다.

( int type에 long type이 casting을 하지않고선 들어가지 않는것과 같다 )

 

class A

{

int af=0;

public void aprint()

{

System.out.println("a");

}

}

class B extends A

{

int f=0;

public void aprint()

{

System.out.println("b");

}
}

class C extends A

{

public void aprint()

{

System.out.println("c");
}

 

public class ObjectTest

{

A b = new B();

A c = new C();

b.aprint();

c.aprint();
}

 

위 스크립트에서 보면 신기한 구문이 있다.

A b = new B();

A c = new C();

A type의 변수를 만들어 놓고 Object B를 만들어서 또는 C를 만들어서 넣는다? 무슨 말일까?
A 는 B(또는 C)의 부모이다.

그러므로 A는 B보다 큰 type이다.

그래서 A type의 변수에 B라는 Object가 들어갈 수 있다.

위의 결과는 무엇일까?
바로 b가 출력되고 c가 출력된다.

왜냐하면 똑같은 형태의 method가 B와 C에서 재정의 되서 구현 되었다.

그래서 B(또는 C) 에서 aprint를 실행할때는 재정의 된 method가 실행되는것이다.

 

위의 스크립트를보면 class B 안에 변수 int f = 0 이 있다.

그러면

A b  = new B() ;  로 생성한 object b에서 class B안의 변수 f를 가져올수 있을까?
정답은 No 다.

 

이 변수의 type은 A라는것을 잊으면 안된다. 분명 B() 라는 제작자를 이용하기는 했지만 A type의 변수이므로

A type의 data만 불러올 수 있는것이다.

그러므로 class A안의 af는 불러올 수 있다.

 

그러면 어떻게 B의 내용도 가져올 수는 없을까?

class A

{
int aa= 0;
}

class B extends A

{
int bb=1;
}


public class ObjectTest

{
public static void main(String args[])
{
B bbb = null;
A b = new B();
if (b instanceof B)
{
bbb=(B) b;
}
System.out.println(bbb.bb);
}
}


 

 

instanceof 를 이용하는 방법이다.

 

Object instanceof Object2 의 형식으로 사용된다.

Object 가 Object2 라면 .... 을 실행해라 . 이런 형식이다.

위의 스크립트에서는 b가 B라면 bbb = (B) b; 를 사용했다.

여기서 (B)로 casting 한 이유는 b라는 변수는 A type의 변수이기 때문에 B type에는 들어갈수 없다.

그러므로 casting 해서 크기를 축소 시켜야 한다.

 

다른 예제로는

 

public void getobject(A a)

{

if (a instanceof B)

{

bbb= (B) b;
}
}

 

이런 방식으로 method를 쓰는 방법도 있다.

 

이렇게 Object에대해 조금더 배웠다.

다음번 에는 3가지 범위의 변수 ( 지역변수 멤버변수 전역변수에 대해 알아보자. )

 

반응형

댓글