JAVA / CLASS(클래스)
정의
클래스 : 객체가 정의되어있는 틀
객체 : 클래스에서 생성된 데이터
인스턴스 : 객체가 소프트웨어에 실체화 된 것
이렇게 보면 클래스 -> 객체의~ 엥 그럼 객체는? 클래스의 ~ 이렇게 나오니 이해하기가 힘들다.
그래서 나는 나만의 방식으로 짱구 곤약귀신편에서 나오는 곤약틀과 곤약으로 이해를 했다.
요렇게 틀에 찍혀 나온 곤약들은 다 똑같이 생겼지만 곧 어떤 특성들 을 가지게 되는데
어떤 곤약은 철수엄마가, 어떤 곤약은 원장님이, 어떤 곤약은 훈이가 되기도 한다.
곤약 틀 = 클래스 / 곤약 = 객체
그리고 같은 곤약 태생이지만 철수엄마 곤약과 원장님 곤약은 서로 다른 특성을 가지고 있다.
이 때 '철수 엄마', '원장님'을 객체라고 한다.
클래스 생성
class Goneyak {
String face; // 곤약의 얼굴
String behavior; //곤약의 행동
}
곤약 틀에서 나온 곤약들은 '얼굴이 있고 어떠한 행동을 한다.' 라는 공통적인 특성을 변수로 생성해줘야 한다.
그리고 그런 변수인 face, behavior은 Gonyak클래스의 멤버변수가 된다.
(클래스는 관행적으로 대문자로 시작하도록 이름을 짓는다.)
생성자
객체를 구체화 시키기 위해서는 '생성자'라는 것이 필요한데, 생성자는 곤약의 생김새, 행동 등을 부여해줄 수 있다.
이 때 생성자는 클래스와 이름이 같아야하며, 리턴타입이나 static이 없어야한다.
class Goneyak {
String face; // 곤약의 얼굴
String behavior; //곤약의 행동
public Gonyak(){}
}
요렇게 아무것도 없는 생성자를 기본생성자라고 한다. 객체에 속성을 주지 않고 생성만 할 때 사용한다.
그럼 객체에 속성을 주려면 어떻게 해야할까?
class Gonyak {
String face; // 곤약의 얼굴 (멤버변수)
String behavior; //곤약의 행동(멤버변수)
public Gonyak(){} // 기본 생성자
public Gonyak(String face, String behavior){ // 생성자
this.face = face;
this.behavior = behavior;
}
}
이런 식으로 생성자의 괄호 안에 속성으로 받아올 변수들을 넣어주면 된다. 그러면 객체 하나하나에 다른 속성을 부여해 줄 수 있게 된다.
여기서 this 는 받아온 변수의 이름과 클래스의 맴버변수의 이름을 같게 쓸 거예요~ 라는 뜻이다!
다른 클래스에서 객체 만들기
다른 클래스에서 곤약의 특성을 이용하고 싶을 때 사용하는 것이 객체인데
우리는 GonyakMain이라는 클래스에서 Gonyak 클래스의 객체를 만들어보겠다.
public class gonyakMain{
public static void main(String[]args) {
Gonyak gonyak; // 객체 생성
gonyak = new Gonyak(); //gonyak은 Gonyak클래스의 인스턴스
}
}
객체를 만드는 가장 기본적인 형태는 이 것이다.
Gonyak 타입의 변수를 만들면 그 것이 객체가 되는 것이다. 객체를 new를 통해서 메모리를 할당 받게 되면 gonyak은 Gonyak 클래스의 인스턴스가 된다.
더 쉽게 구별하기 위해서 'gonyak은 객체이다.' , 'gonyak은 Gonyak클래스의 인스턴스이다.' 이 둘의 차이점을 생각해야한다!
위처럼 () 안에 아무것도 없는 것은 기본생성자를 통해 만든 객체이다.
그럼 얼굴과, 행동 속성을 가지고있는 객체는 어떻게 만들어야할까?
/* 속성을 부여하는 생성자
public Gonyak(String face, String behavior){
this.face = face;
this.behavior = behavior;
}
*/
Gonyak cheol_mom = new Gonyak("친절한 얼굴", "생 닭을 먹는다! 으악!");
철수 엄마의 속성을 가진 객체 cheol-mom이다. 친절한 얼굴과, 생 닭을 먹는다는 속성을 가지고 있다.
이처럼 생성자 옆에 있는 매개변수의 수와 타입을 맞춰주면 철수 엄마의 속성을 가진 객체가 생성되게 된다!
그럼 마저 원장님의 객체도 생성해보겠다.
Gonyak cheol_mom = new Gonyak("친절한 얼굴", "생 닭을 먹는다! 으악!");
Gonyak boss = new Gonyak("수염 난 얼굴");
원장님의 속성을 수염난 얼굴만 지정하면 어떻게 될까?
The constructor Gonyak(String) is undefined 이런 에러가 뜨게 되는데
String 타입을 하나만 받는 생성자가 존재하지 않는다는 것이다.
이처럼 부여하고싶은 속성에 따라 생성자를 꼭 만들어 주어야한다!
toString
그럼 객체만을 가지고 객체의 속성을 출력해보도록 하겠다.
그럴 때 사용하는 것이 toString메소드인데, 멤버변수가 있는 클래스에 생성하면 된다.
public String toString() {
return "얼굴은" + face + "행동은" + behavior;
}
toString은 이런 형식으로 사용되고.
이 것은 좌측 상단의 메뉴에 [Source] -> [Generate toString] 메뉴를 통해 쉽게 만들 수 있다.
다시 메인문으로 돌아가서 철수엄마와 원장님을 출력해보면
Gonyak cheol_mom = new Gonyak("친절한 얼굴", "생 닭을 먹는다! 으악!");
Gonyak boss = new Gonyak("수염 난 얼굴", "운전을 잘한다.");
System.out.println(cheol_mom);
System.out.println(boss);
이렇게 출력이 된다. 만약 toString메소드를 사용하지 않고 출력한다면
해쉬코드 라는게 뜨게 되는데, 코드상 오류는 없지만 더 자세히 써달라는 뜻이다.
클래스를 사용할 때 toString이 없으면 주로 뜨게 되는 것이니 꼭 확인해야한다!