-
생성자 -오버로딩(Overloading)과 this() + 오버라이딩(Overriding)JAVA/개념 - 김영한 강의 2024. 8. 25. 07:12
생성자
- 객체 생성 직후 객체를 초기화하기 위한 특별한 메서드
- 반복적으로 초기화하지 않고 처음에 초기화해놔서 나중에 쓰기 편함
- 생성자를 사용하면 필수값 입력을 보장받아 오류가 생기지 않는다.
- 이름이 클래스 이름과 같아야 한다. 따라서 첫 글자도 대문자다.
- 반환타입이 없다.
- 매개면수가 없는 생성자를 기본 생성자라고 한다.
- 클래스에 생성자가 하나도 없으면 자바는 매개변수가 없고 작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다. 그러나 생성자가 하나라도 있으면 자바는 기본 생성자를 만들지 않는다.
생성자 -오버로딩(Overloading)
생성자도 메서드 오버로딩처럼 매개변수만 다르게 해서 여러 생성자를 만들 수 있다.
public class MemberConstruct { String name; int age; int grade; MemberConstruct(String name, int age) { this.name = name; this.age = age; this.grade = 50; } MmeberConstruct(String name, int age, int grade) { System.out.println("생성자 호출 name=" + name + ",age=" + age + ",grade=" + grade); this.name = name; this.age = age; this.grade = grade; } }
그런데, 중복되는 부분이 있다.
this.name = name;
this.age = age;
이걸 this()로 사용해서 중복을 제거할 수 있다. this() 는 생성자 내부에서 자신의 생성자를 호출하기 때문이다.
(this 는 인스턴스 자신의 참조값을 가리킨다)
MemberConstruct(String name, int age) { this.name = name; this.age = age; this.grade = 50; } // 변경 MemberConstruct(String name, int age) { this(name, age, 50); }
- 기존 MemberConstruct 에 생성자를 하나 추가해서 생성자가 2개가 되었다. 새로 추가한 생성자는 grade 를 받지 않는다(grade=50)
왜 this를 사용하는가?
name이라는 이름이 멤버 변수와 매개변수로 동일하기 때문에, 자바는 기본적으로 **지역 변수(매개변수)**를 우선합니다. 따라서, this.name을 사용하여 멤버 변수와 매개변수를 명확하게 구분하는 것이 필요합니다.
this.name = name;
- this.name: 여기서 this는 현재 객체의 인스턴스를 의미하므로, this.name은 클래스의 멤버 변수인 name을 가리킨다
- name: 이 name은 생성자에 전달된 매개변수로, 생성자 호출 시 외부에서 제공된 값을 의미한다.
this() 규칙
this() 는 생성자 코드의 첫줄에만 작성할 수 있다.
오버로딩(Overloading)
오버로딩은 같은 이름의 메서드나 생성자를 여러 개 정의하는 것을 의미한다.
- 동일한 메서드 이름을 사용하지만, 매개변수의 개수 또는 타입이 달라야 한다
- 반환 타입은 오버로딩에 영향을 미치지 않고 메서드의 시그니처(메서드 이름과 매개변수 목록)가 달라야 한다.
- 주로 메서드나 생성자에서 사용된다.
public class Calculator { // 두 정수를 더하는 메서드 public int add(int a, int b) { return a + b; } // 세 정수를 더하는 메서드 public int add(int a, int b, int c) { return a + b + c; } // 두 실수를 더하는 메서드 public double add(double a, double b) { return a + b; } }
오버라이딩(Overriding)
오버라이딩은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의하는 것을 의미한다. 자식 클래스는 부모 클래스의 메서드를 그대로 사용하지 않고, 자신의 필요에 맞게 기능을 변경할 수 있다.
- 메서드의 이름, 매개변수, 반환 타입이 부모 클래스와 완전히 동일해야 한다.
- 접근 제어자(예: public, protected)는 부모 클래스의 메서드와 같거나 더 넓은 범위로 설정해야 한다. (예: protected를 public으로 변경 가능하지만, 반대로는 불가능)
- @Override 애너테이션을 사용하여 오버라이딩을 명시할 수 있다.
class Animal { // 부모 클래스의 메서드 public void sound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { // 부모 클래스의 sound 메서드를 오버라이딩 @Override public void sound() { System.out.println("Dog barks"); } }
오버로딩(Overloading): 같은 클래스 내에서 같은 이름의 메서드를 다른 매개변수로 여러 개 정의하는 것.
오버라이딩(Overriding): 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의하는 것.
문제
BookMain 코드가 작동하도록 Book클래스 완성하기
public class Book { String title; String author; int page; }
public class BookMain { public static void main(String[] args) { Book book1 = new Book(); book.displayInfo(); Book book2 = new Book("Hello Java", "Seo"); book2.displayInfo(); Book book3 = new Book("JPA 프로그래밍", "kim", 700); book3.displayInfo(); } }
Book 클래스를 바꾸면,
public class Book { String title; String author; int page; Book() { this("","",0); } // title과 author만을 매개변수로 받는 생성자 Book(String title, String author) { this(title, author, 0); } // 모든 필드를 매개변수로 받는 생성자 Book(String title, String author, int page) { this.title = title; this.author = author; this.page = page; } void displayInfo() { System.out.println("제목: " + title + ", 저자: " + author + ", 페이지: " + page); }
근데 원래 생성자 초기화할때
Book() { this.title = ""; this.author = ""; } // 이렇게 하는데 이걸 축약하면 아래와 같이 되는거 Book() { this("","",0); }
'JAVA > 개념 - 김영한 강의' 카테고리의 다른 글
멤버변수의 종류와 자바의 메모리 구조(메서드, 스택, 힙) (1) 2024.09.15 접근제어자 / 캡슐화 (0) 2024.08.30 생성자 (0) 2024.08.24 기본형과 참조형 (0) 2024.08.13 왜 개체지향을 할까? - 예제 (0) 2024.08.11