JAVA

[JAVA와 친해지기] 생성자

지난시간에 내용을 기억하고 계신지요! 지난시간에는 클래스와 객체에 대해서 알아보았습니다. JAVA는 "객체지향 프로그래밍"이라는 프로그래밍 방법론을 주되게 사용하며, 이 "객체"를 만들기 위한 도구를 "클래스(class)", 도구로 생성된 객체의 실제형태를 "인스턴스(Instance)"라고 부른다는것이 지난 글의 주된 내용입니다. 이번시간에 다룰 주제는 객체와 인스턴스를 구현하는 생성자에 대한 이야기를 조금 더 깊게 해볼까 합니다. 지난 이야기가 기억이 나지 않으신다면, 꼭! 저번 글을 읽고 와주시기 바랍니다!

2021.12.01 - [JAVA] - [JAVA와 친해지기] 클래스와 객체

 

[JAVA와 친해지기] 클래스와 객체

프로그래밍 방법론(Programming Methodology)라는 것이 있습니다. 프로그래머는 컴퓨터와 대화를 하는 사람으로 어떠한 언어를 사용해서 컴퓨터와 대화를 할지 결정해서 컴퓨터에게 작업을 지시하기

tutoreducto.tistory.com


생성자(Constructor)

지난시간에 간단하게 생성자에 대해서 다루었습니다. 지난시간의 정의로는

  • 생성자(Constructor) : 객체가 인스터스화될때(생성될 때) 호출되는 블럭 생략가능하다.

로 말씀을 드렸죠. 지난시간의 코드를 다시 들고 오겠습니다.

 

// Dog.java

public class Dog{
	
	int gender;
	int height;
	int weight;
	boolean adorable;
	boolean cute;
	
	Dog(){
    		System.out.println("Hello Im dog");
    	}	// 객체생성자
	
	public void eat(){}
	public void bark(){}
	public void sleep(){}
	public void tailling(){}
	
}

위의 코드 중 Dog(){}라는 부분이 이 Dog 클래스의 생성자입니다. 생성자는 다음과 같은 특징이 있습니다!

  1. 생성자는 클래스이름(){}의 형태로 이루어진다.
  2. 생성자는 파라미터(소괄호 안에 들어가는 부분) 를 변경하여 여러개 생성할 수 있다.
  3. 생성자를 생략하면 디폴트 생성자( 클래스이름(){} ) 이 자동으로 추가된다.

코드를 통해서 살펴보겠습니다!

// Dog.java

public class Dog{
	
	int gender;
	int height;
	int weight;
	boolean adorable;
	boolean cute;
	
    // 3. 아래처럼 클래스이름(){} 된 생성자는 디폴트 생성자(Default Constructor)라고 부르며
    //    생성자를 명시하지 않은 경우에 자동으로 컴파일러에서 붙여준다.
	Dog(){
    		System.out.println("Hello Im dog");
    	}	// 1. 객체생성자, 생성자는 클래스이름과 동일한 함수의 형태를 가진다.
       
    Dog(int gender){
        this.gender = gender;
    }   // 2. 파라미터를 다르게 하여 여러개의 생성자를 선언할 수 있다.
	
	public void eat(){}
	public void bark(){}
	public void sleep(){}
	public void tailling(){}
	
}

2.의 내용처럼 파라미터를 다르게 하여 생성자를 여러개 선언하는 것을 생성자 오버로딩(Constructor Overloading) 이라고 부릅니다! 추후 함수에 관련된 이야기를 할 떄도 Overloading이라는 단어를 보실 수 있으실 겁니다!

 

gender를 파라미터로 받는생성자블럭에 this라는 키워드가 보입니다. this는 인스턴스화된 class자기자신을 의미합니다.

따라서 this.gender라는 것은 public class Dog{바로 아래 있는 멤버변수(클래스 변수) int gender;를 의미하고, this.gender=gender의 우항 gender는 파라미터로 전달된 값을 의미합니다. 

다음의 예시를 살펴보겠습니다.

// Dog.java

public class Dog{
	
	int gender;
	int height;
	int weight;
	boolean adorable;
	boolean cute;
	
	Dog(){
    		System.out.println("Hello Im dog");
    	}	// 객체생성자
	
	public void eat(){}
	public void bark(){}
	public void sleep(){}
	public void tailling(){}
    
    public void printGender(){
        if(gender == 1){
            System.out.println("남성");
        }else{
            System.out.println("여성");
        }
    }
	
}

public class Main{
	public static void main(String[] args){
      Dog bagGu = new Dog(1);
      Dog hwangGu = new Dog(2);
      
      bagGu.printGender();
      hwangGu.printGender();
    }
}
## 출력결과
남성
여성

그렇습니다. 인스턴스화한 bagGu의 gender는 생성자블럭의 this.gender = gender에 의해서 bagGu의 멤버변수 gender는 1로, hwangGu의 멤버변수 gender는 2로 초기화됩니다.(bagGu의 this는 bagGu이며, hwangGu의 this는 hwangGu입니다.)

 

this키워드를 잘 이용하면, 생성자에서 다른 생성자를 호출할 수도 있습니다.

// Dog.java

public class Dog{
	
	int gender;
	int height;
	int weight;
	boolean adorable;
	boolean cute;
	
	Dog(){
    		System.out.println("Hello Im dog");
    	}	
       
    Dog(int gender){
        this();  // 위의 Dog(){ System.out.println("Hello Im dog"); } 호출
        this.gender = gender;
    }  
	
	public void eat(){}
	public void bark(){}
	public void sleep(){}
	public void tailling(){}
	
}

 이렇게 생성자를 다른 생성자에서 사용함으로 나오는 이점은 생성자를 재사용할 수 있다는 점입니다. 생성자A와 B가 있는데, 모든 100가지 줄이 같고 B에 한줄만 추가되는 거라면? 궅이 같은 내용을 A / B에 두번씩 쓸필요없이, A에 한번만 쓰고, B는 A를 호출하기만 하면 되겠죠?


이번시간에는 여러가지 생성자를 선언하는 방법과 디폴트 생성자, this키워드가 어떤것인지, 사용은 어떻게 하는지 알아보았습니다. 다음시간에는 객체의 기능, 행동을 표현하는 매서드(함수)에 대해서 알아보겠습니다!