자바에서 Static과 객체생성의 관계 - new 생성자를 사용할 때 new 클래스명만 해도 되는 이유가?

forefog의 이미지

일단 구현 자체는 요구조건대로 다 했는데 로직이 이해가 잘 안되네요.
(이클립스 가이드 대로 코딩했습니다)

전제조건이 클래스 메소드를 이용해야 하기 때문에 클래스 메소드를 만들었습니다.

Testclass.class
-----------------------------------------------------
public class Testclass{

static String[] info = new String[3];

Testclass(String name, String major, String email){
info[0] = name;
info[1] = major;
info[2] = email;
}

static String printName() { //이름을 반환하는 메소드
return info[0];
}
}

-----------------------------------------------------

second.class
-----------------------------------------------------
public class second extends YGH {

second (String name, String major, String email) {
super(name, major, email);
}

public static void main(String[] args) {

new Testclass("Greg", "Computer", "computer@gmail.com");

System.out.print(Testclass.printMajor());

}

-----------------------------------------------------

다른건 프로그램의 로직을 그려보니 다 이해가 되는데 한가지 생성자 선언이 마음에 걸려서 입니다.

보통은 객체를 생성하면 class 객체명 = new class(); 이지 않습니까?

물론 위 예제에서도 이렇게 하면 선언이 되고 작동에는 문제가 없습니다.
(생성자 기본 변수가 static이라 여러개의 객체라도 결과값은 같긴 하지만요)

그런데 new 생성자(); 형태로도 선언이 되는데 이게 왜 가능한건지 의문이라서요.

단지 생성자이기 때문에 가능한건가요? 또한, 해당 생성자가 static 변수를 사용하고 있기 때문에 가능한 것인가요?

코딩하기 전에는 어느 객체를 생성해도 다 똑같은 값을 가지겠지만 그래도 호출해서 쓰려면 임의의 객체 하나는 생성해야겠다는 생각이 있었거든요.

근데 그럴 필요도 없다는걸 이클립스에서 지적해주더군요 ㅡ.ㅡ?!

검색을 해봐도 일반적인 static정의와 생성자에 관한 글 밖에 안보여서 질문을 드리게되었습니다.

참조할 만한 글이라도 있으면 링크 부탁드리겠습니다.

감사합니다.

익명 사용자의 이미지

우선 static이라 변수를 공유(?)해버린다는 것은 잘 아실테고
그냥 new 생성자() 형태로 생성을 하셔도 되는데 이렇게 될 경우
TestClass test = new TestClass()라고 생성 할 경우처럼 특정 시점에 이 객체가 필요할 경우 test.function()등을 사용 할 수 있겠지만
그냥 new TestClass()라고 생성 할 경우에는 이렇게 사용하기가 힘들겠죠??

물론 링크드 리스트와 같이 객체가 상호 연결 된 경우에는 굳이 저렇게 변수명을 지정하지 않하도 사용할 수 있는 방법이 있습니다만...
아직 여기까지 수준은 아니신것 같고.

forefog의 이미지

어차피 클래스 메소드를 쓰려면 static 변수가 필요하고, 처음에 설계만 잘해두면 해당 클래스 메소드 이용할 때 굳이 객체 생성 없어도 되겠네요. 특별히 해당 클래스에서 메소드나 특별한 변수값 불러다가 쓸 것이 아니라면요.

이것저것 API도 살펴보며 공부하고 있는데, 실제로 어떻게 써먹고 있는지 예제나 사례를 보지 않으면 크게 와닿지가 않네요.

감사합니다. 객체를 생성해서 특별히 호출해야할 경우를 생각해보니 어느정도 수준까지 구별해서 써야할지 감이 오네요.

정진호의 이미지

실제 new 키워드를 통해서 생성하는 객체는 JVM의 메모리의 Heap 영역에 할당이 됩니다.
하지만 static 으로 선언된 변수는 클래스 로드 시 메모리의 클래스 영역에 할당이 되죠.
따라서 객체를 생성해서 힙영역에 올리기전에도 Claa명.변수명을 통해서 접근이 가능한 것이구요, (물론 변수가 public 인 경우에)
static을 멤버 변수로 가지는 객체도 abstract나, interface가 아닌 경우 라면(익명클래스 선언의 경우를 제외하고) 객체를 생성해서 힙영역에 저장할 수가 있습니다.

정진호의 이미지

메모리로 설명해주시니까 이해가 잘 되네요 ㅎㅎ 저랑 이름도 같으시네요! 감사합니다~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.