JAVA 객체지향 프로그래밍

생성자와 this

수업소개

인스턴스를 생성할 때 해야 할 초기화 작업을 정의하는 생성자에 대해서 살펴보는 시간입니다.

 

 

 

강의

소스코드

public class MyOOP {
    public static void main(String[] args) {
		Print p1 = new Print("----");
		p1.A();
		p1.A();
		p1.B();
		p1.B();

		Print p2 = new Print("****");
		p2.A();
		p2.A();
		p2.B();
		p2.B();
		
		
		p1.A();
		p2.A();
		p1.A();
		p2.A();
	}
}

 

댓글

댓글 본문
  1. nextLevel
  2. gwonhong
    this란 그 class를 instance화 했을 때 그 instance를 가리키는 특수한 변수이다.
  3. 원력
    20240127
  4. 당당
    2023.04.22
  5. labis98
    20230203 완료
  6. 보통사람 박코딩
    할수있다
  7. 코딩드림
    221104
  8. 제이드
    우왕 진짜 먼말인지 모르겟어여 나는 빢대가zl.......... 하ㅇ<-<
  9. economin
    수강완료
  10. 인스턴스 생성시부터 초기에 주입해야할값이 있어야할때 =>생성자함수

    생성자함수: 인스턴스명(or클래스명) 과 이름이 같은 메소드

    this. : 인스턴스 변수를 가리키는 특수한 단어
  11. 육도
    2022.05.14 완료
  12. 포포
    어렵다
  13. 유도영
    생성자: 인스턴스에 입력해야 할 초기값을 지정할 수 있게 해줌
    ->클래스에서 클래스와 같은 이름의 메소드를 정의하면 그것이 생성자로 작동됨
  14. 열정jk
    220220 감사합니다
  15. 나연
    2022년 2월 14일 (월) 완료

    생성자:
    인스턴스가 생성될 때
    - 반드시 처리해야 할 작업의 초깃값 지정
    - 혹은 최초로 실행되어야 할 작업들 수행하고 싶을 때 생성자 사용

    ```java
    class Printer {

    public String delimiter;

    // 생성자
    public Printer() {

    }

    // ...

    }
    ```
    인스턴스를 생성할 때 자바는 이 클래스와 동일한 이름의 메소드가 있다면 그 메소드를 호출하도록 약속되어 있음

    생성자에는 `static`이나 리턴 데이터 타입을 지정하지 않음

    ```java
    class Printer {

    public String delimiter = "";

    public Printer(String delimiter) {
    this.delimiter = delimiter;
    }

    // ...

    }
    ```
    - `this`: 클래스가 인스턴스화 되었을 때 인스턴스를 가리키는 특수한 이름
    - 여기서 `this.delimiter`는 인스턴스의 `delimiter` 변수니까 `public String delimiter`를 가리킴
  16. 주간식당메뉴
    2021.11.12.
  17. everdoit
    생성자 기능도 신기하네요
  18. 2021.09.02 완료
  19. 이마누
    완료
  20. labis98
    20210814 good~~~!!!
  21. super1Nova
    210807
  22. Jaemin Lim
    21.07.25
  23. 초딩 개발자
    2021/06/27
  24. 싸알
    java는 클래스와 동일한 이름을 가진 메소드가 있으면, 그 메소드를 생성자로 지정하는데, 생성자는 클래스가 인스턴스화 되었을 때 실행된다. 클래스 내에서 this는 클래스가 인스턴스화 되었을 때 생성된 인스턴스를 가리킨다.
  25. jeisyoon
    2021.05.02 Constructor & this - OK

    Constructor(생성자)를 사용 할 때는 Class 가 반듯이 Instance 이어야 한다.
    Constructor는 초기에 주입할 필요한 값을 전달하거나 초기에 작업을 수행 할 때 사용하며, 만드는 방법은 Class Name과 동일한 Method에 Instance에서 전달한 Argument(인수)를 받을 수 있는 Parameter(매개변수)를 정의 하면 된다.

    this 라는 특수한 Keyword는 Class가 Instance화 했을 때 그 Instance를 가르키는 특수한 문자로서 Class 내에 정의된 Variable을 사용할 때 Variable 앞에 붙여 사용한다 (ex : this.variable )

    예외사항) 강의 동영상 화면에서 Class에 Constructor를 만들 때

    public print(String delimiter) {
    this.delimiter = delimiter;
    }

    라 하면 Error 가 발생 하고 "public" 를 삭제하면 정상 작동함. (Window 10 에서 만 그런가요 ??)
  26. anya422
    done..
  27. 레이
    2021.04.17
  28. 이현수
    2021.04.17
  29. 김우중
    감사합니다
  30. jason
    자동차 메모리 시트 저장된 것(인스턴스) 을 사용할 때는
    항상 자동차 문을 열어야 하는 것을 사용자에게 알게 해 준다, 키로 문을 열지 않으면(생성자의 인자를 넣지 않으면) 메모리 시트를 사용하지 못하게 error 발생
    자동차 리모컨으로 열든, 열쇠로 열든 클래스명과 동일한 메소드 명으로
  31. boat
    인스턴스를 생성하는 동시에 값을 넣어준다면 꼭 필요한 사항을 빠뜨리지 않을 수 있다.(delimiter같이 꼭 지정해줘야하는 값) 이 때 생성자를 이용한다!! 생성자는 원형인 클래스 내부에 클래스 이름과 같은 메소드를 정의하듯이 만들 수 있다.(public만 붙여야한다.)
    그리고 클래스가 인스턴스화가 됐을 때 this라는 키워드를 사용한다면 인스턴스 안의 변수를 가리킬 수 있다.(전달받은 값 아님)
    좋은 강의 감사합니다!!
  32. 전현지
    제가 했던 코딩 중 Print클래스파일의 일부만 붙였습니다. 각 주석은 결과를 보여줍니다.

    class Print {
    public String delimiter = "원래클의 delimiter"; //글쓴님의 경우 ""
    public Print (String (1)delimiter) {
    (2)delimiter = (3)delimiter;
    System.out.println("4.del: "+delimiter); //생성자의 del("----")
    System.out.println("5.this.del: "+this.delimiter); //"원래클의 delimiter"

    public void A() {
    System.out.println("A()시작: "+delimiter); //"원래클의 delimiter"
    System.out.println("A");
    System.out.println("A");
    }
    }
    ------------------------
    보시면 임성운짱짱님의 말씀처럼 생성자 내에서의 delimiter들은 "----"를 도출하게 됩니다.
    왜냐하면 그들의 지역변수? delimiter는 "----"니까요.
    근데 생성자매서드 외부에있는 Print.A()매서드를 보시면 이곳의 delimiter는 무엇을 의미하고있는걸지 생각해보시면, 요놈이 바로 ""를 가리키고있는 것임을 알수있습니다.

    그럼 왜 ""를 가리키느냐?
    delimiter=delimiter;를 썼을때, 밑에 노랑줄로 'the assignment ~has no effect'라고 뜨게됩니다.
    즉, 이 구문이 제대로 작동하지 않게된 것이죠.
    그래서 Print.A(delimiter)에서는 이 delimiter를 찾아야되는데 누굴찾느냐?
    바로 맨위에 정의되었던 delimiter=""; 를 찾아가게됩니다.
    --그렇기때문에 delimiter=""를 this.delimiter=delimiter;구문으로 "----"를 작동시킬수있게 만들어주는 것이고요.
    라고 저는 생각했습니답!
    대화보기
    • oyuiw
      20201213
    • 제예솔
      생성자 = > 초기에 주입해줘야 하는 값을 전달해줄 때 쓴다. this=> 클래스가 인스턴스화 되었을때 인스턴스를 가르키는 특수한 이름이다
    • 안광민
      class Constructorapp {
      public String delimiter = "";
      public Constructorapp(String delimiter) {
      this.delimiter = delimiter;
      }
      public void A() {
      System.out.println(this.delimiter);
      System.out.println("A");
      System.out.println("A");
      }
      public void B() {
      System.out.println(this.delimiter);
      System.out.println("B");
      System.out.println("B");
      }


      }

      Constructor(생성자)를 이용해 instance가 실행될 때 꼭 해줘야 하는 것들을 사용자가 까먹지 않도록 할 수 있다.

      class와 똑같은 이름의 method를 만들면 그게 바로 constructor이다.
      constructor는 static이나 void 등을 지정하지 않는다.

      this는 우리가 생성한 instance를 가리킨다.

      완료
    • 임성운짱짱
      질문이 있습니다..
      5분 :32초에서 public String delimiter = "";
      public Print(String _delimiter) {
      delimiter = _delimiter; 를
      -------------------------------------------------------------------------------
      public String delimiter = "";
      public Print(String (1)delimiter) {
      (2) delimiter = (3)delimiter;
      로 바꿨습니다. 근데 여기서 바뀐부분이(변수이름이 똑같아서 일단 번호를 붙혀서 각자 다르게 부르겠습니다.)
      이해가 안가는게 있는데 1번 delimiter는 일단 인스턴스에서 매개변수를 받아서 ----입니다. 그다음
      2번delimiter는 = "" 입니다. 3번delimiter는 인스턴스에서 매개변수를 받아서 ----값을 가지고 있구요. 때문에 3번delimiter를 2번 delimiter에 대입하면
      ----이 출력되야되는거 아닌가요? 왜 공백이 나오죠..!?
    • 싱와
      ** 코딩 초보인 나는 무식함을 인정하고 초기화부터 정리합니다 **

      초기화라는것은 어떤 일들을 시작하기 전에 하는 루틴같은겨.
      왜 야구선수 투수들이 등판하기 이전에 루틴으로 커피를 세잔 무조건 마셔야한다던지,
      잠은 왼쪽으로 그날은 자야한다던지.. 등판하기전에 무조건 해야하는 그런것들 있잖슈?..
      그런게 초기화다..

      그런것 처럼, 프로그램도 이것이 실행되기 이전에 무조건 실행되야하는 과정들이 있을 수 있단 말이야..
      그런데 자식이 부모마음 모르듯, 사용자들은 개발자들의 의도 그런거 몰라.. 야구선수 선발 루틴? 그런게 알게뭐야..
      그냥 쓰는거야. 그럼 어떻게 되겠어? 프로그램 에러나지. 그날 게임 진단 말이여.

      그.래.서.

      아싸리 이걸 그냥 강제시켜버리는겨. 사용자는 영문도 모르고 이거 해야한다니까 하는데, 왜하는지는 몰라.
      근데 강제로 시키니까 개발자 의도 정확하게 따라가버리고, 초기값도 그냥 셋팅되버리네? 오류가 줄어드네?
      엄마가 공부하라고 할때는 하기 싫었는데 하고나니까 엄마의 의도를 알아버렸네?!

      이러한 놈들을 "생성자, Constructor" 라고 한다. 이말입니다.
      요놈들은 인스턴스를 생성할때 원래 클래스에 클래스 이름하고 똑같은~ 이름을 가진 놈을 메소드로 만들어버리는거다.
      Public sangsungza() {} 이렇게..

      예를 하나 들어보자.

      내가 인스턴스를 하나 만들었는데, 요놈에 매개변수(파라미터)를 추가해서 특정 정수값이 무조건 들어가게 하고 싶네?

      원래 클래스 이름이 sangSungza 라고 한다면,

      Class sangSungza {
      int a ;
      public sangSungza(int a) {
      this.a = a;
      (후략)
      .
      }

      sangSungza foo = new sangSungza(1) {
      .
      .
      }


      이런식으로 초기에 1이라는 정수값을 지정해줄 수 있다는 사실~


      그래서, 정리해볼까?

      어떤 객체를 만들때, 그 객체가 반드시 해야할 일들이 있다면, 그것은 별도의 메소드로 만들어서 그 절차를 사용자가 일일히 숙지하는것이 아니라, 그냥 생성자에 그 절차를 포함시켜버려서 객체를 사용하는 사용자가 그 절차를 숙지하는 과정을 생략하고, 반드시 해야하는 일들을 놓치지 않게 함으로 오류를 줄이고 편의성을 증대시키는것이 생성자다!!
    • 양미림
      public Print는 메소드가 아니라 생성자입니다! 보시면 클래스 이름이 print죠? 일반적으로 생성자는 클래스 이름이랑 동일하게 만듭니다 그래서 print 클래스의 print 생성자를 만든 거예요 메소드량 형태가 비슷하지만 메소드는 리턴 타입이 있고 생성자는 없습니다
      대화보기
      • 김민재
        궁금한게 있는데 Print클래스에 있는 public Print 메소드에는 return값이 없는데 void 안붙여도 상관없는건가요??
      • 선대범
        생성자는 클래스의 인스턴스인 객체를 생성시 인수를 입력하면 그 인수를 받아 어떤 특정한 기능을 하는 코드이다.

        생성자는 메소드를 만들듯이 만들면 되는데 이때 메소드의 이름을 해당 클래스의 이름과 같은 이름으로 그 클래스 내부에 만들면 그것은 생성자가 된다.


        a) 클래스 인스턴스명 = new 클래스명();
        b) 클래스 인스턴스명 = new 클래스명(인수);

        클래스 {
        클래스명() {

        }
        클래스명(파라미터) {

        }
        }

        a)처럼 () 안에 인수가 없으면 파라미터가 없는 생성자로 던져지고 {} 안의 내용을 실행한다. 사용자가 아무런 데이터도 입력하지 않은 경우를 대비한 생성자이다.

        b)처럼 ()안에 인수가 있다면 자료형과 인수의 갯수가 일치하는 파라미터가 있는 생성자로 던져지고 {} 안의 내용이 실행된다. 사용자가 특정한 데이터를 입력할 떄를 대비한 생성자이다.

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

        생성자의 파라미터명과 멤버변수명이 같을 경우가 많은데 이 때 초기화 시키는 방법이 this를 사용하는 것이다. this는 클래스의 멤버변수를 가르킨다.

        a) 클래스 인스턴스명 = new 클래스명();
        b) 클래스 인스턴스명 = new 클래스명(인수);

        클래스 {
        접근권한 자료형 멤버변수명= ...
        클래스명() {

        }
        클래스명(파라미터명[== 멤버변수명]) {
        this.멤버변수명 = 파라미터명;
        }
        }

        클래스의 인스턴스인 객체를 생성할 때 인수를 입력하면 그 값은 생성자의 파라미터로 넘어오고 그 파라미터는 해당 생성자의 지역변수가 되어서 멤버변수에 대입된다. 결과적으로 멤버변수의 값이 인수의 값으로 변경되는 것이다.
      • hyuna lee
        감사합니다.
      • 빽토리얼
        생성자는 인스턴스 초기화 시 매개변수를 필요로 한다면 class 내에서 같은 class 이름을 사용함으로써 지정 가능하다.
        (class Print{
        public Print(String s){ ... } )
        여기서 this. 키워드를 변수 앞에 붙여서 이 변수가 자신의 클래스 내에 있다는 것을 명시해준다.
      • 넘무
        생성자는 인스턴스를 사용할때 초기에 값을 주입할때 사용하고
        this는 인스턴스의 변수,메소드를 지칭할때 사용한다
        좋은 강의 감사합니다
      • gyun
        생성자는 초기에 지정해야 할 값이 있을때 public 클래스 이름동일 형식으로 만든다

        그리고 this는 클래스가 인스턴스화 될 때 인스턴스 변수 값을 지정함
      • jajavava
        생성자는 인스턴스를 생성할 때 초기에 셋팅할 값이 있는 경우에 만들고, 클래스의 이름과 동일한 메소드이다.
        (public만 붙여서 만듬)
        this는 클래스의 인스턴스 변수를 가르킬때 붙여준다.
      • 임위닝
        this에서 많이 헷갈려서 인터넷강의를 찾다가 들어오게되었습니다
        정말 감사합니다
      • yyrr
        2020.03.15 완료
      • juni
        감사합니다..
      • 라또마니
        감사합니다.
      • 쑤우
        수강완료. 감사합니다~