PHP118 [PHP] 메모리 관리와 가비지 컬렉션 - unset, 순환 참조, gc_collect_cycles 등을 통한 메모리 누수 방지. PHP는 기본적으로 참조 횟수 계산 방식을 사용하여 메모리를 관리합니다.이 변수를 보고 있는 사람이 0명이면 메모리에서 지운다 라는 개념이며치명적인 약점이 있는데, 바로 서로가 서로를 참조할 때(순환 참조)'입니다. 1. 참조 카운팅변수를 unset() 하면 참조 카운트가 줄어들고, 0이 되면 즉시 메모리가 해제됩니다.echo "시작 메모리: " . memory_get_usage() . " bytes\n";$data = range(1, 100000); // 큰 배열 생성 (메모리 증가)echo "배열 생성 후: " . memory_get_usage() . " bytes\n";unset($data); // 변수 제거 -> 참조 카운트 0 -> 메모리 즉시 해제echo "unset 후: " . memory_.. 2025. 11. 30. [PHP] Magic Methods (__call, __get, __invoke) 매직 메소드(Magic Methods)는 PHP 클래스 내에서 특정 이벤트가 발생할 때 자동으로 호출되는 예약된 메소드들입니다. 이를 활용하면 간결한 객체 지향 코드를 작성할 수 있습니다. __get($name) 정의: 접근할 수 없는 속성(private, protected)이나 존재하지 않는 속성을 읽으려고 할 때 자동으로 호출됩니다. 용도: 속성을 동적으로 생성하거나, Private 속성을 읽기 전용(Read-only)으로 외부에 노출할 때 유용합니다. class UserProfile{ // 실제 데이터는 이 배열에 저장됩니다. private array $data = []; // 데이터를 설정하는 메소드 (일반 메소드) public function setInfo(string $k.. 2025. 11. 24. [PHP] Traits (트레이트) - 코드를 재사용하는 방법 개념설명트레이트는 클래스 기능(메소드 묶음)을 주입하기 위한 코드 재사용 메커니즘 입니다.PHP는 객체지향 언어처럼 단일 상속만 지원합니다즉, 하나의 클래스는 오직 하나의 부모 클래스만 extends할 수 있습니다. 서로 상속관계가 없는 여러 클래스에서 공통된 기능을 사용하고 싶을때가 있는데 예를들어 로그기록(logger), 파일업로드(uploader) 등 같은 기능들은 User, Product 다양한 클래스에서 필요할수있음.. 이때 트레이트를 사용하면 상속 관계와 무관하게 원하는 클래스에서 사용 할 수 있습니다.음.. 클래스에 필요한 기능들을 플러그인을 하는 것과 비슷합니다. extends(상속) vs use(트레이트) extends (상속): is a 관계 (자식 is a 부모). 클래스 간의 수직적.. 2025. 11. 17. [PHP] foreach 없이 두 배열의 '차이'와 '교집합' 찾기 array_diff(), array_intersect() 안녕하세요.오늘은 foreach 없이 두 배열의 '차이'와 '교집합' 을 찾아보도록 하겠습니다. 두 배열 간의 차이나, 교집합을 찾으려고 할 때 가장 단순한 방법은 foreach를 중첩해서 돌리는 것이지만,이 방법은 코드가 10줄 이상으로 길어지고 데이터가 많아지면 성능이 급격하게 나빠집니다. PHP는 '집합' 연산을 단 한 줄의 함수로 처리할 수 있는 내장 함수를 제공합니다. array_diff($arr1, $arr2) (차집합) - $arr1에는 있지만 $arr2에는 없는 요소들을 반환합니다. - 주의: 순서가 중요합니다! array_diff(A, B)와 array_diff(B, A)는 완전히 다른 결과를 반환합니다. array_intersect($arr1, $arr2) (교집합) - $arr1과.. 2025. 11. 12. [PHP] Secure Password Hashing - password_hash()로 비밀번호 저장 개념 설명 사용자의 비밀번호를 데이터베이스에 그대로 저장해서는 안 됩니다. 만약 데이터베이스가 유출되면 모든 사용자의 계정이 탈취되기 때문입니다. 이를 방지하기 위해 비밀번호는 해시된 형태로 저장해야 합니다. 해싱??임의의 길이 데이터를 고정된 길이의 데이터로 매핑하는 단방향 함수입니다. 해시 함수는 다음과 같은 특징을 가집니다.1. 단방향성: 원본 데이터(비밀번호)로 해시 값을 계산하기는 쉽지만, 해시 값으로 원본 데이터를 알아내는 것은 거의 불가능해야 합니다. md5()나 sha1() 같은 오래된 해시 함수는 이 원칙이 깨졌으므로 절대 비밀번호 저장에 사용하면 안 됩니다. 2. 솔팅 : 동일한 비밀번호라도 해싱할 때마다 결과가 달라져야 합니다. 이는 '레인보우 테이블' 공격(미리 계산된 해시 값 목록.. 2025. 11. 10. [PHP] array_merge와 + 연산자로 두 배열 합치기의 차이점 안녕하세요, 오늘은 array_merge와 + 연산자로 두 배열 합칠때의 차이점을 알아보도록 하겠습니다. PHP에서 두 배열을 합쳐야 할 때, array_merge() 함수와 + (배열 합집합 연산자) 를 사용할 수 있습니다. 그러나 이 둘은 키(Key)를 다루는 방식에서 차이가 있습니다.특히 숫자 키(Numeric Key)를 만났을 때 완전히 다르게 동작하니 주의해야 합니다. array_merge():배열을 뒤에 덧붙이고, 겹치는 문자열 키는 덮어씁니다.숫자 키는 전부 무시하고 새로 색인(re-index)합니다.+ (합집합):먼저 나온 키를 무조건 유지합니다.겹치는 키(숫자든 문자열이든)는 나중에 나온 값을 그냥 무시합니다.예제 1 - 숫자 키(Numeric Key) 처리 방식 차이 두 배열 모두.. 2025. 11. 9. [PHP] usort()로 '사용자 목록'을 '나이 순'으로 정렬 안녕하세요.오늘은 usort()로 '사용자 목록'을 '나이 순'으로 정렬해보도록 하겠습니다. PHP의 기본 sort() 함수는 [5, 1, 3] 같은 단순한 1차원 배열을 [1, 3, 5]로 정렬해줍니다. 하지만 여러 정보를 담고 있는 2차원 배열(혹은 객체 리스트)을 '나이(age) 순'이나 '이름(name) 순'으로 정렬할 때는 sort() 함수로 정렬하기 어렵습니다. 이런 경우 usort() (User-defined Sort)로 비교 규칙을 주어 정렬할 수 있습니다. usort()- 콜백 함수와 우주선 연산자 ()가 핵심입니다. - usort는 function($a, $b) { ... } 형태의 콜백 함수를 받습니다.- 이 함수는 배열의 두 요소($a, $b)를 받아서, 누가 더 큰지 알려주는 .. 2025. 11. 6. [PHP] NumberFormatter로 '2000000'을 '이백만'으로 변환하기 안녕하세요. 오늘은 NumberFormatter로 '2000000'을 '이백만'으로 변환해보도록 하겠습니다. PHP에서 숫자에 쉼표(,)를 찍을 때, 우리는 보통 number_format(1000000) -> 1,000,000을 사용합니다. 하지만 만약 이 숫자를 '₩1,000,000'처럼 그 나라의 통화 기호를 붙여서 표시하거나, '일백만'이라는 한글 단어로 변환해야 한다면 PHP의 intl 확장 기능에 포함된 NumberFormatter 클래스를 활용할 수 있습니다.이 클래스는 'ko_KR'(한국)이나 'en_US'(미국) 같은 '로캘(Locale)'을 인식하여, 해당 국가의 규칙에 맞게 숫자를 변환해 줍니다. NumberFormatter 클래스는 mbstring처럼 별도의 intl 확장 기능이 .. 2025. 11. 5. [PHP] IteratorAggregate - 루프에서 사용될 때 어떤 이터레이터를 사용할지 위임하기. [개념 설명]IteratorAggregate는 PHP의 SPL(Standard PHP Library)에 내장된 인터페이스입니다. 어떤 객체가 이 인터페이스를 구현하면, foreach 루프에서 사용될 때 어떻게 반복(iterate)해야 하는지를 다른 이터레이터 객체에게 위임할 수 있습니다. IteratorAggregate는 단 하나의 메소드, getIterator()만 구현하면 됩니다. 이 메소드는 반드시 Traversable 인터페이스(주로 Iterator 또는 다른 IteratorAggregate 객체)를 구현한 객체를 반환해야 합니다.[왜 Iterator 대신 IteratorAggregate를 사용할까요?]Iterator 인터페이스는 rewind(), current(), key(), next(), v.. 2025. 11. 3. 이전 1 2 3 4 ··· 14 다음