-
length(속성, Property)
-
특징
- 속성 형태로 존재
- 괄호 없이 사용
- 주로 배열(Array), 문자열(String) 길이에 사용됨
- 값은 항상 정수
-
장점
- 간단하게 접근 가능
- 괄호가 없어 코드가 직관적임
- 성능이 약간 빠름(단순 값 조회이기 때문에)
-
단점
- 일부 언어에서는 문자열에는 사용 불가(JavaScript 제외)
- 값을 가져오는 속성이기 때문에 사용자가 값을 바꿀수 없음
let arr = [1,2,3,4];
console.log(arr.length) //4
let str = "Hello";
console.log(str.lenght) // 5
int[] nums = {1,2,3};
System.out.println(nums.length); //3
-
length()
- 매서드 형태
- 반드시 괄호 사용
- 문자열의 길이를 구할 때 자주 사용됨
- 실행 시 계산되므로 동적으로 처리 가능
- 장점
- 문자열 같은 객체에서 사용할 수 있음
- 메서드이므로 내부 로직에서 추가 계산 가능
- 단점
- 괄호를 사용해야 되서 코드가 약간 길어짐
- 단순 조회보다 약간 느림
중요
length 가 문자열 배열 다 사용 가능해서 length()는 사용 안해도 된다고 GPT에 물었더니 언어에 따라 쓰는 것이 다르다고 나옴
- java는 배열 → length, 문자열 →length()
int[] arr = {1,2,3};
System.out.println(arr.length); // 3 ✅
String str = "Hello";
System.out.println(str.length()); // 5 ✅
- js는 배열 문자열 →length 속성을 사용
let arr = [1,2,3];
console.log(arr.length); // 3 ✅
let str = "Hello";
console.log(str.length); // 5 ✅
- 파이썬은 len() 함수로 문자열, 리스트 등 길이 측정
s= "Hello"
print(len(s)) # 5
lst = [1,2,3]
print(len(lst)) # 3
-
정적(Static)
- 특징
- 컴파일 시점에 결정되는 것
- 변수, 타입, 메서드 등이 컴파일 시 이미 메모리 구조가 결정됨
- 클래스 레벨에서 공유되거나 고정된 구조
- 메모리 할당이 미리 고정됨
- 장점
- 컴파일 시 결정되므로 성능이 빠름
- 안정적, 예측 가능
- 타입 검사 (Type check)강력 → 오류를 미리 잡을 수 있음
- 단점
- 유연성이 낮음 (실행중 값이나 구조 변경 어려움)
- 메모리를 미리 잡아야 되서 메모리 낭비 가능
class Counter{
static int count = 0; //정적 변수
Counter(){count++;}
}
Counter a = new Counter();
Counter b = new Counter();
System.out.println(Counter.count); //2, 클래스 레벨에서 공유
-
동적(Dynamic)
- 특징
- 실행 시점에 결정되는 것
- 변수 , 타입, 메모리, 구조 등을 런타입에 생성/ 변경 가능
- 메모리 할당/ 해제도 실행 중 수행
- 장점
- 유연성이 뛰어남 (실행 중 크기(이거는 메모리 크기), 값, 구조 변경 가능)
- 프로그램 실행 환경에 맞취 메모리 최적화 가능
- 단점
- 성능이 정적보다 느림(런타임 계산/관리 필요)
- 잘못쓰면 메모리 누수 가능
- 실행 중 동적으로 할당함 메모리를 제대로 해제하지 않아서 사용하지 않는 메모리가 계속 남아있는 상태
- 타입/ 구조 오류를 실행 시점에 발견 → 디버깅 어려움
import java.util.ArrayList;
ArrayList<Integer> list= new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list.size());
-
컴파일
- 코드를 기계가 이해할수 있는 형태로 변환하는 과정(1,0, 즉 기계어로 바로 변환될 수도 있고, 바이트코드로 변환할 수도 있음 바이트 코드에서 가상머신이 실행시점에 바이트 코드 → 기계어로 변환)
- 컴파일 때 일어나는 일
- 문법 체크
- 타입 검사
- 상수 계산, 정적 메모리 예약 등 정적 정보 결정
- 특징
- 실행 전에 일어남
- 빌드 할때 수행
- 정적 요소 결정
-
런타임
- 프로그램이 실제로 실행되는 시점
- JAVA라면 JVM이 .class 파일을 읽어 메모리에 올리고 실행
- 런타임때 일어나는 일
- 객체 생성, 변수 값 변경, 동적 메모리 할당 등
- 사용자 입력 처리
- 동적 연산 수행
- 특징 프로그램 실행 중 발생
- 동적 요소 처리: ArrayList 크기, 객체 수 사용자 입력
-
메모리 누수가 발생하는 대표적 상황
-
참조를 끊지 않음
- java, Python같은 가비지 컬렉션 언어도 완전히 안전한 것은 아니다.
- 객체가 더 이상 필요해도 어떤 참조를 끊지 않으면 GC가 회수 못함
List<int[]> list = new ArrayList<>();
while(true){
list.add(new int[1000]) //계속 새로운 배열 추가
//list.clear() 또는 참조 해제를 안 하면 계속 메모리 사용
}
-
의문이 생겨서 알은 것
-
메모리 구조 개념