에듀테크 부트캠프

Java 필드와 메서드의 차이: 배열.length vs String.length()

wy-family 2025. 3. 10. 22:17

length 메소드에 대해서, String 에서는 length() 였는데, 배열에서는 () 가 없이 그냥 length 더라고. 왜 그런거야? String[] testArr = new String[3]; for(int i = 0; i < names.length; i++) { } String test = "test"; for(int i = 0; i < test.length(); i++) { }

ChatGPT의 말:

좋은 질문이야! String과 배열에서 length를 다르게 사용하는 이유는, String클래스이고, 배열은 기본적으로 제공되는 데이터 타입의 일부이기 때문이야.


🔍 1. String.length()

String은 **클래스(class)**야. 따라서 length는 메서드로 제공돼.
length()String 객체 내부에서 호출되며, 문자열의 길이를 반환해.

java

코드 복사

String test = "hello";

System.out.println(test.length()); // 5

 

여기서 .length()String 클래스의 인스턴스 메서드야.
자바 내부적으로 length() 메서드는 char 배열(char[])의 길이를 반환하도록 구현되어 있어.


🔍 2. 배열.length

배열은 String과 다르게 객체이긴 하지만, 자바에서 특별 취급하는 자료형이야.
즉, 배열.length는 **메서드가 아니라, 배열의 길이를 나타내는 "변수(필드)"**야.

java

코드 복사

int[] numbers = {1, 2, 3, 4, 5};

System.out.println(numbers.length); // 5

 

배열의 length는 자바에서 final 필드로 선언된 변수이기 때문에, 메서드처럼 ()가 붙지 않아.


🧐 정리하자면?

  • String.length()String 클래스 내부의 메서드
  • 배열.length → 배열의 크기를 나타내는 필드(변수)

이 차이를 기억하면 헷갈리지 않을 거야! 🚀

나의 말:

어떤 클래스 내부의 메서드를 사용하려면 () 괄호를 사용해야 한다는 건 알겠어. String 뿐만 아니라, 어떤 클래스든 그렇다고 이해하고 있어. 근데 배열의 크기를 나타내는 필드, 변수에 값을 출력한다는 건 어떤 의미인걸까? 필드가 무엇인지 구체적으로 설명해줄래?

ChatGPT의 말:

좋아! "필드"가 무엇인지 이해하면, 배열.length가 왜 () 없이 사용되는지 확실히 이해할 수 있을 거야.


✅ 필드(Field)란?

자바에서 **필드(Field)**란 클래스 내부에서 선언된 변수를 의미해.
즉, **객체가 가지는 데이터(속성)**를 저장하는 공간이야.

🔹 예제: 필드가 있는 클래스

java

코드 복사

class Person {

    String name;  // 필드 (객체의 속성)

    int age;      // 필드 (객체의 속성)

}

 

위 코드에서 nameagePerson 클래스의 필드야.
이 필드는 객체가 생성될 때 각각 저장될 값을 가지게 돼.

java

코드 복사

Person p1 = new Person();

p1.name = "Alice";

p1.age = 25;

 

System.out.println(p1.name); // Alice

System.out.println(p1.age);  // 25

 

이렇게 필드객체의 속성을 저장하는 변수야.
그리고 객체의 필드는 객체명.필드명으로 접근할 수 있어.


배열.length는 왜 필드일까?

자바에서 배열은 특별한 객체이고, 배열의 크기를 저장하는 length라는 필드를 가지고 있어. 즉, 배열.length는 **배열 객체가 가지고 있는 속성(필드)**이야.

java

코드 복사

int[] numbers = {1, 2, 3, 4, 5};

System.out.println(numbers.length); // 5

 

위 코드에서 numbers.length배열의 크기를 저장하는 필드야.
즉, numbers 객체가 가지고 있는 length라는 속성을 출력하는 것뿐이야.

🚨 중요한 점!

  • lengthfinal 필드이기 때문에 한 번 정해지면 바꿀 수 없어.
  • 따라서 numbers.length = 10; 이런 식으로 값을 변경할 수 없어.

