자바에서 ConstantPool질문입니다

조회수 663회

자바 공부하다 Constant Pool이란걸 알게됬습니다. Constant Pool과 hashcode()를 이용하면 private로 선언된 String 변수의 주소를 알아낼 수도 있겠다고 생각이 들어 코드를 짜고 돌려봤는데 자꾸 illegal start of expression이 발생합니다.

package project;

public class Main{
    public static void main(String[] args){//메인메소드
  private String name=new String("Caleb");//private로생성  illegal start of expression  발생
        System.out.println("First Reference="+name.hashcode());//1출력
Main operator=new Main();
        operator.runMethod0();
    }
}

public class AnotherClass{ 
    public void runMethod0(){
          public String irm="Caleb";//Canstant pool유도   illegal start of expression발생
        System.out.println("Second Reference="+irm.hashcode());//2출력
    }
    }

illegal start of expression이 발생하는 이유가 궁금합니다

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    먼저 제시한 코드가 문법에 맞질 않습니다.

    일단 기본적으로 접근 제한자는(private 같은) 메소드내에서는 사용할 수가 없습니다.

    둘째로 hashcode 메소드는 int 를 반환합니다. 문자열에 더했으니 그것도 컴파일 오류입니다.

    셋째로 Main 클래스에는 runMethod0 메소드도 없습니다.

    그리고 new String 을 하게 되면 constant pool 에 등록되는 것이 아닌 heap 에 등록됩니다.

    중요한 사실은 hashcode 는 메모리 주소같은 것은 아닙니다. hashcode 는 constants pool 의 값과 동일여부와 관계가 없습니다.

    참고 - jdk 1.8 에 구현된 hashCode 입니다.

    public int hashCode() {
            int h = hash;
            if (h == 0 && value.length > 0) {
                char val[] = value;
    
                for (int i = 0; i < value.length; i++) {
                    h = 31 * h + val[i];
                }
                hash = h;
            }
            return h;
        }
    

    중요한 사실은 리터럴로 문자열(String a = "" 형태)을 만들면 constants pool 에 등록되며 new 연산자를 사용하여 String 객체를 만들면 heap 에 저장됩니다.

    new 연산자를 이용하여 String 객체 생성후 intern 메소드를 사용하면 constants pool 에 명시적으로 등록할 수 있습니다.

    constants pool 에는 같은 문자열은 없습니다.

    즉 아래의 두개는 1개의 "abcd"만 constants pool 에 등록됩니다.

    String a = "abcd";
    String b = "abcd";
    
    • 친절한 답변 감사합니다. 그런데 System.out.println()메소드에서는 자동적으로 int 값도 String로 바꿔준다고 알고있는데 왜 int형인 예시.hashcode가 System.out.println()괄호안에 들어갈 경우 오류가 발생하는지 궁금합니다 김동현 2018.9.5 23:39
    • 바꿔주는 것이 아닙니다. prinltn(String) 이 있는 것이지요. 오류의 원인은 문자열에 int인 hashcode 를 더해서 생기는 문제입니다. 당연히 println(int) 도 정의되어 있으므로 hashcode 만 사용하면 문제 없습니다. 정영훈 2018.9.6 00:25
    • 아 감사합니다^^ 김동현 2018.9.7 21:56

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)