JAVA_오류해결1

호근·2022년 12월 11일
0

java

목록 보기
24/35

메인 메서드가 인스턴스를 참조하려면
서로 다른 클래스로 분리되어있어야한다.


class Vehicle{
	public static void main(String[] args){
    	Wheel wheel = new Wheel(); 
    }
}

class Wheel{
	. . .
}

정정된 코드

public class StudyAbstract {
public static void main (String[] args) {
		
		CDPlayer cdp = new CDPlayer();
		System.out.println(cdp.currentTrack);
	}


}

abstract class Player{
	boolean pause; // 일시정지 상태저장 변수
	int currentPos; // 현재 Play되고있는 위치를 저장하는 변수
	
	public Player() {
		pause = false;
		currentPos = 0;
	}
	
	
	/** pos 에서 재생을 시작하는 기능이 수행되도록 작성해야한다.**/
	abstract void paly(int pos);
	/** 재생을 즉시 멈추는 기능을 수행하도록 작성되어야한다. **/
	abstract void stop();
	
	void play() {
		paly(currentPos); // 추상메서드를 사용할 수 있다.
	}
	
	void pause() {
		if(pause) {
			pause = false;
			play();
		} else {
			pause = true;
			stop();
		}
	}
}

class CDPlayer extends Player{
	public CDPlayer() {
		// TODO Auto-generated constructor stub
	}
	@Override
	void paly(int pos) {

	}

	@Override
	void stop() {
		
	}
	
	int currentTrack; // 현재 재상중인 트랙
	void nextTrack() {
		currentTrack ++;
	}
	
	void preTrack() {
		if(currentTrack > 1) {
			currentTrack --;
		}
	}
}

메인메서드는 static으로 지정되기 때문에
인스턴스의 원형이 같은 클래스 내부에 있을 때 Run하면
클래스가 로드되는 시점에 메인메서드는 메모리상에 올라간다.
덕분에 객체를 인스턴스화하면 오류가 난다.

클래스로더는 메인메서드부터 읽지만, 메인메서드를 읽을 때 인스턴스는 아직 읽기 전이기 때문.


인스턴스가 같은 클래스가 아닌 다른 클래스에 위치한 상태로 Run하면,

클래스로더는 클래스부터 메모리에 올리기 때문에 별개의 클래스 상태인 CDPlayer나 Player클래스는 main메서드가 실행되기 전에 이미 로드를 마친 상태일것이라 추측.. 한다..
메인메서드는 가장 나중에 실행되어야 하니까..

클래스로더가 클래스를 읽는 순서가 알고싶어서 영문으로 검색해보았는데,
너무 딥한내용들이 나와서 해당 내용들을 학습하기엔 아직 시기상조인것같아서 이정도로 이해하고 넘어가려한다.

훗날에 심층적인 학습이 필요할것같긴하다.

profile
22.11.28 ~

0개의 댓글