메서드(Method)와 생성자(Constructor)

이용만·2023년 2월 23일
0

선생님이 말씀하시는 생성자

  • 객체 필드를 초기화 하는데 쓰이는 특수한 메서드가 생성자다.

메서드 : 특정 작업을 수행하는 일련의 명령문들의 집합

자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
	메서드 내용 // 메서드 바디}
public static int add(int x, int y) { // 메서드 시그니처
	int result = x + y; // 메서드 바디
	return result;}
		
        

메서드 오버로딩(Method Overloading)

메서드 오버로딩이란 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미한다.

public class Overloading {
    public static void main(String[] args) {
        Shape s = new Shape(); // 객체 생성
 
        s.area(); // 메서드 호출
        s.area(5);
        s.area(10,10);
        s.area(6.0, 12.0);
    }
}

class Shape {
    public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
        System.out.println("넓이");
    }
    public void area(int r) {
        System.out.println("원 넓이 = " + 3.14 * r * r);
    }

    public void area(int w, int l) {
        System.out.println("직사각형 넓이 = " + w * l);
    }

    public void area(double b, double h) {
        System.out.println("삼각형 넓이 = " + 0.5 * b * h);
    }
}

//출력값
넓이
원 넓이 = 78.5
직사각형 넓이 = 100
삼각형 넓이 = 36.0

area()라는 메서드 명을 가지고 있음에도 각기 다른 출력값을 리턴하낟.
꼭 기억해야 할 점은 무조건 같은 메서드명을 사용한다고해서 오버로딩이 되는 것이 아니라는 것이다.

※오버로딩 성립조건

1) 같은 이름의 메서드명을 쓴다.
2) 매개변수의 개수나 타입이 다르게 정의되어야 된다.

※오버로딩의 장점
하나의 메서드로 여러 경우의 수를 해결할 수 있다.
ex) println()

생성자 : 객체를 생성하는 역할, 인스턴스 생성 시 호출되는 인스턴스 초기화 메서드

학습 목표

  • 생성자의 핵심 개념과 기본 문법을 이해하고 사용할 수 있다.
  • 생성자가 메서드와 구분되는 두 가지 차이를 이해하고 설명할 수 있다.
  • 메서드 오버로딩이 생성자에서 어떻게 구현될 수 있는 지 확인하고 이해할 수 있다.
  • 기본 생성자와 매개변수가 있는 생성자의 차이를 설명할 수 있다.
  • this 와 this() 의 차이에 대해 설명할 수 있다.

생성자는 인스턴스를 생성하는게 아니라 생성을 담당하는 것은 "new" 키워드이고,
생성자는 인스턴스 변수들을 초기화하는데 사용되는 특수한 메서드이다.
생성자의 매개변수의 개수와 타입이 호출될 때 전달되는 인자의 타입과 개수는 일치해야된다

※생성자와 메서드의 차이
1) 생성자의 이름은 반드시 클래스의 이름과 같아야 된다.
2) 생성자는 리턴 타입이 없다. 하지만 메서드에서 리턴 값이 없을 때 표시하는 void 키워드를 사용하지 않는다. 왜? '리턴하지 않는다' 를 의미하는 void와는 다르게 생성자는 아예 리턴 타입자체가 존재하지 않기떄문이다.

클래스명(매개변수) { // 생성자 기본 구조
	...생략...
}

기억해야할 것은 생성자도 앞서 학습했던 오버로딩이 가능하기에 한 클래스 내에 여러 생성자가 존재할 수 있다.

public class ConstructorExample {
    public static void main(String[] args) {
        Constructor constructor1 = new Constructor();
        Constructor constructor2 = new Constructor("Hello World");
        Constructor constructor3 = new Constructor(5,10);
    }
}

class Constructor {
    Constructor() { // (1) 생성자 오버로딩
        System.out.println("1번 생성자");
    }

    Constructor(String str) { // (2) 
        System.out.println("2번 생성자");
    }

    Constructor(int a, int b) { // (3) 
        System.out.println("3번 생성자");
    }
}

-> 생성자의 모양에 따라 객체 생성하는 방법이 결정된다.

기본생성자 vs 매개변수가 있는 생성자

기본생성자

public Car(){ // 기본 생성자
        
    }

    //매개변수가 있는 생성자
    public Car(String model, String color){
        this.model = model;
        this.color = color;
    }

기본 생성자는 클래스에 따로 만들지 않아도 자바 컴파일러가 기본 생성자를 자동으로 추가해준다.
만약 생성자를 또 만들게 되면 기본 생성자가 아닌 이미 추가되어 있는 생성자를 사용한다.

매개변수가 있는 생성자
매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출시에 해당 값을 받아 인스턴스를 초기화하는데 사용된다. 언제 사용하는가? 고유한 특성을 가진 인스턴스를 계속 만들어야하는 경우 인스턴스마다 각기 다른 값을가지고 초기화 할 수 있어서 매우 유용하다.

public class ConstructorExample {
    public static void main(String[] args) {
        Car c = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + c.getModelName() + "이고, 컬러는 " +  c.getColor() + "입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.

Car 인스턴스 생성 시 매개변수가 있는 생성자를 사용함으로 인스턴스를 만든 후에 인스턴스의
필드값을 일일이 설정할 필요 없이 생성과 동시에 원하는 값으로 설정해줄 수 있다.

this vs this()

this()

생성자는 상호 호출이 가능하다. 상호 호출을 위해 사용하는 메서드가 this() 이다.
this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다.
ex) Car 클래스의 생성자를 호출하는 것은 Car()가 아니라 this()이고 그 효과는 Car() 생성자를 호출하는 것과 같다.

※this() 메서드를 사용하기 위한 문법요소
1) this() 메서드는 반드시 생성자의 내부에서만 사용할 수 있다.
2) this() 메서드는 반드시 생성자의 첫 줄에 위치해야 된다.

public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        Example example2 = new Example(5);
    }
}

class Example  {
    public Example() {
        System.out.println("Example의 기본 생성자 호출!");
    };

    public Example(int x) {
        this();
        System.out.println("Example의 두 번째 생성자 호출!");
    }
}

//Output
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!

this() 메서드가 출력되어 다시 첫 번째 기본 생성자가 호출된다.


this

public class ConstructorExample {
    public static void main(String[] args) {
        Car car = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " +  car.getColor() + "입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.

매개변수가 있는 생성자를 보면 modelName, color, maxSpeed가 있는데
인스턴스 변수와 매개변수를 이름만으로 구분하기가 어려워지기에 구분해주기 위한 용도로
주로 사용되는 방법이 this 키워드입니다.
결론적으로 this는 인스터느 자신을 가리키고 우리가 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this를 통해서 인스턴스자신의 변수에 접근할 수 있다.

profile
성장하는 개발자가 되고자 합니다.

0개의 댓글