Cannot make a static reference to the non-static method solution(String) from the type Main

서현서현·2022년 12월 30일
0

작은 실수들

목록 보기
14/19
class Main {
	public boolean A(){}
	
    public ArrayList<Integer> solution(){
    	if(A()) System.out.println("B");
    }
    
    public static void main(String args[]){
    	Main T = new Main();
        System.out.println(T.solution());
    }
}

대강 위와같은 코드가 있을때 갑자기 의문이 생김!!

왜 main함수에서는 T.solution() 형태로 메소드를 호출하는데, solution()메소드에선 A메소드 호출시 객체생성없이 메소드 이름만 사용하는 차이가 있는가??

생각해보면 지금까진 늘 메소드 호출시에 걍 메소드이름만 썼음... 그래서 알아봤더니
같은 클래스 내의 메소드를 호출할땐 메소드 이름만 써도 된다!!!

그렇다면 main메소드에선 왜 객체를 생성한 뒤에 사용했을까?? 해서 객체생성 구문을 없앴더니

Cannot make a static reference to the non-static method solution(String) from the type Main

위와같은 오류가 떴다. 해석하자면 static메소드에선 non-static 메소드를 참조할 수 없다는거임
이거 해결하는 방법은 두가지가 있음

  1. 객체를 생성해주거나
  2. non-static 메소드에 static을 붙여주거나

원인은 무엇인가? 간단하다.
main메소드와 같은 static메소드는 클래스객체 외부에 존재한다. (자바 프로그램 시작시 처음시작부분을 정해야하는데 클래스 밖에 존재해야 클래스가 생성되는 구문이 없어도 실행이 되겠지!!)
즉!! static구문이 붙지 않은 solution()이라는 객체의 메소드는 Main T = new Main()이라는 구문이 실행되어야만 존재 할 수 있기 때문이다!! 따라서 아직 존재하지 않는거임...!!!

간단하고 또 기초적인 부분인데.. 메소드를 들 static을 붙여서 만들다보니 이런 바보같은 질문을 해버렸다^^ㅎㅎ 이제 알았으니 됐다!!!!!!!


참고로...

String str = new StringBuilder(s).reverse().toString();
int a = Integer.parseInt(str);

두 변수의 창를 보면 StringBuilder()의 경우는 객체를 생성했고, Integer.parseInt()의 경우 객체를 생성하지 않고 클래스.메소드() 형태이다.
자연스럽게 이렇게 쓰고있었는데 갑자기 혼란이 와서 다시 공부해보니 이것도 static의 문제임!!!!!


사진을 보면 알 수 있듯이 Integer클래스의 parseInt() 메소드는 static이고 Stringbuilder는 아님! 그러므로 결론은

다른 클래스에 있는 static 메소드의 경우 클래스.메소드() 형태로 호출할 수 있다! non-static일경우 new로 객체를 반드시 생성해야됨!!

0개의 댓글