[Java] 공유객체

Hyo Kyun Lee·2022년 2월 3일
0

Java

목록 보기
42/49

1. 공유객체

여러 개의 스레드가 동일한 객체를 참조 및 공유하고 있을때, 해당 객체를 공유객체라 일컫는다.

2. 여러개의 thread가 하나의 객체를 공유한다.

예를 들어, MusicPlayer라는 여러 class들이 MusicBox라는 하나의 클래스를 공유하되, MusicPlayer 객체를 다른 인자를 기반으로하여 다양한 생성자를 만들어내도록 구현해보자.

2-1. 공유받는 객체 생성

MusicPlayer라는 클래스는 MusicBox라는 하나의 객체를 공유받는다.

public class MusicBox{
	public void PlayMusicA(){
    	System.out.println("played music A");
    }
    
    public void PlayMusicB(){
		System.out.println("played music B");
    }
}

2-2. 공유객체 생성자 생성 및 run() 메소드 작성을 위한 thread 생성

위 공유객체를 실제로 활용할 수 있도록 생성자를 생성하고 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;
        }
    }
}

2-3. thread 실제 실행을 위한 main thread 생성

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에 맞게 개별적으로 실행되기 때문에 이 점에 유의하면서 동일 객체를 사용하면 된다.

  • MusicBoxListener 객체에서 run 메소드 실행
  • 생성자를 통해 box 객체가 전달되면서, 해당 type에 맞게 switch문 실행
  • 전달된 객체 모두 동일한 공유 객체를 가지며, 해당 객체에서 type과 관련한 메소드를 실행

3. 참조자료

프로그래머스 강의 - 공유객체
https://programmers.co.kr/learn/courses/9/lessons/273

0개의 댓글