팀 프로젝트의 기능 개발이 슬슬 마무리되면서 기능과 관계없이 조금 더 효율적인 코드를 위해 리팩토링을 시작했다.
아직 기능이 완성된 것은 아니라서 다른 팀원들과 겹치치 않을 만한 곳부터 고치는데, 그중 눈에 띈 것이 바로 static이었다.
나무반 세션 중 튜터님이 초기에 static을 많이 사용하게 된다고 많이 사용하지 말라고 하셨는데, 그 말을 듣고 프로젝트 코드를 보니 아니나 다를까 초기에 관리클래스(ManagementScore, ManagementStudent)를 대강 나누면서 사용한 static이 클래스 내부 메서드와 변수에 전부 붙어있었다. 아무래도 static 메서드 내부에서 같은 클래스의 메서드를 호출할 때 그 메서드도 static이어야 해서 더 그런 것 같다..
그렇다면 어떤 상황에서 static을 지양해야 하고, 관리클래스의 어떤 메서드에 static이 필요할까?
1. 메모리
자바에서 메모리공간은 크게 static, stack, heap 영역으로 구분되는데, static 메소드와 변수는 바로 static 영역에 저장된다. 문제는 다른 영역과 다르게 static 영역의 데이터는 프로그램이 시작할 때부터 종료할 때까지 남아있게 된다.
즉, 호출 여부와 관계없이 메모리에 올라간다!
따라서 아무렇게 static 변수/메서드로 사용하다 보면 메모리를 낭비하게 되므로 신중하게 사용 할 필요가 있다.
물론 전반적으로 공유되고있는 변수 또는 메서드라면 오히려 static을 사용하는 것이 더 효율적일 수 있다.
2. 객체지향
static은 전역 변수를 사용할때, 그리고 해당 클래스가 Math 클래스처럼 변경이 없고 일반적인 클래스라면 매우 유용하다. (인스턴스 생성 없이 호출해야 할 경우) 하지만 객체지향 관점에서 보면 각 객체의 데이터들이 캡슐화되어야 한다는 원칙에 위배되게 된다.
프로젝트에 이를 적용해보면,
- 프로젝트 시작~끝의 대부분 실행되는 메서드인가? -> △ : CampManagementApp 클래스의 View 메서드는 프로그램 실행 동안 반복되어 호출되고 그 외 클래스와 메서드는사용자가 각 클래스의 메서드를 선택해야만 실행된다. 한 번도 호출되지 않고 끝나는 경우도 많다.
- 변경 가능성이 없는가? -> X : 기능의 추가 및 삭제가 활발할 것으로 예상
- static이 아니면 구현이 어려운가? -> X : 시작 클래스에서 생성자만 전역으로 선언하여 활용할 수 있다.
- 전반적으로 공유되고 있는 변수 또는 메서드인가? -> △ : 대부분 아니지만, 저장 목록 관련 변수는 모든 클래스에서 접근한다.
이런 이유로 프로그램의 시작점인 CampManagement 클래스에서 호출하는 메서드는 모두 인스턴스 메서드로 작성하여 생성자를 통해 호출하는 것으로 변경하고(아래 코드 캡쳐화면 처럼), 전역변수로 사용되는 스캐너와 저장 목록 관련 변수는 static으로 선언했다. 나머지 변수와 메서드 앞에서는 static을 지웠다!
앞으로 프로젝트 시작 전 변수와 메서드를 어떤 범위와 방향으로 사용할 것인지에 따라 공개범위와 정적 메서드 활용을 고민하고 적용하도록 해야겠다!
'TIL' 카테고리의 다른 글
[KPT] 9조 KPT 회고 (0) | 2024.08.08 |
---|---|
[TIL] Github에 올라간 .idea 폴더 삭제 / .gitignore 파일 미적용 해결 (0) | 2024.08.02 |
[TIL] Git LF will be replaced by CRLF in 에러 (0) | 2024.08.01 |
[TIL] 문자열 자르는 방법 2가지 (0) | 2024.07.31 |