- AWS
- spring mvc
- select
- session
- springboot
- Docker
- ORM
- SSL
- 스프링부트
- 프로그래머스
- 1차원 배열
- DI
- join
- string
- 데이터베이스
- spring
- 스프링
- Git
- sql
- java
- jpa
- mysql
- PYTHON
- nginx
- Django
- @transactional
- 문자열
- spring boot
- spring security 6
- 자바
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
개발하는 자몽
static, singleton pattern 본문
static
static 키워드를 사용하여 static 변수와 static 메서드를 만들 수 있다. 각각 정적 필드와 정적 메서드라고도 하며 둘 모두를 정적 멤버(클래스 멤버)라고 말한다. 이 둘은 객체(instance)에 소속된 멤버가 아닌 클래스에 고정된 멤버로, 클래스 로더(classloader)가 클래스를 로딩해서 메서드 메모리 영역에 로드할 때 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나는 즉시 바로 사용이 가능하다.
static 키워드로 생성된 정적 멤버는 heap이 아닌 static 영역에 메모리가 할당된다. static 영역에 할당된 메모리는 모든 객체가 공유할 수 있어서(같은 곳의 메모리 주소만 바라봄) 어디서든지 참조할 수 있다는 장점을 갖는다. 그러나 Garbage Collector의 관리 영역 밖에 존재하기 때문에 프로그램이 종료될 때 까지 메모리가 할당된 채로 존재하게 된다. 따라서 static을 과하게 사용하면 시스템 성능에 좋지 않다. 적절하게 사용한다면 메모리 사용에 큰 이점이 있다(static 변수는 메모리 할당을 한 번만 한다)
static method는 메소드 앞에 static 키워드를 붙인 것으로 객체 생성 없이 클래스를 통해 직접 호출할 수 있다. 주의할 점은 static method에서는 정적 필드(static field)만 사용이 가능하고 정적 메서드(static method)만 호출이 가능하다. 또한 this 키워드 사용과 메서드 오버라이딩이 불가능하다.
Singleton Pattern
싱글톤 패턴은 객체의 인스턴스를 오직 1개만 생성하여 사용하는 디자인 패턴이다.
public class Singleton {
private static Singleton instance = new Singleton(); //static으로 선언되어 최초 한번만 메모리 할당
private Singleton() {} //외부에서 호출할 수 없도록 private으로 지정
public static Singleton getInstance() { //접근을 위한 getter
return instance;
}
...
}
위 처럼 간단하게 구현할 수 있으며, 이 밖에도 여러 가지 구현 방식이 있다.
사용 시의 장점은
- 다른 클래스 간에 데이터 공유가 쉽다. 싱글톤 패턴을 사용하면 인스턴스가 사용되므로 다른 클래스의 인스턴스들이 접근할 수 있다.
- static으로 선언되어 한 번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
이 외에도 다른 장점이 있으나 이 두개가 메인인 것 같다.인스턴스가 한 개만 존재해야 하는 시스템인 경우 싱글톤 패턴을 사용하기도 한다.
싱글톤 패턴의 문제점은 다른 클래스의 인스턴스들 간에 결합도가 높아져 객체 지향 설계 원칙 중 하나인 "개방-폐쇄 원칙"을 위배하게 된다. 이로 인해 수정이 어려워지고 테스트가 어려워진다.
참고
'Java' 카테고리의 다른 글
Wrapper 클래스 (0) | 2022.07.19 |
---|---|
[객체 지향] is-a, has-a (0) | 2022.07.16 |
객체와 메모리 in Java (0) | 2022.07.14 |
스프링과 객체 지향 (1) - 자바 언어의 다형성 (0) | 2022.04.04 |
객체지향프로그래밍(추상화, 부품화, 은닉화, 캡슐화) (0) | 2021.12.23 |