[Java] Static vs Instance

이열음·2022년 2월 27일
1

우테코 과제를 진행하면서 InputView를 객체로 만들어서 주입할지
아니면 static으로 유틸리티로 정의하고 처리할지 고민이 되었습니다
그래서 각자의 특징을 정리해보려 합니다.

Static

프로그램이 실행될 때 메모리중 Data 영역에 할당되며 프로그램이 종료될 때 해제됩니다.
다수의 클래스에서 호출해도 새로운 객체를 생성하지 않고, 시작시점에 메모리에 할당된 데이터를 사용합니다.
주로 여러 클래스에서 공통적으로 자주 사용하는 변수나 메소드를 정의할때 사용합니다.

특징

객체를 생성하지 않아도 되서 위치에 관계없이 쉽게 가져다 쓸 수 있다.

객체를 생성하지 않기 때문에 코드가 간결하고, 어디서든 접근할 수 있습니다.

GC의 대상이 되지 않는다.

GC의 대상이 아니라는 것은 때에따라 장점이 될 수 있는 점이기도 합니다. 공통된 메소드나 변수를 엄청 많이 호출하게 된다면 GC의 오버헤드가 늘어나기 때문입니다. 그래서 대체로 여기저기서 쓰이거나 여러번 호출되는 메소드는 Static으로 관리하곤 합니다. 하지만 static은 메모리에 처음부터 끝까지 올라가있는 데이터이다 보니 GC의 대상이 아닙니다. 따라서 지나치게 무거워지면 메모리가 부족해질 수 있습니다.

객체지향적이지 않다.

여러곳에서 접근할 수 있다는 점 자체가 객체지향성의 캡슐화를 위반합니다.

멀티스레드 환경에서 충돌이 발생할 수 있다.

메모리 영역에서 전역적으로 관리하다보니 멀티스레드로 동시에 동작하는 경우에는 충돌이 일어날 수 있습니다.

Instance

클래스를 통해 생성된 객체가 메모리에 할당되어 실제 사용될때 이를 인스턴스라고 합니다.

특징

재사용 가능하다.

인스턴스는 클래스라는 틀로 찍어낸 하나의 객체입니다.
따라서 같은 클래스를 통해 객체를 여러개 만들 수 있습니다.

상속 가능하다.

하나의 큰 특징을 가진 객체를 상속하여 세부적인 객체를 생성할 수 있습니다.

생성된 객체는 각자 움직인다.

생성된 객체는 서로 다른 메모리를 사용하기 때문에 내부 구조는 같아도 동작은 완전히 분리되어있습니다. 따라서 같은 속성의 객체가 서로 다른 행동을 하게끔 할때 유리합니다.

GC의 대상이 된다.

객체는 앞서 말했듯 Heap 메모리 영역에 할당됩니다. 이 Heap 메모리는 GC의 대상이 되어 객체가 더이상 활용되지 않을때 불필요하게 할당되어있는 메모리를 자동으로 해제합니다.

객체 생성이 필수적이다.

해당 클래스 내의 메소드나 변수를 사용하기 위해서는 new 키워드를 통해
객체를 생성해야 합니다. 이 과정에서 객체간 의존성과 같이 고려해야할 점이 생깁니다.

설계가 상대적으로 어렵다.

객체간의 연관관계나 의존성, 상속의 방향 등을 생각해야하기 때문에 설계가 다소 복잡합니다.

0개의 댓글