1. length(속성, Property)

    1. 특징

      1. 속성 형태로 존재
      2. 괄호 없이 사용
      3. 주로 배열(Array), 문자열(String) 길이에 사용됨
      4. 값은 항상 정수
    2. 장점

      1. 간단하게 접근 가능
      2. 괄호가 없어 코드가 직관적임
      3. 성능이 약간 빠름(단순 값 조회이기 때문에)
    3. 단점

      1. 일부 언어에서는 문자열에는 사용 불가(JavaScript 제외)
      2. 값을 가져오는 속성이기 때문에 사용자가 값을 바꿀수 없음
      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
      
  2. length()

    1. 매서드 형태
    2. 반드시 괄호 사용
    3. 문자열의 길이를 구할 때 자주 사용됨
    4. 실행 시 계산되므로 동적으로 처리 가능
    5. 장점
      1. 문자열 같은 객체에서 사용할 수 있음
      2. 메서드이므로 내부 로직에서 추가 계산 가능
    6. 단점
      1. 괄호를 사용해야 되서 코드가 약간 길어짐
      2. 단순 조회보다 약간 느림

중요

length 가 문자열 배열 다 사용 가능해서 length()는 사용 안해도 된다고 GPT에 물었더니 언어에 따라 쓰는 것이 다르다고 나옴

  1. java는 배열 → length, 문자열 →length()
int[] arr = {1,2,3};
System.out.println(arr.length); // 3 ✅

String str = "Hello";
System.out.println(str.length()); // 5 ✅
  1. js는 배열 문자열 →length 속성을 사용
let arr = [1,2,3];
console.log(arr.length); // 3 ✅

let str = "Hello";
console.log(str.length); // 5 ✅
  1. 파이썬은 len() 함수로 문자열, 리스트 등 길이 측정
s= "Hello"
print(len(s)) # 5

lst = [1,2,3]
print(len(lst)) # 3
  1. 정적(Static)

    1. 특징
      1. 컴파일 시점에 결정되는 것
        1. 변수, 타입, 메서드 등이 컴파일 시 이미 메모리 구조가 결정됨
      2. 클래스 레벨에서 공유되거나 고정된 구조
      3. 메모리 할당이 미리 고정됨
    2. 장점
      1. 컴파일 시 결정되므로 성능이 빠름
      2. 안정적, 예측 가능
      3. 타입 검사 (Type check)강력 → 오류를 미리 잡을 수 있음
    3. 단점
      1. 유연성이 낮음 (실행중 값이나 구조 변경 어려움)
      2. 메모리를 미리 잡아야 되서 메모리 낭비 가능
    class Counter{
    	static int count = 0; //정적 변수
    	Counter(){count++;}
    }
    
    Counter a = new Counter();
    Counter b = new Counter();
    System.out.println(Counter.count); //2, 클래스 레벨에서 공유
    
  2. 동적(Dynamic)

    1. 특징
      1. 실행 시점에 결정되는 것
        1. 변수 , 타입, 메모리, 구조 등을 런타입에 생성/ 변경 가능
      2. 메모리 할당/ 해제도 실행 중 수행
    2. 장점
      1. 유연성이 뛰어남 (실행 중 크기(이거는 메모리 크기), 값, 구조 변경 가능)
      2. 프로그램 실행 환경에 맞취 메모리 최적화 가능
    3. 단점
      1. 성능이 정적보다 느림(런타임 계산/관리 필요)
      2. 잘못쓰면 메모리 누수 가능
        1. 실행 중 동적으로 할당함 메모리를 제대로 해제하지 않아서 사용하지 않는 메모리가 계속 남아있는 상태
      3. 타입/ 구조 오류를 실행 시점에 발견 → 디버깅 어려움
    import java.util.ArrayList;
    ArrayList<Integer> list= new ArrayList<>();
    list.add(1);
    list.add(2);
    System.out.println(list.size());
    
    
  3. 컴파일

    1. 코드를 기계가 이해할수 있는 형태로 변환하는 과정(1,0, 즉 기계어로 바로 변환될 수도 있고, 바이트코드로 변환할 수도 있음 바이트 코드에서 가상머신이 실행시점에 바이트 코드 → 기계어로 변환)
    2. 컴파일 때 일어나는 일
      1. 문법 체크
      2. 타입 검사
      3. 상수 계산, 정적 메모리 예약 등 정적 정보 결정
    3. 특징
      1. 실행 전에 일어남
      2. 빌드 할때 수행
      3. 정적 요소 결정
  4. 런타임

    1. 프로그램이 실제로 실행되는 시점
    2. JAVA라면 JVM이 .class 파일을 읽어 메모리에 올리고 실행
    3. 런타임때 일어나는 일
      1. 객체 생성, 변수 값 변경, 동적 메모리 할당 등
      2. 사용자 입력 처리
      3. 동적 연산 수행
    4. 특징 프로그램 실행 중 발생
    5. 동적 요소 처리: ArrayList 크기, 객체 수 사용자 입력
  5. 메모리 누수가 발생하는 대표적 상황

    1. 참조를 끊지 않음

      1. java, Python같은 가비지 컬렉션 언어도 완전히 안전한 것은 아니다.
      2. 객체가 더 이상 필요해도 어떤 참조를 끊지 않으면 GC가 회수 못함
      List<int[]> list = new ArrayList<>();
      while(true){
      	list.add(new int[1000]) //계속 새로운 배열 추가
      	//list.clear() 또는 참조 해제를 안 하면 계속 메모리 사용
      }
      
    2. 의문이 생겨서 알은 것

    3. 메모리 구조 개념