우선은 생성자 전에 상속이나 오버라이딩에 대해서도 있기는 하지만 그건 이미 이 전 글에 정리가 되어있어서
바로 생성자로 넘어왔다 생성자의 경우에는 분명 글이 있기는 하겠지만 내가 좀 더 이해를 해보기 위해서
다시 한 번 정리를 해보려고 한다.
상속이나 오버라이딩에 대해서도 간단하게 정리를 하자면 extends 를 통해서 클래스간 상속이 가능하며
부모 클래스에 있는 메서드는 자식 클래스에서도 메서드 선언 없이 사용이 가능하다는 점이 있다.
다만, 자바에서는 다중 상속이 안된다는 점이 있다 (다른 언어에서는 가능하다고 한다.)
오버라이딩의 경우에는 부모클래스의 메소드를 자식클래스가 동일한 형태로 구현하는 것을
메소드 오버라이딩이라고 한다.
그리고 메소드들은 동일한 이름으로 메소드 이름을 정할 수 없다 하지만 메소드의 입력항목이 다를 겨웅에는
동일한 이름의 메소드를 생성이 가능하다 이렇게 입력항목이 다른 경우 동일한 이름의 메소드를 만드는 것을
메소드 오버로딩이라고 한다.
자 그렇다면 우선은 다시 생성자로 넘어가도록 하겠다.
public class Main {
public static void main(String[] args) {
집에있는변호사 a집에있는변호사 = new 집에있는변호사();
a집에있는변호사.setName("김변호사");
a집에있는변호사.work();
a집에있는변호사.work(3);
}
}
class 사람 {
String name;
void setName (String name) {
this.name = name;
}
}
class 변호사 extends 사람{
void work () {
System.out.println(this.name + " 일하다");
}
}
class 집에있는변호사 extends 사람 {
void work () {
System.out.println(this.name + " 집에서 일한다 ");
}
void work(int hour) {
System.out.println(this.name + "집에서 일한다 " + hour + "시간");
}
}
자 우선 위의 코드를 실행을 했을 때에는 "김변호사 집에서 일한다", "김변호사 집에서 일한다 3시간 " 이런식으로
출력이 되게 된다 그 이유는 실질적으로 객체 생성을 한 것은 집에있는변호사 라는 객체를 하나 생성한 것이고
집에있는변호사 라는 클래스에 만들어놓은 메소드들이 실행이 되기 때문이다.
그렇다면 거기에서 main클래스의 내용만 조금 수정해보겠다.
public class Main {
public static void main(String[] args) {
집에있는변호사 a집에있는변호사 = new 집에있는변호사();
System.out.println(a집에있는변호사.name);
}
}
이렇게 main 클래스를 수정을 하면 당연히 name 의 값은 없기 때문에 null값이 출력이 되게 된다.
이렇게 집에있는변호사 클래스는 코딩에 따라 인스턴스 변수 name에 값을 설정을 할 수도 안할수도 있다.
자 그러면 name이라는 인스턴스 변수에 값을 무조건 설정해야만 객체가 생성되도록
강제할 수 있는 방법이 바로 생성자를 이용하는 방법이다.
class 집에있는변호사 extends 사람 {
집에있는변호사(String name) {
this.setName(name);
}
이렇게 집에있는변호사 라는 클래스에다가 위와 같이 생성자를 만들었다.
이처럼 메소드명이 클래스명과 동일하면서 리턴 자료형을 정의하지 않는 메소드를 생성자 라고 한다.
생성자도 만들 때 규칙이 있다
1. 클래스명과 메소드명이 동일해야한다.
2. 리턴타입을 정의하지 않는다. (void도 사용하지 않는다.)
정도가 있다, 이 생성자는 객체가 생성이 될 때 호출이 되며 new 키워드를 사용 했을 때 호출이 된다.
위의 코드를 조금 살펴보면
집에있는변호사 클래스에 만든 생성자는 입력값으로 문자열을 필요로 하는 생성자라고 보면 된다.
그렇기 때문에 new 키워드로 객체를 만들 때 문자열을 전달해야한다.
예를 들어서
집에있는변호사 a집에있는변호사 = new 집에있는변호사("김변호사");
이런식으로 생성자 호출 시 문자열을 전달을 해줘야한다.
만약에 집에있는변호사 a집에있는변호사 = new 집에있는변호사();
이렇게 코드를 짜게 되면 컴파일 오류가 발생을 할텐데 이유는 객체 생성 방법이 생성자의 규칙과
맞지 않아서 발생하는 오류라고 생각하면 된다.
생성자가 선언이 된 경우에는 생성자의 규칙대로만 객체를 생성할 수 있다.
자 그렇다면 무조건 생성자 처럼 무조건 어떤 값을 전달해야 객체를 생성할 수 있는 것 말고 없을 때에도 생성할 수 있는
것은 없을까 했을 때 있는 것이 디폴트 생성자이다.
class 변호사 extends 사람{
변호사 () {
}
void work () {
System.out.println(this.name + " 일하다");
}
이 코드를 보면 되는데 이 코드에서는 입력값을 받는 항목을 비워놓고 생성자 내부에도 아무 내용이 없는 생성자를 만들었다.
이런 것들을 디폴트(default) 생성자라고 하며 이런 생성자를 구현을 하게 되면
new 변호사() 로 변호사 클래스의 객체가 만들어 질 때 위에 코드 처럼 구현한 디폴트 생성자가 실행이 된다.
만약 클래스에 생성자가 하나도 없다면 컴파일러는 자동으로 위와 같은 디폴트 생성자를 추가한다고 보면 된다.
즉, 우리가 저런 것들을 따로 구현하지 않아도 자바의 컴파일러가 우리 모르게 저런 디폴트 생성자를 만들어줬다고 보면 된다.
하지만 우리가 작성한 생성자가 하나라도 있다면 컴파일러는 디폴트 생성자를 생성하지 않는다.
그리고 메소드 오버로딩도 있는 것 처럼 생성자에도 오버로딩이 있게 된다.
public class Main {
public static void main(String[] args) {
집에있는변호사 a집에있는변호사 = new 집에있는변호사("김변호사");
집에있는변호사 a집에있는정변호사 = new 집에있는변호사(1);
System.out.println(a집에있는변호사.name);
System.out.println(a집에있는정변호사.name);
}
}
class 사람 {
String name;
void setName (String name) {
this.name = name;
}
}
class 변호사 extends 사람{
변호사 () {
}
void work () {
System.out.println(this.name + " 일하다");
}
}
class 집에있는변호사 extends 사람 {
집에있는변호사(String name) {
this.setName(name);
}
집에있는변호사(int type) {
if (type == 1) {
this.setName("정변호사");
} else if (type == 2) {
this.setName("유변호사");
}
}
void work () {
System.out.println(this.name + " 집에서 일한다 ");
}
void work(int hour) {
System.out.println(this.name + "집에서 일한다 " + hour + "시간");
}
}
위의 코드를 봤을 때 새로운 객체인 집에있는정변호사라는 객체를 추가를 했고 값을 숫자 타입으로 받는 것으로 설정을 해놨다
그리고 집에있는변호사라는 클래스에다가 if문을 통해서 int type으로 값을 받고 그 값에 따라서
정변호사 또는 유변호사가 나오도록 설정을 했다.
이렇게 생성자 오버로딩을 진행을 했다.
'Java' 카테고리의 다른 글
| 나 혼자 공부하는 자바 (객체 값 받는 법) (0) | 2022.10.04 |
|---|---|
| 나 혼자 자바 공부하기 (메소드 알아보기) (1) | 2022.10.04 |
| 나 혼자 자바 공부하기 (클래스) (0) | 2022.10.03 |
| 2022-09-30 자바 (최대값 구하기) (0) | 2022.09.30 |
| 2022-09-30 자바(숫자만 뽑은 후 더하기) (1) | 2022.09.30 |
댓글