여러 개의 스레드가 동일한 객체를 참조 및 공유하고 있을때, 해당 객체를 공유객체라 일컫는다.
예를 들어, MusicPlayer라는 여러 class들이 MusicBox라는 하나의 클래스를 공유하되, MusicPlayer 객체를 다른 인자를 기반으로하여 다양한 생성자를 만들어내도록 구현해보자.
MusicPlayer라는 클래스는 MusicBox라는 하나의 객체를 공유받는다.
public class MusicBox{
public void PlayMusicA(){
System.out.println("played music A");
}
public void PlayMusicB(){
System.out.println("played music B");
}
}
위 공유객체를 실제로 활용할 수 있도록 생성자를 생성하고 run 메소드가 구현되어있는 thread class를 생성한다.
public class MusicBoxListener extends Thread{
int type;
MusicBox musicbox;
//musicbox는 공유객체로, 생성자가 받는 type이나 객체형태를 통해 다르게 활용될 수 있다.
public MusicBoxListener(int type, MusicBox musicbox){
this.type = type;
this.musicbox = musicbox;
}
@Override
public void run(){
switch(type){
//생성자가 입력받는 type(정수)에 따라 다른 메소드를 실행하도록 구성
//메소드는 다르지만 결국 사용하는 객체는 하나이다.
case 1:
musicbox.PlayMusicA();
break;
case 2:
musicbox.PlayMusicB();
break;
}
}
}
main thread에서 MusicBoxListener의 생성자를 실제로 정의해주고, 공유객체를 실행할 수 있는 객체를 만들어준다.
public class MusicBoxTester{
public void main(String[] args){
MusicBox box = new MusicBox();
//공유객체를 실행하는 스레드를 type(생성자)에 따라 여러개 생성
MusicBoxListener person1 = new MusicBoxListener(1, box);
MusicBoxListener person2 = new MusicBoxListener(2, box);
//MusicBoxListener 객체에서 run 메소드 실행
//생성자를 통해 box 객체가 전달되면서, 해당 type에 맞게 switch문 실행
//전달된 객체 모두 동일한 공유 객체를 가지며, 해당 객체에서 type과 관련한 메소드를 실행
person1.run();
person2.run();
}
}
※ 여기서 MusicBoxListener는 정의된 생성자에 따라 여러개의 type, 객체를 건네줄 수 있으므로 다양한 객체가 선언될 수 있다.
※ 다만 run() 메소드를 통해 호출되는 메소드가 모두 하나로 공유하고 있는 동일 객체 내 존재하는 메소드이며, 다만 type에 맞게 개별적으로 실행되기 때문에 이 점에 유의하면서 동일 객체를 사용하면 된다.
프로그래머스 강의 - 공유객체
https://programmers.co.kr/learn/courses/9/lessons/273