Home
home
🏡 홈
home

정적변수, 정적메서드에 대하여

분류
개발지식
태그
PHP
작성자
작성일
2024/03/31 12:31
개발자 중에서 static 에 대해 정확히 이해 못하는 경우가 의외로 많다. (특히, 웹개발분야) 이 부분을 입문자가 알아듣기 쉽게, 예시코드와 함께 정리해보았다.
(아래 설명은 출처없이 개인적인 지식으로 기술한 거이며, php 기준으로 설명이 된 것이므로 예외 케이스가 있음을 참고 바랍니다.)

정적변수란 ?

일단, 위키백과에서 얘기하는 일반적인 설명을 보자.
컴퓨터 프로그래밍에서 정적 변수(靜的變數, static variable)는 정적으로 할당되는 변수이며, 프로그램 실행 전반에 걸쳐 변수의 수명이 유지된다.
JavaScript
복사
쉽게 해석하자면, 프로그램 시작~종료까지 유지되는 변수라고 보면 된다.

전역변수 vs 정적변수

여기서 의문이 드는게 하나 있는데, 우리가 알고 있는 전역변수와 너무 유사하다.
사실, 전역변수와 정적변수의 메모리 할당 방식은 거의 동일하다고 보면 된다.
프로그램 시작이 데이터 영역에 할당되며, 종료시까지 소멸되지 않고 남아있다.
다만, 전역변수는 모든 곳에서 접근 가능하므로, 관리하기 어려워 질 수 있다.
이를 보완하여 클래스에 소속되게 만든게 정적변수 라고 보면 된다.
// 전역 변수와 정적 변수 static $aa = 0; // 정적 변수 $bb = 0; // 전역 변수 $aa++; class MyClass { ... }
PHP
복사
위 코드를 보면 클래스 외부에 정적변수를 선언했는데, 전역변수와 동일하게 볼 수 있다.

정적 메서드

정적 메서드 는 인스턴스 생성없이 바로 호출할 수 있는 데,
공통 라이브러리나 전역 함수들을 관리할 때 사용한다.
정적변수처럼 클래스가 로드 되는시점에 메모리 할당되며,
여기서 혼동되지 말아야 될 것이
함수이므로 데이터 영역이 아닌 코드영역에 올라간다는 차이점이 있다.

예시코드

예시 코드를 한번 보자.
// 클래스 정의 class MyClass { private $a = 0; // 인스턴스 변수 private static $b = 0; // 정적변수 private static $c = 0; // 정적변수 // 인스턴스 메서드 function SetB() { self::$b++; // 정적변수 $b를 증가시킴 } // 인스턴스 메서드 function GetB() { echo "static b: ".self::$b."\n"; // 정적변수 $b 출력 } // 정적 메서드 static function Test () { // 정적변수 $c를 증가시키고 출력 self::$c++; echo "static c: ".self::$c."\n"; } } // $a,$b에 각각 인스턴스 생성 $a = new MyClass; $b = new MyClass; $a->SetB(); // 정적변수 $b 1증가 (1) $b->SetB(); // 정적변수 $b 1증가 (2) $b->SetB(); // 정적변수 $b 1증가 (3) $a->GetB(); // 정적 변수 $b 출력 (3이출력) $a::Test(); // 정적 함수 Test() 호출 $a::Test(); // 정적 함수 Test() 호출
PHP
복사
# 실행결과 static b: 3 static c: 1 static c: 2
Plain Text
복사
위 코드를 분석해보면, 각 인스턴스를 생성했지만
정적변수들은 인스턴스간에 공통적으로 사용되는 걸 알 수 있다.
다만, 위 코드에서 아쉬운점이 하나있는데,
인스턴스 메서드에서 정적변수를 조작하고 있다. (SetB, GetB 에서 static $b 를 조작)
이렇게 사용할 수는 있지만 코드의 혼동이 올 수 있으므로,
좋은 프로그래밍 습관은 아니다.
따라서, 정적변수를 조작할 때는,
인스턴스 메서드가 아닌 정적 메서드를 사용하길 권장한다.