생성자 / this. / this()

Jan 28, 2024
생성자 / this. / this()

1. 생성자란?

객체가 생성될 때 무조건 실행되는 메서드. 객체 초기화(=최초값 세팅)를 위해 사용하는 것. 생성자 이름은 클래스 이름과 같다. 반환값을 가지지 않는다. 보통은 생략되어서 보이지 않고(기본생성자), 별도로 선언하지 않더라도 자동으로 생성된다. * 생성자도 메소드! > 오버로딩을 할 수 있다, 매개변수를 가질 수 있다 * 생성자를 통해 객체가 생성 * 생성자가 때려졌다 = 이미 new가 되었다. (heap에 만들어졌다.)
notion image
맛보기
<CircleTest Class>
notion image
Circle()은 생성자다. 생성자를 작성하지 않으면 자동 생성됨. (눈에는 안보임)
notion image
생성자를 작성한 모습
 
<CircleTest Class>
notion image
 
<Circle Class>
notion image
new가 실행되기 전에 static이 붙지 않은 애들이 메모리에 다 뜸. 여기선 radius랑 getArea가 뜸. getArea는 메소드니 제외하고, Circle obj = new Circle();이란 말은 radius는 값이 없는 상태.
Circle obj = new Circle(50); 이렇게 생성자에 값을 넣으면 최초로 만들어질 때, (new 띄울 때, 기본값이 50) radius 값이 50이 된다는 말. = CircleTest에서 최초값을 세팅했음!
 
<결과값>
notion image
 
💡
객체 초기화 > 생성자 시간이 지나면서 변화하는 것 > 메소드
 

2. 생성자의 매개변수

notion image
분홍색 표시 코드를 보면, Pizza는 매개변수가 없다. (디폴트 생성자) 즉, 초기값으로 세팅된건 없고, 8번, 9번 값으로 초기화를 받는다. //결과 - type 슈퍼슈프림, size 12 노란색 표시 코드를 보면, 매개변수가 2가지 (int s, String t)가 들어가있다. (생성자) 그래서 new Pizza(24, "포테이토") 라고 초기값을 넣어준 것!! //결과 - type 포테이토, size 24 초기에 세팅된 값이 그대로 출력되는 걸 알 수 있다!!
 

2-1. 생성자에 매개변수를 사용하는 이유?

  • 객체를 생성하고 초기화하는 과정에서 필요한 데이터를 전달하기 위함
  • 객체를 생성할 때, 객체의 초기 상태를 설정해야 하는 경우가 많다. 예를 들어, People 클래스에서는 name, power, hp라는 속성을 가지고 있다. People 객체를 생성할 때, (=new 할 때) 해당 객체의 name과 power의 초기값을 (객체를 생성할 때마다 내가 원하는 초기값으로) 입력 받고 싶다.
  • 이때 생성자를 사용하면 객체 생성과 동시에 초기 데이터를 전달할 수 있다. 생성자에 매개변수를 정의하고, 객체를 생성할 때 해당 매개변수에 전달된 값을 이용하여 객체의 속성을 초기화할 수 있다.
 

IntelliJ 생성자 자동 생성
(1) Alt + Insert → Constructor
(1) Alt + Insert → Constructor
 
(2) 만들 생성자 선택 후, OK
(2) 만들 생성자 선택 후, OK
 
(3) 결과
(3) 결과
 

3. this. (지역변수)

this.
notion image
notion image
notion image
매개변수의 name과 객체의 name 둘의 이름이 똑같다. 이것을 구분하기 위해 this. 을 사용함. this.name은 heap(객체)의 name을 뜻함.
객체 내에서 현재 객체를 가리키는 참조. 객체 내에서 멤버 변수와 메소드를 참조할 때 사용됨. 주로 멤버 변수와 매개변수의 이름이 같을 때, 멤버 변수를 구분하기 위해 사용
💡
this는 무조건 heap꺼!
 

4. this()

