본문 바로가기
Java

Java(자바) 클래스 다듬는 생성자와 this , 메소드 오버로딩

by allwing12 2022. 8. 17.

어떤 클래스던 모든 클래스는 인스턴스화 될 때 생성자를 사용하게 된다.

생성자에는 특징이 여러가지 있는데 그 부분을 잠시 보자면

 

1. 생성자는 리턴타입이 없다.

2. 생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일할 때 자동으로 생성된다.

3. 매개변수가 없는 생성자를 기본생성자 라고 한다.

4. 생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 자동으로 만들어지지 않는다.

 

 

생성자는 객체가 될 때 필드를 초기화 하는 역할을 수행하며

자동차가 객체가 될 때 반드시 이름을 가지도록 하려면 Car클래스를 다음과 같이 만들어야한다.

 

public class Car{
	String name;
    int number;
    
    public Car(String n){
    	name = n;
    }
}

 

위의 코드와 연계로 Car 클래스를 이용해서 Car 인스턴스를 생성하는 방법은 아래와 같다.

 

 

public class CarExam2{
	public static void main(String args[]){
    
    	Car c1 = new Car("경찰차");
        Car c2 = new Car("화물차");
        // Car c3 = new Car(); 라고 할시 컴파일 오류가 발생한다.
        
        System.out.println(c1.name);
        System.out.println(c2.name);
        
 // Car클래스는 기본 생성자를 가지지 않기 때문에 기본생성자로 Car 객체를 생성할 수 없다.

 

 

this 키워드에 대해서 알아보려고 하는데 this는 현재 객체, 자기 자신을 나타낸다고 보면 된다.

 

 public class Car{
        String name;
        int number;

        public Car(String n){
            name = n;
        }
    }

 

Car클래스의 생성자 매개변수의 이름이 n이며 n이라는 변수명은 뭘 의미하는지는 쉽게 알 수 없는데

n으로 쓰기 보다는 name으로 사용하는 것이 좋으며 이런식으로 변수명을 쉽게 알아보기 쉽게

지정을 해주는 것이 중요하다. (안그러면 정말 이게 뭔지 잘 모른다...)

 

public Car(String name){
	name = name;
 }

 

근데 이렇게 name=name 이라고 해버리면 가깝게 선언된 변수를 우선 사용하기 때문에

name=name 이라는 코드는 매개변수의 name 의 값을 매개변수 name에 대입하라는 의미가 되는데

필드는 바뀌지 않는다, 이런 경우에는 필드라는 것을 컴파일러와 JVM에게 알려주기 위해 this 키워드를 사용한다.

 

public Car(String name){
	this.name = name;
 }

 

위와 같이 this.name은 필드 name을 말하는거고 = 뒤에 name은 매개변수를 의미를 하게되며

매개변수의 값을 필드에 대입하라는 의미가 되며 우리가 볼 때에도 쉽게 이해할 수 있게 된다.

클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때에도 this.메소드명()으로 호출 할 수 있다.

 

 


메소드 오버로딩에 대해서 알아보려고 하는데 메소드 오버로딩은 매개변수의 수, 타입이 다른 경우

동일한 이름으로 메소드를 여러개 정의할 수 있게 해주는 것을 뜻한다.

 

class MyClass2{
	public int plus(int x, int y){
    	return x+y;
   }
   
   public int plus(int x, int y, int z){
   		return x + y + z;
     }
     
   public String plus(String x, String y){
   		return x + y;
   }
}

 

메소드 오버로딩의 경우에는 매개변수 부분이 차이가 달라야 한다.

위의 코드는 이름은 같지만 매개변수가 다른 메소드 들이다.

매개변수 이름은 같아도 상관은 없지만 타입이 같으면 안된다.

 

 

댓글