본문 바로가기
프로그래밍/Java-문법정리

【OOP】02_멤버변수·메서드·생성자

by 코이킹 2022. 1. 15.
반응형

안녕하세요 코이킹입니다. 

 

이번 포스트에선 클래스의 구성요소인 멤버변수·메서드·생성자에 대해서 설명하겠습니다. 

 


※ 설명에 사용할 코드 

public class Dog {

	// 멤버변수 
	String name;
	int hp;
	
	// 정적(static) 멤버변수
	static String breed;
	static final String cryingSound = "Wang~!";
	
	
	// 인스턴스 메서드 
	public void eat() {
		System.out.println("eat");
	}
	
	// 메서드 오버로딩
	public void eat(String food) {
		System.out.println("eat : "+food);
	}
		
	public String getName() {
		return name;
	}
	
	public int sleep(int time) {
		System.out.println("sleep");
		this.hp = time;
		return this.hp;
	}
	
	// 스테틱 메서드
	public static String getBreed() {
		return breed;
	}
	
	public static void crying() {
		System.out.println(cryingSound);
	}
	
	// 생성자 (기본)
	public Dog() {

	}
	
	// 생성자 (파라미터 설정)
	public Dog(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}
	
	
	// 생성자 (생성자 오버로딩 응용)
	public Dog(String name, int hp, String breed) {
		this(name, hp);
		this.breed = breed;
	}
	
}

 

1. 멤버변수 

멤버변수는 클래스 내부에 정의된 변수를 말하며, 현실의 객체가 가지는 속성을 추려내어 변수화 한것이라고 할 수 있습니다. 

멤버변수는 인스턴스 변수와 정적변수로 나눌 수 있습니다. 

 

1) 인스턴스 변수

인스턴스 변수는 클래스를 사용하여 인스턴스를 생성한 후에 사용할 수 있는 멤버변수 입니다. 

정적변수를 사용해야할 상황이 아니라면 대부분의 멤버변수는 인스턴스 변수로 선언하면 됩니다. 

 

아래와 같은 방식으로 인스턴스 변수에 접근이 가능합니다. 

[참조변수].[인스턴스변수명]

System.out.println("First Dog's Name : " + dog1.name);
System.out.println("Second Dog's Name : " + dog2.name);

 

2) 정적(static) 변수

 정적변수는 인스턴스를 생성하지 않더라도 사용 할 수 있는 변수입니다. 

 

아래와 같은 방식으로 인스턴스 변수에 접근이 가능합니다.

[참조변수 또는 클래스명].[인스턴스변수명]

 

정적변수는모든 인스턴스가 공유하는 값이라고도 볼 수 있습니다. 

 

System.out.println("####################");
System.out.println("First Dog's Breed : " + dog1.breed);
System.out.println("Second Dog's Breed : " + dog2.breed);
System.out.println("Third Dog's Breed : " + dog3.breed);
System.out.println("Dog's Breed : " + Dog.breed);
System.out.println();
		
Dog.breed = "Nothing";
System.out.println("####################");
System.out.println("First Dog's Breed : " + dog1.breed);
System.out.println("Second Dog's Breed : " + dog2.breed);
System.out.println("Third Dog's Breed : " + dog3.breed);
System.out.println("Dog's Breed : " + Dog.breed);
System.out.println();

// 모든 스태틱 변수의 값이 변해 있음.
System.out.println("####################");
System.out.println("First Dog's CryingSound : " + dog1.cryingSound);
System.out.println("Second Dog's CryingSound : " + dog2.cryingSound);
System.out.println("Third Dog's CryingSound : " + dog3.cryingSound);
System.out.println("Dog's CryingSound : " + Dog.cryingSound);
System.out.println();

 

예제 코드의 dog1, dog2는 정적변수 breed에 값을 대입하지 않았지만, dog3인스턴스를 생성시에

초기화한 값인 "Akita"를 dog1, dog2의 인스턴스에서 사용할 수 있습니다. 

 

다시 인스턴스를 생성하지 않고, [클래스].[정적변수]의 방식으로 정적변수에 접근하여 다른 값을 대입하면, 

Dog클래스로 생성한 모든 인스턴스에서 대입한 값을 사용할 수 있는 것을 알 수 있습니다. 

 

 

2. 메서드 

메서드는 현실의 객체가 가지는 다양한 행위를 코드로 정의한 것이라고 할 수 있습니다. 
메서드는 인스턴스 메서드와 정적 메서드로 나눌 수 있습니다. 

 

1) 인스턴스 메서드 

