스태틱 편집하기

이동: 둘러보기, 검색

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 아이디(ID)으로 기록되고, 다른 장점도 있습니다.

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

위키원에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 위키원:저작권 문서를 보세요). 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 | 편집 도움말 (새 창에서 열림)