ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] #생성자
    프로그래밍/JAVA 2022. 6. 1. 01:18
    728x90
    반응형

    프롤로그를 쓰고 나니 뭔가 마음이 두근두근 거린다...
    본인 얘기는 프롤로그에서 다했으니 마음을 부여 잡고 주제로 돌아가 보자 ㅎ

    생성자(Constructor)
    - 인스턴스가 생성될 때마다 딱 한번만 호출되는 인수턴스 초기화 메소드

    클래스를 하나 생성을 했다.

    이 클래스 안에는 인스턴수 변수가 3개와 인서턴스 메서드 1개가 선언이 되어있다. 다른 클래스에서 이 클래스의 객체를 생성하려고 하면 밑에와 같은 방법을 사용해야한다.

    이것은 흔히 객체를 생성한다라고 우리가 표현을 한다. 이렇게 객체를 생성할 경우 우리가 가상 공간에 있는 저 변수들을 임의로 쓸수 있게 된다. 이런 식으로 참조변수를 통해서 값을 넘겨 줄 수 있다. 이렇게 되면 Number Class안에 인스턴스 변수에 다이렉트로 전달이 된다.

    그.런.데

    지금 당장은 문제가 전혀 없지만, 이렇게 되면 다음과 같은 문제점이 있다.

    1. 같은 타입의 다른 두 객체가 생성 되었을 때 서로 호출 될 때마다 인스턴스 변수에 영향을 주지 않으려면 어떡해야 하지?
    2. 인스턴스변수가 상수화 되어있으면 어떡하지?

    음.. 천천히 문제점을 찾아가 보기 위해 일단 다음 코드를 살펴보자

    결과

    참조변수 n1을 추가로 선언한 형태이다. 이렇게 될경우 객체는 2개 생성이 되어있지만 결국은 하나의 클래스의 하나의 인스턴스에 영향을 주게 된다. 이렇게 될 경우 굳이 두개의 객체를 생성할 필요가 없을 뿐더러 너무 비효율적인 코드가 된다.

    이런 사태를 간결하게 해결하기 위한 것이 바로 생성자이다.

    위의 코드를 이렇게 간결하게 줄일 수가 있다. 달라진 점을 살펴보자

    우선 Nuber클래스에 Nuber라는 메서드가 2개가 추가로 생성이 되었다. 사실 void Number(){} 이 부분은 없어도 되는 부분이지만 추가 설명을 위해 작성했는데, 그 부분은 후에 설명을 하겠다. 일단 생성자는 클래스이름과 동일해야한다. 생성자에 매개 변수를 추가해서 다른 클래스에서 보낸 값을 매개변수로 받아와 추가로 인스턴스 변수에 넣어준다. 생성자는 인스턴스 생성 시 딱 한번만 호출되는 메서드 이기에 매개변수로 받아와서 인스턴스에 저장을 하면 바로 소멸 된다. 다른 두 객체 가 서로의 인스턴스에 영향을 주지 않게 되는 것이다. 그래서 혹시나 인스턴스 변수가 상수화가 된다고 해도 한번씩만 호출되어 저장 되기 때문에 한번씩만 저장 되어 영향이 없는 것이다.

    결과

    결과는 같지만 과정이 다름을 알아야한다.

    그리고 이제 void Number(){}에 대한 설명을 하게 될 텐데 모두 오버로딩과 오버라이딩의 차이를 알것이라고 생각한다.(물론 그것도 나중에 포스팅할 예정이다. 나중에 추가하겠다..) 지금 생성자는 오버로딩된 상태이고 매개변수가 없는 Number()생성자는 기본 생성자라고 한다. 기본 생성자는 우리가 굳이 추가하지 않아도 필수로 알아서 컴파일 시 추가가 된다. 그래서 우리 눈에는 보이지 않지만 분명 추가가 되어 컴파일이 된다.

    이전 코드의 이 부분이 사실 객체를 생성한다는 뜻 이 외에도 기본생성자를 호출한다는 뜻도 내포가 되있었던 것이다. 물론 이것도 굳이 하지 않아도 된다. 기본생성자에 내용이 없기 때문에 당연히 쓰지 않는 객체를 생성할 필요가 없는 것이다.
    그리고 생성자는 단한번만 호출되는 특징 때문에 return 값도 당연히 존재할 수가 없다. 이 점을 모두 유의하자.

    사람마다 생각차이는 있지만 생성자를 쓰는 이유는 다음과 같다고 생각한다.

    - 코드중복을 제거하기 위함
    - 효율성 있는 코드를 작성할 수 있음(위에 말과 동일)
    - 특정 클래스에서 사용하도록 유도

    공부를 하다 느낀점이지만 이런 기본적인 개념을 놓치면 나중 내용을 이해할 수 없는 점이 참 공부의 무서운 점인것 같다... 내가 정리한 내용은 여기까지이다. 분명 설명을 하다 놓치는 점이 있을것이다. 나중에 생각이 나거나 포스트를 보신 분이 태클을 걸어주시면 추가할 계획이다.

    긴 글 읽어주신 분들 게 감사드리고 이상 포스팅을 마쳐야할 것 같다.. 다음 포스팅을 기대해주시라... 안뇽히...








    '프로그래밍 > JAVA' 카테고리의 다른 글

    [JAVA] #오버로딩/오버라이딩  (0) 2022.06.15
Designed by Tistory.