TIL : 221220

JINSEON YE·2022년 12월 20일

TIL

목록 보기
36/88
  1. Cannot find symbol 의미
    포괄적인 에러로 작성한 소스코드에 문제가 숨어있거나 컴파일 하는 방식에 문제가 있을 때 발생한다.

자바의 소스코드는 아래와 같은 구성요소 이루어져 있다.

  1. 키워드 : true, false, class, while 등

  2. 리터럴 : "Hello", 'H', 33 등

  3. 오퍼레이터나 알파벳, 숫자가 아닌 문자 : +, ", { 등

  4. 식별자 : 클래스명(Integer 등), 변수명(i 등), 함수명(toString 등)

  5. 주석 및 공백

이 때 cannot find symbol 은 식별자와 관련된 오류이다.

코드가 컴파일될 때 컴파일러는 소스코드의 식별자들이 각각 어떤 의미가 있는지 해석한다. 이 작업을 할 수 없는 경우(= 컴파일러가 소스코드를 해석할 수 없음) cannot find symbol 에러가 출력된다.

  1. Cannot find symbol 원인
    굉장히 다양한 원인이 때로는 복합적으로 있을 수 있다.
  1. 스펠링 오작성 : 예를들어 StringBuffer를 SpringBuffer로 작성. SpringBuffer 클래스가 없어 코드를 컴파일할 수 없다.

StringBuffer sb = new SpringBuffer();
Error:(5, 31) java: cannot find symbol
symbol: class SpringBuffer
location: class com.example.demo.cannotfindsymbol.Test

  1. 대소문자 오작성 : StringBuffer -> Stringbuffer로 작성.
  1. 변수 선언을 하지않고 사용

System.out.println(str); // 선언하지 않은 str 변수 사용

  1. 다른 영역에 선언한 변수를 사용하는 오류 : for문 영역의 변수를 외부에서 접근.

for(int i=0; i<2; i++){
System.out.println(i);
}

System.out.println(i); // i를 찾을 수 없어 오류

  1. 객체가 가지고 있지 않은 변수나 함수에 접근하는 경우

String str = "123";
str.reverse(); // String 객체는 reverse() 메소드가 없다.

  1. new 키워드를 작성하지 않은 경우

StringBuffer sb = StringBuffer();

  1. 같은 클래스명의 다른 패키지 클래스가 import 된 경우 : IDE의 자동 임포트 기능을 이용하다 보면 종종 발생한다. 사용하고자 하는 패키지의 클래스가 임포트 되었는지 확인한다.
  1. 세미콜론(;)이 잘못 작성된 경우 : 아래는 없어야 될 세미콜론이 중간에 작성되었다.

세미콜론에 의해 for(~~~) 와 코드블럭{ }이 분리되며 코드블럭{ }에서 i는 선언되지 않았으므로 오류가 발생한다.

for (int i = 0; i < 100; i++); {
System.out.println("i : " + i);
}

  1. 오퍼레이터가 오작성 된 경우 : 아래에서는 *를 생략함으로써 i라는 메소드를 찾으나 없으므로 오류가 발생한다.

int a = 1;
int b = 2;
int i = 1;

int result = i(a+b); // i(a+b) 에서 를 작성하지 않음

cannot find symbol 해결
발생할 수 있는 원인이 워낙 다양하고 복합적이다 보니, 오류가 발생한 부분을 중심으로 작성한 코드를 주의 깊게 디버깅하는 수밖에 없다.

개발자가 코드를 잘못 작성한 것 외에도 의도한 것과 다른 버전의 라이브러리를 사용했다던가(의존성 에러), IDE에서 문제가 있다던가, 특정 소스를 컴파일하지 않았던가 등의 다양한 원인이 있으므로 단계별로 살펴봐야 한다.

참고

charAt

문자열에서 문자 한개씩만 갖고올 수 있음.

Ex)

//알파벳을 입력하면 맨 앞 글자를 숫자로 변환해주는 프로그램 만들기(Scanner이용)
Scanner sc = new Scanner(System.in);
System.out.println("알파벳을 입력하세요");

char alpha = sc.nextLine().charAt(0); // 스캐너로 입력한 글자의 첫글자 갖고오기
int ialpha = (int)alpha;

System.out.println(ialpha);
Ex2)

String str = "안녕하세요";
System.out.println(str.charAt(1)); //"녕"이 출력

전위연산자/후위연산자

int a = 10;
int b;

//후위 연산자
b = a++; // 연산자 우선순위가 낮습니다.
// b=a를 먼저 진행 후 a에 1을 더함.
System.out.println("a=" + a + "b=" b); //a=11, b=10

//전위 연산자
b = ++a; // 연산자 우선순위가 높습니다.
//a+1을 먼저 진행후 b에 a+1값을 줌.
System.out.println("a=" + a + "b=" +b); //a=12, b=12

profile
백엔드 개발자

0개의 댓글