class Sum
{
int num;
public Sum() { num = 0;}
public void addNum(int n) { num += n; }
public int getNum() { return num; }
}
class AdderThread extends Thread
{
Sum sumInst;
int start, end;
public AdderThread(Sum sum, int s, int e)
{
sumInst=sum;
start=s;
end=e;
}
public void run()
{
for(int i=start; i<=end; i++)
sumInst.addNum(i);
}
}
class ThreadHeapMultiAccess {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Sum s = new Sum();
AdderThread at1 = new AdderThread(s, 1, 50);
AdderThread at2 = new AdderThread(s, 51, 100);
at1.start();
at2.start();
try{
at1.join();
at2.join();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("1~100까지의 합:"+s.getNum());
}
}
이 소스 코드에서
클래스AdderThread가
클래스 Sum을 상속 하지도 않았는데
Sum의 있는 메서드를 어떻게 사용 할 수 있는건가요 ?
인스턴스의 참조 값만 알면 가능하다는데
이해가 잘안되네요 ㅡㅜ
main 메서드에서 Sum s = new Sum()으로 Sum클래스 객체를 생성했고, 이를 AdderThread 쓰레드 객체 생성할때 생성자를 통해 전달했네요.
AdderThread에서는 생성자를 통해 전달받은 Sum 객체를 통해 Sum클래스의 메서드에 접근하네요.
타 클래스의 메서드나 멤버변수에 접근할수 잇는건 상속했을때 뿐만이 아닙니다. 이건 설명이 필요하다기보다.. 아주 기본적인 내용이므로 그냥 책을 좀더 읽어보셔야 할듯 합니다.
쉽게 생각하면.. 클래스가 하나의 객체를 만드는 틀이라고 볼수있잖아요.. 예를 들어 TV라는 클래스가 있다면 TV클래스에는 음량이나 채널과 같은 멤버 변수가 있을수 있을것이고, 메서드로는 음량을 키운다, 채널을 돌린다 등의 동작이 있겠지요..
Class TV {
private int chanel;
private int volumn;
pulic void volumnUp(){
volumn++;
}
}
간단하게 여기서 볼륨을 올린다는 volumnUp() 메서드를 사용하려면 어떻게 하나요?
TV클래스를 사용하기 위해 메인 클래스가 TV 클래스를 상속받아야만 사용이 가능한가요?
아니면 TV tv = new TV(); 로 객체를 생성한 다음에 tv.volumnUp(); 을 통해서 사용하나요.
이거랑 똑같은데.. 님이 적으신 코드를 보면..
ThreadHeapMultiAccess 내부에서 AdderThread at1 = new AdderThread(s, 1, 50); 이렇게 객체를 생성하여 start(); 를 사용하신건 이해가 가고 AdderThread클래스에서 Sum의 addNum() 메서드를 사용하신건 이해가 안가시나용.. 물론 AdderThread클래스 내부에서 Sum 객체를 생성하지 않았지만 이는 생성자를 통해서 받고 있잖아요.. 그리고 만약 메인 클래스에서 Sum s = new Sum(); 을 통해 Sum 객체를 생성하여 AdderThread클래스 생성자에 전달하지 않고 그냥 Sum s; 로 하여 AdderThread클래스를 생성하게 되면 nullPointException 뜰껍니다.
AdderThread내부에서 생성되지도 않은 Sum클래스의 메서드에 접근하려 하니까요.