728x90

이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.

그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.

그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(ctrl+f 나 cmd+f)로 찾아보도록하자.


저번시간의 코드가 기억이 나는가? 기억이 잘 나지 않는다면 그 코드를 그대로 가져오겠다.


public class Main {
public static void main(String[] args) {
Pokemon p1 = new Pokemon();
Pokemon p2 = new Pokemon();

p1.name = "피카츄";
p1.hp = 50;
p1.skill1 = "백만볼트";

p2.name = "꼬부";
p2.hp = 25;
p2.skill1 = "물대포";

System.out.println(p1.status());
System.out.println(p2.status());
}
}


이 코드는 객체를 사용해서 프로그래밍을 하였다.

그러나 초기화를 할때 일일이 값을 넣어주었다. 이 방식을 그대로 사용해야한다면 불편할 것이다.

그러므로 이번에는 이러한 초기값들을 한번에 초기화 시켜주는 작업을 해줄 것이다.

이 초기화를 도와주는 메소드가 있다. 아주 특별한 메소드라서 보통은 메소드라고 부르지않고 생성자라고 부른다.

영어로는 Constructor라고 불리운다.


생성자


public class Pokemon {
String name;
int hp;
String skill1;
String skill2;
String skill3;
String skill4;

Pokemon() {
name = "캐터피";
hp = 7;
skill1 = "실뿜기";
}

String status() {
return "포켓몬의 이름은 " + name + ", 체력은 " + hp + "입니다.";
}
}


생성자는 앞에 반환형을 적지않는다. 어짜피 적을 수있다고 했었어도 적을 반환형도 없다.

그리고 자기 클래스의 이름을 적는다.

자기 자신의 이름을 그대로 적는순간 이는 생성자가된다. 

반대로 이야기해서 해당 클래스와 이름이 동일한 특정 메소드는 만들 수 없다는 이야기가 된다.

Pokemon클래스에 생성자를 제작했다.

이제 메인함수에서 실행하여 보자.


public class Main {
public static void main(String[] args) {
Pokemon p1 = new Pokemon();
Pokemon p2 = new Pokemon();
Pokemon p3 = new Pokemon();

p1.name = "피카츄";
p1.hp = 50;
p1.skill1 = "백만볼트";

p2.name = "꼬부";
p2.hp = 25;
p2.skill1 = "물대포";

System.out.println(p1.status());
System.out.println(p2.status());
System.out.println(p3.status());
}
}


p1과 p2는 우리가 지정해줬지만 p3는 우리가 지정해 준적이 없다.

그럼에도 불구하고 p3의 값을 출력했을때 값이 나온다.

그 이유는 p3를 초기화 하였기 때문이다.


그럼 생성자를 이용해서 초기화를 정해줬는데 내가 원하는 값으로 초기화를 해줄 수 있을까?

물론 가능하다. 아래의 코드를 보자.


public class Pokemon {
String name;
int hp;
String skill1;
String skill2;
String skill3;
String skill4;

Pokemon() {
name = "캐터피";
hp = 7;
skill1 = "실뿜기";
}

Pokemon(String n, int h, String s) {
name = n;
hp = h;
skill1 = s;
}

String status() {
return "포켓몬의 이름은 " + name + ", 체력은 " + hp + "입니다.";
}
}


보면 생성자가 한개가 아니라 두개이다. 생성자는 이미 있는 함수에 파라메터(받는 인자)가 다르다면 다른 생성자로 인식하게된다.

이를 생성자의 오버로딩(Overloading)이라고 한다.

오버로딩은 함수의 이름이 중복되서 사용하는 것을 의미하는데 자세한 설명은 다음장인 오버로딩에서 설명하도록 하자.

어쨋던 이미 있는 함수의 이름을 재선언 하는 것을 오버로딩이라고 한다는 것만 알아두면 된다.

이제 main함수에서 불러와보도록 하자.


