스태틱 편집하기
최신판 | 당신의 편집 | ||
2번째 줄: | 2번째 줄: | ||
==개요== | ==개요== | ||
− | [[자바]]에서 스태틱 키워드를 사용한다는 것은 [[메모리]]에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다. 이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필요하다. 일반적으로 우리가 만든 [[클래스]]는 스태틱 영역에 생성되고, new 연산을 통해 생성한 [[객체]]는 Heap영역에 생성된다. 객체의 생성시 할당된 Heap역역의 메모리는 가비지 컨트롤러를 통해 수시로 관리를 받는다. 하지만 스태틱 키워드를 통해 스태틱 영역에 할당된 메모리는 모든 객체가 공유하는 [[메모리]]라는 장점을 지니지만, 가비지 컨트롤러의 관리 영역 밖에 존재하므로 스태틱을 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채 존재하게 된다.<ref name="개요">망나니개발자, | + | [[자바]]에서 스태틱 키워드를 사용한다는 것은 [[메모리]]에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다. 이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필요하다. 일반적으로 우리가 만든 [[클래스]]는 스태틱 영역에 생성되고, new 연산을 통해 생성한 [[객체]]는 Heap영역에 생성된다. 객체의 생성시 할당된 Heap역역의 메모리는 가비지 컨트롤러를 통해 수시로 관리를 받는다. 하지만 스태틱 키워드를 통해 스태틱 영역에 할당된 메모리는 모든 객체가 공유하는 [[메모리]]라는 장점을 지니지만, 가비지 컨트롤러의 관리 영역 밖에 존재하므로 스태틱을 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채 존재하게 된다.<ref name="개요">망나니개발자, <[https://mangkyu.tistory.com/47 static변수와 static 메소드]>, 《개인블로그》,2019-02-04</ref> |
==특징== | ==특징== | ||
14번째 줄: | 14번째 줄: | ||
} | } | ||
− | 위와 같은 클래스로 객체를 여러개 생성할 시 Reptiles라는 메모리를 여러개 생성하게 된다. 하지만 이러한 경우에 static을 사용한다면 [[객체]] 하나의 메모리를 참조해 메모리 효율을 높일 수 있다.<ref name="개요">망나니개발자, | + | 위와 같은 클래스로 객체를 여러개 생성할 시 Reptiles라는 메모리를 여러개 생성하게 된다. 하지만 이러한 경우에 static을 사용한다면 [[객체]] 하나의 메모리를 참조해 메모리 효율을 높일 수 있다.<ref name="개요">망나니개발자, <[https://mangkyu.tistory.com/47 static변수와 static 메소드]>, 《개인블로그》,2019-02-04</ref> |
===스태틱 변수(정적 변수)=== | ===스태틱 변수(정적 변수)=== | ||
스태틱 변수는 [[메모리]]가 [[클래스]]에 귀속되며 각각의 [[오브젝트]]에 귀속되지 않는다. 일반 변수는 객체마다 1개 생성되며 n개의 객체가 있을 때는 n번 생성된다. 스태틱 변수는 객체가 n개 있어도 단 한개만 생성된다. | 스태틱 변수는 [[메모리]]가 [[클래스]]에 귀속되며 각각의 [[오브젝트]]에 귀속되지 않는다. 일반 변수는 객체마다 1개 생성되며 n개의 객체가 있을 때는 n번 생성된다. 스태틱 변수는 객체가 n개 있어도 단 한개만 생성된다. | ||
− | 이런 스태틱 변수를 사용하기 위해서는 <클래스 이름>.<스태틱 변수 이름>으로 사용이 가능하다. 클래스에 속해있으므로 [[오브젝트]]를 따로 생성하지 않아도 바로 사용이 가능하다.<ref name="특징1">삐멜 소프트웨어 엔지니어, | + | 이런 스태틱 변수를 사용하기 위해서는 <클래스 이름>.<스태틱 변수 이름>으로 사용이 가능하다. 클래스에 속해있으므로 [[오브젝트]]를 따로 생성하지 않아도 바로 사용이 가능하다.<ref name="특징1">삐멜 소프트웨어 엔지니어, <[https://imasoftwareengineer.tistory.com/73 9.static변수 static 메소드]>, 《개인블로그》,2019-04-03</ref> |
public class 클래스 { | public class 클래스 { | ||
42번째 줄: | 42번째 줄: | ||
그렇기 때문에 전역으로 자주 사용할 메소드를 스태틱 메소드로 만들어서 사용한다. 프로젝트 내에서 공통적으로 사용해야할 [[메소드]]가 있으면 스태틱 메소드로 생성해 불필요한 코드 수를 줄이게 된다. | 그렇기 때문에 전역으로 자주 사용할 메소드를 스태틱 메소드로 만들어서 사용한다. 프로젝트 내에서 공통적으로 사용해야할 [[메소드]]가 있으면 스태틱 메소드로 생성해 불필요한 코드 수를 줄이게 된다. | ||
main 메소드 또한 static이 붙는다. 클래스를 로딩하면서 메인 메소드가 메모리에 저장되고 자바는 메인 메소드를 보고 가장 먼저 불러들이는 것이다. | main 메소드 또한 static이 붙는다. 클래스를 로딩하면서 메인 메소드가 메모리에 저장되고 자바는 메인 메소드를 보고 가장 먼저 불러들이는 것이다. | ||
− | 메인 메소드 또한 다른 스태틱 변수와 메소드와 다름이 없으나 public static void main(String[] args)의 형식을 가진 메소드를 가장 먼저 실행시킨다는 특징을 가지고 있을 뿐이다.<ref name="특징1">삐멜 소프트웨어 엔지니어, | + | 메인 메소드 또한 다른 스태틱 변수와 메소드와 다름이 없으나 public static void main(String[] args)의 형식을 가진 메소드를 가장 먼저 실행시킨다는 특징을 가지고 있을 뿐이다.<ref name="특징1">삐멜 소프트웨어 엔지니어, <[https://imasoftwareengineer.tistory.com/73 9.static변수 static 메소드]>, 《개인블로그》,2019-04-03</ref> |
===스태틱 클래스(정적 클래스)=== | ===스태틱 클래스(정적 클래스)=== | ||
스태틱 클래스는 모든 멤버가 정적 변수 혹은 정적 메소드로 이루어진 것이며 [[객체]]를 생성할 수 없다. 그리고 class 키워드 앞에 static이라는 키워드를 선언해야한다. | 스태틱 클래스는 모든 멤버가 정적 변수 혹은 정적 메소드로 이루어진 것이며 [[객체]]를 생성할 수 없다. 그리고 class 키워드 앞에 static이라는 키워드를 선언해야한다. | ||
− | 정적 클래스의 모든 멤버는 static으로 선언되어야하며 [[생성자]]를 포함할 수 없다. 정적 클래스는 객체들이 처음 호출될 때 전역적으로 접근해야 하는 유틸리티 클래스를 만들 때 정적 클래스로 만들어 유용하게 사용이 가능하며 객체들이 처음 호출될 때 생성되고 프로그래밍 종료될 때 해제되기 때문에 정적 클래스는 어디서든 접근이 가능하다.<ref name="특징2">싸비, | + | 정적 클래스의 모든 멤버는 static으로 선언되어야하며 [[생성자]]를 포함할 수 없다. 정적 클래스는 객체들이 처음 호출될 때 전역적으로 접근해야 하는 유틸리티 클래스를 만들 때 정적 클래스로 만들어 유용하게 사용이 가능하며 객체들이 처음 호출될 때 생성되고 프로그래밍 종료될 때 해제되기 때문에 정적 클래스는 어디서든 접근이 가능하다.<ref name="특징2">싸비, <[https://ssabi.tistory.com/27 정적(Static) 클래스(Class), 메소드(Method), 필드(Field)]>, 《개인블로그》,2019-11-28</ref> |
− | === 유의 사항<ref name='staticc'> CIVIC, | + | === 유의 사항<ref name='staticc'> CIVIC, <[https://seokho-j0308.tistory.com/28 자바 ② 소유 제한자 ( static )]>, <<개인 블로그>>, 2018-02-14 </ref> === |
*스태틱이 붙으면 클래스 소유이며 붙지않으면 객체 소유가된다. | *스태틱이 붙으면 클래스 소유이며 붙지않으면 객체 소유가된다. | ||
* [[클래스]]와 [[생성자]] 앞에는 붙지 못한다. [[멤버변수]]와 [[메소드]]앞에만 붙을 수 있다. | * [[클래스]]와 [[생성자]] 앞에는 붙지 못한다. [[멤버변수]]와 [[메소드]]앞에만 붙을 수 있다. | ||
97번째 줄: | 97번째 줄: | ||
=== 제약 조건 === | === 제약 조건 === | ||
스태틱 메소드는 객체가 생성되지 않는 상황에서도 사용이 가능하므로 객체에 속한 [[인스턴스]] 메소드, [[인스턴스]] 변수 등을 사용할 수 없으며 static 멤버들만 사용이 가능하다. 그리고 스태틱 메소드는 this 키워드를 사용할 수 없다. | 스태틱 메소드는 객체가 생성되지 않는 상황에서도 사용이 가능하므로 객체에 속한 [[인스턴스]] 메소드, [[인스턴스]] 변수 등을 사용할 수 없으며 static 멤버들만 사용이 가능하다. 그리고 스태틱 메소드는 this 키워드를 사용할 수 없다. | ||
− | this의 경우 호출 당시 실행중인 [[객체]]를 가리키는 레퍼런스이다. 즉, 객체가 생성되지 않은 상황에서도 클래스 이름을 이용하여 호출이 가능한 스태틱 메소드는 this 키워드를 사용할 수 없다.<ref name="제약">heejeong Kwon, | + | this의 경우 호출 당시 실행중인 [[객체]]를 가리키는 레퍼런스이다. 즉, 객체가 생성되지 않은 상황에서도 클래스 이름을 이용하여 호출이 가능한 스태틱 메소드는 this 키워드를 사용할 수 없다.<ref name="제약">heejeong Kwon, <[https://gmlwjd9405.github.io/2018/08/04/java-static.html java static 멤버와 static 메서드]>, 《개인블로그》</ref> |
− | === 싱글톤패턴<ref name='singleton'> Hayden, | + | === 싱글톤패턴<ref name='singleton'> Hayden, <[https://hayden-archive.tistory.com/72 static 키워드]>, <<개인 블로그>>, 2020-04-18</ref> === |
[[싱글톤패턴]]은 [[접근제어자]] [[프라이빗]]과 스태틱를 활용해 클래스로 부터 객체를 하나만 만들 수 있도록 막아놓은 패턴을 말한다. 먼저 클래스에서 일단 하나의 객체를 private static [[제어자]]로 생성하고 외부에서 객체 생성을 못하도록 [[생성자]]에도 private으로 접근제어를 해준다. 만들어진 하나의 객체를 외부에서 사용할 수 있도록 public static 제어자를 통해 미리 메모리에 올려놓고 열어둔다. | [[싱글톤패턴]]은 [[접근제어자]] [[프라이빗]]과 스태틱를 활용해 클래스로 부터 객체를 하나만 만들 수 있도록 막아놓은 패턴을 말한다. 먼저 클래스에서 일단 하나의 객체를 private static [[제어자]]로 생성하고 외부에서 객체 생성을 못하도록 [[생성자]]에도 private으로 접근제어를 해준다. 만들어진 하나의 객체를 외부에서 사용할 수 있도록 public static 제어자를 통해 미리 메모리에 올려놓고 열어둔다. | ||
124번째 줄: | 124번째 줄: | ||
==참고자료== | ==참고자료== | ||
− | * 망나니개발자, | + | * 망나니개발자, <[https://mangkyu.tistory.com/47 static변수와 static 메소드]>, 《개인블로그》,2019-02-04 |
− | * 삐멜 소프트웨어 엔지니어, | + | * 삐멜 소프트웨어 엔지니어, <[https://imasoftwareengineer.tistory.com/73 9.static변수 static 메소드]>, 《개인블로그》,2019-04-03 |
− | * 싸비, | + | * 싸비, <[https://ssabi.tistory.com/27 정적(Static) 클래스(Class), 메소드(Method), 필드(Field)]>, 《개인블로그》,2019-11-28 |
− | * CIVIC, | + | * CIVIC, <[https://seokho-j0308.tistory.com/28 자바 ② 소유 제한자 ( static )]>, <<개인 블로그>>, 2018-02-14 |
− | * heejeong Kwon, | + | * heejeong Kwon, <[https://gmlwjd9405.github.io/2018/08/04/java-static.html java static 멤버와 static 메서드]>, 《개인블로그》 |
− | * Hayden, | + | * Hayden, <[https://hayden-archive.tistory.com/72 static 키워드]>, <<개인 블로그>>, 2020-04-18 |
==같이 보기== | ==같이 보기== |