java를 통해 코드를 작성하다 보면, 원하는 길이를 반환해야 할 때에 다양한 메소드가 존재한다는 것을 알 수 있다. 문제가 있다면 각 상황에 맞는 메소드를 사용하지 않으면 오류가 발생한다는 점이다.
어떤 상황에서 무엇을 사용해야 하고, 왜 그 차이가 발생하는 것인지 정리해 보았다.
용어 | 데이터 타입 |
---|---|
length | 배열 |
length() | 문자열 |
size() | ArrayList 등 |
size()
는 가장 대표적으로 ArrayList에 사용하지만, 보편적으로는 컬렉션 프레임워크 타입(java.util.Collection
)의 길이를 잴 때에 사용된다.
표를 비교해 보면, length
를 쓰는 데이터타입과 size
를 쓰는 데이터타입의 차이점을 짐작할 수 있다.
배열과 문자열은 생성 후 변경 불가능한 객체immutable object이고, ArrayList는 변경이 가능한 객체인 것이다.
문자열은 바꿀 수 있지 않나?
java는 객체 지향 프로그램으로, OOP에서는 한 번 할당하면 내부 데이터를 변경할 수 없는 불변객체(immutable object)가 존재한다고 한다.String, Boolean, Integer, Float, Long
등이 존재하며, 이들은 재할당은 가능하지만 내부 데이터를 변경하는 행위는 불가능하다.
size()
는 java.util.Collection
표준 라이브러리의 모든 데이터 구조에서 상속한다. 즉, 해당 라이브러리의 메소드들은 size()
를 지원한다.
그렇다면 같은 length에서, 왜 한 쪽은 괄호()
가 붙은 것일까?
왜냐하면 한 쪽은 상수이고, 한 쪽은 메소드이기 때문이다. 맨 위의 테이블을 작성할 때에 메소드라고 적지 않은 이유를 여기서 알 수 있다.
length
는 상수로, 배열이 선언될 때 최초의 길이를 저장하고 있다. 현재 배열에 저장한 요소 수가 아닌, 선언한 길이를 담고 있는 것이다. 모든 배열은 해당 상수를 필드로 가지고 있다.
length()
는 메소드로, String에서 호출되면 해당하는 문자 수를 리턴한다. 문자열은 열의 크기와 문자의 수가 동일하다.
https://stackoverflow.com/questions/20192843/difference-between-size-and-length-methods
https://ko.wikipedia.org/wiki/%EB%B6%88%EB%B3%80%EA%B0%9D%EC%B2%B4