아래와 같은 방식으로 인스턴스 메서드를 호출할 수 있습니다.

[참조변수].[메서드명(파라미터...)]

// 반환값 X / 매개변수 X
dog3.eat();
		
// 반환값 X / 매개변수 O
dog3.eat("Meat");
		
// 반환값 O / 매개변수 X
String dog3Name = dog3.getName();
System.out.println("Third Dog's Name : " + dog3Name);
		
// 반환값 O / 매개변수 O
int hp = dog3.sleep(120);
System.out.println("Recovered HP : "+hp);

 

2) 정적(static) 메서드 

아래와 같은 방식으로 정적 메서드를 호출할 수 있습니다.

[참조변수 또는 클래스명].[메서드명(파라미터...)]

Dog.crying();
Dog.getBreed();

 

3) 메서드 오버로딩

메서드 오버로딩은 같은 이름의 메서드를 여러개 선언할 수 있는 것을 말합니다. 
메서드 오버로딩의 방법은 메서드의 매개변수의 개수 또는 자료형을 다르게 선언해주면 됩니다. 

// 같은 이름의 메서드를 여러개 선언가능
dog3.eat();
dog3.eat("Meat");

 

3. 생성자 

1) 인스턴스의 초기화를 위해 생성자가 필요

  예제의 dog1 인스턴스를 보면 객체를 생성한 직후의 멤버변수의 값은 아무것도 들어있지 않은 상태입니다.   
이 상태에서 클래스 내부의 멤버변수의 값을 활용하는 메서드가 호출된다면 원래 설계된 의도대로 동작하지 않을 것 입니다. 
따라서 인스턴스의 멤버변수는 초기 값의 설정이 필요합니다. 

 

2) 생성자란? 

생성자란 클래스를 이용해 인스턴스를 생성시 반드시 한번은 호출되는 일종의 메서드 입니다. 

 

선언은 아래와 같은 방식으로 하면 됩니다. 

 

[클래스명] (매개변수..) {
 
}

 

 생성자가 반드시 한 번은 호출된다라고 했지만 지금까지의 예제에서는 생성자를 별도로 선언하지 않았습니다. 

여기에는 이유가 있는데 클래스 내부에 생성자가 명시되지 않았을 때 Java에서 디폴트 생성자를 만들어 주기 때문입니다. 

디폴트 생성자는 인스턴스를 생성하기 위해 호출되기 위한 역할만 수행하므로 내용이 없습니다.

public Dog() {

}

 

3) this키워드 

this키워드는 클래스내부에서 클래스 자신을 가리킬때 사용합니다. 
this키워드를 사용하면 생성자에서 매개변수를 받을 때 같은 변수명을 사용할 수 있습니다. 

public Dog(String name, int hp) {
    this.name = name;
    this.hp = hp;
}

 

4) 생성자 오버로딩 

값을 초기화하지 않고 인스턴스를 생성해야하거나, 일부의 멤버변수의 값만 초기화하고 싶거나, 
생성자 호출시 특정한 로직을 호출하고 싶다거나 등등... 다양한 조건을 만족하면서 인스턴스를 생성하고자 한다면 생성자 오버로딩을 사용하면 됩니다. 

생성자 오버로딩을 사용하는 방법은 메서드의 오버로딩처럼 생성자의 매개변수의 개수를 다르게 하거나, 자료형을 다르게 하면 됩니다. 

 

	// 생성자 (기본)
	public Dog() {

	}
	
	// 생성자 (파라미터 설정)
	public Dog(String name, int hp) {
		this.name = name;
		this.hp = hp;
	}
	
	
	// 생성자 (생성자 오버로딩 응용)
	public Dog(String name, int hp, String breed) {
		this(name, hp);
		this.breed = breed;
	}

※ this() 메서드

this() 메서드는 생성자 내부에서만 호출할 수 있는 메서드로 생성자내부에서 다른 생성자를 호출하기위해 사용됩니다. 

 


※ 예제 코드

https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/objective/basic02/Dog.java

https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/objective/basic02/Main.java

 

※ qiita에 투고한 URL

https://qiita.com/Koiking-L/items/77272888d4fc65aaffc5

 

반응형

'프로그래밍 > Java-문법정리' 카테고리의 다른 글

【OOP】04_상속  (0) 2022.01.18
【OOP】03_캡슐화  (0) 2022.01.16
【OOP】01_객체・클래스・인스턴스  (0) 2022.01.10
【Java문법】예외처리  (0) 2022.01.10
【Java문법】셋(Set)  (0) 2022.01.10

댓글