public class Main {
public static void main(String[] args) {
Pokemon p1 = new Pokemon("피카츄", 50, "백만볼트");
Pokemon p2 = new Pokemon("꼬부기", 25, "물대포");
Pokemon p3 = new Pokemon();

System.out.println(p1.status());
System.out.println(p2.status());
System.out.println(p3.status());
}
}


이제 굉장히 코드가 깔끔해지고 사용하기도 굉장히 편해졌다. 초기의 너저분한 코드와는 궤를 달리한다.


this


this의 뜻이 뭔지 모르는 사람은 없을 것이다. 바로 이것이라는 뜻이다.

this는 특정 클래스 내에서만 사용할 수 있는 키워드이다.

이 this의 호출은 바로 이 클래스 그 자체를 호출한다.

예를 들어보자.


public class Pokemon {
String name;
int hp;
String skill1;
String skill2;
String skill3;
String skill4;

Pokemon() {
this.name = "캐터피";
this.hp = 7;
this.skill1 = "실뿜기";
}

Pokemon(String n, int h, String s) {
this.name = n;
this.hp = h;
this.skill1 = s;
}

String status() {
return "포켓몬의 이름은 " + name + ", 체력은 " + hp + "입니다.";
}
}


위의 코드는 this 키워드를 사용한 예제이다.

this 키워드를 사용하면 현재 클래스의 멤버를 명시적으로 선언해주는 것이다.


그러나 한가지 의문이 들 수 있다. 왜냐하면 이때까지는 this를 사용하지 않았기 때문이다.

그럼 this를 사용하지 않아도 되느냐고 반문할 수 있다.

그 역시 그렇다. this를 사용하지 않아도 일반적인 상황에서는 자동으로 멤버를 지정하는 걸로 인식한다.

그럼 필드로 인식하지 않는 경우도 있냐는 것이다.

물론 그런 상황역시 존재한다. 예를들면 아래 같은 상황이다.


public class Pokemon {
String name;
int hp;
String skill1;
String skill2;
String skill3;
String skill4;

Pokemon() {
this.name = "캐터피";
this.hp = 7;
this.skill1 = "실뿜기";
}

Pokemon(String name, int hp, String skill1) {
this.name = name;
this.hp = hp;
this.skill1 = skill1;
}

String status() {
return "포켓몬의 이름은 " + name + ", 체력은 " + hp + "입니다.";
}
}


매개변수가 3개인 생성자를 보자. 보다시피리 매개변수의 이름과 필드의 이름이 동일하다.

따라서 둘을 구별할 수없다.

만약 이렇게 이름이 중복되는 상황이 발생한다면 항상 안의 블록이 우선시 된다.

따라서 위의 생성자에서 name을 그냥 호출한다면, 이는 필드가 안인 매개변수를 호출하는 것이된다.

이때 구별해 주려면 this를 써야하며 이경우 this의 호출은 반드시강제 된다.


public class Pokemon {
String name;
int hp;
String skill1;
String skill2;
String skill3;
String skill4;

Pokemon() {
this.name = "캐터피";
this.hp = 7;
this.skill1 = "실뿜기";
this.skill2 = "";
this.skill3 = "";
this.skill4 = "";
}

Pokemon(String name, int hp, String skill1) {
this();
this.name = name;
this.hp = hp;
this.skill1 = skill1;
}

String status() {
return "포켓몬의 이름은 " + name + ", 체력은 " + hp + "입니다.";
}
}


일반적으로 생성자는 클래스이름을 그대로 호출한다. 근데 그건 다른 메소드에서 사용할때의 이야기이다.

생성자에서 기존의 생성자를 호출할땐 어떻게 해야할까?

그 때역시 this를 호출한다. 이때 this()라는 형식으로 함수호출하는 방식으로 사용하면된다.

'Programming > Java' 카테고리의 다른 글

[Java-12]static  (0) 2017.10.05
[Java-11]오버로딩(feat.디폴트 생성자)  (0) 2017.10.04
[Java-09]객체와 클래스  (0) 2017.09.30
[Java-08]배열  (0) 2017.09.30
[Java-07]반복문  (0) 2017.09.29

+ Recent posts