자바의 소스코드는 아래와 같은 구성요소 이루어져 있다.
키워드 : true, false, class, while 등
리터럴 : "Hello", 'H', 33 등
오퍼레이터나 알파벳, 숫자가 아닌 문자 : +, ", { 등
식별자 : 클래스명(Integer 등), 변수명(i 등), 함수명(toString 등)
주석 및 공백
이 때 cannot find symbol 은 식별자와 관련된 오류이다.
코드가 컴파일될 때 컴파일러는 소스코드의 식별자들이 각각 어떤 의미가 있는지 해석한다. 이 작업을 할 수 없는 경우(= 컴파일러가 소스코드를 해석할 수 없음) cannot find symbol 에러가 출력된다.
StringBuffer sb = new SpringBuffer();
Error:(5, 31) java: cannot find symbol
symbol: class SpringBuffer
location: class com.example.demo.cannotfindsymbol.Test
System.out.println(str); // 선언하지 않은 str 변수 사용
for(int i=0; i<2; i++){
System.out.println(i);
}
System.out.println(i); // i를 찾을 수 없어 오류
String str = "123";
str.reverse(); // String 객체는 reverse() 메소드가 없다.
StringBuffer sb = StringBuffer();
세미콜론에 의해 for(~~~) 와 코드블럭{ }이 분리되며 코드블럭{ }에서 i는 선언되지 않았으므로 오류가 발생한다.
for (int i = 0; i < 100; i++); {
System.out.println("i : " + i);
}
int a = 1;
int b = 2;
int i = 1;
int result = i(a+b); // i(a+b) 에서 를 작성하지 않음
cannot find symbol 해결
발생할 수 있는 원인이 워낙 다양하고 복합적이다 보니, 오류가 발생한 부분을 중심으로 작성한 코드를 주의 깊게 디버깅하는 수밖에 없다.
개발자가 코드를 잘못 작성한 것 외에도 의도한 것과 다른 버전의 라이브러리를 사용했다던가(의존성 에러), IDE에서 문제가 있다던가, 특정 소스를 컴파일하지 않았던가 등의 다양한 원인이 있으므로 단계별로 살펴봐야 한다.
문자열에서 문자 한개씩만 갖고올 수 있음.
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