[java] 자바의 길이와 길이 ()

배열의 길이를 속성으로 사용하는 이유는 무엇 array.length이며 String의 경우 메소드가 str.length()있습니까?

이유가 있나요?



답변

먼저 비슷한 목적을 위해 세 가지 방법을 강조하겠습니다.

length어레이 ( int[], double[], String[]) – 배열의 길이를 알고

length()문자열 관련 객체 ( String, StringBuilder등)-문자열의 길이를 알기 위해

size()컬렉션 개체 ( ArrayList, Set등)-컬렉션의 크기를 알기 위해

이제 잊어 length()단지 생각 length하고 size().

length메서드가 아니므로 객체에 대해 작동하지 않는다는 것이 완전히 의미가 있습니다. 배열에서만 작동합니다.
size()그것의 이름은 그것을 더 잘 설명하고 그것이 메소드이기 때문에 내가 거기에서 말했듯이 컬렉션 (컬렉션 프레임 워크)과 함께 작동하는 객체의 경우에 사용될 것입니다.

이제 와서 length():
String은 원시 배열이 아니고 (그래서 우리는 사용할 수 없습니다 .length) 컬렉션도 아닙니다 (그래서 우리는 사용할 수 없습니다 ). 그래서 우리 .size()는 다른 하나가 필요합니다 length().

이유에 대한 대답으로 ?
유용하고, 기억하기 쉽고, 사용하기 쉽고 친근하다고 생각합니다.


답변

약간 단순화하면 배열이 일반 클래스가 아닌 특수한 경우라고 생각할 수 있습니다 (기본 요소와 비슷하지만 그렇지 않음). 문자열과 모든 컬렉션은 클래스이므로 크기, 길이 또는 유사한 것을 얻는 방법입니다.

디자인 당시의 이유는 성능 때문이라고 생각합니다. 오늘 만들었다면 아마도 배열 기반 컬렉션 클래스와 같은 것을 생각해 냈을 것입니다.

관심이 있다면 생성 된 코드에서 두 코드의 차이점을 설명하는 작은 코드 스 니펫이 있습니다. 먼저 소스 :

public class LengthTest {
  public static void main(String[] args) {
    int[] array = {12,1,4};
    String string = "Hoo";
    System.out.println(array.length);
    System.out.println(string.length());
  }
}

바이트 코드에서 중요하지 않은 부분을 잘라 내고 javap -c클래스 에서 실행 하면 마지막 두 줄에 대해 다음과 같은 결과가 나타납니다.

20: getstatic   #3; //Field java/lang/System.out:Ljava/io/PrintStream;
23: aload_1
24: arraylength
25: invokevirtual   #4; //Method java/io/PrintStream.println:(I)V
28: getstatic   #3; //Field java/lang/System.out:Ljava/io/PrintStream;
31: aload_2
32: invokevirtual   #5; //Method java/lang/String.length:()I
35: invokevirtual   #4; //Method java/io/PrintStream.println:(I)V

첫 번째 경우 (20-25)의 경우 코드는 JVM에 배열의 크기를 묻습니다 (JNI에서는 GetArrayLength ()에 대한 호출 일 것임). 반면 문자열의 경우 (28-35)에서는 다음을 수행해야합니다. 길이를 얻기위한 메소드 호출.

1990 년대 중반에 좋은 JIT와 물건이 없었다면 java.util.Vector (또는 이와 유사한 것) 만 있고 실제로 클래스처럼 작동하지는 않지만 빠르다는 언어 구조가 아니라면 성능이 완전히 저하되었을 것입니다. 물론 속성을 메서드 호출로 마스킹하고 컴파일러에서 처리 할 수 ​​있었지만 실제 클래스가 아닌 것에 메서드를 사용하는 것이 훨씬 더 혼란 스러웠을 것입니다.


답변

.lengthJava의 일회성 속성입니다. 1 차원 배열 의 크기를 찾는 데 사용됩니다 .

.length()방법입니다. 길이를 찾는 데 사용됩니다 String. 값 중복을 방지합니다.


답변

중히 여기다:

int[] myArray = new int[10];
String myString = "hello world!";
List<int> myList = new ArrayList<int>();

myArray.length    // Gives the length of the array
myString.length() // Gives the length of the string
myList.size()     // Gives the length of the list

문자열과 배열이 서로 다른 시간에 설계되었으므로 결국 서로 다른 규칙을 사용하게 될 가능성이 큽니다. 한 가지 이유는 문자열이 내부적으로 배열 length()을 사용하기 때문에 동일한 정보의 중복을 방지하기 위해 메서드 를 사용했다는 것입니다. 또 다른 방법 length()은 배열의 크기도 변경할 수 없지만 메서드를 사용하면 문자열의 불변성을 강조하는 데 도움이됩니다.

궁극적으로 이것은 언어가 처음부터 다시 디자인되면 확실히 고쳐질 진화 된 불일치 일뿐입니다. 내가 아는 한 다른 언어 (C #, Python, Scala 등)가 동일한 작업을 수행하지 않는 한 이는 언어의 일부로 끝난 약간의 결함 일 수 있습니다.

어쨌든 잘못된 것을 사용하면 오류가 발생합니다.


답변

Java에서 Array는 실제로 데이터를 보유하는 구조와 별도로 길이를 저장합니다. 배열을 만들 때 길이를 지정하면 배열의 정의 속성이됩니다. 길이 N의 배열에 무엇을하든 (값 변경, null 항목 등) 항상 길이 N의 배열이됩니다.

String의 길이는 부수적입니다. 그것은 문자열의 속성이 아니라 부산물입니다. Java Strings는 실제로는 변경할 수 없지만 내용을 변경할 수 있다면 길이를 변경할 수 있습니다. 가능한 경우 마지막 문자를 두드리면 길이가 줄어 듭니다.

나는 이것이 훌륭한 구별이라는 것을 이해하고 그것에 대해 투표를받을 수 있지만 사실입니다. 길이가 4 인 Array를 만들면 그 길이가 4 인 Array가 Array의 특징이며, 그 안에 무엇이 포함되어 있는지에 관계없이 사실입니다. “개”를 포함하는 문자열을 만들면 4 개의 문자를 포함하기 때문에 해당 문자열은 길이 4입니다.

나는 이것이 하나는 속성으로하고 다른 하나는 메소드로하는 것에 대한 정당화라고 본다. 사실, 의도하지 않은 불일치 일 수도 있지만, 항상 제게 이해가되며 항상 제가 그것에 대해 생각한 방식입니다.


답변

나는 배열의 경우 다음과 같은 두려움으로 인해 메소드를 통해 길이가 검색되지 않는다고 배웠습니다. 프로그래머는 루프에 들어가기 전에 길이를 지역 변수에 할당 할 것입니다 (조건부가 배열의 길이를 사용하는 for 루프를 생각해보십시오.) 프로그래머 함수 호출을 줄여서 성능을 향상시키기 위해 그렇게 할 수 있습니다. 문제는 루프 중에 길이가 변경 될 수 있지만 변수는 변경되지 않는다는 것입니다.


답변

배열이 생성 될 때마다 크기가 지정됩니다. 따라서 길이는 구성 속성으로 간주 될 수 있습니다. String의 경우 본질적으로 char 배열입니다. 길이는 char 배열의 속성입니다. 모든 것이이 필드를 필요로하지 않기 때문에 길이를 필드로 입력 할 필요가 없습니다.
http://www.programcreek.com/2013/11/start-from-length-length-in-java/