String.length()는 왜 메서드일까?

배열과 달리 String은 내부적으로 문자(char) 배열을 감싼 클래스야.
즉, String 객체는 length 값을 직접 저장하지 않고, 메서드(length())를 통해 길이를 계산해 반환해.

java

코드 복사

public final class String {

    private final char[] value;  // String 내부에는 char 배열이 있음

 

    public int length() { 

        return value.length;  // 내부 char 배열의 길이를 반환

    }

}

 

즉, String.length()는 단순히 값을 저장하는 필드가 아니라, 메서드를 호출해서 길이를 계산하는 방식이기 때문에 ()를 붙여야 해.


🚀 최종 정리

구분 필드(Field) 메서드(Method)
역할 값을 저장하는 변수 특정 동작(계산, 로직 실행 등)을 수행하는 함수
사용 예시 배열.length String.length()
() 필요 여부 ❌ (배열.length) ✅ (String.length())

📌 한 마디로 요약하면?

  • **배열의 length는 "필드(변수)"**이므로 () 없이 사용한다.
  • **String.length()는 "메서드(함수)"**이므로 ()가 필요하다.

이제 확실히 이해됐지? 😉

나의 말:

필드를 이해하니까 이해가 확 되네. 그러면 배열이 가지고 있는 필드, 즉 해당 배열이 가지고 있는 내부의 여러 값 중에 길이가 있다는 건 알겠어. 그러면 length 말고 가지고 있는 중요한 값들은 뭐가 있어?

ChatGPT의 말:

좋아! 필드를 이해했으니, 배열이 가지고 있는 다른 중요한 값(필드나 기능)이 무엇이 있는지 살펴보자.


✅ 배열이 가지고 있는 중요한 필드

배열은 자바에서 특별한 객체이고, length 외에도 몇 가지 중요한 값들이 있어. 하지만 배열은 기본적으로 length 외에는 필드가 많지 않아. 대신, 배열을 다루기 위한 **유용한 메서드가 포함된 클래스(Arrays)**를 제공해.


🔹 1. length (배열의 크기)

가장 중요한 필드! 배열의 크기(길이)를 나타냄.

java

코드 복사

int[] numbers = {10, 20, 30, 40};

System.out.println(numbers.length); // 4

 


🔹 2. 배열의 기본 필드는 length 하나뿐! 🤯

배열 자체에는 사용자가 접근할 수 있는 필드는 length 하나뿐이야.
하지만 배열과 관련된 유용한 기능(메서드)들은 Arrays 클래스에 포함되어 있어.


✅ 배열과 함께 사용하면 좋은 Arrays 클래스의 기능

배열은 length 필드 외에는 제공하는 필드가 거의 없지만,
자바에서 배열을 다루기 위한 유틸리티 클래스java.util.Arrays가 제공하는 중요한 메서드들이 있어.

🔹 1. Arrays.toString(배열) → 배열 내용을 보기 좋게 출력

java

코드 복사

import java.util.Arrays;

 

int[] numbers = {10, 20, 30, 40};

System.out.println(Arrays.toString(numbers)); // [10, 20, 30, 40]

 

💡 배열을 직접 출력하면 주소값이 나오지만, Arrays.toString()을 사용하면 내용이 출력돼.


🔹 2. Arrays.sort(배열) → 배열 정렬하기

java

코드 복사

int[] numbers = {30, 10, 20, 40};

Arrays.sort(numbers);  // 오름차순 정렬

System.out.println(Arrays.toString(numbers)); // [10, 20, 30, 40]

 

💡 sort()를 사용하면 배열을 쉽게 정렬할 수 있어.


🔹 3. Arrays.fill(배열, 값) → 모든 요소를 특정 값으로 채우기

java

코드 복사

int[] numbers = new int[5];

Arrays.fill(numbers, 7);

System.out.println(Arrays.toString(numbers)); // [7, 7, 7, 7, 7]

 

💡 배열을 초기화할 때 유용해!


🔹 4. Arrays.copyOf(배열, 새로운 길이) → 배열 복사하기