this() > 굳이 쓸 필요 x
4-1. this() 주의사항
1. this()는 반드시 생성자 안에서만 호출이 가능하다 2. this()는 반드시 첫번째 문장이어야 한다 3. this()는 다른 생성자를 호출할 때만 사용하여야 한다.
notion image
notion image
notion image
근데.. 그냥 [ this.name = "토비"; ] 이렇게 초기화를 더 많이함. 굳이.. this() 를?
this()는 같은 클래스 내에서 다른 생성자를 호출하는 역할. 주로 생성자 오버로딩 시 코드의 재사용성을 높이기 위해 사용
 
💡
this. 이랑 this()는 완전히 다른 것
 

5. 기본 생성자

매개변수를 가지지 않고 클래스의 객체를 생성하는 생성자. (매개 변수가 없는 생성자) 개발자가 생성자를 하나도 정의하지 않으면 자바 컴파일러는 기본 생성자를 자동으로 만든다 이때, 모든 멤버 변수들을 기본값으로 초기화한다. ex) toString 안의 내용 참조 (lamp)
notion image
기본 생성자는 매개변수를 가지지 않고 클래스의 객체를 생성하는 역할을 하며, 주로 멤버 변수를 기본값으로 초기화하는 용도로 사용
 

5-1. 기본 생성자가 (자동으로) 추가되지 않는 경우 ★

이유 자세히 보기
<생성자를 만드니, 기본 생성자를 불러오는 13번 라인은 오류!>
notion image
보이는 것처럼 생성자가 있는 상황에선 자동으로 기본 생성자를 만들지 못한다! 기본 생성자를 직접 만들어주지 않을거면 14번 라인처럼 입력해줘야함.
 
<기본 생성자를 수기로 생성해 준 모습>
notion image
오류가 뜨지 않는 것 확인!
 
개발자가 클래스에 생성자(=매개 변수가 있는 것)를 하나라도 선언한다면 컴파일러는 기본 생성자(=매개 변수 X)를 자동으로 추가하지 않는다. >> 원래는 자동으로 생성 해줬는데... 수기 생성 해야한다. 개발자가 생성자를 하나라도 정의하면 컴파일러는 해당 생성자를 기본 생성자로 간주하고, 추가적으로 기본 생성자를 생성하지 않는다.
 

6. 생성자와 메소드 구분

생성자는 클래스의 이름과 동일한 이름을 가지고 있다 (대문자로 시작), 리턴값 없다. 객체를 초기화하고 생성하는 역할. (태어나면서부터 가지는 값) ex) public Person() { 메소드는 객체의 동작이나 기능을 정의하고 구현하는 역할을 하며 객체를 통해 호출된다. 리턴값 있다. 소문자. 라마표기법. (살아가면서 느는 것) ex) public int minus() { * 매개변수는 둘 다 가질 수 있다!
 

강의 예제
package ex04; //설계도 class People { String name; //애의 스코프는 heap int power; int hp; //객체 초기화할때 사용 public People(String name, int power) { //애의 name은 스코프가 stack //값을 전달받아서 객체의 상태값으로 옮김. this.name = name; //this는 스코프가 heap에 있는 애를 이야기함 this.power = power; this.hp = 100; //생성할 때마다 hp는 100으로 고정이니 애는 상수로 받는다. } //초기값이 아니라, 살아가면서 느는거라(?) 메소드 (행위) public void upgradePower() { this.power++; } @Override public String toString() { return "People{" + "name='" + name + '\'' + ", power=" + power + ", hp=" + hp + '}'; } } public class PersonEx01 { public static void main(String[] args) { People p1 = new People("티모", 10); System.out.println(p1); p1.upgradePower(); System.out.println(p1); } }
notion image
notion image
 

 
💡
클래스의 객체를 생성자로 전달하는 경우, 별도의 생성자를 구현할 필요는 없다. 생성자는 객체를 초기화하기 위해 사용되는 특별한 메서드로서, 클래스의 인스턴스를 생성할 때 호출된다. 클래스의 생성자는 일반적으로 인스턴스 변수를 초기화하거나 필요한 설정을 수행하는 역할을 한다. 그러나 이미 생성된 객체를 생성자로 전달받는 경우, 해당 객체는 이미 생성 및 초기화된 상태이므로 별도의 생성자를 구현할 필요가 없다.
Share article

codingb