프로그래밍 언어/Java

[java]클래스에 대해 알아보자

ssung.k 2019. 3. 28. 03:05

클래스

클래스 정의

클래스는 class 키워드로 시작한다. 이어서 클래스의 이름을 적고 중괄호 안에 필드와 메소드를 나열하는 형식이다.

public class Dog {
    String name;
	
	void bark() {
		System.out.println("왈왈");
	}
}

Dog라는 클래스 이름으로 필드로는 강아지의 이름 name 을 메소드로는 강아지의 울음소리를 출력하는 bark() 를 정의했다. 이들은 클래스의 맴버 라고 불리며 위와 같이 필드는 상태를 메소드는 동작을 나타낸다.

 

객체 생성

클래스는 객체를 만들기 위한 틀에 불과하다. 이 틀로 객체를 찍어내야한다. 위에서 정의한 Dog 클래스의 객체를 생성해보자.

class Dog {
	String name;
	
	void bark() {
		System.out.println("왈왈");
	}
}

public class DogTest {

	public static void main(String[] args) {
		Dog MyDog;
        MyDog = new Dog();
        MyDog.name = "moongchi";
        MyDog.bark();
		System.out.println("강아지의 이름은 "+MyDog.name+"입니다.");
	}
}
// 왈왈
// 강아지의 이름은moongchi입니다.

하나씩 상세히 알아보도록 하자.

Dog MyDog;

객체를 만들기 위해서 가장 먼저해야할 일은 참조 변수를 선언하는 것이다. 이는 객체를 생성하는 것이 아닌 객체를 가르킬 수 있도록 참조변수만 만든 것이니 헷갈리지 말자.

 

MyDog = new Dog();

다음으로는 new 연산자를 사용하여 객체를 생성하고 객체의 참조값을 참조 변수에 저장한다.

 

MyDog.name = "moongchi";
MyDog.bark();

생성한 인스턴스의 필드와 메소드를 사용하고. 접근할 때는 . 을 사용한다.

 

메소드 중복정의

영어로는 method overloading 이라고 한다. 이는 동일한 이름의 메소드를 여러 개 정의할 수 있음을 의미한다. 이름은 같지만 매개변수를 다르게 하여 메소드를 구분해준다. 예시를 통해 알아보자.

class Dog {
	String name;
	
	void bark() {
		System.out.println("왈왈");
	}
	void bark(String sound) {
		System.out.println(sound);
	}
}

public class DogTest {

	public static void main(String[] args) {
		Dog MyDog;
        MyDog = new Dog();
        MyDog.name = "moongchi";
        MyDog.bark();
		MyDog.bark("멍멍");
	}
}
// 왈왈
// 멍멍

첫번째 bark 는 매개변수를 받지 않고 왈왈을 출력하며 두 번째 bark 는 강아지의 울음소리를 매개변수로 받아서 이를 출력한다.

 

생성자

생성자는 객체를 만들 때 초기화 하는 방법이다. 물론 위에서도 각 필드에 접근하여 초기화를 해주었지만 다음과 같이 생성자를 사용할 경우, 일일히 인스턴스를 초기화를 안해줘도 된다. 생성자의 이름은 클래스의 이름과 같으며 반환값을 가질 수 없다. 예시를 통해 살펴보겠다.

class Dog {
	String species;
	
	public Dog() {
		species = "Maltese"; 
	}
	
	public Dog(String species) {
		this.species = species;
	}
}

public class DogTest {

	public static void main(String[] args) {
		Dog MyDog = new Dog();
        Dog YourDog = new Dog("poodle");
        
       System.out.println(MyDog.species);
       System.out.println(YourDog.species);
	}
}
// Maltese
// poodle

다른 매개변수없이 객체를 생성하게 된다면 자동으로 Maltese 를 값으로, 매개변수를 넣어준다면 그 값으로 species 를 결정한다.

생성자가 없으면 어떻게 될까요?

첫번째 예시에서는 생성자가 없었지만 코드가 문제없이 돌아간다. 개발자가 생성자를 따로 정의하지 않는다면 자바는 기본 생성자를 자동으로 만들게 되고 기본값으로 초기화한다. 기본적으로 수치형 변수는 0, 참조형 변수는 null, 부울형 변수는 false 로 초기화된다.

 

this 참조 변수

위 예시를 보면 처음 보는 코드가 있다. this 에 대해서 알아보자.

public Dog(String species) { 
		this.species = species;
	}

이는 참조변수라고 부른다. 이를 사용하는 이유는 기존에 필드로 있던 species 와 매개변수로 받아온 species 를 구분하기 위해서 사용한다.

 

this() 와 this

괄호 하나 차이로 완전히 다른 역할을 한다. this 는 위에서 알아봤던 대로 현재 객체를 가르키는 참조 변수이고, this() 에 대해서 알아보자.

class Dog {
	String species;
	
	public Dog(String species) {
		 this.species = species;
	}
	
	public Dog() {
		 this("Maltese");
	}
}

public class DogTest {

	public static void main(String[] args) {
		Dog MyDog = new Dog();
        Dog YourDog = new Dog("poodle");
        
       System.out.println(MyDog.species);
       System.out.println(YourDog.species);
	}
}
// Maltese
// poodle

this() 는 다른 생성자를 의미합니다. 그리고 this 의 매개변수를 통해 어떤 생성자를 의미하게 될지 결정합니다. 다음과 같은 경우는 this 의 매개변수가 "Maltese" 로 하나이므로 바로 위에 있는 매개변수 하나짜리 생성자를 호출하게 됩니다.