생성자와 초기화 feat .this

hongxeob·2022년 12월 20일
0

Java

목록 보기
4/7
post-thumbnail

참 생각없이 쓰면 쉬운 생성자와 초기화.. 하지만 조금이라도 알고나면 코드를 짜거나 할때 생각을 하며 더욱 질좋은 코드를 짤 수 있다!


생성자

  • 생성자는 인스턴스가 생성될 때 호출 되는 '인스턴스 초기화 메서드'(객체 초기화)
    • 초기화란 쉽게 말해 원하는 초기값을 세팅해 준다고 생각하면 된다
  • 생성자를 생성할 때 규칙
    1. 이름이 클래스 이름과 같아야 한다.
    2. 생성자는 리턴값이 없다.(void 안붙임)
    3. 모든 클래스는 반드시 생성자를 가져야 한다.

기본 생성자

  • 형태 : 클래스이름(){} -> Card() { }
  • 매개변수가 없는 생성자
  • 생성자가 하나도 없을 때만 -> 컴파일러가 자동 추가
    • 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을때 뿐!
    • 즉 클래스안에 다른 생성자가 하나라도 있으면, 기본 생성자가 자동으로 추가 되지 않기 때문에 새로 쓸때는 직접 내가 생성자를 넣어줘야 한다.

🕸️ 매개변수가 있는 생성자

  • 매개변수가 있는 생성자를 만들어준다면, 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있다!
    • 인스턴스를 생성한 다음 -> 인스턴스 변수의 값을 변경하는 것 보다 낫다!
  • (오른쪽 핑크 박스) -> 간결해진다.직관적이다.

생성자 this()

  • 같은 클래스의 멤버들 간에 서로 호출 할수 있는것 처럼 생성자 간에도 호출이 가능!
  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출시 첫 줄에만 사용 가능
    • 중복을 제거한 코드(왼쪽->오른쪽)
    • 아무값도 입력하지 않으면 "white","auto",4가 생성됨(초기화값) 이것을 코드 중복을 제거 하고 this를 사용한다.
      • tip : 코드 중복을 제거하려면 어느 한쪽이 다른 한 쪽을 호출하게 만들어 주면 된다 (위 그림도, 위 코드에서 아래 코드를 호출하게 만듬)

참조변수 this (this != this())

  • 생성자 this() 와는 전혀 다르다!
  • 인스턴스 자기 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
    • 클래스 메서드(static메서드) 에서는 사용 불가
  • 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
    • this.xxx가 붙어야 인스턴스 변수로 인식을 한다.
    • 아니면 지역변수(매개변수로 인식을 함)

정리하자면,

참조변수 this

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스의 주소가 저장되어 있다.
  • 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재한다.

VS

생성자 this(), this(매개변수)

  • 생성자. 같은 클래스의 다른 생성자를 호출 할때 사용한다
  • 마지막 static 붙은 코드에서는 this를 사용할 수 없다. 이유는 static 메서드는 객체 생성없이 호출 하기 때문에 인스턴스 변수를 사용할수 없다

변수의 초기화

  • 지역변수(lv)는 수동 초기화 해야함! (사용전에 꼭!)
  • 멤버변수(클래스 안에서 선언됨)는 자동 초기화 된다!
    • 지역변수(메서드or생성자 안에서 선언됨)는 자동으로 안 됨!

멤버변수의 초기화 3가지 방법

1. 자동 초기화

  • 0으로 만들어 준다

2. 간단 초기화

  • 명시적 초기화 (=) 사용
    class Car{
        int door = 4; // 기본형 변수의 초기화
        Engine e = new Engine(); // 참조형 변수의 초기화 = null or 객체의 주소(객체를 넣어주는게 초기화)
    }

3. 복잡 초기화

  • 초기화 블럭
    • 인스턴스 초기화 블럭 : {} - 인스턴스 변수의 복잡한 초기화에 사용
    • 클래스 초기화 블럭 : static {} - 클래스 변수의 복잡한 초기화에 사용
  • 생성자
    • 인스턴스 변수(iv) 초기화
    • 복잡한 초기화

멤버 변수의 초기화 시기와 순서

  • 클래스 변수 (먼저)
    • 초기화 시점 : 클래스가 처음 로딩될 때 단 한 번
    • 초기화 순서 : 기본값 - > 명시적 초기화 ->클래스 초기화 블럭
  • 인스턴스 변수 (클래스 변수 초기화 후)
    • 초기화 시점 : 인스턴스가 생성될 때 마다
    • 초기화 순서 : 기본값 - > 명시적 초기화 ->인스턴스 초기화 블럭->생성자


뭔가 머릿속에서 둥둥 떠다니던 개념들은 확실하게 잡은것 같다!
쉬운 코드라도 생각을 하면서 짤 수 있을것 같은 자신감이 생긴다!
무엇보다 무의식적으로 코드를 짜는게 아닌 의식적으로 생각!을 하며 진행 한다는게 정말 중요한데,
이 공부를 통해서 한 걸음 더 나아간듯 하다!

profile
걍 하자 저스트 뚜잇

0개의 댓글