java

코드 복사

int[] numbers = {10, 20, 30};

int[] newNumbers = Arrays.copyOf(numbers, 5);

System.out.println(Arrays.toString(newNumbers)); // [10, 20, 30, 0, 0]

 

💡 크기를 늘리거나 줄여서 새로운 배열을 만들 수 있어.


🔹 5. Arrays.equals(배열1, 배열2) → 두 배열이 같은지 비교하기

java

코드 복사

int[] arr1 = {1, 2, 3};

int[] arr2 = {1, 2, 3};

System.out.println(Arrays.equals(arr1, arr2)); // true

 

💡 배열은 ==로 비교하면 주소값을 비교하므로, 값을 비교할 때는 Arrays.equals()를 사용해야 해.


🔹 6. Arrays.binarySearch(배열, 값) → 정렬된 배열에서 특정 값 찾기

java

코드 복사

int[] numbers = {10, 20, 30, 40, 50};

int index = Arrays.binarySearch(numbers, 30);

System.out.println(index); // 2

 

💡 이진 탐색(Binary Search) 알고리즘을 사용하므로, sort()로 정렬된 상태에서 사용해야 해.


🚀 최종 정리

배열 자체는 length 필드만 가지고 있지만,
배열을 다루기 위해 java.util.Arrays 클래스의 기능을 활용하면 훨씬 편리하게 사용할 수 있어!

기능 사용법
배열 크기 확인 배열.length
배열 내용 출력 Arrays.toString(배열)
배열 정렬 Arrays.sort(배열)
배열 특정 값으로 채우기 Arrays.fill(배열, 값)
배열 복사 Arrays.copyOf(배열, 새로운 길이)
배열 비교 Arrays.equals(배열1, 배열2)
배열에서 특정 값 찾기 Arrays.binarySearch(배열, 값)

이제 배열을 더 강력하게 다룰 수 있겠지? 😆🎯

나의 말:

그러면, 메소드는 ()를 쓰는거고, () 를 쓰지 않으면 필드라고 이해가 되는데, System.out.println(); 이라고 하면, out 은 System의 필드인거고, println()은 out의 메소드인건가?

ChatGPT의 말:

정확해! 🎯
System.out.println();을 분석하면,

1️⃣ outSystem 클래스의 필드
2️⃣ println()out 필드의 메서드

라는 구조가 돼. 이제 차근차근 살펴보자!


System.out.println(); 구조 분석

1️⃣ System 클래스

System은 **자바의 기본 제공 클래스(java.lang.System)**야.
여기에는 프로그램 실행과 관련된 여러 기능이 포함돼 있어.

2️⃣ out 필드 (System.out)

outSystem 클래스 내부에 있는 정적(static) 필드야.

java

코드 복사

public final class System {

    public static final PrintStream out = ...;

}

 

🚨 즉, System.outPrintStream 타입의 필드야!
여기서 PrintStream은 출력과 관련된 기능을 제공하는 클래스야.

outSystem 클래스 내부의 "필드"(변수)이므로 ()가 필요 없음.


3️⃣ println() 메서드 (out.println())

System.out의 타입은 PrintStream이므로, println()PrintStream 클래스에 정의된 메서드야.

java

코드 복사

public class PrintStream {

    public void println(String x) {

        // 문자열을 출력하는 코드

    }

}

 

즉, System.out.println("Hello")을 실행하면,

  1. System.outPrintStream 객체를 가져옴
  2. println("Hello")PrintStream 클래스의 메서드를 호출하여 화면에 출력

println()메서드이므로 ()를 붙여서 호출해야 함.


✅ 결론 🎯

코드 필드 vs 메서드 설명
System.out 필드 (변수) System 클래스의 정적 필드 (출력 스트림)
out.println() 메서드 (함수) PrintStream 클래스의 출력 메서드

📌 정리하면?

  • System.outSystem 클래스의 필드() 필요 없음
  • println()PrintStream 클래스의 메서드() 필요함

이제 확실히 이해됐지? 😆 🚀